mysqldump导出mysql数据库需注意权限、锁表、字符集、多库/排除表、超时处理及压缩恢复:必须有select权限;默认flush tables with read lock会阻塞写入;推荐--single-transaction(innodb)和--default-character-set=utf8mb4;--databases支持多库并自动建库语句,--ignore-table仅单库生效且须db.table格式;max_allowed_packet过小导致2013错误,可加大并加--skip-lock-tables;gzip压缩率70%–90%,恢复需先gunzip再导入。

导出单个 MySQL 数据库用 mysqldump 最稳
直接跑命令就能导出,但必须确保当前用户有对应数据库的 SELECT 权限,否则会卡在“Access denied”错误里。默认不加参数时,mysqldump 会锁表(FLUSH TABLES WITH READ LOCK),如果数据库正在写入,可能阻塞业务几秒到几十秒。
推荐基础写法:
mysqldump -u root -p myapp_db > myapp_db.sql
执行后会提示输入密码,不是明文写在命令里——这是安全底线。如果想免交互,用配置文件(~/.my.cnf)存凭证,别用 -ppassword 这种写法,进程列表里一眼就暴露密码。
-
-u和-p之间**不能有空格**,-p password是错的,-ppassword才对(但依然不推荐) - 导出大库(>1GB)时加
--single-transaction,避免锁表,前提是引擎是 InnoDB - 如果目标库含中文或 emoji,务必加
--default-character-set=utf8mb4,否则恢复时可能乱码
导出多个库或排除某些库怎么写
用 --databases 参数可以一次导出多个库,每个库名之间用空格分隔;而 --ignore-table 可跳过指定表(比如日志表),但注意它**只支持单库模式下生效**,多库时得手动拆。
导出 shop_db 和 user_db:
mysqldump -u root -p --databases shop_db user_db > two_dbs.sql
只导 shop_db,但跳过它的 shop_log 表:
mysqldump -u root -p shop_db --ignore-table=shop_db.shop_log > shop_no_log.sql
-
--databases会让 dump 文件里自动带CREATE DATABASE语句,恢复时不用提前建库 -
--ignore-table必须写成db_name.table_name格式,漏掉库名会报错Unknown table - 想排除系统库(
information_schema等)?mysqldump默认就不导它们,不用额外过滤
导出时遇到 “Got error: 2013: Lost connection” 怎么办
这通常不是网络断了,而是 MySQL 服务端主动断开——因为查询超时、内存不足,或 max_allowed_packet 太小,撑不住大结果集。尤其导出含长文本、BLOB 字段的表时高频出现。
- 先查服务端设置:
mysql -u root -p -e "SHOW VARIABLES LIKE 'max_allowed_packet';" - 导出时加大限制:
mysqldump -u root -p --max-allowed-packet=512M myapp_db > dump.sql - 如果还断,加
--skip-lock-tables避免锁等待,但要接受非一致性快照(主从延迟大的时候慎用) - 极端情况(如磁盘 IO 拖垮 mysqldump 进程),改用
--tab模式生成 CSV,再拼 SQL,不过这已经脱离纯 dump 场景了
gzip 压缩导出文件能省多少空间
文本型 SQL 导出文件压缩率普遍在 70%–90%,10GB 的库压完常剩 1–3GB。关键是压缩过程不占 MySQL 资源,只吃本地 CPU 和磁盘 IO,适合夜间批量操作。
一行搞定压缩导出:
mysqldump -u root -p myapp_db | gzip > myapp_db.sql.gz
- 恢复时不能直接
mysql -u root -p myapp_db ,得先解压或用 <code>zcat:zcat myapp_db.sql.gz | mysql -u root -p myapp_db - 如果导出中途 Ctrl+C,.gz 文件大概率损坏,用
gzip -t myapp_db.sql.gz快速验证完整性 - 别对
.sql.gz再套 zip 或 tar——徒增解包步骤,没实际收益
真正麻烦的是跨版本恢复:MySQL 5.7 导出的文件,在 8.0 上恢复可能因默认认证插件或保留字变化失败,这时候光靠 mysqldump 不够,得看 mysqldump --help 里 --set-gtid-purged 和 --compatibility 的组合用法。










