Aller au contenu
Accueil IntoSQL

Convertir PostgreSQL en MariaDB

Déposez un dump texte de pg_dump ou pg_dumpall, en .sql ou .sql.gz, et téléchargez un script MariaDB avec les mêmes tables, clés, index et données. Chaque valeur que MariaDB ne peut pas contenir telle quelle, et chaque objet qu'il ne reprend pas, est listé dans le rapport.

Votre fichier
sqlshop_2024_postgres.sqlFichier d'exemple, 6,2 ko
Votre base de données

18 lignes converties, 3 corrections, aucune rejetée

Afficher

Tables de shop_2024_postgres.sqlDump PostgreSQL 18.6 · écrit par pg_dump · utf8mb4

  • customers8 lignes2
    8 colonnes
    idint not null
    nametext not null
    emailvarchar(768) not null
    countrychar(2) not null
    is_activetinyint(1) not null
    tagsjson not null
    signed_update
    created_atdatetime(6) not null
  • orders10 lignes1
    10 colonnes
    idint not null
    customer_idint not null
    statusenum('pending','paid','shipped','cancelled') not null
    totaldecimal(10,2) not null
    itemssmallint not null
    ordered_atdatetime(6) not null
    shipped_atdatetime(6)
    notetext
    detailsjson
    deliveryvarchar(100)

Non converti

  • Vue paid_orders

Chaque base de données les écrit dans son propre langage. Réécrivez-les pour 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;

Corrections

  1. "created_at" de customers contient des instants avec fuseau horaire ; MariaDB n'a aucun type qui le garde, ils sont donc stockés en UTC en datetime(6).
  2. "tags" de customers est text[], que MariaDB n'a pas ; elle est donc en json avec les mêmes valeurs.
  3. "delivery" de orders est interval, que MariaDB n'a pas ; elle est donc en varchar(100) avec les mêmes valeurs.

