Migração de dados de PostgreSQL para MySQL e MariaDB

Migrate · · 5 min de leitura

Vai levar tabelas do PostgreSQL para o MySQL ou o MariaDB? O dbSlice copia os dados por um app Windows ou pela linha de comando, mantém o destino sincronizado enquanto o PostgreSQL ainda está no ar e compara os dois lados chave a chave antes da troca.

Migrar de PostgreSQL para MySQL: o que muda no destino

Se a tabela de destino não existe, o dbSlice para e mostra um CREATE TABLE traduzido para o MySQL, para o seu DBA revisar e rodar. Por padrão, ele não cria nada nos seus bancos. Estes são os tipos do PostgreSQL que pedem uma decisão do lado do MySQL:

  • NUMERIC sem precisão. É sugerido como DECIMAL(38,10). Uma precisão declarada é mantida até o limite do MySQL de 65 dígitos e 30 decimais. Confira os valores reais e defina precisão e escala antes de rodar o CREATE TABLE.
  • timestamptz. Chega em UTC e é sugerido como DATETIME(6), que guarda os microssegundos mas não guarda fuso. Mantenha a convenção de UTC na aplicação. O TIMESTAMP do MySQL converteria os valores pelo fuso da sessão e termina em 2038.
  • boolean. Vira TINYINT(1); MySQL e MariaDB não têm um tipo booleano separado, e BOOLEAN é um apelido.
  • uuid. Vira texto CHAR(36). Para uma chave menor, converta num SELECT e guarde como BINARY(16) com UUID_TO_BIN no MySQL 8, ou use o tipo UUID no MariaDB 10.7 em diante.
  • text e varchar sem tamanho. Viram LONGTEXT, que não pode ser chave primária nem índice completo. Dê um tamanho VARCHAR(n) a toda coluna usada como chave ou num índice.
  • bytea. Vira LONGBLOB. Colunas binárias são gravadas com INSERTs em lote, não pelo caminho de carga em massa.
  • json e jsonb. Viram JSON. No MariaDB, JSON é um apelido de LONGTEXT com verificação de validade, lido com as mesmas funções JSON_VALUE e JSON_EXTRACT.
  • Arrays, enums, interval, inet e outros tipos só do PostgreSQL. São sugeridos como LONGTEXT. Converta-os num SELECT na origem, por exemplo SELECT id, array_to_string(tags, ',') AS tags, status::text AS status, … FROM orders. Você também pode declarar um ENUM do MySQL para o status, ou levar os arrays para uma tabela filha.
  • Conjunto de caracteres. Crie as tabelas do MySQL com utf8mb4. O antigo utf8 (3 bytes) rejeita emoji e outros caracteres de 4 bytes que o PostgreSQL guarda sem problema.
  • Nomes em minúsculas. Os nomes no PostgreSQL costumam já estar em minúsculas, o que combina com o MySQL no Linux, onde os nomes de tabela diferenciam maiúsculas. Mantenha os nomes das colunas iguais nos dois lados, porque o dbSlice mapeia as colunas pelo nome.
  • Ids serial e identity. O MySQL aceita valores explícitos numa coluna AUTO_INCREMENT; então os ids continuam iguais sem nenhuma permissão especial. O MySQL avança o contador para depois do maior id inserido.
  • O Upsert roda como INSERT … ON DUPLICATE KEY UPDATE. A coluna-chave escolhida precisa ser a chave primária ou ter um índice único no destino. O ON DUPLICATE KEY UPDATE dispara em qualquer conflito de unicidade; sem um, as linhas são inseridas de novo.
Aba Synchronize do dbSlice

O que muda no MariaDB

O MariaDB aceita o mesmo CREATE TABLE e a mesma carga. Diferenças para saber:

  • JSON é guardado como LONGTEXT com verificação.
  • O MariaDB 10.7 em diante tem um tipo nativo UUID.
  • Crie as tabelas com utf8mb4, como no MySQL.

Como o dbSlice controla a carga

  • Lê o PostgreSQL em lotes pequenos, ordenados pela chave, para o banco em uso continuar atendendo os usuários.
  • Casa as linhas por uma chave que você escolhe. Modos: Initial load, depois Upsert, Insert new, Update only ou incremental por coluna (updated_at ou o id da sequence).
  • Caminho rápido para cargas grandes: no Initial load e no Insert new, o dbSlice usa o LOAD DATA LOCAL INFILE do MySQL quando o seu perfil de conexão permite e o servidor tem local_infile ligado, uma configuração que o seu DBA controla.
    • Cada lote roda numa transação. Se o MySQL acusa um aviso ou pula uma linha, o dbSlice desfaz o lote e grava de novo com INSERTs comuns, para mostrar o erro real.
    • O desfazer precisa de tabelas InnoDB, o engine padrão.
  • Confere antes de gravar com o Record Diff e as conferências na tela, e prova o resultado com o Compare e a lista completa de chaves divergentes.
  • Mascara no caminho as cópias de desenvolvimento e teste, mantendo chaves e chaves estrangeiras intactas.
  • Exportar em vez de carregar: quando você só precisa de um arquivo, o mesmo app exporta uma tabela do PostgreSQL para CSV, JSON, XML ou HTML.

Passo a passo: converter uma tabela de PostgreSQL para MySQL

  1. Conecte no PostgreSQL e no MySQL ou MariaDB.
  2. Escolha a tabela de origem (ou um SELECT, como no exemplo do array) e a tabela de destino.
  3. Escolha a coluna-chave: a chave primária, ou uma coluna com índice único no destino.
  4. Escolha o modo: Initial load, depois Upsert ou Insert new.
  5. Rode o Record Diff e depois a cópia, ou salve como job para a CLI e o Agendador de Tarefas do Windows.

Mover dados entre PostgreSQL e MySQL, com qualquer um dos dois como origem

O mesmo app move dados no outro sentido: veja MySQL para PostgreSQL. Para SQL Server, veja PostgreSQL para SQL Server, SQL Server para MySQL e SQL Server para MariaDB.

Perguntas frequentes

O dbSlice converte funções, triggers ou views?

Não. Ele move dados; o código PL/pgSQL precisa ser reescrito para o MySQL.

Preciso de replicação lógica ou extensões no PostgreSQL?

Não. O dbSlice lê as tabelas com consultas comuns.

Funciona com MariaDB?

Sim, com os mesmos passos; veja "O que muda no MariaDB" acima.

As execuções incrementais copiam as exclusões?

Não. Rode o Compare ou uma recarga antes da troca.

Existe versão gratuita?

Sim, na Microsoft Store: ela conecta, navega, compara e exporta para CSV. Gravar num destino exige uma licença Desktop ou Server.

Ainda não usa o dbSlice?
Experimente a versão gratuita da Microsoft Store: ela conecta, navega pelos dados, compara estruturas e exporta para CSV.

Experimente grátis Veja as demonstrações

Em produção há mais de 6 anos · Garantia de 14 dias · Roda na sua máquina