Executando verificação de segurança...
1

opa, obrigado pela dica, uso script em js pra fazer migrações entre DBs, mas o clickhouse em específico não se encaixa no padrão que usei ate então.

sobre a parada, descobri que era um problema paralelo.
no meu arranjo atual tenho 1 tabela principal onde chegam os dados brutos e outras 2 tabelas de agregações que são populadas por 2 MVs que processam os inserts assim que chegam.

o problema estava em uma dessas MVs que estava processando os inserts de forma mais lenta do que eles estavam sendo inseridos na tabela principal, e como o clickhouse faz muito trabalho de forma assíncrona, na hora de sincronizar os dados, o DB tava gerando dados temporários muito maiores do que o disco disponível (por conta de um armazenamento de state que faz comparações constantemente pra remover duplicações)

estou pensando em fazer um post sobre isso e como solucionei esse problema.

mas foi só remover essa MV problemática que eu consegui mover os dados entre tabelas, inclusive num tempo recorde kkkk coisa de 2h movi 44bi linhas.

agora o novo problema é re-popular a tabela de agregações com a MV que tive que remover.

Carregando publicação patrocinada...
1

Olha o código abaixo em node.js dá uma ajustada pro teu cenário já que usa js

import { createClient } from '@clickhouse/client';

const ch = createClient({
  host: process.env.CHK_HOST,  // https://host:8443
  username: process.env.CHK_USER,
  password: process.env.CHK_PASS,
  database: process.env.CHK_DB,
});

const BUCKETS = 256;
const CUTOFF = '2025-09-08 00:00:00'; // opcional (estratégia de cutoff)

async function backfill() {
  for (let i = 0; i < BUCKETS; i++) {
    const q = `
      INSERT INTO agg_tabela
      SELECT
        k1, k2,
        sumState(m1) AS m1_state,
        uniqCombinedState(user_id) AS u_state,
        countState() AS cnt_state
      FROM fatos
      WHERE sipHash64(k1, k2) % ${BUCKETS} = ${i}
        AND event_time <= parseDateTimeBestEffort('${CUTOFF}')  -- remova se não usar cutoff
      GROUP BY k1, k2
      SETTINGS max_execution_time=0
    `;
    await ch.exec({ query: q });
    console.log(`bucket ${i} OK`);
  }
}

backfill().then(()=>process.exit(0)).catch(e=>{console.error(e);process.exit(1);});




O que isso ai não faz:

Não cria a MV nova depois do backfill — você precisa criar com:

CREATE MATERIALIZED VIEW mv_agg TO agg_tabela AS SELECT ... GROUP BY ...;

Não valida as contagens automaticamente. Se quiser isso, adicione lógica de validação com:

const res = await ch.query({
  query: `SELECT count() FROM agg_tabela WHERE sipHash64(k1,k2) % 256 = ${i}`,
  format: 'JSONEachRow',
});

Espero que ajude, acho muito interessante fazer artigo de como resolveu, acho que isso é o maior déficit na web, as pessoas pedem ajuda, resolvem e não voltam para dar um feedback de como resolveram e quem lê em busca de ajuda se lasca.