mysql恢复drop表
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,drop误操作删除表后,恢复的大概流程是1、从备份中将表恢复到备份时间点2、找到drop操作点3、从binlog中找到备份点到drop点中间所有事件,并筛选出该表的事件4、执行找到该表的事件一、实验数
千家信息网最后更新 2024年11月20日mysql恢复drop表drop误操作删除表后,恢复的大概流程是
1、从备份中将表恢复到备份时间点
2、找到drop操作点
3、从binlog中找到备份点到drop点中间所有事件,并筛选出该表的事件
4、执行找到该表的事件
一、实验数据:
mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 500 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 1000 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 1000 | +--------+---------+--------+ 8 rows in set (0.00 sec)
二:备份 [root@wd-gtt-system-db data]# mysqldump -S /data/DB/mysql/mysql.sock -h272.30.249.143 -P3306 -uroot -p --single-transaction -B test --tables sale --master-data=2 >/data/backup/mysql_dump.sql 这里一定要加--master-data参数,因为要记录备份时binlog位置
[root@wd-gtt-system-db data]# cat /data/backup/mysql_dump.sql -- MySQL dump 10.13 Distrib 5.6.27-76.0, for Linux (x86_64) -- -- Host: 172.30.249.143 Database: test -- ------------------------------------------------------ -- Server version 5.6.27-76.0-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-- -- Position to start replication or point-in-time recovery from --
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=309610;
....... 标红处就是备份点,在后面从binlog中找到备份点到drop点中间所有事件用得上
三:增加测试数据并drop表 insert into sale values(201605,'5',10000) update sale set amount=0 where user_id=1 mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 0 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 0 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 0 | | 201605 | 5 | 10000 | +--------+---------+--------+ 9 rows in set (0.00 sec) mysql> drop table sale;
四:从备份中恢复数据到备份点
因为备份的是全库,要从备份中找到sale表相关的建表语句和数据
[root@wd-gtt-system-db ~]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `sale`/!d;q' /data/backup/mysql_dump.sql DROP TABLE IF EXISTS `sale`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `sale` ( `month` int(10) DEFAULT NULL, `user_id` varchar(64) DEFAULT NULL, `amount` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; [root@wd-gtt-system-db ~]# grep 'INSERT INTO `sale`' /data/backup/mysql_dump.sql>data.sql [root@wd-gtt-system-db ~]# cat data.sql INSERT INTO `sale` VALUES (201601,'1',500),(201601,'2',300),(201601,'3',500),(201602,'1',1000),(201602,'2',800),(201603,'2',1000),(201603,'3',500),(201604,'1',1000);
执行上面的语句,查看数据,已经恢复备份点的状态 mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 500 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 1000 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 1000 | +--------+---------+--------+ 8 rows in set (0.00 sec)
五、查询dorp操作的position
因为drop操作是在备份后发生的,加个 --start-position=309610 [root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 /data/DB/mysql/mysql-bin.000002 |grep DROP -A10 -B10 ### @1=201604 /* INT meta=0 nullable=1 is_null=0 */ ### @2='1' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */ ### @3=0 /* INT meta=0 nullable=1 is_null=0 */ # at 328220 #161220 15:30:49 server id 2 end_log_pos 328251 CRC32 0xb42e62b5 Xid = 8713 COMMIT/*!*/; # at 328251 #161220 15:31:12 server id 2 end_log_pos 328368 CRC32 0xf8c5dde3 Query thread_id=127 exec_time=0 error_code=0 use `test`/*!*/; SET TIMESTAMP=1482219072/*!*/; DROP TABLE `sale` /* generated by server */ ...... 标红的地方表示position=328368 执行的drop操作,我们要恢复到这个之前,也就是328251 这个事件
六:从binlog中找到备份点到drop点中间所有事件
--start-position=备份点
--stop-position=drop操作前的事件点
[root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 --stop-position=328251 mysql-bin.000002 > recover.sql
检索出sale表相关事件
[root@trcloud opt]# more recover.sql |grep --ignore-case -E 'insert|update|delete' -A2 -B2|grep sale insert into sale values(201605,'5',10000) update sale set amount=0 where user_id=1
注:binlog是MIXED或者Statement模式才可通过上述方法找到事件的DML语句
七:执行上面找出来的语句
查看数据,全部恢复
mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 0 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 0 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 0 | | 201605 | 5 | 10000 | +--------+---------+--------+ 9 rows in set (0.00 sec)
1、从备份中将表恢复到备份时间点
2、找到drop操作点
3、从binlog中找到备份点到drop点中间所有事件,并筛选出该表的事件
4、执行找到该表的事件
一、实验数据:
mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 500 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 1000 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 1000 | +--------+---------+--------+ 8 rows in set (0.00 sec)
二:备份 [root@wd-gtt-system-db data]# mysqldump -S /data/DB/mysql/mysql.sock -h272.30.249.143 -P3306 -uroot -p --single-transaction -B test --tables sale --master-data=2 >/data/backup/mysql_dump.sql 这里一定要加--master-data参数,因为要记录备份时binlog位置
[root@wd-gtt-system-db data]# cat /data/backup/mysql_dump.sql -- MySQL dump 10.13 Distrib 5.6.27-76.0, for Linux (x86_64) -- -- Host: 172.30.249.143 Database: test -- ------------------------------------------------------ -- Server version 5.6.27-76.0-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-- -- Position to start replication or point-in-time recovery from --
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=309610;
....... 标红处就是备份点,在后面从binlog中找到备份点到drop点中间所有事件用得上
三:增加测试数据并drop表 insert into sale values(201605,'5',10000) update sale set amount=0 where user_id=1 mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 0 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 0 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 0 | | 201605 | 5 | 10000 | +--------+---------+--------+ 9 rows in set (0.00 sec) mysql> drop table sale;
四:从备份中恢复数据到备份点
因为备份的是全库,要从备份中找到sale表相关的建表语句和数据
[root@wd-gtt-system-db ~]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `sale`/!d;q' /data/backup/mysql_dump.sql DROP TABLE IF EXISTS `sale`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `sale` ( `month` int(10) DEFAULT NULL, `user_id` varchar(64) DEFAULT NULL, `amount` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; [root@wd-gtt-system-db ~]# grep 'INSERT INTO `sale`' /data/backup/mysql_dump.sql>data.sql [root@wd-gtt-system-db ~]# cat data.sql INSERT INTO `sale` VALUES (201601,'1',500),(201601,'2',300),(201601,'3',500),(201602,'1',1000),(201602,'2',800),(201603,'2',1000),(201603,'3',500),(201604,'1',1000);
执行上面的语句,查看数据,已经恢复备份点的状态 mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 500 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 1000 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 1000 | +--------+---------+--------+ 8 rows in set (0.00 sec)
五、查询dorp操作的position
因为drop操作是在备份后发生的,加个 --start-position=309610 [root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 /data/DB/mysql/mysql-bin.000002 |grep DROP -A10 -B10 ### @1=201604 /* INT meta=0 nullable=1 is_null=0 */ ### @2='1' /* VARSTRING(192) meta=192 nullable=1 is_null=0 */ ### @3=0 /* INT meta=0 nullable=1 is_null=0 */ # at 328220 #161220 15:30:49 server id 2 end_log_pos 328251 CRC32 0xb42e62b5 Xid = 8713 COMMIT/*!*/; # at 328251 #161220 15:31:12 server id 2 end_log_pos 328368 CRC32 0xf8c5dde3 Query thread_id=127 exec_time=0 error_code=0 use `test`/*!*/; SET TIMESTAMP=1482219072/*!*/; DROP TABLE `sale` /* generated by server */ ...... 标红的地方表示position=328368 执行的drop操作,我们要恢复到这个之前,也就是328251 这个事件
六:从binlog中找到备份点到drop点中间所有事件
--start-position=备份点
--stop-position=drop操作前的事件点
[root@wd-gtt-system-db mysql]# mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF-8 --start-position=309610 --stop-position=328251 mysql-bin.000002 > recover.sql
检索出sale表相关事件
[root@trcloud opt]# more recover.sql |grep --ignore-case -E 'insert|update|delete' -A2 -B2|grep sale insert into sale values(201605,'5',10000) update sale set amount=0 where user_id=1
注:binlog是MIXED或者Statement模式才可通过上述方法找到事件的DML语句
七:执行上面找出来的语句
查看数据,全部恢复
mysql> select * from sale; +--------+---------+--------+ | month | user_id | amount | +--------+---------+--------+ | 201601 | 1 | 0 | | 201601 | 2 | 300 | | 201601 | 3 | 500 | | 201602 | 1 | 0 | | 201602 | 2 | 800 | | 201603 | 2 | 1000 | | 201603 | 3 | 500 | | 201604 | 1 | 0 | | 201605 | 5 | 10000 | +--------+---------+--------+ 9 rows in set (0.00 sec)
备份
事件
数据
语句
点到
中将
也就是
位置
参数
地方
就是
方法
时间
是在
模式
流程
状态
选出
面的
可通
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
电脑上网网络安全密码
海南丹露网络技术有限公司
adsl 个人服务器
兰州定制软件开发公司哪家好
销售服务器账务处理方案
数据库发布到客户端啥意思
计算机网络技术论文标题
软件开发 试用期工作总结
数据库构成的基本元素
FIFA22数据库王者
opu客房数据库日志已满怎么办
我市网络安全和信息化现状
数据库gsp是什么意思
报社融媒体软件开发
吃鸡选服务器
浙江倚宿网络技术有限公司
网络强国维护国家网络安全
中航神州网络技术有限公司
青阳微型软件开发服务厂家供应
怎么还原php的数据库
魔兽世界服务器是什么
盐城哪里有软件开发公司
ef框架连接oracle数据库
拼多多的服务器可靠吗
企业管理用的软件开发
2018计算机网络安全考试
网络安全综合治理平台
t3损益结转对应哪种数据库
数据库gsp是什么意思
数据库 删除所有记录