You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PostgreSQL备份文件恢复到MariaDB/MySQL数据库?

PostgreSQL备份迁移到MySQL/MariaDB的可行方案

先解决当前导入错误

你碰到的#1193 - Unknown system variable 'statement_timeout'错误,是因为statement_timeout是PostgreSQL独有的系统变量,MySQL/MariaDB根本不认识这类配置。直接删掉备份文件里所有PostgreSQL专属的SET语句就行,比如这些:

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

这些都是pg_dump自动生成的PostgreSQL环境配置,MySQL完全不需要,删完就能跳过这类错误。

完整迁移方案

方案一:手动修改备份文件(适合小文件)

如果备份文件不大,手动调整后就能导入:

  • 删干净所有PostgreSQL专属的配置语句(就是上面那些SET开头、带pg_catalog的语句)
  • 修正数据类型映射:
    • PostgreSQL的serial/bigserial换成MySQL的INT AUTO_INCREMENT/BIGINT AUTO_INCREMENT
    • PostgreSQL的text换成MySQL的TEXT或VARCHAR(65535)
    • PostgreSQL的timestamp without time zone换成MySQL的DATETIME
    • PostgreSQL的boolean换成MySQL的TINYINT(1)(MySQL 8.0+也可以直接用BOOLEAN)
  • 调整语法差异:
    • 把INSERT INTO ... RETURNING ...里的RETURNING部分删掉
    • 删除CREATE TABLE语句里的OWNER TO xxx内容
    • 把PostgreSQL的COMMENT ON TABLE users IS '用户表';改成MySQL的ALTER TABLE users COMMENT '用户表';格式
  • 最后用MySQL客户端导入修改好的文件:
    mysql -u 用户名 -p 目标数据库名 < 修改后的备份文件.sql
    

方案二:工具自动转换(适合大文件/复杂结构)

如果备份文件大或者表结构复杂,用专业工具更高效:

  • pg2mysql:专门转PostgreSQL备份到MySQL的脚本,能自动处理大部分类型和语法差异:
    1. 安装pg2mysql(比如Debian/Ubuntu系统:sudo apt install pg2mysql)
    2. 转换备份文件:
      pg2mysql 原PostgreSQL备份.sql > 转换后的MySQL备份.sql
      
    3. 检查转换后的文件,确认没有残留的PostgreSQL语法,再导入MySQL
  • 分步骤导出导入:如果结构特别复杂,分开处理表结构和数据:
    1. 用pg_dump导出纯表结构:
      pg_dump -s -d PostgreSQL数据库名 > schema.sql
      
      手动修改schema.sql里的语法和数据类型(参考方案一的映射规则),导入MySQL创建空表
    2. 用pg_dump导出CSV格式的数据:
      pg_dump -a --data-only --format=csv -d PostgreSQL数据库名 -t 表名 > 表名_data.csv
      
    3. 用MySQL的LOAD DATA INFILE导入CSV数据:
      LOAD DATA INFILE '/文件路径/表名_data.csv' INTO TABLE 表名 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
      

注意事项

  • 提前在MySQL里建好目标数据库,字符集设为utf8mb4,和PostgreSQL的编码保持一致
  • 迁移完成后一定要验证数据完整性,比如对比表行数、关键字段的值
  • 如果有PostgreSQL的自定义函数、存储过程,得手动改成MySQL的语法,两者的PL/SQL语法差异不小

内容的提问来源于stack exchange,提问作者Anjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:15:38