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 进程对数据目录有读写权限,备份文件路径可访问。
相关推荐
枕布响丸辣2 小时前
MySQL 数据库备份与恢复全攻略:从基础到实战
数据库·oracle
dgvri2 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
IvorySQL2 小时前
PostgreSQL 技术日报 (3月31日)|五大内核模块补丁评审与问题修复汇总
数据库·postgresql·开源
IvorySQL2 小时前
最后 1 天!HOW 2026 早鸟票收官,赴济南解锁开源数据库未来
数据库·postgresql·开源
PacosonSWJTU2 小时前
(转)mybatis拦截器
数据库·redis·mybatis
yitian_hm2 小时前
HBase 原理深度剖析:从数据模型到存储机制
大数据·数据库·hbase
Anastasiozzzz2 小时前
深入研究RAG: 向量数据库 原理&选型
数据库
Yushan Bai3 小时前
RAC环境数据文件读取异常导致实例重启
数据库·oracle
小猿姐3 小时前
当KubeBlocks遇上国产数据库之Kingbase:让信创数据库“飞得更高”
运维·数据库·云原生