MySQL8配置mysqldump逻辑备份

MySQL8配置mysqldump逻辑备份🌘


mysqldump 是 MySQL 自带的一个极其常用的逻辑备份 工具。它的基本原理是将数据库中的数据和结构转换成一系列的 SQL 语句 (如 CREATE TABLEINSERT 等)。

1. 核心特点

  • 逻辑备份 :它备份的是 SQL 指令,而不是物理数据文件(.ibd)。

  • 跨平台/版本:由于是 SQL 文本,你可以把 5.7 版本的备份恢复到 8.0 版本,或者从 Linux 迁移到 Windows。

  • 简单灵活:可以只备份一个表、一个库,或者整个服务器。

  • 恢复成本:对于小数据库非常方便,但对于 TB 级别的大数据库,恢复速度比物理备份(XtraBackup)慢得多。


2. 主要优缺点

维度 优点 缺点
可读性 备份文件是纯文本,可以直接用编辑器打开看。 文件体积相对物理备份较大(压缩前)。
细粒度 能够很方便地只恢复某一个表的数据。 恢复时需要重新构建索引,CPU 和 IO 消耗大。
兼容性 兼容性极强,适合做数据库升级或迁移。 备份大型数据库时,对生产环境的压力持续时间长。
锁表情况 配合 --single-transaction 可实现 InnoDB 的无锁热备 如果有非 InnoDB 表(如 MyISAM),备份时会锁表。

3. mysqldump 的工作流程

  • 连接查询:连接到 MySQL 服务器。

  • 获取结构 :查询表结构(DDL),生成 CREATE TABLE 语句。

  • 读取数据 :将每一行数据读出来,转换成 INSERT 语句。

  • 生成文件 :将这些 SQL 语句写入到 .sql 文件中。


4. 常见的备份场景

  • 日常小规模备份 :数据量在 50G 以下时,mysqldump 是首选。

  • 单表误删找回 :物理备份只能整库恢复,而 mysqldump 允许你只把那张误删的表导入回去。

  • 环境迁移:把生产环境的数据抽出一部分导给开发环境使用。


5. 执行备份

5.1 推荐创建专用备份账号

bash 复制代码
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'StrongPass!';
GRANT SELECT, SHOW VIEW, TRIGGER, EVENT, LOCK TABLES, RELOAD, PROCESS ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;

5.2 准备环境(不在备份命令中明文暴露)

bash 复制代码
[root@localhost ~]# vim /etc/mysql_backup.cnf
[client]
user=root
password=LJFLDskfdjsldkjfl
port=3306                             #根据自己实际端口填写
socket=/var/lib/mysql/mysql.sock      #根据自己实际sock填写

5.3 执行备份

bash 复制代码
[root@localhost ~]# mysqldump --defaults-extra-file=/etc/mysql_backup.cnf \
    --single-transaction \
    --routines \
    --hex-blob \
    --set-gtid-purged=OFF \
    --triggers \
    --events \
    --all-databases \
    --flush-logs \
    --source-data=2 \
   | gzip > "/data/mysql/backup/logical_backup/mysqldump_$(date '+%F_%H-%M-%S').sql.gz"

6. 编写备份脚本

bash 复制代码
[root@localhost ~]#vim  mysqldump_backup.sh 
#!/bin/bash
#
# ==============================================================================
# MySQL 逻辑备份脚本(基于 mysqldump)
# 适用于 MySQL 8.0,支持定时任务
# 作者:Noleaf
# 日期:2025-12-31
# ==============================================================================

set -euo pipefail

#=============================变量定义==========================================

# 时间戳
Timestamp=$(date '+%F_%H-%M-%S')

# 备份根目录
BACKUP_BASE=/data/mysql8/backup/mysqldump_backup

# 备份文件名称
BACKUP_NAME="mysqldump_${Timestamp}.sql.gz"

# 日志目录及文件
LOG_DIR=${BACKUP_BASE}/logs
LOG_FILE=${LOG_DIR}/mysqldump_${Timestamp}.log

# 保留天数
KEEP_DAYS=30

# MySQL 配置文件(包含用户名和密码)
MYSQL_CNF=/etc/mysql_backup.cnf

#=============================创建目录==========================================

mkdir -p "$BACKUP_BASE" "$LOG_DIR"

echo "========================== mysqldump备份开始于 [$Timestamp] ===================" | tee -a "$LOG_FILE"

#=============================执行备份==========================================
#注意mysqldump路径
if /usr/local/mysql-8.0.44/bin/mysqldump --defaults-extra-file=${MYSQL_CNF} \
    --single-transaction \
    --routines \
    --hex-blob \
    --set-gtid-purged=OFF \
    --triggers \
    --events \
    --all-databases \
    --flush-logs \
    --source-data=2 \
    | gzip > "${BACKUP_BASE}/${BACKUP_NAME}"; then
    echo "Success: mysqldump备份成功!文件: ${BACKUP_BASE}/${BACKUP_NAME}" | tee -a "$LOG_FILE"
else
    echo "ERROR: mysqldump备份失败!请检查日志 ${LOG_FILE}" | tee -a "$LOG_FILE"
    exit 1
fi

#=============================清理旧备份==========================================

echo "正在清理 $KEEP_DAYS 天之前的旧备份..." | tee -a "$LOG_FILE"
find "${BACKUP_BASE}" -maxdepth 1 -type f -name "mysqldump_*.sql.gz" -mtime +${KEEP_DAYS} -exec rm -f {} \;
find "${LOG_DIR}" -maxdepth 1 -type f -name "mysqldump_*.log" -mtime +${KEEP_DAYS} -exec rm -f {} \;

