MySQL 备份 - 学习笔记

MySQL 备份

  • 参考链接
  • 1. 备份的分类
    • 1.1 从物理与逻辑角度分类
    • 1.2 从数据库的备份策略角度分类
  • 2. 完全备份
    • 2.1 备份过程
    • 2.2 恢复过程
  • 3. 增量备份
    • 3.1 备份过程
    • 3.2 恢复过程

参考链接

[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  |
// 增量恢复成功 !

你可能感兴趣的:(mysql,数据库,学习)