能,但必须加--single-transaction和--master-data=2,否则导出会锁表或位点不准;主库写入不停,mysqldump依赖InnoDB MVCC实现一致性快照,MyISAM表仍会触发全局读锁,需确认业务库全为InnoDB。

从库崩溃但主库正常,还能用 mysqldump 吗?
能,但必须加 --single-transaction 和 --master-data=2,否则导出会锁表或位点不准。主库写入不停,mysqldump 依赖 InnoDB MVCC 实现一致性快照,MyISAM 表仍会触发全局读锁,所以要确认业务库全是 InnoDB。
常见错误是漏掉 --master-data=2,导致 dump 文件里没有注释形式的 CHANGE MASTER TO 语句,重建时得手动查 SHOW MASTER STATUS —— 可问题在于:dump 过程中主库 binlog 一直在滚动,你查到的 File/Position 已不是 dump 对应的那个点。
-
mysqldump --single-transaction --master-data=2 --databases db1 db2 > backup.sql是底线命令 - 导出后立刻执行
UNLOCK TABLES;(如果之前手动加了FLUSH TABLES WITH READ LOCK) - 别用
--all-databases,它会把mysql系统库也导出,GTID 模式下可能带入旧gtid_executed,引发复制拒绝
GTID 模式下重建,为什么不能直接 START SLAVE?
因为从库本地 gtid_executed 和主库不一致,且 gtid_purged 缺失关键区间。即使你用了 --set-gtid-purged=ON 导出,导入后从库的 gtid_purged 仍是空的,START SLAVE 会报 ERROR 1872 或卡在 Retrieved_Gtid_Set 为空。
必须显式同步 gtid_purged:先在主库执行 SHOW MASTER STATUS,拿到 Executed_Gtid_Set 值;再在从库停复制后执行:
STOP SLAVE;<br>RESET MASTER;<br>SET GLOBAL gtid_purged = 'xxx-xxx-xxx:1-1000';<br>CHANGE MASTER TO MASTER_HOST='x.x.x.x', MASTER_USER='repl', MASTER_PASSWORD='xxx', MASTER_AUTO_POSITION=1;<br>START SLAVE;
注意:RESET MASTER 会清空本地所有 binlog,仅限从库执行——主库绝不能跑这条。
数据量大时,mysqldump 太慢,有更快的物理方案吗?
有,MySQL 8.0.17+ 原生 CLONE INSTANCE 插件是最优解,5 分钟内完成 TB 级克隆,且自动对齐 GTID、跳过系统表冲突。前提是主从都装了 clone 插件,并开通 BACKUP_ADMIN 权限。
操作分两步:主库创建克隆用户,从库执行拉取。容易踩的坑是网络不通或 SELinux 拦截端口(默认用 3306 + 1,即 3307),以及从库磁盘空间不足(克隆过程需要双倍空间临时存放)。
- 主库:
INSTALL PLUGIN clone SONAME 'mysql_clone.so'; CREATE USER 'clone_user'@'%' IDENTIFIED BY 'pwd'; GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%'; - 从库:先停复制
STOP REPLICA;,再执行CLONE INSTANCE FROM 'clone_user'@'主库IP':3306; - 克隆完成后,MySQL 自动重启服务,无需手动
START REPLICA—— 它已内置恢复逻辑
重建后复制启动了,但 Seconds_Behind_Master 一直是 NULL
这不是延迟,而是 SQL 线程根本没跑。典型原因是 Slave_SQL_Running 显示 No,但 Last_SQL_Error 被日志轮转覆盖了。立刻执行 SHOW SLAVE STATUS\G,重点看 Seconds_Behind_Master 字段值本身 —— 如果是 NULL,说明 SQL 线程未启动;如果是数字,才代表真实延迟。
更隐蔽的问题是 replica_parallel_type 配置不一致:主库设了 LOGICAL_CLOCK,从库还是默认 DATABASE,会导致 SQL 线程静默卡住。检查方式:SELECT @@replica_parallel_type;,两边必须一致。
另一个常被忽略的点:从库 read_only=ON 时,某些内部操作(如 GTID 初始化)会被拦截,表现为 START REPLICA 无反应。临时关掉:SET GLOBAL read_only = OFF;,等复制跑起来再开。


















