mysqldump + 远程导入是最稳的跨服务器复制表方式;需确保网络连通、账号有远程权限、字符集统一,推荐用管道直传并加--single-transaction和--default-character-set=utf8mb4。
MySQL 跨服务器复制表:mysqldump + 远程导入是最稳的路
直接在两台 mysql 服务器之间“复制一张表”,没有内置的 create table ... as select from remote 语法,mysqldump 配合管道或临时文件是生产中最可控的方式。它不依赖主从、不强求账号互通,只要源库可读、目标库可写、网络通,就能跑通。
常见错误现象:ERROR 1045 (28000): Access denied(权限不足)、ERROR 1146 (42S02): Table doesn't exist(目标库没建库)、导入后中文乱码(字符集未显式指定)。
- 源服务器执行:
mysqldump -h 源IP -u 用户 -p --skip-extended-insert --set-gtid-purged=OFF --default-character-set=utf8mb4 数据库名 表名 > table.sql - 目标服务器导入前先确认库存在:
mysql -h 目标IP -u 用户 -p -e "CREATE DATABASE IF NOT EXISTS 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" - 再导入:
mysql -h 目标IP -u 用户 -p --default-character-set=utf8mb4 数据库名
注意:--skip-extended-insert 让每行 INSERT 独立,出错时容易定位;--set-gtid-purged=OFF 避免 GTID 冲突(非主从场景下必须关);字符集必须两端一致,否则字段内容损坏。
PostgreSQL 跨服务器复制表:pg_dump + psql 管道最简
PostgreSQL 同样没有跨实例的直接 SELECT INTO REMOTE,pg_dump 是事实标准。和 MySQL 类似,但它对 schema 和权限更敏感,尤其当表带自定义类型、函数依赖或行级安全策略时,裸 dump 可能漏依赖。
使用场景:迁移单表结构+数据,且目标库已存在同名 schema(如 public);若目标库 schema 不存在,需提前建好或加 --schema=xxx 参数。
- 导出结构+数据(不含 owner 和权限):
pg_dump -h 源IP -U 用户 -t 表名 -F c -v 数据库名 > table.dump - 更推荐文本格式便于检查:
pg_dump -h 源IP -U 用户 -t 表名 --inserts --column-inserts --no-owner --no-privileges 数据库名 > table.sql - 导入:
psql -h 目标IP -U 用户 -d 数据库名 -f table.sql
性能影响:大表用 -F c(custom 格式)压缩快、恢复快,但不可读;文本格式慢但可 grep、可 sed 替换 schema 名;--no-owner 防止因用户不存在报错。
跨服务器连通性卡在哪?先盯住这三件事
90% 的“复制失败”其实卡在连通性上,不是语法或工具问题。别急着调参数,先确认基础链路是否真实打通。
- 网络层:从目标服务器执行
telnet 源IP 端口(MySQL 默认 3306,PostgreSQL 默认 5432),不通就查防火墙、安全组、SELinux - 认证层:用相同账号密码在目标机上手动连一次源库,例如
mysql -h 源IP -u 用户 -p,看是否提示Access denied—— 如果是,说明账号没开远程访问(MySQL 需GRANT ... ON *.* TO '用户'@'%'...;PostgreSQL 需改pg_hba.conf加 host 行) - DNS/hosts 解析:避免用主机名传参,统一用 IP;如果非用主机名,确保两端
/etc/hosts或 DNS 都能正确解析
容易被忽略的是:某些云数据库(如阿里云 RDS、腾讯云 CDB)默认禁止公网直连,即使开了白名单,也只允许从指定 EIP 访问——这时得走跳板机或数据库网关。
不想落地文件?用管道减少中间环节
落地文件会多一次磁盘 IO 和空间占用,大表还可能填满临时目录。用管道直传更干净,但对网络稳定性要求更高,断了就得重来。
MySQL 示例(源→目标):mysqldump -h 源IP -u 用户 -p --single-transaction --default-character-set=utf8mb4 数据库名 表名 | mysql -h 目标IP -u 用户 -p --default-character-set=utf8mb4 数据库名
PostgreSQL 示例:pg_dump -h 源IP -U 用户 -t 表名 --no-owner --no-privileges 数据库名 | psql -h 目标IP -U 用户 -d 数据库名
-
--single-transaction对 MySQL 很关键,保证 dump 过程中表状态一致(适合 InnoDB) - 管道模式下,所有参数(尤其是字符集)必须两边严格一致,否则一端解码失败,另一端直接报错退出
- 别在管道里加
gzip——虽然能提速传输,但一旦中间断开,gzip 流无法 resume,不如用rsync同步 .sql 文件后再导入
真正麻烦的不是命令怎么写,而是两边的 MySQL 版本差太多(比如 5.7 → 8.0),或 PostgreSQL 大版本跨跃(9.6 → 14),这时候 mysqldump --compatible=ansi 或 pg_dump --no-tablespaces 这类兼容开关才真起作用。










