线上业务库不能停写且需备份一致性时,优先用--single-transaction(仅innodb有效);含myisam则改用--lock-all-tables并注意导出存储过程、事件及sql模式,大库建议mydumper或xtrabackup。

mysqldump 导出时加 --single-transaction 还是 --lock-all-tables
线上业务库不能停写,又得保证备份一致性,--single-transaction 是默认首选,但它只对 InnoDB 有效。如果库中混有 MyISAM 表,导出期间其他连接仍可写 MyISAM 表,导致备份不一致。
- 确认引擎类型:
SELECT table_name, engine FROM information_schema.tables WHERE table_schema = 'your_db'; - 纯 InnoDB:用
--single-transaction,无锁,适合大库 - 含 MyISAM 或需强一致性:改用
--lock-all-tables,会全局只读,业务写入短暂阻塞 - 别漏加
--routines和--events,否则存储过程和事件不会导出
跨服务器恢复时 mysql 命令报错 ERROR 1045 (28000): Access denied
不是密码错了,而是目标 MySQL 实例没开远程权限或本地 socket 路径不对。本地恢复用 mysql -u root -p 没问题,但跨服务器导入常走 TCP,容易卡在认证环节。
- 检查目标库是否允许远程登录:
SELECT host, user FROM mysql.user WHERE user = 'root';,若只有localhost,需执行GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'xxx'; FLUSH PRIVILEGES; - 导入命令别写成
mysql -h 192.168.x.x -u root -p —— 重定向 <code> 在远程连接下不可靠,改用 <code>mysql -h 192.168.x.x -u root -p -e "source /path/to/backup.sql"或先 scp 再本地执行 - 注意字符集:导出时加
--default-character-set=utf8mb4,导入前确认目标库character_set_database是utf8mb4,否则中文变 ?
大表迁移卡住、超时或中断后怎么续传
单 SQL 文件 > 1GB 时,mysql 客户端容易因 max_allowed_packet 或网络抖动失败,且无法断点续传。直接拆分不如换策略。
- 导出阶段就分表:
mysqldump -u user -p db_name table1 table2 > tables.sql,避免单文件过大 - 用
--skip-triggers --skip-routines先导数据,再单独导对象,降低单次负担 - 真正卡死的场景(如 100GB+ 单表),放弃 mysqldump,改用
mydumper(多线程)或物理拷贝(rsync + xtrabackup),后者要求源目标 MySQL 版本、配置、目录结构高度一致 - 别信“加
--compress就能提速”——压缩由客户端做,反而增加 CPU 开销,千兆内网通常关掉更稳
恢复后发现自增 ID 错乱、时间戳全变成 0000-00-00
这不是数据丢了,是 SQL 文件里没带 SET SQL_MODE 上下文,MySQL 用默认宽松模式解析,把非法时间、空字符串当 0 处理。
- 导出时显式指定 SQL 模式:
mysqldump --sql-mode="STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE" ... - 恢复前手动执行:
SET SQL_MODE='STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';,再 source - 自增 ID 偏移常见于从低版本(5.6)导出、高版本(8.0)导入,因为
AUTO_INCREMENT行为变化;用SHOW CREATE TABLE核对建表语句里的AUTO_INCREMENT=xxx是否被保留 - 如果用了 GTID,记得导出时加
--set-gtid-purged=OFF,否则恢复时可能报GTID_PURGED can only be set when the server is not using GTID
实际跨服务器搬迁最耗时间的从来不是 dump 或 restore,而是校验。表行数对得上不代表数据对得上,CHECKSUM TABLE 只在同版本间可靠,异构环境建议抽样比对关键字段 MD5,或者用 pt-table-checksum(Perl 工具,需额外部署)。









