Skip to content

mysqldump

mysqldump 是MySQL官方提供的逻辑备份工具,用于将数据库结构和数据导出为SQL脚本文件。支持全库备份、单库备份、单表备份,以及选择性备份(仅结构/仅数据)。生成的SQL文件可通过mysql命令重新导入,常用于数据迁移、备份恢复等场景。

mysqldump默认不属与热备,需要增加--single-transaction参数适用于InnoDB支持热备份

语法格式

bash
mysqldump [options] db_name [tbl_name ...]
mysqldump [options] --databases db_name ...
mysqldump [options] --all-databases

选项

选项描述
基本连接选项
--user=user_name, -u user_nameMySQL用户名
--password[=password], -p[password]MySQL密码
--host=host_name, -h host_name连接的主机地址
--port=port_num, -P port_num连接端口号
--socket=path, -S path套接字文件路径
--ssl-mode=modeSSL连接模式(DISABLED/PREFERRED/REQUIRED等)
备份范围控制
--all-databases, -A备份所有数据库
--databases, -B备份多个指定数据库
--ignore-table=db_name.tbl_name排除指定表
--tables覆盖--databases选项,只备份指定表
--where='where_condition', -w 'where_condition'按条件导出数据
输出内容控制
--no-create-db, -n不输出CREATE DATABASE语句
--no-create-info, -t不输出表创建语句
--no-data, -d只导出表结构
--add-drop-database添加DROP DATABASE语句
--add-drop-table添加DROP TABLE语句(默认)
--skip-add-drop-table不添加DROP TABLE语句
--replace使用REPLACE代替INSERT语句
--insert-ignore使用INSERT IGNORE语句
--skip-extended-insert禁用多行INSERT语法
--complete-insert, -c使用完整列名的INSERT语句
--compact精简输出格式
--create-options包含表创建选项
--quote-names, -Q用反引号引用标识符(默认)
--skip-quote-names禁用标识符引用
对象类型控制
--routines, -R包含存储过程和函数
--events, -E包含事件
--triggers包含触发器(默认)
--skip-triggers不包含触发器
--tz-utc添加时区设置(默认)
--skip-tz-utc不添加时区设置
性能优化选项
--single-transaction使用事务保证一致性(InnoDB)
--lock-tables, -l锁定所有表(MyISAM)
--skip-lock-tables不锁定表
--quick, -q不缓存查询结果
--opt等同于--add-drop-table --add-locks --create-options --quick --extended-insert --lock-tables
--skip-opt禁用--opt选项
字符集与编码
--default-character-set=charset设置默认字符集
--set-charset添加SET NAMES语句(默认)
--skip-set-charset不添加SET NAMES语句
--hex-blob十六进制导出BLOB类型
输出格式控制
--tab=dir_name, -T dir_name生成分隔文本文件
--fields-terminated-by=string字段分隔符
--fields-enclosed-by=string字段包围符
--fields-optionally-enclosed-by=string字段可选包围符
--fields-escaped-by=string转义字符
--lines-terminated-by=string行结束符
其他实用选项
--result-file=file_name, -r file_name指定输出文件
--verbose, -v详细模式
--debug-info, -#输出调试信息
--force, -f遇到错误继续执行
--max_allowed_packet=size最大数据包大小
--net_buffer_length=sizeTCP/IP缓冲区大小
--flush-logs, -F备份前刷新日志
--delete-master-logs备份后删除二进制日志
--dump-date添加备份日期注释(默认)
--skip-dump-date不添加日期注释
--compress, -C压缩客户端/服务器协议
--version, -V显示版本信息
--help, -?显示帮助信息

备份案例

bash
# 备份整个数据库(包含结构和数据)
mysqldump -u root -p123456 --databases wordpress > wordpress_backup.sql

# 仅备份表结构
mysqldump -u root -p --no-data --databases inventory > schema_only.sql

# 备份特定表的数据(带条件)
mysqldump -u root -p --where="create_time>'2023-01-01'" sales orders > recent_orders.sql

# 使用事务保证一致性备份
mysqldump -u root -p --single-transaction --quick --all-databases > full_backup.sql

# 压缩备份文件
mysqldump -u root -p --all-databases | gzip > all_dbs.sql.gz

# 完整备份(含存储过程/触发器)
mysqldump -u root -p --single-transaction --routines --triggers --all-databases > full_backup.sql

