Acesso ao seu banco de dados PostgreSQL de origem.
Uma instância do ClickHouse Managed Postgres para a qual você quer migrar seus dados.
PeerDB instalado em uma máquina. Você pode seguir as instruções de instalação no repositório do GitHub do PeerDB. Basta clonar o repositório e executar docker-compose up. Neste guia, usaremos a UI do PeerDB, que ficará acessível em http://localhost:3000 assim que o PeerDB estiver em execução.
Antes de iniciar a migração, tenha em mente o seguinte:
Objetos do banco de dados: o PeerDB criará tabelas automaticamente no banco de dados de destino com base no esquema de origem. No entanto, determinados objetos do banco de dados, como índices, restrições e gatilhos, não serão migrados automaticamente. Você precisará recriar esses objetos manualmente no banco de dados de destino após a migração.
Alterações de DDL: se você habilitar a replicação contínua, o PeerDB manterá o banco de dados de destino sincronizado com a origem para operações DML (INSERT, UPDATE, DELETE) e propagará operações ADD COLUMN. No entanto, outras alterações de DDL (como DROP COLUMN e ALTER COLUMN) não são propagadas automaticamente. Mais informações sobre o suporte a alterações de esquema aqui
Conectividade de rede: certifique-se de que os bancos de dados de origem e de destino estejam acessíveis a partir da máquina em que o PeerDB está sendo executado. Talvez seja necessário configurar regras de firewall ou definições de Security Group para permitir a conectividade.
Primeiro, precisamos criar peers para os bancos de dados de origem e de destino. Um peer representa uma conexão com um banco de dados. Na UI do PeerDB, acesse a seção “Peers” clicando em “Peers” na barra lateral. Para criar um novo peer, clique no botão + New peer.
Crie um peer para o seu banco de dados PostgreSQL de origem preenchendo os dados de conexão, como host, porta, nome do banco de dados, nome de usuário e senha. Depois de preencher esses dados, clique no botão Create peer para salvar o peer.
Da mesma forma, crie um peer para sua instância do ClickHouse Managed Postgres fornecendo os detalhes de conexão necessários. Você pode obter os detalhes de conexão da sua instância no console do ClickHouse Cloud. Depois de preencher os detalhes, clique no botão Create peer para salvar o peer de destino.Agora, você deverá ver os peers de origem e de destino listados na seção “Peers”.
Para reproduzir a configuração do banco de dados de origem no banco de dados de destino, precisamos obter um dump do esquema do banco de dados de origem. Você pode usar pg_dump para criar um dump somente do esquema do seu banco de dados PostgreSQL de origem:
Instalar o pg_dump
Ubuntu:Atualize as listas de pacotes:
sudo apt update
Instale o cliente PostgreSQL:
sudo apt install postgresql-client
macOS:Método 1: usando Homebrew (recomendado)Instale o Homebrew se ainda não o tiver:
Remova restrições UNIQUE e índices do dump do esquema
Antes de aplicar isso ao banco de dados de destino, precisamos remover as restrições UNIQUE e os índices do arquivo de dump para que a ingestão do PeerDB nas tabelas de destino não seja bloqueada por essas restrições. Eles podem ser removidos usando:
Aplicar o dump do esquema ao banco de dados de destino
Após limpar o arquivo de dump do esquema, você pode aplicá-lo ao banco de dados de destino ClickHouse Managed Postgres conectando-se via psql e executando o arquivo de dump do esquema:
Aqui, no lado de destino, não queremos que a ingestão pelo PeerDB seja bloqueada por restrições de chave estrangeira. Para isso, podemos alterar o role de destino (usado acima no peer de destino) para ter session_replication_role definido como replica:
ALTER ROLE <target_role> SET session_replication_role = replica;
Em seguida, precisamos criar um mirror para definir o processo de migração de dados entre os peers de origem e de destino. Na UI do PeerDB, vá até a seção “Mirrors” clicando em “Mirrors” na barra lateral. Para criar um novo mirror, clique no botão + New mirror.
Dê ao seu mirror um nome que descreva a migração.
Selecione os peers de origem e de destino que você criou anteriormente nos menus suspensos.
Certifique-se de que:
Soft delete esteja OFF.
Expanda Advanced settings. Certifique-se de que o sistema de tipos do Postgres esteja habilitado e de que as colunas do PeerDB estejam desabilitadas.
Selecione as tabelas que você deseja migrar. Você pode escolher tabelas específicas ou selecionar todas as tabelas do banco de dados de origem.
Selecionando tabelasCertifique-se de que os nomes das tabelas de destino sejam os mesmos das tabelas de origem no banco de dados de destino, pois migramos o esquema exatamente como estava na etapa anterior.
Depois de configurar as definições do mirror, clique no botão Create mirror.
Você verá o mirror recém-criado na seção “Mirrors”.
Após criar o mirror, o PeerDB iniciará a carga inicial de dados do banco de dados de origem para o banco de dados de destino. Você pode clicar no mirror e, em seguida, na aba Carga inicial para acompanhar o progresso da migração inicial dos dados.Quando a carga inicial for concluída, você deverá ver um status indicando que a migração foi concluída.
Se você clicar no peer de origem, poderá ver uma lista dos comandos em execução no PeerDB. Por exemplo:
Inicialmente, executamos uma consulta COUNT para estimar o número de linhas em cada tabela.
Em seguida, executamos uma consulta de particionamento com NTILE para dividir tabelas grandes em fragmentos menores e transferir os dados com mais eficiência.
Depois, executamos comandos FETCH para buscar dados do banco de dados de origem e, em seguida, o PeerDB os sincroniza com o banco de dados de destino.
Essas etapas podem variar conforme o seu caso de uso e os requisitos da aplicação. O mais importante é garantir a consistência dos dados, minimizar o tempo de indisponibilidade e validar a integridade dos dados migrados antes de concluir a migração para o novo sistema.
Após a conclusão da migração:
Execute verificações de validação pré-cutover
Compare as tabelas principais entre a origem e o destino antes de redirecionar o tráfego:
-- Comparação de contagem de linhas para tabelas críticasSELECT 'public.orders' AS table_name, COUNT(*) AS row_count FROM public.orders;SELECT 'public.customers' AS table_name, COUNT(*) AS row_count FROM public.customers;-- Verificação rápida dos registros mais recentes em tabelas de alta atividadeSELECT MAX(updated_at) FROM public.orders;SELECT MAX(id) FROM public.orders;
Interrompa as escritas no sistema de origem
Primeiro, pause as escritas da aplicação. Como proteção adicional, defina o banco de dados de origem como somente leitura durante a transição:
ALTER DATABASE <source_db> SET default_transaction_read_only = on;
Se for necessário reverter, você pode reativar as gravações:
ALTER DATABASE <source_db> SET default_transaction_read_only = off;
Confirme se a replicação está totalmente sincronizada
Verifique se a linha mais recente em uma ou mais tabelas com alta taxa de gravação é a mesma na origem e no destino:
-- Execute na origem e no destino e compare os resultadosSELECT MAX(id) AS latest_id, MAX(updated_at) AS latest_ts FROM public.orders;
Recrie e habilite restrições, índices e gatilhos
Se você removeu ou adiou restrições/índices para a ingestão, reaplique-os agora. Além disso, redefina a role de replicação no destino se antes a definiu como replica:
ALTER ROLE <target_role> SET session_replication_role = origin;
Após a carga de dados, alinhe as sequências com os valores atuais das tabelas:
-- Redefinição genérica de sequência para todas as colunas serial/identity em esquemas fora do sistemaDO $$DECLARE r RECORD;BEGIN FOR r IN SELECT n.nspname AS schema_name, c.relname AS table_name, a.attname AS column_name, pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace JOIN pg_attribute a ON a.attrelid = c.oid WHERE c.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped AND n.nspname NOT IN ('pg_catalog', 'information_schema') LOOP IF r.seq_name IS NOT NULL THEN EXECUTE format( 'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)', r.seq_name, r.column_name, r.schema_name, r.table_name ); END IF; END LOOP;END $$;
Redirecione o tráfego da aplicação
Quando a validação for concluída com sucesso e as sequências/restrições estiverem em vigor:
Direcione o tráfego de leitura para o ClickHouse Managed Postgres.
Direcione o tráfego de gravação para o ClickHouse Managed Postgres.
Monitore erros da aplicação, violações de restrições e a saúde do banco de dados.
Limpe os recursos
Quando você estiver satisfeito com a migração e já tiver alterado sua aplicação para usar o ClickHouse Managed Postgres, poderá excluir o mirror e os peers no PeerDB.
Slots de replicaçãoSe você tiver ativado a replicação contínua, o PeerDB criará um slot de replicação no banco de dados PostgreSQL de origem. Após concluir a migração, exclua manualmente o slot de replicação do banco de dados de origem para evitar o uso desnecessário de recursos.
Parabéns! Você migrou seu banco de dados PostgreSQL com sucesso para o ClickHouse Managed Postgres usando pg_dump e pg_restore. Agora, você já pode explorar os recursos do Managed Postgres e sua integração com o ClickHouse. Aqui está um guia de início rápido de 10 minutos para ajudar você a começar: