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. 权限最小化 :备份账号仅授予 SELECT、RELOAD、LOCK 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 进程对数据目录有读写权限,备份文件路径可访问。
相关推荐
数据库小学妹3 分钟前
OLAP数据库怎么选、怎么优化?路线、提速与边界
运维·数据库·后端
织码weavecodes12 分钟前
新闻资讯模块设计:内容发布、阅读计数与附件鉴权
java·服务器·数据库
小羊没烦恼!22 分钟前
分布式事务 | 使用DTM 的Saga 模式
java·linux·运维·数据库·wpf
这个DBA有点耶22 分钟前
备份成功≠数据可恢复:静默损坏会让物理备份把坏页一起带走
数据库·mysql·代码规范
数据库小学妹25 分钟前
MySQL MDL锁等待排查:DDL卡住与长事务定位
数据库·后端·mysql
Thneonl35 分钟前
ClickHouse UPDATE:一秒返回,三小时才生效
数据库·后端
SelectDB1 小时前
特征导出卡在 JDBC 上,我换成了 Arrow Flight SQL 试试
大数据·数据库·数据分析
一只旭宝1 小时前
【网络精讲6】muduo 的组件与接口:可视化了解muduo库
网络·数据库
泡海椒1 小时前
深度解析JQuick-SQL SQL解析与AST生成机制|分布式SQL原理
数据库·分布式·sql
SelectDB1 小时前
订单表改成实时更新后,我把主键模型的坑踩了一遍
大数据·数据库·数据分析