导出一致性数据应优先用--single-transaction而非--lock-tables,它基于MVCC快照实现无锁一致导出,但仅适用于InnoDB表且要求REPEATABLE READ隔离级别。

mysqldump 导出时加 --single-transaction 还是 --lock-tables?
导出一致性数据,mysqldump 默认用 --lock-tables(锁全库),对线上写入影响大;高并发场景必须换 --single-transaction,它靠 MVCC 快照保证一致性,不锁表。
但注意:只有 InnoDB 表才支持 --single-transaction,MyISAM 表会退化成表锁;且该参数要求事务隔离级别至少为 REPEATABLE READ(默认就是)。
- 导出前先确认引擎:
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_db'; - 混合引擎库建议显式加
--skip-lock-tables+--single-transaction,避免 mysqldump 自动降级 - 如果导出中途报错
Cannot execute statement: binlog logging is disabled,说明开启了binlog_format=STATEMENT且事务中含不安全语句,可临时加--set-gtid-purged=OFF
mysql 命令导入 SQL 文件为什么卡住没反应?
mysql 命令本身不显示进度,大文件导入时看起来像卡死,其实是正在读取并执行——尤其当 SQL 文件含大量 INSERT 或未禁用自动提交时,性能极低。
真实瓶颈常在客户端缓冲和事务提交频率,不是网络或磁盘。
- 导入前加
--force避免单条语句失败中断整个流程 - 用
mysql --local-infile=1开启本地文件加载(配合LOAD DATA LOCAL INFILE可快 5–10 倍) - 大文件务必加
--init-command="SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;",最后再手动COMMIT和恢复检查 - 别用重定向
mysql db ,改用 <code>mysql db -e "source /path/to/file.sql"更可控(尤其含中文路径时)
如何用 shell 包装 mysqldump + mysql 实现带时间戳的自动备份还原?
手动拼接命令容易漏参数、路径出错、权限不对,核心是把数据库连接信息抽离,时间戳格式统一,且还原时要跳过 CREATE DATABASE 冲突。
关键不是“写个脚本”,而是控制好三件事:连接复用、SQL 头部清理、错误传播。
- 导出命令推荐:
mysqldump --no-create-db --databases $DB_NAME --single-transaction --routines --triggers > backup_$(date +\%Y\%m\%d_\%H\%M).sql - 还原前用
sed -i '/^CREATE DATABASE/d' backup_*.sql删除建库语句(否则还原到已有库会报错) - 包装脚本里用
set -e确保任意步骤失败立即退出,别让mysqldump出错后还继续执行mysql - 密码别硬编码,用
~/.my.cnf配置文件,权限设为600,内容包含[client]\nuser=xxx\npassword=xxx
还原时报错 ERROR 1046 (3D000): No database selected 怎么办?
这个错不是数据库不存在,而是 SQL 文件里没有 USE db_name;,或 mysqldump 导出时没加 --databases 参数导致头部缺失库选择指令。
最直接解法是还原时显式指定库名,而不是依赖 SQL 文件里的 USE 语句。
- 正确还原姿势:
mysql -D target_db (<code>-D指定默认库,比USE更可靠) - 如果 SQL 文件是多库导出(含
CREATE DATABASE),还原前必须确保目标库已存在,或加--force忽略建库失败 - 用
head -20 backup.sql快速确认文件开头是否有USE `xxx`;或CREATE DATABASE,没有就别指望自动切换库
真正难的不是命令怎么写,是搞清每条参数在什么存储引擎、什么 binlog 模式、什么字符集下会静默失效。比如 --single-transaction 在 RDS 上可能被策略限制,LOAD DATA LOCAL INFILE 在新版 MySQL 客户端默认关闭——这些细节不查文档,光靠试错会浪费一整天。










