mysql恢復drop表
drop誤操作刪除表後,恢復的大概流程是
1、從備份中將表恢復到備份時間點
2、找到drop操作點
3、從binlog中找到備份點到drop點中間所有事件,並篩選出該表的事件
4、執行找到該表的事件
一、實驗資料:
mysql> select * from sale;
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 -h172.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
因為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表相關事件
檢索出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語句
七:執行上面找出來的語句
檢視資料,全部恢復
注: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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29989552/viewspace-2131057/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中使用undrop來恢復drop的表(上)MySql
- Oracle Drop表(purge)恢復(ODU)Oracle
- 恢復oracle中drop掉的表Oracle
- mysql 無備份恢復drop資料-共享表空間MySql
- oracle恢復表delete/truncate/drop的方法總結Oracledelete
- RMAN恢復單個表空間或被DROP/DELETE/TRUNCATE的表delete
- db2 恢復drop後的表的一個操作DB2
- 快速drop mysql大表MySql
- Oracle 10g 中誤刪除(drop)表的恢復處理Oracle 10g
- 恢復MySQL InnoDB表結構的方法MySql
- 【Mysql】Mysql從frm檔案裡恢復表結構MySql
- oracle誤drop/update資料恢復測試Oracle資料恢復
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- 使用logmnr分析歸檔日誌恢復被drop掉的資料表
- MySQL Drop 大表的解決方案MySql
- MySQL資料庫表誤刪除恢復(一)MySql資料庫
- mysql無備份恢復-獨立表空間MySql
- 【Mysql】恢復slave上某幾張表的方法MySql
- MySQL備份和恢復資料表的方法MySql
- MySQL通過Binlog恢復刪除的表MySql
- mysql 恢復(one)資料庫及單張表MySql資料庫
- 【Mysql】完全恢復與不完全恢復MySql
- oracle drop table purge無備份bbed恢復(1/3)Oracle
- oracle drop table purge無備份bbed恢復(2/3)Oracle
- oracle drop table purge無備份bbed恢復(3/3)Oracle
- Mysql備份恢復MySql
- MySQL恢復過程MySql
- Mysql密碼恢復MySql密碼
- mysql 備份恢復MySql
- mysql資料恢復MySql資料恢復
- 【MySQL】MySQL備份和恢復MySql
- MySQL 非常規恢復與物理備份恢復MySql
- 循序漸進oracle第8章:Oracle的閃回特性之恢復drop表四種方法Oracle
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- rman恢復資料檔案 恢復表空間
- Oracle Delete表恢復(ODU)Oracledelete
- Oracle Truncate表恢復(ODU)Oracle
- Mysql update誤操作恢復MySql