Mysql 数据库与恢复

一、备份核心概念与分类

(一)按备份方式划分

  1. 逻辑备份

导出数据库的SQL语句、表结构和数据,生成可读的SQL文件,不直接复制数据文件。

优点:跨平台、跨MySQL版本兼容性强,文件体积小,可读性高,可编辑修改;

缺点:备份与恢复速度较慢,大数据量场景效率低,适合中小型数据库。

代表工具:mysqldump、mysqlpump。

  1. 物理备份

直接复制MySQL的数据文件、日志文件等底层文件,相当于文件镜像拷贝。

优点:备份、恢复速度极快,适合大型数据库和生产环境高并发场景;

缺点:兼容性差,依赖MySQL版本和存储引擎,文件不可直接编辑,需专业工具操作。

代表工具:Percona XtraBackup、mysqlbackup。

(二)按备份状态划分

  1. 冷备份

关闭MySQL服务后进行备份,数据一致性最高,操作简单,但会导致业务停机,生产环境极少使用。

  1. 温备份

数据库运行中备份,会对表加读锁,阻塞数据写入,影响业务正常运行,仅适合低并发场景。

  1. 热备份

数据库正常对外提供服务时备份,无锁或低锁机制,不影响业务读写,是生产环境首选方式。

(三)按备份数据范围划分

  1. 全量备份

备份整个数据库的所有数据和结构,是备份的基础,恢复时只需最新全量文件。

优点:恢复简单快捷;缺点:备份耗时久、占用存储空间大。

  1. 增量备份

仅备份自上一次全量或增量备份后变更的数据,依赖二进制日志(binlog)实现。

优点:备份速度快、占用空间小;缺点:恢复需按顺序叠加全量+增量文件,操作复杂。

  1. 差异备份

备份自上一次全量备份后所有变更的数据,介于全量和增量之间,恢复比增量简单。

二、常用备份工具实操

(一)mysqldump(逻辑备份,官方自带)

  1. 核心参数
  • -u :数据库用户名

  • -p :数据库密码

  • -h :数据库主机地址

  • --databases :指定备份多个数据库

  • --single-transaction :针对InnoDB引擎,实现热备份,保证数据一致性,不锁表

  • --lock-tables=false :关闭表锁,配合InnoDB使用

  • --default-character-set=utf8mb4 :指定字符集

  • > 备份文件路径.sql :导出备份文件

  1. 常用备份命令
  • 备份单个数据库

bash

mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 test_db > /backup/test_db_$(date +%Y%m%d).sql

  • 备份多个数据库

bash

mysqldump -u root -p --single-transaction --databases db1 db2 > /backup/multi_db_$(date +%Y%m%d).sql

  • 备份所有数据库

bash

mysqldump -u root -p --single-transaction --all-databases > /backup/all_db_$(date +%Y%m%d).sql

  • 备份单张表

bash

mysqldump -u root -p --single-transaction test_db test_table > /backup/test_db_test_table_$(date +%Y%m%d).sql

(二)Percona XtraBackup(物理备份,生产推荐)

  1. 核心优势

支持InnoDB热备份,无锁、速度快,支持全量+增量备份,适合大数据量场景。

  1. 全量备份命令

bash

xtrabackup --user=root --password=123456 --backup --target-dir=/backup/full_$(date +%Y%m%d)

  1. 增量备份命令(基于全量备份)

bash

xtrabackup --user=root --password=123456 --backup --incremental-basedir=/backup/full_20240520 --target-dir=/backup/incr_$(date +%Y%m%d)

(三)binlog日志备份(增量备份核心)

binlog是MySQL二进制日志,记录所有数据增删改操作,用于实现时间点恢复(PITR),必须开启。

  1. 开启binlog

修改MySQL配置文件 my.cnf ,添加以下配置后重启服务:

ini

mysqld

log_bin=mysql-bin

binlog_format=ROW

server_id=1

expire_logs_days=7 # 日志自动清理天数

  1. 查看binlog日志

sql

SHOW BINARY LOGS; # 查看所有binlog文件

