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:
NUMERICsem precisão. É sugerido comoDECIMAL(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 oCREATE TABLE.timestamptz. Chega em UTC e é sugerido comoDATETIME(6), que guarda os microssegundos mas não guarda fuso. Mantenha a convenção de UTC na aplicação. OTIMESTAMPdo MySQL converteria os valores pelo fuso da sessão e termina em 2038.boolean. ViraTINYINT(1); MySQL e MariaDB não têm um tipo booleano separado, eBOOLEANé um apelido.uuid. Vira textoCHAR(36). Para uma chave menor, converta num SELECT e guarde comoBINARY(16)comUUID_TO_BINno MySQL 8, ou use o tipoUUIDno MariaDB 10.7 em diante.textevarcharsem tamanho. ViramLONGTEXT, que não pode ser chave primária nem índice completo. Dê um tamanhoVARCHAR(n)a toda coluna usada como chave ou num índice.bytea. ViraLONGBLOB. Colunas binárias são gravadas com INSERTs em lote, não pelo caminho de carga em massa.jsonejsonb. ViramJSON. No MariaDB,JSONé um apelido deLONGTEXTcom verificação de validade, lido com as mesmas funçõesJSON_VALUEeJSON_EXTRACT.- Arrays, enums,
interval,inete outros tipos só do PostgreSQL. São sugeridos comoLONGTEXT. Converta-os num SELECT na origem, por exemploSELECT id, array_to_string(tags, ',') AS tags, status::text AS status, … FROM orders. Você também pode declarar umENUMdo MySQL para o status, ou levar os arrays para uma tabela filha. - Conjunto de caracteres. Crie as tabelas do MySQL com
utf8mb4. O antigoutf8(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
seriale identity. O MySQL aceita valores explícitos numa colunaAUTO_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. OON DUPLICATE KEY UPDATEdispara em qualquer conflito de unicidade; sem um, as linhas são inseridas de novo.

O que muda no MariaDB
O MariaDB aceita o mesmo CREATE TABLE e a mesma carga. Diferenças para saber:
JSONé guardado comoLONGTEXTcom 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_atou o id da sequence). - Caminho rápido para cargas grandes: no Initial load e no Insert new, o dbSlice usa o
LOAD DATA LOCAL INFILEdo MySQL quando o seu perfil de conexão permite e o servidor temlocal_infileligado, 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
- Conecte no PostgreSQL e no MySQL ou MariaDB.
- Escolha a tabela de origem (ou um SELECT, como no exemplo do array) e a tabela de destino.
- Escolha a coluna-chave: a chave primária, ou uma coluna com índice único no destino.
- Escolha o modo: Initial load, depois Upsert ou Insert new.
- 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.