# 关键参数:
# --single-transaction   # 对InnoDB启用一致性备份
# --master-data=2        # 记录binlog位置(用于主从.1:不注释binlog位置、2注释binlog位置)
# --flush-logs           # 备份前刷新日志
# --skip-add-drop-table  # 避免恢复时先删除表


# 增大网络缓冲区
mysqldump --net_buffer_length=1M ...

# 关闭外键检查
mysqldump --skip-add-drop-table --skip-add-locks --skip-disable-keys ...

# 设置锁等待超时
mysqldump --lock-wait-timeout=30 ...

# 减少内存使用(适合大表)
mysqldump --quick --skip-opt ...

# 标准全库备份(推荐生产环境使用)
mysqldump --user=root --password --host=localhost --port=3306 \
  --single-transaction --routines --events --triggers \
  --opt --flush-logs --master-data=2 \
  --all-databases > full_backup_$(date +%Y%m%d).sql

基础备份脚本

shell
#!/bin/bash

MYSQL_USER="backup_user"
MYSQL_PASS="password"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
BACKUP_DIR="/data/backups/mysql"

DBS=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e"show databases;" 2>/dev/null | grep -Ev "Database|*schema|mysql|sys")

for db in $DBS; do
  mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" -h"$MYSQL_HOST" -P"$MYSQL_PORT" \
  --single-transaction --routines --events --triggers --opt --flush-logs --master-data=2 \
  -B "$db" | gzip > "$BACKUP_DIR/$db"_$(date +%Y_%m_%d_%H_%M).sql.gz
done

恢复数据方法

完整恢复

bash
# 解压后恢复
gunzip < full_backup.sql.gz | mysql -u root -p

# 直接恢复压缩文件(MySQL 5.7+)
mysql -u root -p -e "SET GLOBAL innodb_compression_default=1"
zcat full_backup.sql.gz | mysql -u root -p

恢复单个数据库

bash
# 从完整备份提取特定库
sed -n '/^-- Current Database: `mydb`/,/^-- Current Database: `/p' full_backup.sql > mydb.sql
mysql -u root -p mydb < mydb.sql

恢复特定表

bash
mysql -u root -p mydb < mytable.sql

定时备份脚本示例

shell
#!/bin/bash
BACKUP_DIR="/mysql_backups"
DATE=$(date +%Y%m%d_%H%M)
LOG_FILE="$BACKUP_DIR/backup_$DATE.log"

echo "Backup started at $(date)" >> $LOG_FILE

mysqldump -u backup_user -p'password' \
--single-transaction \
--routines \
--triggers \
--master-data=2 \
--databases important_db | gzip > $BACKUP_DIR/full_$DATE.sql.gz 2>> $LOG_FILE

# 保留最近7天备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete >> $LOG_FILE

echo "Backup completed at $(date)" >> $LOG_FILE

注意事项

  1. 权限要求:执行用户至少需要SELECT权限(表数据)、SHOW VIEW权限(视图)、TRIGGER权限(触发器)
  2. 大表处理:备份大表时建议添加--quick选项避免内存溢出
  3. MyISAM引擎:使用--lock-tables会阻塞整个库的写操作,生产环境建议在低峰期执行
  4. 恢复测试:定期验证备份文件可用性(可通过mysql -e "SOURCE backup.sql"测试)
  5. 密码安全:避免在命令行直接暴露密码,建议使用-p后交互式输入
  6. 版本兼容:高版本mysqldump备份的文件可能不兼容低版本MySQL服务器
  7. 性能影响:生产环境大表备份建议使用--single-transaction --quick组合

常见问题解决方案

问题1:备份时内存不足

现象ERROR 2013 (HY000) at line XXX: Lost connection to MySQL server during query

解决方案

bash
# 使用--quick参数逐行获取数据
mysqldump --quick -u root -p mydb > backup.sql

# 增加超时时间
mysqldump --net_read_timeout=60 --net_write_timeout=120 ...

问题2:大表备份中断

解决方案

bash
# 使用where条件分片备份
mysqldump -u root -p mydb big_table --where="id<1000000" > part1.sql
mysqldump -u root -p mydb big_table --where="id>=1000000" > part2.sql

问题3:GTID一致性警告

现象Warning: (1681, 'GTID cannot work...')

解决方案

bash
# 添加set-gtid-purged参数
mysqldump --set-gtid-purged=OFF -u root -p mydb > backup.sql