MySQL备份

本文详细介绍了MySQL的备份类型,包括物理备份和逻辑备份,以及完全备份、差异备份和增量备份的概念。重点讲解了如何使用mysqldump进行完全备份,并展示了恢复数据的过程。此外,还讨论了利用二进制日志实现增量备份的方法及其恢复流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接

[1].如何实现 MySQL 增量备份与恢复。
[2].学习 MySQL 备份一篇就够了。

1. 备份的分类

1.1 从物理与逻辑角度分类

  • 物理备份:对数据库操作系统的物理文件的备份(如数据文件、日志文件等)。
    • 冷备份:在关闭数据库的时候进行备份。
    • 热备份:在数据库运行的时候进行备份,依赖于数据库的日志文件。
  • 逻辑备份:对数据库逻辑组件的备份(如表等数据库对象)。

1.2 从数据库的备份策略角度分类

  • 完全备份:每次对数据进行完整的备份。
  • 差异备份:与上次完全备份相比,对有过改动的文件进行备份。
  • 增量备份:与上次完全备份或增量备份相比,对有过改动的文件进行备份。

2. 完全备份

2.1 备份过程

  1. 创建数据库和表,并插入数据:
root 	$  mysql -u root -p			// 打开 MySQL
mysql$  create databse my_db;	// 创建数据库	
mysql$  use my_db;				// 使用数据库
mysql$  create table my_tb(id int(4) primary key, name char(10));	// 创建表
mysql$  insert into my_tb values (1, "tom"), (2, "jerry");			// 插入数据
mysql$  select * from my_tb;
| id | name  |
|  1 |   tom    |
|  2 |   jerry   |
mysql$ exit;
  1. 使用 mysqldump 进行备份:
// 创建存放备份文件目录
root $  mkdir backup;
root $  cd backup;
// 备份所有数据库
root $  mysqldump -u root -p --all-databases > all-data-$(date +%F).sql
// 备份单个数据库
root $  mysqldump -u root -p my_db > my_db-$(date +%F).sql
// 备份单个表
root $  mysqldump -u root -p my_db my_tb > my_db-my_tb-$(date +%F).sql
// 备份单个表的结构
root $  mysqldump -u root -p -d my_db my_tb > desc-my_db-my_tb-$(date +%F).sql
// 当前备份的文件
root $  ls
// all-data-2023-05-11.sql  desc-my_db-my_tb-2023-05-11.sql  my_db-2023-05-11.sql  my_db-my_tb-2023-05-11.sql

2.2 恢复过程

  1. 删除数据表:
root $ mysql -u root -p			// 打开 MySQL
mysql$ use my_db;				// 选择数据库
mysql$ drop table my_tb;		// 删除数据表
mysql$ show tables;				// 列出所有表
// Empty set (0.00 sec)
  1. 使用 source 恢复数据:
// source 备份文件存放目录
mysql$ source ./all-data-2023-05-11.sql	// 恢复
mysql$ use my_db;						// 选择数据库
mysql$ show tables;						// 选择数据表
mysql$ select * from my_tb;				// 展示内容
// | id | name  |
// |  1 | tom   |
// |  2 | jerry |
// 成功恢复 !

3. 增量备份

  • MySQL 没有提供直接的增量备份方法。
  • 可以通过 MySQL 提供的二进制日志间接实现增量备份( binary logs)。
    • 二进制日志保存了所有更新或者可能更新数据库的操作。
    • 定时执行 flush-logs 方法重新创建新的日志,并及时保存旧的日志,相当于完成了一个增量备份。

3.1 备份过程

  1. 配置开启二进制日志文件:
root $ vim /etc/my.cnf				// 在文件末尾处添加  log-bin=mysql-bin
root $ systemctl restart mysqld		// 重启服务
root $ find / -name "mysql-bin*"	// 查询日志文件所存放的位置
// 我的路径为:/var/lib/mysql/mysql-bin.000001
  1. 创建数据库和表,并插入数据:
root $ mysql -u root -p			// 打开 MySQL
mysql$ create databse my_db;	// 创建数据库	
mysql$ use my_db;				// 使用数据库
mysql$ create table my_tb(id int(4) primary key, name char(10));	// 创建表
mysql$ insert into my_tb values (1, "tom"), (2, "jerry");			// 插入数据
mysql$ select * from my_tb;
// | id | name  |
// |  1 | tom   |
// |  2 | jerry |
mysql$ exit;
  1. 进行完全备份:
// 先进行完全备份
root $ mysqldump -u root -p my_db > my_db-$(date +%F).sql
  1. 尝试修改文件,进行增量备份:
root $ mysql -u root -p			// 打开 MySQL
mysql$ use my_db;				// 使用数据库
mysql$ insert into my_tb values (3, "mark"), (4, "java");	// 插入数据
mysql$ select * from my_tb;		// 显示表内容
mysql$ exit;					// 退出
root $ mysqladmin -u root -p flush-logs	// 根据日志进行增量备份
// 查看日志文件情况,此时 000001 文件记录的是当前的增备记录,而 000002 用于下次增备。
root $ find / -name "mysql-bin*"	
// /var/lib/mysql/mysql-bin.000001	/var/lib/mysql/mysql-bin.000002  /var/lib/mysql/mysql-bin.index
  1. 查看增量备份内容:
root $ mysqlbinlog --no-defaults --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000001 > bak.txt
root $ vim ./bak.txt			// 查看日志内容

3.2 恢复过程

  1. 模拟故障,删除表:
root $ mysql -u root -p			// 打开 MySQL
mysql$ use my_db;				// 选择数据库
mysql$ drop table my_tb;		// 删除数据表
mysql$ show tables;				// 列出所有表
// Empty set (0.00 sec)
  1. 进行完全备份恢复:
// 先恢复完全备份
mysql$ source ./all-data-2023-05-11.sql	// 恢复
mysql$ use my_db;						// 选择数据库
mysql$ show tables;						// 选择数据表
mysql$ select * from my_tb;				// 展示内容
// | id | name  |
// |  1 | tom   |
// |  2 | jerry |
  1. 进行增量备份恢复:
// 基于时间点的恢复,具体的时间可以根据 (3.1-5) 中的 vim ./bak.txt 来查看,详情可阅读参考链接[1]。
// 可以基于断点位置恢复,将 --stop-datetime 替换为 --stop-position 详情可阅读参考链接[1]。
root $ mysqlbinlog --no-defaults --stop-datetime='2023-05-11 16:55:30' /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
root $ mysql -u root -p			// 打开 MySQL
mysql$ use my_db;				// 选择数据库
mysql$ select * from my_tb;
// | id | name  |
// |  1 | tom   |
// |  2 | jerry |
// |  3 | mark  |
// |  4 | java  |
// 增量恢复成功 !
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的小老虎丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值