能,但必须用 mysqldump + ssh + mysql 三段式管道;直接 rsync /var/lib/mysql 会导致 innodb 文件状态不一致、版本兼容性错误、selinux 权限失败及 gtid 冲突等问题。

能,但必须用 mysqldump + ssh + mysql 三段式管道,不能直接 scp 数据文件或依赖图形工具。 否则大概率遇到权限错、字符集乱码、GTID 冲突、主从位点丢失,甚至目标库启动失败。
为什么不能直接 rsync /var/lib/mysql 目录
MySQL 的数据文件(如 ibdata1、ib_logfile*)是 InnoDB 引擎在运行时独占管理的二进制状态快照。直接复制未停机的目录会导致:
- 目标库启动时报错
InnoDB: Database page corruption或卡在crash recovery - 即使源库已停机,若两台机器 MySQL 版本不一致(如源是 5.7,目标是 8.0.33),
rsync过来的系统表空间可能无法识别 - SELinux 上下文、socket 路径、pid-file 位置全部不匹配,
systemctl start mysqld会静默失败
正确的 SSH 管道命令长什么样
核心是把 mysqldump 输出直接喂给远端 mysql 客户端,中间不落地文件。典型命令如下:
mysqldump -h localhost -u root -p'Admin@123' --single-transaction --routines --triggers yl_data | ssh server@192.168.0.212 "mysql -u root -p'Admin@123' yl_data"
关键参数说明:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
--single-transaction:对 InnoDB 表做一致性快照,避免锁表(但 MyISAM 表仍会锁) -
--routines和--triggers:否则存储过程、函数、触发器全丢 - 密码必须写在
-p后紧贴,不能空格分隔,否则管道会卡在交互式输密环节 - 目标端
mysql命令必须提前建好空库yl_data,且字符集要与源库一致(建议统一为utf8mb4)
实际跑不通的常见报错和解法
管道迁移失败,90% 出在以下三个环节:
- SSH 登录被拒:
Permission denied (publickey)→ 先用ssh-copy-id server@192.168.0.212配好密钥登录,别依赖密码交互 - 字符集错乱:
ERROR 1366 (HY000) at line XXX: Incorrect string value→ 在两端都加--default-character-set=utf8mb4参数 - GTID 冲突(源库开了
gtid_mode=ON):ERROR 3546 (HY000) at line XXX: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty→ 目标库执行RESET MASTER;清空 GTID 集合后再导入
大库(>1GB)必须加的优化项
纯管道对网络抖动和内存很敏感,超时或 OOM 会导致半截导入。务必加:
- 本地导出侧加
--max-allowed-packet=512M,防止 mysqldump 自身切包失败 - 远程导入侧在目标
/etc/my.cnf的[mysqld]段加max_allowed_packet = 512M,并重启mysqld - 用
pv查看实时进度(先apt install pv或yum install pv):mysqldump ... yl_data | pv -s $(du -sb yl_data.sql | awk '{print $1}') | ssh ... "mysql ..."
真正麻烦的不是命令本身,而是两边 MySQL 实例的隐性状态——字符集、SQL mode、GTID 开关、默认引擎——这些不会出现在管道里,但会决定导入后查出来的数据对不对。