À vérifier

  • 1 objet non converti (vues, déclencheurs, routines ou événements) ; le rapport les liste un par un. Recréez-les à la main dans MariaDB.
  • La valeur par défaut de "tags" dans customers ne peut pas être écrite pour MariaDB (a value its type can't hold) ; la colonne n'a donc pas de valeur par défaut. Ajoutez la valeur par défaut à la main si les nouvelles lignes en ont besoin.
  • L'index idx_orders_details sur orders utilise une expression qui ne peut pas être écrite pour MariaDB (neither MySQL 5.7 nor MariaDB index an expression) ; il n'est donc pas créé. Créez l'index à la main si les requêtes en ont besoin.
  • 1 date de "shipped_at" dans orders, que MariaDB ne peut pas stocker (par exemple infinity), devient NULL. MariaDB stocke les années 1 à 9999, sans infini ; remplacez ces dates dans la source si elles comptent.

Votre fichier est converti sur cet ordinateur et n'est jamais envoyé.

Autres exemples :

Ce qui change de PostgreSQL à MariaDB

Chaque ligne est une règle appliquée par le convertisseur, avec la ligne de rapport qu'il écrit quand la règle change quelque chose dans vos données.

  • boolean

    tinyint(1)

    Le BOOLEAN de MariaDB est un TINYINT(1) : true vaut 1 et false vaut 0.

  • varchar(n), char(n), text

    varchar(n) jusqu'à 1024 caractères, char(n) jusqu'à 255, text au-delà

    Le texte garde chaque caractère en utf8mb4. Une colonne dans une clé est au plus varchar(768), le maximum qu'une clé accepte.

  • numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds

    varchar

    Le decimal de MariaDB contient 65 chiffres dont 30 décimales. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact ; numeric sans précision devient decimal(65,30) si ses valeurs y tiennent.

    Ligne du rapport: decimal_as_text

  • money

    decimal(19,2)

    MariaDB n'a pas de type monétaire. Le montant est gardé comme nombre, sans le symbole monétaire ajouté par la locale du serveur.

    Ligne du rapport: type_replaced

  • interval

    varchar(100) avec le texte de PostgreSQL

    Le TIME de MariaDB contient des durées jusqu'à 838 heures, mais un intervalle a des mois et des jours ; son texte en garde chaque partie.

    Ligne du rapport: type_replaced

  • arrays (integer[], text[]...)

    tableaux json

    MariaDB n'a pas de tableaux. Un tableau JSON garde chaque élément et NULL, et les fonctions JSON le lisent.

    Ligne du rapport: type_replaced

  • ranges, geometric types, tsvector, xml, hstore, composite and extension types

    longtext avec le texte de PostgreSQL

    MariaDB n'a pas de type équivalent ; chaque valeur garde donc le texte écrit par PostgreSQL.

    Ligne du rapport: type_replaced

  • json, jsonb

    json

    Les mêmes valeurs JSON ; l'ordre des clés et les espaces de jsonb sont ceux du serveur.

  • timestamp

    datetime(p)

    Un timestamp sans fuseau horaire est une date et une heure locales, comme datetime.

  • timestamp with time zone

    datetime(p) en UTC

    Le TIMESTAMP de MariaDB s'arrête en 2038 ; les instants sont donc stockés en datetime en UTC, le même instant quel que soit le décalage écrit par le dump.

    Ligne du rapport: moments_as_utc

  • time

    time(p)

    Le TIME de MariaDB contient chaque heure du jour, 24:00:00 compris.

  • infinity, -infinity, BC dates and years past 9999

    NULL

    MariaDB stocke les années 1000 à 9999, sans infini. Ces valeurs deviennent NULL et le rapport les compte.

    Ligne du rapport: date_out_of_range

  • NaN and Infinity in numeric, real and double precision

    NULL

    Les nombres de MariaDB n'ont ni NaN ni Infinity ; ces valeurs deviennent donc NULL et le rapport les compte.

    Ligne du rapport: invalid_value_null

  • NOT NULL columns with values that become NULL

    NOT NULL retiré

    Une colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.

    Ligne du rapport: not_null_relaxed

  • enum types

    enum(...) avec les mêmes libellés

    L'ENUM de MariaDB garde les libellés dans leur ordre.

  • uuid, inet, cidr

    uuid en uuid, inet et cidr en varchar(43)

    MariaDB a un type uuid ; les adresses gardent leur texte, masque compris.

  • bytea

    blob, mediumblob ou longblob ; varbinary(3072) dans une clé

    Les octets restent des octets.

  • bit(n)

    bit(n) jusqu'à 64, texte au-delà

    Une chaîne de bits jusqu'à 64 bits devient le nombre que forment ses bits ; une plus longue garde ses chiffres.

  • citext and nondeterministic collations

    comparaison exacte

    Les tables utilisent utf8mb4_bin pour que le texte se compare exactement, comme dans PostgreSQL ; les colonnes insensibles à la casse dans la source perdent cette propriété.

    Ligne du rapport: case_insensitive_collation

  • serial, identity

    AUTO_INCREMENT, qui reprend après l'identifiant le plus élevé

    La première colonne de la clé primaire compte ; le compteur reprend là où en était la séquence.

  • a second serial or identity column in a table

    entier simple

    MariaDB compte une colonne par table ; toute autre garde ses valeurs sans compteur.

    Ligne du rapport: counter_dropped

  • sequences not owned by a column

    CREATE SEQUENCE, à la prochaine valeur qu'elle fournit

    Les séquences MariaDB fonctionnent de la même façon.

  • generated columns

    colonnes générées, STORED comme dans la source

    MariaDB les calcule de la même façon.

  • generated columns with functions MariaDB lacks

    une colonne simple

    Une formule qui ne peut pas être écrite pour MariaDB laisse une colonne simple et une ligne dans le rapport.

    Ligne du rapport: generated_not_translated

  • defaults with functions MariaDB lacks, and defaults from a sequence

    aucune valeur par défaut

    Une valeur par défaut qui ne peut pas être écrite pour MariaDB est omise et signalée.

    Ligne du rapport: default_not_translated

  • CHECK constraints

    traduites, en ligne dans CREATE TABLE

    MySQL 8.0.16 et MariaDB les appliquent ; MySQL 5.7 les garde sans les vérifier.

  • CHECK constraints with functions MariaDB lacks

    non créée

    Une contrainte CHECK qui ne peut pas être écrite pour MariaDB est omise et signalée.

    Ligne du rapport: check_skipped

  • CHECK ... NOT VALID

    non créée

    PostgreSQL n'a jamais vérifié les lignes déjà présentes, qui peuvent donc l'enfreindre.

    Ligne du rapport: check_not_valid

  • gin, gist, brin and hash indexes, partial and expression indexes

    non créé

    MariaDB n'a que des index b-tree, plein texte et spatiaux, sur des colonnes entières, sans WHERE.

    Ligne du rapport: index_skipped

  • foreign keys

    clés étrangères, chargées avec FOREIGN_KEY_CHECKS=0

    Les lignes se chargent dans tout ordre, puis les clés vérifient les nouvelles lignes.

  • foreign keys to tables the dump doesn't create

    non créée

    Une clé ne peut pas désigner une table absente.

    Ligne du rapport: foreign_key_skipped

  • partitioned tables

    une seule table avec les lignes de chaque partition

    Les lignes sont les mêmes ; partitionnez à nouveau la table dans MariaDB si besoin.

    Ligne du rapport: partitions_dropped

  • schemas

    une seule base de données, tables préfixées par le nom de leur schéma

    Les schémas de MariaDB sont des bases de données, qu'un script chargé dans une seule base ne peut pas créer ; les tables de public gardent leur nom.

    Ligne du rapport: schemas_merged

  • views, functions, procedures, triggers, rules, policies, extensions and types

    listés dans le rapport

    Leur code est écrit dans le langage de PostgreSQL ; ils sont donc listés pour que vous les recréiez.

    Ligne du rapport: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    types déduits des valeurs

    Un dump de données seules ne contient que des lignes, donc les types viennent des valeurs.

    Ligne du rapport: no_schema

  • expressions in INSERT values

    NULL

    Un convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.

    Ligne du rapport: expression_value

  • types IntoSQL doesn't know

    longtext

    Le texte accepte toute valeur ; changez le type après le chargement.

    Ligne du rapport: unknown_type

  • text that isn't valid in its encoding

    les octets invalides deviennent le caractère de remplacement

    Le texte doit être de l'utf8mb4 valide.

    Ligne du rapport: invalid_utf8_replaced

  • text decoded twice (ñ)

    copié tel quel

    Le dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.

    Ligne du rapport: mojibake_suspected

Dans PostgreSQLDans MariaDBLigne du rapport
booleantinyint(1)Le BOOLEAN de MariaDB est un TINYINT(1) : true vaut 1 et false vaut 0.
varchar(n), char(n), textvarchar(n) jusqu'à 1024 caractères, char(n) jusqu'à 255, text au-delàLe texte garde chaque caractère en utf8mb4. Une colonne dans une clé est au plus varchar(768), le maximum qu'une clé accepte.
numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holdsvarcharLe decimal de MariaDB contient 65 chiffres dont 30 décimales. Les nombres plus larges sont gardés en texte pour que chaque chiffre reste exact ; numeric sans précision devient decimal(65,30) si ses valeurs y tiennent.decimal_as_text
moneydecimal(19,2)MariaDB n'a pas de type monétaire. Le montant est gardé comme nombre, sans le symbole monétaire ajouté par la locale du serveur.type_replaced
intervalvarchar(100) avec le texte de PostgreSQLLe TIME de MariaDB contient des durées jusqu'à 838 heures, mais un intervalle a des mois et des jours ; son texte en garde chaque partie.type_replaced
arrays (integer[], text[]...)tableaux jsonMariaDB n'a pas de tableaux. Un tableau JSON garde chaque élément et NULL, et les fonctions JSON le lisent.type_replaced
ranges, geometric types, tsvector, xml, hstore, composite and extension typeslongtext avec le texte de PostgreSQLMariaDB n'a pas de type équivalent ; chaque valeur garde donc le texte écrit par PostgreSQL.type_replaced
json, jsonbjsonLes mêmes valeurs JSON ; l'ordre des clés et les espaces de jsonb sont ceux du serveur.
timestampdatetime(p)Un timestamp sans fuseau horaire est une date et une heure locales, comme datetime.
timestamp with time zonedatetime(p) en UTCLe TIMESTAMP de MariaDB s'arrête en 2038 ; les instants sont donc stockés en datetime en UTC, le même instant quel que soit le décalage écrit par le dump.moments_as_utc
timetime(p)Le TIME de MariaDB contient chaque heure du jour, 24:00:00 compris.
infinity, -infinity, BC dates and years past 9999NULLMariaDB stocke les années 1000 à 9999, sans infini. Ces valeurs deviennent NULL et le rapport les compte.date_out_of_range
NaN and Infinity in numeric, real and double precisionNULLLes nombres de MariaDB n'ont ni NaN ni Infinity ; ces valeurs deviennent donc NULL et le rapport les compte.invalid_value_null
NOT NULL columns with values that become NULLNOT NULL retiréUne colonne dont des valeurs ont dû devenir NULL ne peut pas garder NOT NULL, sinon le chargement s'arrêterait.not_null_relaxed
enum typesenum(...) avec les mêmes libellésL'ENUM de MariaDB garde les libellés dans leur ordre.
uuid, inet, cidruuid en uuid, inet et cidr en varchar(43)MariaDB a un type uuid ; les adresses gardent leur texte, masque compris.
byteablob, mediumblob ou longblob ; varbinary(3072) dans une cléLes octets restent des octets.
bit(n)bit(n) jusqu'à 64, texte au-delàUne chaîne de bits jusqu'à 64 bits devient le nombre que forment ses bits ; une plus longue garde ses chiffres.
citext and nondeterministic collationscomparaison exacteLes tables utilisent utf8mb4_bin pour que le texte se compare exactement, comme dans PostgreSQL ; les colonnes insensibles à la casse dans la source perdent cette propriété.case_insensitive_collation
serial, identityAUTO_INCREMENT, qui reprend après l'identifiant le plus élevéLa première colonne de la clé primaire compte ; le compteur reprend là où en était la séquence.
a second serial or identity column in a tableentier simpleMariaDB compte une colonne par table ; toute autre garde ses valeurs sans compteur.counter_dropped
sequences not owned by a columnCREATE SEQUENCE, à la prochaine valeur qu'elle fournitLes séquences MariaDB fonctionnent de la même façon.
generated columnscolonnes générées, STORED comme dans la sourceMariaDB les calcule de la même façon.
generated columns with functions MariaDB lacksune colonne simpleUne formule qui ne peut pas être écrite pour MariaDB laisse une colonne simple et une ligne dans le rapport.generated_not_translated
defaults with functions MariaDB lacks, and defaults from a sequenceaucune valeur par défautUne valeur par défaut qui ne peut pas être écrite pour MariaDB est omise et signalée.default_not_translated
CHECK constraintstraduites, en ligne dans CREATE TABLEMySQL 8.0.16 et MariaDB les appliquent ; MySQL 5.7 les garde sans les vérifier.
CHECK constraints with functions MariaDB lacksnon crééeUne contrainte CHECK qui ne peut pas être écrite pour MariaDB est omise et signalée.check_skipped
CHECK ... NOT VALIDnon crééePostgreSQL n'a jamais vérifié les lignes déjà présentes, qui peuvent donc l'enfreindre.check_not_valid
gin, gist, brin and hash indexes, partial and expression indexesnon crééMariaDB n'a que des index b-tree, plein texte et spatiaux, sur des colonnes entières, sans WHERE.index_skipped
foreign keysclés étrangères, chargées avec FOREIGN_KEY_CHECKS=0Les lignes se chargent dans tout ordre, puis les clés vérifient les nouvelles lignes.
foreign keys to tables the dump doesn't createnon crééeUne clé ne peut pas désigner une table absente.foreign_key_skipped
partitioned tablesune seule table avec les lignes de chaque partitionLes lignes sont les mêmes ; partitionnez à nouveau la table dans MariaDB si besoin.partitions_dropped
schemasune seule base de données, tables préfixées par le nom de leur schémaLes schémas de MariaDB sont des bases de données, qu'un script chargé dans une seule base ne peut pas créer ; les tables de public gardent leur nom.schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and typeslistés dans le rapportLeur code est écrit dans le langage de PostgreSQL ; ils sont donc listés pour que vous les recréiez.not_converted_objects
dumps without CREATE TABLE (--data-only)types déduits des valeursUn dump de données seules ne contient que des lignes, donc les types viennent des valeurs.no_schema
expressions in INSERT valuesNULLUn convertisseur qui n'exécute pas de base de données ne peut pas les évaluer.expression_value
types IntoSQL doesn't knowlongtextLe texte accepte toute valeur ; changez le type après le chargement.unknown_type
text that isn't valid in its encodingles octets invalides deviennent le caractère de remplacementLe texte doit être de l'utf8mb4 valide.invalid_utf8_replaced
text decoded twice (ñ)copié tel quelLe dump contient exactement ces caractères, ils sont donc copiés ; le rapport les signale.mojibake_suspected

Charger le script dans MariaDB

Le script crée les tables, copie les lignes, puis ajoute les clés, les index et les clés étrangères ; il se charge donc vite et s'arrête à la première erreur.

mariadb --default-character-set=utf8mb4 mydb < postgresql.mariadb.sql

Les clés étrangères sont créées comme le dump les déclare, avec FOREIGN_KEY_CHECKS=0 pendant le chargement des lignes, comme le fait mysqldump.

Pour un gros dump, exécutez le client sur la machine du serveur, et augmentez max_allowed_packet si une seule ligne est très grande.

IntoSQL Pro charge le fichier directement dans MariaDB depuis l'application de bureau ou la ligne de commande, sans écrire de script.

Faire le dump PostgreSQL pour un meilleur résultat

Le convertisseur lit ce que contient le dump. Ces options y gardent davantage de vos données :

  • --format=plain, le format par défaut de pg_dump, écrit du SQL. Une archive custom ou directory (-Fc, -Fd) devient du SQL avec pg_restore -f dump.sql, sans serveur de base de données.
  • --no-owner --no-privileges omettent les rôles et les droits, que le convertisseur ignore de toute façon ; le dump est donc plus petit.
  • pg_dumpall met toutes les bases de données dans un seul fichier ; les tables de chacune sont préfixées par son nom, donc rien n'entre en collision.

Ce qui n'est pas converti

Les vues, vues matérialisées, fonctions, procédures, déclencheurs, règles, politiques de sécurité des lignes, extensions et types sont écrits dans le langage propre à PostgreSQL. Ils sont listés par nom dans le rapport, jamais supprimés en silence, pour que vous puissiez les réécrire pour MariaDB.

Questions sur PostgreSQL vers MariaDB

Pas de réponse ici ? Écrivez-nous depuis la page de contact, une personne vous répond. Page de contact

Mon dump est-il envoyé ?

Non. Le convertisseur s'exécute dans votre navigateur et lit le dump depuis votre disque par morceaux ; il ne quitte donc jamais votre ordinateur. L'application de bureau et la ligne de commande convertissent aussi sur votre ordinateur.

Quelle taille peut avoir le dump ?

Le convertisseur ne garde jamais tout le dump en mémoire : il lit le fichier deux fois, par plages, et écrit le script au fur et à mesure. Les dumps de plusieurs gigaoctets se convertissent dans le navigateur, dans l'application de bureau et avec la ligne de commande.

Lit-il les archives pg_dump -Fc ?

Pas directement : une archive custom est un format binaire. pg_restore -f dump.sql dump.backup la transforme en SQL texte que le convertisseur lit, sans se connecter à un serveur. Le convertisseur le signale quand il reçoit une archive.

De quelles versions de PostgreSQL le dump peut-il venir ?

Les dumps écrits par pg_dump et pg_dumpall depuis PostgreSQL 10, avec des lignes COPY ou INSERT. Chaque dump de test vient de PostgreSQL 13 et 18 et est comparé à sa source cellule par cellule.

Les valeurs serial et identity sont-elles conservées ?

Oui, pour une colonne par table : la colonne serial ou identity en tête de la clé primaire devient AUTO_INCREMENT et reprend après l'identifiant le plus élevé. Les séquences qui n'appartiennent à aucune colonne deviennent des séquences MariaDB à la valeur atteinte.

Que deviennent les tableaux, les enums et les autres types PostgreSQL ?

Les tableaux deviennent des tableaux JSON, les booléens tinyint(1), les enums ENUM avec les mêmes libellés, uuid UUID, et money un decimal. Les plages, types géométriques, hstore et types composites gardent le texte de PostgreSQL, et le rapport indique quelles colonnes.

Et les fonctions, les déclencheurs et les vues ?

Ils sont listés par nom dans le rapport et ne sont pas convertis, car chaque base de données les écrit dans son propre langage.

Sur quelles versions de MariaDB le script se charge-t-il ?

MariaDB 10.11 et versions ultérieures. Chaque dump de test se charge sur 10.11 et 11.4, et s'arrête à la première erreur en cas de problème.