Mysql数据库备份与恢复笔记

MySQL 数据库备份与恢复笔记

一、备份的核心概念

  • 备份目的:防止数据丢失、灾难恢复、数据迁移、审计与分析。
  • 备份类型
    • 冷备份:数据库停机时备份,一致性高但影响业务。
    • 热备份:数据库运行中备份,不影响业务,是生产环境主流选择。
    • 逻辑备份:导出 SQL 语句 / 数据,文件小、可跨平台,但恢复速度慢。
    • 物理备份:直接拷贝数据文件,速度快,但平台兼容性差。

二、常用备份工具与方法

1. mysqldump(逻辑备份,官方推荐)

适用场景
  • 中小型数据库、数据迁移、单库 / 单表备份。
  • 支持全量备份与部分数据备份。
常用命令

bash

运行

复制代码
# 全量备份所有数据库
mysqldump -u[用户名] -p --all-databases > all_databases_$(date +%Y%m%d).sql

# 备份指定数据库
mysqldump -u[用户名] -p [数据库名] > [数据库名]_$(date +%Y%m%d).sql

# 备份指定数据库中的单张表
mysqldump -u[用户名] -p [数据库名] [表名] > [表名]_$(date +%Y%m%d).sql

# 备份时添加库创建语句(避免恢复时手动建库)
mysqldump -u[用户名] -p --databases [数据库名] > [数据库名]_with_create.sql
关键参数
  • --databases:显式包含 CREATE DATABASE 语句,恢复时无需手动建库。
  • --single-transaction:对 InnoDB 引擎做一致性热备份,不锁表。
  • --lock-tables:对 MyISAM 引擎锁表备份,保证一致性。
  • --routines --triggers --events:同时备份存储过程、触发器、事件。

2. 物理备份(冷备份)

适用场景
  • 大型数据库、需要快速恢复、同版本 / 同平台迁移。
  • 数据库必须停机或处于只读状态。
操作步骤
  1. 停止 MySQL 服务: bash

    运行

    复制代码
    systemctl stop mysqld
  2. 拷贝数据目录(默认路径 /var/lib/mysql):

    bash

    运行

    复制代码
    cp -r /var/lib/mysql /backup/mysql_data_$(date +%Y%m%d)
  3. 启动 MySQL 服务: bash

    运行

    复制代码
    systemctl start mysqld

3. xtrabackup(物理热备份,Percona 工具)

适用场景
  • 生产环境大型数据库,支持在线热备份、增量备份,速度远快于 mysqldump。
  • 仅支持 InnoDB/XtraDB 引擎。
核心命令

bash

运行

复制代码
# 全量备份
xtrabackup --user=[用户名] --password=[密码] --backup --target-dir=/backup/full_$(date +%Y%m%d)

# 增量备份(基于全量备份)
xtrabackup --user=[用户名] --password=[密码] --backup --incremental-basedir=/backup/full_20260330 --target-dir=/backup/incr_$(date +%Y%m%d)

# 准备备份(合并增量数据,使备份可恢复)
xtrabackup --prepare --target-dir=/backup/full_20260330
xtrabackup --prepare --target-dir=/backup/full_20260330 --incremental-dir=/backup/incr_20260330

三、数据恢复方法

1. mysqldump 备份恢复

全库 / 单库恢复

bash

运行

复制代码
# 恢复所有数据库(需先停止业务,避免数据冲突)
mysql -u[用户名] -p < all_databases_20260330.sql

# 恢复指定数据库(备份文件含 --databases 时)
mysql -u[用户名] -p < [数据库名]_with_create.sql

# 恢复指定数据库(备份文件不含 --databases,需先手动建库)
mysql -u[用户名] -p -e "CREATE DATABASE IF NOT EXISTS [数据库名];"
mysql -u[用户名] -p [数据库名] < [数据库名]_20260330.sql
单表恢复

bash

运行

复制代码
# 先导入到临时库,再导出单表到目标库
mysql -u[用户名] -p temp_db < [表名]_20260330.sql
mysqldump -u[用户名] -p temp_db [表名] | mysql -u[用户名] -p target_db

2. 物理备份恢复

  1. 停止 MySQL 服务: bash

    运行

    复制代码
    systemctl stop mysqld
  2. 清空原数据目录(务必先备份原数据! ):

    bash

    运行

    复制代码
    rm -rf /var/lib/mysql/*
  3. 拷贝备份数据到原目录: bash

    运行

    复制代码
    cp -r /backup/mysql_data_20260330/* /var/lib/mysql/
  4. 修正权限: bash

    运行

    复制代码
    chown -R mysql:mysql /var/lib/mysql
  5. 启动 MySQL 服务: bash

    运行

    复制代码
    systemctl start mysqld

3. xtrabackup 备份恢复

bash

运行

复制代码
# 停止 MySQL 服务
systemctl stop mysqld

# 清空原数据目录
rm -rf /var/lib/mysql/*

# 拷贝准备好的备份数据到原目录
cp -r /backup/full_20260330/* /var/lib/mysql/

# 修正权限
chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL 服务
systemctl start mysqld

四、备份与恢复最佳实践

  1. 定期备份:生产环境建议每日全量备份 + 每小时增量备份。

  2. 异地存储:备份文件不要和数据库存放在同一服务器,避免机房故障。

  3. 自动验证:定期执行恢复测试,确保备份文件可用。

  4. 权限最小化 :备份账号仅授予 SELECTRELOADLOCK TABLES 等必要权限。

  5. 压缩备份 :备份后用 gzip/xz 压缩,节省存储空间:

    bash

    运行

    复制代码
    mysqldump -u[用户名] -p [数据库名] | gzip > [数据库名]_$(date +%Y%m%d).sql.gz

    恢复时:

    bash

    运行

    复制代码
    gunzip < [数据库名]_20260330.sql.gz | mysql -u[用户名] -p [数据库名]

五、常见问题排查

  • 报错 Table 'xxx' doesn't exist
    • 检查备份文件是否包含该表,或恢复时库名 / 表名拼写错误。
    • 确认备份文件执行时是否有语法错误(可查看 MySQL 日志)。
  • 恢复缓慢
    • 大库恢复建议关闭二进制日志(set sql_log_bin=0),提升速度。
    • 调整 innodb_buffer_pool_size 等参数优化 I/O。
  • 权限问题
    • 确保 MySQL 进程对数据目录有读写权限,备份文件路径可访问。
相关推荐
qq_401700414 小时前
Qt QUrl 详解与代码示例
开发语言·数据库·qt
程序员阿鹏5 小时前
如何实现MySQL分库分表?
数据结构·数据库·sql·mysql·缓存
风哥2号5 小时前
数据库教程FGMT33‑MySQL主从复制项目实施与维护06(MySQL8.4/9.7 MGR组复制)
数据库·mysql
liangsheng_g5 小时前
Spring事务传播行为分派与挂起恢复源码实战
数据库·sql·spring
sunoo-2295 小时前
【51单片机实战】温控下位机完整实现:DS18B20采集 + 自定义二进制串口协议 + PWM声光告
笔记·学习·51单片机·串口
蓝速科技6 小时前
信创终端 POC 测试实战与选型避坑指南丨蓝速科技
运维·数据库·人工智能·科技·自然语言处理
风哥2号6 小时前
数据库教程FGMT29‑Linux平台MySQL5.7安装配置与管理入门
数据库
杨云龙UP6 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
问心无愧05136 小时前
ctfshow web179,180
笔记
Persistent的粽子!7 小时前
C++的内存管理
c++·经验分享·笔记