MySQL 备份
参考链接
[1].如何实现 MySQL 增量备份与恢复。
[2].学习 MySQL 备份一篇就够了。
1. 备份的分类
1.1 从物理与逻辑角度分类
- 物理备份:对数据库操作系统的物理文件的备份(如数据文件、日志文件等)。
- 冷备份:在关闭数据库的时候进行备份。
- 热备份:在数据库运行的时候进行备份,依赖于数据库的日志文件。
- 逻辑备份:对数据库逻辑组件的备份(如表等数据库对象)。
1.2 从数据库的备份策略角度分类
- 完全备份:每次对数据进行完整的备份。
- 差异备份:与上次完全备份相比,对有过改动的文件进行备份。
- 增量备份:与上次完全备份或增量备份相比,对有过改动的文件进行备份。
2. 完全备份
2.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;
- 使用 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 恢复过程
- 删除数据表:
root $ mysql -u root -p // 打开 MySQL
mysql$ use my_db; // 选择数据库
mysql$ drop table my_tb; // 删除数据表
mysql$ show tables; // 列出所有表
// Empty set (0.00 sec)
- 使用 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 备份过程
- 配置开启二进制日志文件:
root $ vim /etc/my.cnf // 在文件末尾处添加 log-bin=mysql-bin
root $ systemctl restart mysqld // 重启服务
root $ find / -name "mysql-bin*" // 查询日志文件所存放的位置
// 我的路径为:/var/lib/mysql/mysql-bin.000001
- 创建数据库和表,并插入数据:
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;
- 进行完全备份:
// 先进行完全备份
root $ mysqldump -u root -p my_db > my_db-$(date +%F).sql
- 尝试修改文件,进行增量备份:
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
- 查看增量备份内容:
root $ mysqlbinlog --no-defaults --base64-output=decode-rows -v /var/lib/mysql/mysql-bin.000001 > bak.txt
root $ vim ./bak.txt // 查看日志内容
3.2 恢复过程
- 模拟故障,删除表:
root $ mysql -u root -p // 打开 MySQL
mysql$ use my_db; // 选择数据库
mysql$ drop table my_tb; // 删除数据表
mysql$ show tables; // 列出所有表
// Empty set (0.00 sec)
- 进行完全备份恢复:
// 先恢复完全备份
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.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 |
// 增量恢复成功 !