#=============================统计数据简报========================================

BACKUP_SIZE=$(du -sh "${BACKUP_BASE}/${BACKUP_NAME}" | cut -f1)
echo "本次mysqldump备份大小:${BACKUP_SIZE}" | tee -a "$LOG_FILE"

echo "=================== mysqldump备份完成于 [$(date '+%F %H:%M:%S')] ===================" | tee -a "$LOG_FILE"

7. MySQL8/GTID 恢复备份流程

7.1 准备环境

  • 确认目标库为 MySQL 8.0 ,并启用了 GTID 模式 (gtid_mode=ON,enforce_gtid_consistency=ON)。

  • 确认目标库已初始化,并有足够磁盘空间。

  • 建议在恢复前关闭业务连接,避免写入冲突。

7.2 解压备份文件

如果备份文件是 .sql.gz 压缩格式,先解压:

bash 复制代码
[root@localhost ~]# gunzip /data/mysql8/backup/mysqldump_backup/mysqldump_2026-01-05_14-30-00.sql.gz

得到解压备份文件:

复制代码
mysqldump_2026-01-05_14-30-00.sql

7.3 执行恢复命令

直接导入 SQL 文件:

bash 复制代码
[root@localhost ~]# mysql --defaults-extra-file=/etc/mysqldump8_backup.cnf < mysqldump_2026-01-05_14-30-00.sql

如果是压缩文件,用管道方式:

bash 复制代码
[root@localhost ~]# gunzip < mysqldump_2026-01-05_14-30-00.sql.gz | mysql --defaults-extra-file=/etc/mysqldump8_backup.cnf

7.4 恢复过程中的注意事项

  • GTID 设置

    • 如果备份文件包含:

      复制代码
      SET @@GLOBAL.gtid_purged='uuid:transaction_id,...';

      在恢复时可能报错。

    • 建议在备份时使用 --set-gtid-purged=OFF,恢复后再根据需要手动设置。

    • 如果必须导入 GTID 集合,需先确认目标库为空库,并执行:

      sql 复制代码
      SET GLOBAL gtid_purged='uuid:transaction_id,...';
  • 外键检查 mysqldump 会自动关闭/开启 FOREIGN_KEY_CHECKS,避免因表顺序导致外键错误。

  • 唯一性检查 大库恢复时可临时关闭:

    sql 复制代码
    SET UNIQUE_CHECKS=0;
    SET FOREIGN_KEY_CHECKS=0;

    导入完成后再开启。

  • 严格模式 MySQL 8 默认开启严格模式,对非法日期(如 0000-00-00)、超长字符串会报错。恢复前可调整:

    sql 复制代码
    SET sql_mode='NO_ENGINE_SUBSTITUTION';
  • 对象属性 MySQL 8 对 DEFINER 用户 要求更严格,如果备份文件中定义的用户不存在,恢复后对象可能无法运行。需提前创建:

    sql 复制代码
    CREATE USER 'definer_user'@'%' IDENTIFIED BY 'password';

7.5 验证恢复结果

  • 检查库和表数量

    sql 复制代码
    SHOW DATABASES;
    SHOW TABLES FROM dbname;
  • 检查数据量

    sql 复制代码
    SELECT COUNT(*) FROM dbname.tablename;
  • 检查对象完整性

    sql 复制代码
    SHOW PROCEDURE STATUS;
    SHOW TRIGGERS;
    SHOW EVENTS;
  • 检查 GTID 集合

    sql 复制代码
    SHOW VARIABLES LIKE 'gtid_executed';

7.6 恢复后的收尾工作

  • 确认 DEFINER 用户 存在,避免存储过程/触发器报错。

  • 如果是主从环境,执行:

    sql 复制代码
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000123', MASTER_LOG_POS=456789, MASTER_AUTO_POSITION=1;
    START SLAVE;

    在 GTID 模式下,推荐使用 MASTER_AUTO_POSITION=1,自动对齐 GTID。

  • 检查日志,确认没有报错或警告。


✅ 总结

MySQL 8 恢复流程的关键点:

  1. 解压备份文件

  2. 导入 SQL 文件

  3. 处理 GTID 设置gtid_purged

  4. 注意严格模式与对象属性

  5. 验证恢复结果(库、表、对象、GTID 集合)

  6. 收尾工作(用户权限、主从复制、日志检查)

相关推荐
ruleslol12 小时前
MySQL 工具使用指南
mysql
爱学java的ptt12 小时前
mysql的存储引擎
数据库·mysql
龘龍龙12 小时前
Python基础学习(十一)
python·学习·mysql
不屈的铝合金12 小时前
SQL 语言概述与数据库核心前置配置了解
数据库·sql·mysql·约束·sql 语句分类·字符集配置·校对规则
萧曵 丶12 小时前
可重复读(Repeatable Read)隔离级别下幻读产生的原因
数据库·sql·mysql
Antoine-zxt13 小时前
MySQL宕机日志迷局破解指南:从前台启动到精准排错
数据库·mysql·adb
·云扬·13 小时前
MySQL运维效率提升:实用SQL语句合集
运维·sql·mysql
剑来.13 小时前
一次完整的 MySQL 性能问题排查思路(线上实战总结)
数据库·mysql·oracle
欢乐的小猪14 小时前
windows10如何安装多个版本mysql
数据库·mysql
Antoine-zxt14 小时前
MySQL数据脱敏技术全解析:从原理到可视化实践
数据库·mysql