如何将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)
- PostgreSQL的
- 调整语法差异:
- 把
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的脚本,能自动处理大部分类型和语法差异:
- 安装pg2mysql(比如Debian/Ubuntu系统:
sudo apt install pg2mysql) - 转换备份文件:
pg2mysql 原PostgreSQL备份.sql > 转换后的MySQL备份.sql - 检查转换后的文件,确认没有残留的PostgreSQL语法,再导入MySQL
- 安装pg2mysql(比如Debian/Ubuntu系统:
- 分步骤导出导入:如果结构特别复杂,分开处理表结构和数据:
- 用pg_dump导出纯表结构:
手动修改schema.sql里的语法和数据类型(参考方案一的映射规则),导入MySQL创建空表pg_dump -s -d PostgreSQL数据库名 > schema.sql - 用pg_dump导出CSV格式的数据:
pg_dump -a --data-only --format=csv -d PostgreSQL数据库名 -t 表名 > 表名_data.csv - 用MySQL的
LOAD DATA INFILE导入CSV数据:LOAD DATA INFILE '/文件路径/表名_data.csv' INTO TABLE 表名 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
- 用pg_dump导出纯表结构:
注意事项
- 提前在MySQL里建好目标数据库,字符集设为
utf8mb4,和PostgreSQL的编码保持一致 - 迁移完成后一定要验证数据完整性,比如对比表行数、关键字段的值
- 如果有PostgreSQL的自定义函数、存储过程,得手动改成MySQL的语法,两者的PL/SQL语法差异不小
内容的提问来源于stack exchange,提问作者Anjan
相关产品推荐
相关产品推荐

