mysqldump是mysql官方唯一可靠导出完整sql脚本的工具,图形界面底层均调用它;仅用mysqldump -u root -p mydb > backup.sql会遗漏字符集、事务一致性、存储过程、事件、触发器、二进制字段等关键参数,导致还原失败。

mysqldump 是唯一能可靠导出完整 SQL 脚本的官方工具,图形界面(如 Workbench、phpMyAdmin)底层调用的也是它,只是封装了选项。别指望“一键全量导出”能自动覆盖所有边界场景——权限、字符集、存储引擎、时区、GTID 状态都得手动对齐。
导出命令必须加的关键参数
只写 mysqldump -u root -p mydb > backup.sql 会漏掉大量关键信息,还原时大概率失败:
-
--default-character-set=utf8mb4:不加的话,如果库用的是utf8mb4,导出可能降级成latin1,中文变乱码 -
--single-transaction:InnoDB 表必备,保证导出时数据一致性;但 MyISAM 表不支持,会自动退化为全局锁 -
--routines:不加就丢掉存储过程、函数、触发器 -
--events:调度事件(event scheduler)默认不导出 -
--triggers:触发器默认不导出(即使--routines已启用) -
--hex-blob:二进制字段(如BLOB、UUID)不加这个,导出后可能被截断或转义错误
导出所有数据库但排除系统库
--all-databases 看似省事,但它会把 mysql、information_schema、performance_schema、sys 全部打包进去。其中 mysql 库含用户权限,直接还原会覆盖目标实例的账号体系,非常危险。
安全做法是显式列出业务库:
mysqldump -u root -p --default-character-set=utf8mb4 \ --single-transaction --routines --events --triggers --hex-blob \ db1 db2 db3 > full_backup_$(date +%Y%m%d_%H%M).sql
或者用脚本动态生成库名列表(排除系统库):
mysql -N -s -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');" | \
xargs mysqldump -u root -p --default-character-set=utf8mb4 --single-transaction --routines --events --triggers --hex-blob \
> full_backup.sql
导出时遇到 Access denied 错误怎么办
常见报错:mysqldump: Got error: 1045: Access denied for user 'xxx'@'localhost' (using password: YES) when trying to connect
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
这不是密码错了,而是账户缺少必要权限。一个最小可用权限组合是:
-
SELECT(所有要导出的库/表) -
LOCK TABLES(--single-transaction不需要,但其他模式需要) -
SHOW VIEW(导出视图定义) -
TRIGGER(导出触发器) -
EVENT(导出事件) -
USAGE(连接权限,总是需要)
执行一次授权即可:
GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, EVENT ON `mydb`.* TO 'backup_user'@'localhost';
注意:LOCK TABLES 是全局权限,不能按库授予;如果不用 --single-transaction,就必须有它。
导出大库时卡住或超时
不是网络问题,而是 MySQL 服务端主动中断了长时间连接。需同步调整客户端和服务端两处设置:
- 客户端加
--net-buffer-length=1000000和--max-allowed-packet=512M - 服务端确认
max_allowed_packet≥ 客户端值(建议设为 1G) - 服务端确认
wait_timeout和interactive_timeout≥ 3600(1 小时) - 避免在高负载时段执行,尤其是带
--lock-tables的模式
导出 100GB+ 库时,建议拆成单表导出并行跑,比单进程快得多:
mysql -N -s -e "SELECT CONCAT('mysqldump -u root -p --no-create-info ', DATABASE(), ' ', TABLE_NAME, ' > ', DATABASE(), '_', TABLE_NAME, '.sql') FROM information_schema.TABLES WHERE TABLE_SCHEMA='mydb';" | bash
真正麻烦的从来不是“怎么导”,而是“导出来能不能还原成功”。字符集声明、GTID 模式、SQL_MODE、时区设置、外键约束顺序……这些细节不会报错,但会在还原后悄悄让数据不对或查询失效。每次导出后,至少拿一个空实例试还原一次 CREATE DATABASE + source xxx.sql,比什么都靠谱。