SHOW MASTER STATUS; # 查看当前正在写入的binlog

  1. 备份binlog日志

bash

cp /var/lib/mysql/mysql-bin.* /backup/binlog/

三、数据库恢复实操

(一)mysqldump备份文件恢复

  1. 命令行恢复

bash

mysql -u root -< /backup/test_db_20240520.sql

  1. MySQL客户端内恢复

sql

USE test_db;

SOURCE /backup/test_db_20240520.sql;

(二)物理备份(XtraBackup)恢复

  1. 准备备份文件(修复数据一致性)

bash

xtrabackup --prepare --target-dir=/backup/full_20240520

  1. 停止MySQL服务,清空数据目录

bash

systemctl stop mysqld

rm -rf /var/lib/mysql/*

  1. 恢复数据

bash

xtrabackup --copy-back --target-dir=/backup/full_20240520

  1. 修改文件权限,启动MySQL

bash

chown -R mysql:mysql /var/lib/mysql

systemctl start mysqld

(三)基于binlog的时间点恢复

  1. 先恢复全量备份,再通过binlog恢复增量数据

  2. 解析binlog日志,定位恢复位置

bash

mysqlbinlog --start-position=107 --stop-position=1000 /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

  1. 按时间点恢复

bash

mysqlbinlog --start-datetime="2024-05-20 10:00:00" --stop-datetime="2024-05-20 18:00:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

四、备份与恢复注意事项

  1. 备份前检查:确认数据库正常运行,InnoDB引擎建议开启 --single-transaction ,避免锁表影响业务。

  2. 备份文件管理:备份文件命名包含日期时间,定期清理过期文件,备份文件需异地存储,防止服务器故障丢失。

  3. 恢复前测试:生产环境恢复前,先在测试环境验证备份文件有效性,避免备份文件损坏导致恢复失败。

  4. 权限控制:备份工具需具备数据库读写权限,恢复后检查文件权限,确保MySQL服务可正常读取数据文件。

  5. binlog安全:binlog日志和全量备份分开存储,定期备份binlog,避免日志损坏无法增量恢复。

  6. 存储引擎适配:MyISAM引擎不支持热备份,备份时需锁表;InnoDB引擎支持无锁热备份,优先使用。

五、生产环境备份策略

  1. 中小型数据库(<50G)

每日凌晨执行全量mysqldump备份,开启binlog日志备份,保留7天备份文件,每周做一次异地备份。

  1. 中大型数据库(50G-200G)

每周一次全量XtraBackup备份,每日一次增量备份,实时备份binlog,实现分钟级数据恢复。

  1. 大型数据库(>200G)

采用全量+增量+binlog组合备份,搭配主从复制,从库执行备份不影响主库业务,备份文件实时同步到远程存储服务器。

六、常见问题排查

  1. mysqldump备份慢:加大 --single-transaction 参数,关闭锁表,避开业务高峰期备份,优化数据库索引。

  2. 恢复失败:检查备份文件是否完整,字符集是否匹配,数据库用户权限是否足够,binlog日志是否完整。

  3. 物理备份恢复后无法启动:检查数据目录权限,确认MySQL版本和备份时一致,清理残留日志文件。

相关推荐
星辰_mya6 小时前
延伸之canal
adb
zhenxin01227 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
炸炸鱼.7 小时前
MySQL 高可用实战(主主复制 + Keepalived+HAProxy)
数据库·mysql·adb
buhuimaren_8 小时前
mysql高可用
adb
PD我是你的真爱粉10 小时前
MySQL 事务与并发控制:从日志底层到 MVCC 哲学
android·mysql·adb
PD我是你的真爱粉10 小时前
MySQL 高性能实战与底层原理
数据库·mysql·adb
PD我是你的真爱粉14 小时前
MySQL 索引进阶:从失效排查到架构哲学
mysql·adb·架构
wuyikeer14 小时前
docker 安装 mysql
mysql·adb·docker
大龄烤红薯14 小时前
docker-【容器数据存储位置分析】以Mysql容器为例
mysql·adb·docker