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 进程对数据目录有读写权限,备份文件路径可访问。
相关推荐
ybwycx几秒前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
你觉得脆皮鸡好吃吗几秒前
SQL注入总概述
数据库·sql·网络安全学习
2301_81527952几秒前
golang如何编译iOS库_golang编译iOS库实践
jvm·数据库·python
深蓝海拓1 分钟前
基于QtPy (PySide6) 的PLC-HMI工程项目(十一)框架的进一步完善:UI的自动周期更新以及下行数据的生成和处理
网络·笔记·python·学习·ui·plc
2402_854808372 分钟前
C#怎么开发CAD自定义命令_C#如何调用AutoCAD的API【教程】
jvm·数据库·python
lkbhua莱克瓦244 分钟前
记单词功能深度优化项目 - 业务需求开发文档(BRD+技术拆分版)
笔记
m0_716430074 分钟前
mysql乐观锁更新失败如何处理_应用层重试逻辑编写建议
jvm·数据库·python
qq_654366985 分钟前
SQL嵌套查询中的变量传值_优化存储过程逻辑
jvm·数据库·python
Austindatabases5 分钟前
阿里云MongoDB 部署安全吗? 多可用区怎么搞?
数据库·安全·mongodb·阿里云·云计算
m0_748920368 分钟前
持久化存储如何与后端接口同步?解决本地缓存与数据库不一致痛点
jvm·数据库·python