共计 2289 个字符,预计需要花费 6 分钟才能阅读完成。
本篇内容主要讲解“如何解决线上数据库删了的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“如何解决线上数据库删了的问题”吧!
事件背景
MySQL 数据库每日零点自动全备
某天上午 9 点,二狗子不小心 drop 了一个数据库
我们需要通过全备的数据文件,以及增量的 binlog 文件进行数据恢复
主要思想与原理
利用全备的 sql 文件中记录的 CHANGE MASTER 语句,binlog 文件及其位置点信息,找出 binlog 文件增量的部分
用 mysqlbinlog 命令将上述的 binlog 文件导出为 sql 文件,并剔除其中的 drop 语句
通过全备文件和增量 binlog 文件的导出 sql 文件,就可以恢复到完整的数据
过程示意图
操作过程
模拟数据
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, `age` tinyint(2) NOT NULL DEFAULT 0 , PRIMARY KEY (`id`), KEY `index_name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 mysql insert student values(1, zhangsan ,20); mysql insert student values(2, lisi ,21); mysql insert student values(3, wangwu ,22);
全备命令
# mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip /server/backup/test_$(date +%F).sql.gz
参数说明:
-B 指定数据库
-F 刷新日志
-R 备份存储过程等
-x 锁表
–master-data 在备份语句里添加 CHANGE MASTER 语句以及 binlog 文件及位置点信息
继续插入数据并删库
mysql insert student values(4, xiaoming ,20); mysql insert student values(5, xiaohong ,20);
在插入数据的时候我们模拟误操作,删除 test 数据库。
mysql drop database test;
此时,全备之后到误操作时刻之间,用户写入的数据在 binlog 中,需要恢复出来。
查看全备之后新增的 binlog 文件
# cd /server/backup/ # ls test_2020-08-19.sql.gz # gzip -d test_2020-08-19.sql.gz # grep CHANGE test_2020-08-19.sql -- CHANGE MASTER TO MASTER_LOG_FILE= mysql-bin.000003 , MASTER_LOG_POS=107;
这是全备时刻的 binlog 文件位置,即 mysql-bin.000003 的 107 行,因此在该文件之前的 binlog 文件中的数据都已经包含在这个全备的 sql 文件中了
移动 binlog 文件,并读取 sql,剔除其中的 drop 语句
# cp /data/3306/mysql-bin.000003 /server/backup/ # mysqlbinlog -d test mysql-bin.000003 mysql-bin.000003.sql
接下来,使用 vim 编辑 mysql-bin.000003.sql 文件,剔除 drop 语句
注意:在恢复全备数据之前必须将该 binlog 文件移出,否则恢复过程中,会继续写入语句到 binlog,最终导致增量恢复数据部分变得比较混乱
恢复数据
# mysql -uroot -p test_2020-08-19.sql # mysql -uroot -p -e select * from test.student; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 20 | | 2 | lisi | 21 | | 3 | wangwu | 22 | +----+----------+-----+
此时恢复了全备时刻的数据,然后使用 mysql-bin.000003.sql 文件恢复全备时刻到删除数据库之间,新增的数据。
# mysql -uroot -p test mysql-bin.000003.sql # mysql -uroot -p -e select * from test.student; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 20 | | 2 | lisi | 20 | | 3 | wangwu | 20 | | 4 | xiaoming | 20 | | 5 | xiaohong | 20 | +----+----------+-----+
此时,整个恢复过程结束,是不是很简单呢? 没错,就是这么简单!!
到此,相信大家对“如何解决线上数据库删了的问题”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!