Converta PostgreSQL para MariaDB
Solte um dump simples do pg_dump ou pg_dumpall, em .sql ou .sql.gz, e baixe um script do MariaDB com as mesmas tabelas, chaves, índices e dados. Cada valor que o MariaDB não aceita como está, e cada objeto que ele não traz, aparece no relatório.
18 linhas convertidas, 3 correções, nenhuma rejeitada
Tabelas em shop_2024_postgres.sqlDump do PostgreSQL 18.6 · gerado por pg_dump · utf8mb4
customers8 linhas2
8 colunas id int not null name text not null email varchar(768) not null country char(2) not null is_active tinyint(1) not null tags json not null signed_up date created_at datetime(6) not null orders10 linhas1
10 colunas id int not null customer_id int not null status enum('pending','paid','shipped','cancelled') not null total decimal(10,2) not null items smallint not null ordered_at datetime(6) not null shipped_at datetime(6) note text details json delivery varchar(100)
Não convertidos
- Visão paid_orders
Cada banco de dados escreve estes objetos na sua própria linguagem. Reescreva-os para o MariaDB.
-- Written by IntoSQL from a PostgreSQL dump. Load it with: mariadb --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `customers` (
`id` int NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`email` varchar(768) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` tinyint(1) NOT NULL DEFAULT 1,
`tags` json NOT NULL,
`signed_up` date,
`created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
UNIQUE KEY `customers_email_key` (`email`),
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`customer_id` int NOT NULL,
`status` enum('pending','paid','shipped','cancelled') NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` smallint NOT NULL DEFAULT 1,
`ordered_at` datetime(6) NOT NULL,
`shipped_at` datetime(6),
`note` text,
`details` json,
`delivery` varchar(100),
PRIMARY KEY (`id`),
KEY `idx_orders_customer` (`customer_id`),
KEY `idx_orders_status_date` (`status`,`ordered_at`),
CONSTRAINT `orders_total_check` CHECK (`total` >= (0)),
CONSTRAINT `orders_customer_id_fkey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=5001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`tags`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'["vip"]','2023-01-15','2023-01-15 10:24:00'),(2,'Zoë Müller','zoe@example.de','DE',1,'[]','2023-02-03','2023-02-03 08:11:42'),(3,'José Peña','jose@example.es','ES',0,'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17'),(4,'李雷','lilei@example.cn','CN',1,'[]','2023-05-09','2023-05-09 02:40:00'),(5,'Noah O\'Brien','noah@example.ie','IE',1,'[]',NULL,'2023-06-30 14:00:00'),(6,'Amélie Laurent','amelie@example.fr','FR',1,'["vip"]','2024-01-02','2024-01-02 09:30:00'),(7,'Ravi Patel','ravi@example.in','IN',0,'[]','2024-02-29','2024-02-29 23:59:59'),(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'[]','2024-04-12','2024-04-12 12:12:12');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`delivery`) VALUES (1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'{"gift": false}','1 day 06:30:00'),(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}',NULL),(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL,NULL),(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','{"fragile": true}','2 days 05:50:00'),(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice',NULL,NULL),(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','{"fragile": true}','20:00:00'),(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),(8,2,'shipped',19.99,1,'2024-03-12 08:00:00',NULL,'Shipped date set to infinity by an old import',NULL,NULL),(9,3,'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00','Two parcels','{"parcels": [1, 2]}','18:30:00'),(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,NULL);
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
Correções
- "created_at" de customers contém instantes com fuso horário; o MariaDB não tem um tipo que o mantenha, então eles são guardados em UTC como datetime(6).
- "tags" de customers é text[], que o MariaDB não tem, então vira json com os mesmos valores.
- "delivery" de orders é interval, que o MariaDB não tem, então vira varchar(100) com os mesmos valores.
Para revisar
- 1 visão, gatilho, rotina ou evento não foi convertido; o relatório lista cada um. Recrie-os manualmente no MariaDB.
- O valor padrão de "tags" em customers não pode ser escrito para o MariaDB (a value its type can't hold), então a coluna fica sem valor padrão. Adicione o valor padrão manualmente se novas linhas precisarem dele.
- O índice idx_orders_details de orders usa uma expressão que não pode ser escrita para o MariaDB (neither MySQL 5.7 nor MariaDB index an expression), então não é criado. Crie o índice manualmente se as consultas precisarem dele.
- 1 valor em "shipped_at" de orders é uma data que o MariaDB não consegue guardar, como infinity, então ficou NULL. O MariaDB guarda os anos de 1 a 9999 sem infinito; substitua essas datas na origem se elas forem importantes.
Seu arquivo é convertido neste computador e nunca é enviado.
Outros exemplos:
O que muda do PostgreSQL para o MariaDB
Cada linha é uma regra que o conversor aplica, com a linha do relatório que ele escreve quando a regra muda algo nos seus dados.
boolean
tinyint(1)
O BOOLEAN do MariaDB é TINYINT(1): true é 1 e false é 0.
varchar(n), char(n), text
varchar(n) até 1024 caracteres, char(n) até 255, text acima disso
O texto mantém cada caractere como utf8mb4. Uma coluna em uma chave é no máximo varchar(768), o maior que uma chave comporta.
numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds
varchar
O decimal do MariaDB comporta 65 dígitos com 30 decimais. Números mais largos ficam como texto, para que cada dígito continue exato; numeric sem precisão vira decimal(65,30) quando seus valores cabem.
Linha do relatório: decimal_as_text
money
decimal(19,2)
O MariaDB não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou.
Linha do relatório: type_replaced
interval
varchar(100) com o texto do PostgreSQL
O TIME do MariaDB guarda durações de até 838 horas, mas um interval tem meses e dias; o texto dele mantém cada parte.
Linha do relatório: type_replaced
arrays (integer[], text[]...)
arrays json
O MariaDB não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON o leem.
Linha do relatório: type_replaced
ranges, geometric types, tsvector, xml, hstore, composite and extension types
longtext com o texto do PostgreSQL
O MariaDB não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu.
Linha do relatório: type_replaced
json, jsonb
json
Os mesmos valores JSON; a ordem das chaves e os espaços do jsonb são os do servidor.
timestamp
datetime(p)
Um timestamp sem fuso horário é a leitura de um relógio de parede, como o datetime.
timestamp with time zone
datetime(p) em UTC
O TIMESTAMP do MariaDB só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que o dump escreveu.
Linha do relatório: moments_as_utc
time
time(p)
O TIME do MariaDB guarda qualquer hora do dia, incluindo 24:00:00.
infinity, -infinity, BC dates and years past 9999
NULL
O MariaDB guarda os anos de 1000 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta.
Linha do relatório: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
Os números do MariaDB não têm NaN nem Infinity, então esses valores viram NULL e o relatório os conta.
Linha do relatório: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL removido
Uma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia.
Linha do relatório: not_null_relaxed
enum types
enum(...) com os mesmos rótulos
O ENUM do MariaDB mantém os rótulos na sua ordem.
uuid, inet, cidr
uuid como uuid, inet e cidr como varchar(43)
O MariaDB tem um tipo uuid; os endereços mantêm seu texto, incluindo a máscara.
bytea
blob, mediumblob ou longblob; varbinary(3072) em uma chave
Bytes continuam bytes.
bit(n)
bit(n) até 64, text acima disso
Uma string de bits de até 64 bits é o número que seus bits formam; uma mais longa mantém seus dígitos.
citext and nondeterministic collations
comparação exata
As tabelas usam utf8mb4_bin, então o texto é comparado de forma exata, como no PostgreSQL; colunas que ignoravam maiúsculas na origem perdem isso.
Linha do relatório: case_insensitive_collation
serial, identity
AUTO_INCREMENT, continuando depois do maior id
A coluna que inicia a chave primária conta; o contador continua de onde a sequência estava.
a second serial or identity column in a table
inteiro simples
O MariaDB conta uma coluna por tabela; qualquer outra mantém seus valores sem contador.
Linha do relatório: counter_dropped
sequences not owned by a column
CREATE SEQUENCE, no valor que entregaria a seguir
As sequências do MariaDB funcionam do mesmo jeito.
generated columns
colunas geradas, STORED como na origem
O MariaDB as calcula do mesmo jeito.
generated columns with functions MariaDB lacks
uma coluna simples
Uma fórmula que não pode ser escrita para o MariaDB deixa uma coluna simples e uma linha no relatório.
Linha do relatório: generated_not_translated
defaults with functions MariaDB lacks, and defaults from a sequence
sem valor padrão
Um valor padrão que não pode ser escrito para o MariaDB fica de fora e é informado.
Linha do relatório: default_not_translated
CHECK constraints
traduzido, dentro do CREATE TABLE
O MySQL 8.0.16 e o MariaDB os aplicam; o MySQL 5.7 os mantém sem verificar.
CHECK constraints with functions MariaDB lacks
não criado
Um CHECK que não pode ser escrito para o MariaDB fica de fora e é informado.
Linha do relatório: check_skipped
CHECK ... NOT VALID
não criado
O PostgreSQL nunca verificou as linhas que já existiam, então elas podem violá-lo.
Linha do relatório: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes
não criado
O MariaDB só tem índices b-tree, de texto completo e espaciais, sobre colunas inteiras, sem WHERE.
Linha do relatório: index_skipped
foreign keys
chaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0
As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois.
foreign keys to tables the dump doesn't create
não criada
Uma chave não pode apontar para uma tabela que não existe.
Linha do relatório: foreign_key_skipped
partitioned tables
uma tabela com as linhas de todas as partições
As linhas são as mesmas; particione a tabela de novo no MariaDB se precisar.
Linha do relatório: partitions_dropped
schemas
um banco de dados, tabelas com o nome do schema na frente
Os schemas do MariaDB são bancos de dados, que um script carregado em um único banco não pode criar; as tabelas de public mantêm seus nomes.
Linha do relatório: schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and types
listados no relatório
O código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los.
Linha do relatório: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipos lidos dos valores
Um dump só de dados tem apenas linhas, então os tipos vêm dos valores.
Linha do relatório: no_schema
expressions in INSERT values
NULL
Um conversor que não executa um banco de dados não consegue avaliá-las.
Linha do relatório: expression_value
types IntoSQL doesn't know
longtext
O texto aceita qualquer valor; mude o tipo depois da carga.
Linha do relatório: unknown_type
text that isn't valid in its encoding
os bytes inválidos como o caractere de substituição
O texto precisa ser utf8mb4 válido.
Linha do relatório: invalid_utf8_replaced
text decoded twice (ñ)
copiado como está
O dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta.
Linha do relatório: mojibake_suspected
| No PostgreSQL | No MariaDB | Linha do relatório |
|---|---|---|
| boolean | tinyint(1)O BOOLEAN do MariaDB é TINYINT(1): true é 1 e false é 0. | |
| varchar(n), char(n), text | varchar(n) até 1024 caracteres, char(n) até 255, text acima dissoO texto mantém cada caractere como utf8mb4. Uma coluna em uma chave é no máximo varchar(768), o maior que uma chave comporta. | |
| numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds | varcharO decimal do MariaDB comporta 65 dígitos com 30 decimais. Números mais largos ficam como texto, para que cada dígito continue exato; numeric sem precisão vira decimal(65,30) quando seus valores cabem. | decimal_as_text |
| money | decimal(19,2)O MariaDB não tem tipo money. O valor fica como número, sem o símbolo de moeda que a localidade do servidor adicionou. | type_replaced |
| interval | varchar(100) com o texto do PostgreSQLO TIME do MariaDB guarda durações de até 838 horas, mas um interval tem meses e dias; o texto dele mantém cada parte. | type_replaced |
| arrays (integer[], text[]...) | arrays jsonO MariaDB não tem arrays. Um array JSON mantém cada item e NULL, e as funções JSON o leem. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, composite and extension types | longtext com o texto do PostgreSQLO MariaDB não tem um tipo equivalente, então cada valor mantém o texto que o PostgreSQL escreveu. | type_replaced |
| json, jsonb | jsonOs mesmos valores JSON; a ordem das chaves e os espaços do jsonb são os do servidor. | |
| timestamp | datetime(p)Um timestamp sem fuso horário é a leitura de um relógio de parede, como o datetime. | |
| timestamp with time zone | datetime(p) em UTCO TIMESTAMP do MariaDB só vai até 2038, então os instantes são guardados como datetime em UTC, o mesmo instante qualquer que seja o fuso que o dump escreveu. | moments_as_utc |
| time | time(p)O TIME do MariaDB guarda qualquer hora do dia, incluindo 24:00:00. | |
| infinity, -infinity, BC dates and years past 9999 | NULLO MariaDB guarda os anos de 1000 a 9999 sem infinito. Esses valores viram NULL e o relatório os conta. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLOs números do MariaDB não têm NaN nem Infinity, então esses valores viram NULL e o relatório os conta. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL removidoUma coluna cujos valores tiveram de virar NULL não pode manter NOT NULL, senão a carga pararia. | not_null_relaxed |
| enum types | enum(...) com os mesmos rótulosO ENUM do MariaDB mantém os rótulos na sua ordem. | |
| uuid, inet, cidr | uuid como uuid, inet e cidr como varchar(43)O MariaDB tem um tipo uuid; os endereços mantêm seu texto, incluindo a máscara. | |
| bytea | blob, mediumblob ou longblob; varbinary(3072) em uma chaveBytes continuam bytes. | |
| bit(n) | bit(n) até 64, text acima dissoUma string de bits de até 64 bits é o número que seus bits formam; uma mais longa mantém seus dígitos. | |
| citext and nondeterministic collations | comparação exataAs tabelas usam utf8mb4_bin, então o texto é comparado de forma exata, como no PostgreSQL; colunas que ignoravam maiúsculas na origem perdem isso. | case_insensitive_collation |
| serial, identity | AUTO_INCREMENT, continuando depois do maior idA coluna que inicia a chave primária conta; o contador continua de onde a sequência estava. | |
| a second serial or identity column in a table | inteiro simplesO MariaDB conta uma coluna por tabela; qualquer outra mantém seus valores sem contador. | counter_dropped |
| sequences not owned by a column | CREATE SEQUENCE, no valor que entregaria a seguirAs sequências do MariaDB funcionam do mesmo jeito. | |
| generated columns | colunas geradas, STORED como na origemO MariaDB as calcula do mesmo jeito. | |
| generated columns with functions MariaDB lacks | uma coluna simplesUma fórmula que não pode ser escrita para o MariaDB deixa uma coluna simples e uma linha no relatório. | generated_not_translated |
| defaults with functions MariaDB lacks, and defaults from a sequence | sem valor padrãoUm valor padrão que não pode ser escrito para o MariaDB fica de fora e é informado. | default_not_translated |
| CHECK constraints | traduzido, dentro do CREATE TABLEO MySQL 8.0.16 e o MariaDB os aplicam; o MySQL 5.7 os mantém sem verificar. | |
| CHECK constraints with functions MariaDB lacks | não criadoUm CHECK que não pode ser escrito para o MariaDB fica de fora e é informado. | check_skipped |
| CHECK ... NOT VALID | não criadoO PostgreSQL nunca verificou as linhas que já existiam, então elas podem violá-lo. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes | não criadoO MariaDB só tem índices b-tree, de texto completo e espaciais, sobre colunas inteiras, sem WHERE. | index_skipped |
| foreign keys | chaves estrangeiras, carregadas com FOREIGN_KEY_CHECKS=0As linhas carregam em qualquer ordem, e as chaves verificam as linhas novas depois. | |
| foreign keys to tables the dump doesn't create | não criadaUma chave não pode apontar para uma tabela que não existe. | foreign_key_skipped |
| partitioned tables | uma tabela com as linhas de todas as partiçõesAs linhas são as mesmas; particione a tabela de novo no MariaDB se precisar. | partitions_dropped |
| schemas | um banco de dados, tabelas com o nome do schema na frenteOs schemas do MariaDB são bancos de dados, que um script carregado em um único banco não pode criar; as tabelas de public mantêm seus nomes. | schemas_merged |
| views, functions, procedures, triggers, rules, policies, extensions and types | listados no relatórioO código deles é escrito na linguagem do PostgreSQL, então eles são listados para você recriá-los. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipos lidos dos valoresUm dump só de dados tem apenas linhas, então os tipos vêm dos valores. | no_schema |
| expressions in INSERT values | NULLUm conversor que não executa um banco de dados não consegue avaliá-las. | expression_value |
| types IntoSQL doesn't know | longtextO texto aceita qualquer valor; mude o tipo depois da carga. | unknown_type |
| text that isn't valid in its encoding | os bytes inválidos como o caractere de substituiçãoO texto precisa ser utf8mb4 válido. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiado como estáO dump contém exatamente esses caracteres, então eles são copiados; o relatório os aponta. | mojibake_suspected |
Carregue o script no MariaDB
O script cria as tabelas, copia as linhas e depois adiciona chaves, índices e chaves estrangeiras, então carrega rápido e para no primeiro erro.
mariadb --default-character-set=utf8mb4 mydb < postgresql.mariadb.sqlAs chaves estrangeiras são criadas como o dump as declara, com FOREIGN_KEY_CHECKS=0 enquanto as linhas carregam, como faz o mysqldump.
Para um dump grande, execute o cliente na mesma máquina do servidor e aumente max_allowed_packet se uma única linha for muito grande.
O IntoSQL Pro carrega o arquivo direto no MariaDB pelo app para desktop ou pela linha de comando, sem escrever um script.
Gere o dump do PostgreSQL para o melhor resultado
O conversor lê o que o dump contém. Estas opções mantêm mais dos seus dados nele:
- --format=plain, o padrão do pg_dump, escreve SQL. Um arquivo custom ou de diretório (-Fc, -Fd) vira SQL com pg_restore -f dump.sql, sem servidor de banco de dados.
- --no-owner --no-privileges deixam de fora papéis e permissões, que o conversor ignora de qualquer forma, então o dump fica menor.
- O pg_dumpall gera o dump de todos os bancos de dados em um arquivo; as tabelas de cada um recebem o nome dele, então nada colide.
O que não é convertido
Visões, visões materializadas, funções, procedimentos, gatilhos, regras, políticas de segurança de linha, extensões e tipos são escritos na linguagem própria do PostgreSQL. Eles aparecem no relatório pelo nome, nunca são descartados em silêncio, para que você possa reescrevê-los para o MariaDB.
Perguntas sobre PostgreSQL para MariaDB
Não encontrou a resposta? Escreva para nós pela página de contato e uma pessoa responde. Página de contato
Meu dump é enviado?
Não. O conversor roda no seu navegador e lê o dump do seu disco em partes, então ele nunca sai do seu computador. O app para desktop e a linha de comando também convertem no seu computador.
Qual o tamanho máximo do dump?
O conversor nunca guarda o dump inteiro na memória: ele lê o arquivo duas vezes, por intervalos, e escreve o script à medida que avança. Dumps de vários gigabytes são convertidos no navegador, no app para desktop e com a linha de comando.
Ele lê arquivos do pg_dump -Fc?
Não diretamente: um arquivo custom é um formato binário. pg_restore -f dump.sql dump.backup o transforma no SQL simples que o conversor lê, sem se conectar a um servidor. O conversor avisa quando recebe um arquivo desses.
De quais versões do PostgreSQL o dump pode vir?
Dumps escritos pelo pg_dump e pg_dumpall do PostgreSQL 10 em diante, com linhas em COPY ou INSERT. Cada dump de teste vem do PostgreSQL 13 e 18 e é comparado com a origem célula por célula.
Os valores serial e identity são mantidos?
Sim, para uma coluna por tabela: a coluna serial ou identity que inicia a chave primária vira AUTO_INCREMENT e continua depois do maior id. Sequências que não pertencem a uma coluna viram sequências do MariaDB no valor que tinham alcançado.
O que acontece com arrays, enums e outros tipos do PostgreSQL?
Arrays viram arrays JSON, booleanos tinyint(1), enums ENUM com os mesmos rótulos, uuid UUID, e money um decimal. Ranges, tipos geométricos, hstore e tipos compostos mantêm o texto do PostgreSQL, e o relatório diz quais colunas.
E as funções, gatilhos e visões?
Eles aparecem no relatório pelo nome e não são convertidos, porque cada banco de dados os escreve na sua própria linguagem.
Em quais versões do MariaDB o script carrega?
MariaDB 10.11 e posteriores. Cada dump de teste carrega no 10.11 e no 11.4 e para no primeiro erro se algo der errado.