MySQL中使用undrop來恢復drop的表(上)
MySQL中可以使用程式語言(比如Python)來解析binlog中DML的逆操作來達到閃回的效果,如果資料不多,手工解析也可以。這也是現在大家碰到的很多DML Flashback的一個基本原理。而如果是DDL,比如DROP,那就得嘆聲氣了。
GitHub上有一個很不錯的專案是undrop,基於InnoDB,也就意味著如果你所在的環境有了drop操作還是存在恢復的可能了,當然這個過程需要謹慎,建議大家在測試環境先練習測試論證後再做決定,當然我們希望這個工具永遠不要排上用場。
這個專案貌似現在關注的人還不太多,最近看阿里的核心月報中也做了解讀。,所以引起了我的注意,帶著好奇心,自己也測試一把。
安裝部署很簡單。
gitclone
make
這裡需要注意的是,你的環境很可能沒有flex包,可以在make之前安裝一下。
yum install flex
然後我們來嘗試編譯一個檔案sys_parser.c,先配置basedir
basedir=/usr/local/mysql_5.7
gcc `$basedir/bin/mysql_config --cflags` `$basedir/bin/mysql_config --libs` -o sys_parser sys_parser.c
這個工具的一個基本原理就是解析ibdata,從裡面解析出我們需要的頁的資訊,即對應的資料字典。
mysql> show tables like '%SYS%';
+--------------------------------------+
| Tables_in_information_schema (%SYS%) |
+--------------------------------------+
| INNODB_SYS_DATAFILES |
| INNODB_SYS_VIRTUAL |
| INNODB_SYS_INDEXES |
| INNODB_SYS_TABLES |
| INNODB_SYS_FIELDS |
| INNODB_SYS_TABLESPACES |
| INNODB_SYS_FOREIGN_COLS |
| INNODB_SYS_COLUMNS |
| INNODB_SYS_FOREIGN |
| INNODB_SYS_TABLESTATS |
+--------------------------------------+
10 rows in set (0.00 sec)
其中這4個資料字典是需要重點關注的。
SYS_COLUMNS| SYS_FIELDS | SYS_INDEXES | SYS_TABLES
這個工具功能蠻豐富,在目錄下有個sakila的資料夾,是一些示例的指令碼,我們可以建立一些看起來和業務相關的表,不過實際上我們可以做個減法,只建立一個我們需要重點關注的表,然後匯入資料即可。
-rw-r--r--. 1 jeanron jeanron 3231472 Dec 16 2011 sakila-data.sql
-rw-r--r--. 1 jeanron jeanron 50019 Dec 16 2011 sakila.mwb
-rw-r--r--. 1 jeanron jeanron 23099 Dec 16 2011 sakila-schema.sql
否則,這一套表結構還算是比較複雜的,存在外來鍵關聯,處理起來需要花些額外的時間。
整個初始化的工作,我們以表actor為例,手工摘取出actor的建表語句,然後執行sakila-data.sql指令碼即可。
mysql> checksum table actor;
+--------------+------------+
| Table | Checksum |
+--------------+------------+
| sakila.actor | 1702520518 |
+--------------+------------+
1 row in set (0.00 sec)
查詢一下表actor的資料量。
mysql> select count(*)from actor;
+----------+
| count(*) |
+----------+
| 200 |
+----------+
1 row in set (0.00 sec)
要解析ibdata,可以使用stream_parser來做。我們指定ibdata的路徑。
# ./stream_parser -f /U01/mysql_5.7_test/n1/ibdata1
Opening file: /U01/mysql_5.7_test/n1/ibdata1
File information:
ID of device containing file: 64512
inode number: 152382
protection: 100640 (regular file)
number of hard links: 1
user ID of owner: 501
group ID of owner: 501
device ID (if special file): 0
blocksize for filesystem I/O: 4096
number of blocks allocated: 155648
time of last access: 1509475823 Wed Nov 1 02:50:23 2017
time of last modification: 1509476206 Wed Nov 1 02:56:46 2017
time of last status change: 1509476206 Wed Nov 1 02:56:46 2017
total size, in bytes: 79691776 (76.000 MiB)
Size to process: 79691776 (76.000 MiB)
All workers finished in 1 sec
整個操作很快,會在當前目錄下生成一個pages-ibdata1的資料夾,下面包含兩個資料夾。
drwxr-xr-x. 2 root root 4096 Nov 1 02:57 FIL_PAGE_INDEX
drwxr-xr-x. 2 root root 4096 Nov 1 02:57 FIL_PAGE_TYPE_BLOB
比如INDEX目錄下,存在大量的頁,比如下面的輸出。
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000001.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000002.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000003.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000004.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000005.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000011.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000012.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000013.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000014.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000015.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000016.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000017.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 0000000000000032.page
-rw-r--r--. 1 root root 32768 Nov 1 02:57 0000000000000033.page
-rw-r--r--. 1 root root 16384 Nov 1 02:57 18446744069414584320.page
要解析裡面的內容,我們可以使用另外一個命令c_parser,根據關鍵字sakila/actor來過濾。
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep 'sakila/actor'
其中引數4DF,代表檔案格式(4代表檔案格式是 REDUNDANT),D(D 表示只恢復被刪除的記錄),f生成檔案
然後依次使用c_parser來解析頁得到其他幾個資料字典的資訊,比如(SYS_INDEXES,SYS_COLUMNS,SYS_FIELDS)
後續的內容,在下一篇中會持續更新。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2148048/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql恢復drop表MySql
- 恢復oracle中drop掉的表Oracle
- Oracle Drop表(purge)恢復(ODU)Oracle
- mysql 無備份恢復drop資料-共享表空間MySql
- oracle恢復表delete/truncate/drop的方法總結Oracledelete
- Oracle 10g 中誤刪除(drop)表的恢復處理Oracle 10g
- 【Mysql】恢復slave上某幾張表的方法MySql
- db2 恢復drop後的表的一個操作DB2
- RMAN恢復單個表空間或被DROP/DELETE/TRUNCATE的表delete
- 使用logmnr分析歸檔日誌恢復被drop掉的資料表
- 使用MySQL自身複製來恢復binlogMySql
- 恢復MySQL InnoDB表結構的方法MySql
- 快速drop mysql大表MySql
- 使用Flashback Transaction方法來恢復資料表資料
- 刪除表空間,有rman全備的恢復(使用dbms_backup_restore來進行恢復)REST
- MySQL Drop 大表的解決方案MySql
- MySQL備份和恢復資料表的方法MySql
- MySQL通過Binlog恢復刪除的表MySql
- MySQL禁用恢復外來鍵約束MySql
- docker 中 MySQL 備份及恢復DockerMySql
- 【Mysql】Mysql從frm檔案裡恢復表結構MySql
- oracle誤drop/update資料恢復測試Oracle資料恢復
- 使用ODU恢復被truncate表的資料
- 使用 MYSQLBINLOG 來恢復資料MySql
- 使用innobackupex恢復mysql資料庫MySql資料庫
- mysql 5.5 索引建設(表rebuild)過程中的系統崩潰的恢復MySql索引Rebuild
- 使用hellodba的工具恢復truncate表的資料
- Oracle drop分割槽表單個分割槽無法透過閃回恢復Oracle
- 使用 “恢復模式” 或 “DFU 模式” 來更新和恢復 iOS 韌體模式iOS
- oracle12c新特性(8)--RMAN中的表恢復和分割槽恢復Oracle
- 閃回恢復一個表中的資料
- java中實現MYSQL的備份和恢復JavaMySql
- 如何從MySQL全庫備份的dump檔案中恢復某張表和表結構MySql
- 使用ODU恢復oracle被truncate的表資料Oracle
- 循序漸進oracle第8章:Oracle的閃回特性之恢復drop表四種方法Oracle
- 從MySQL全庫備份中恢復某個庫和某張表MySql
- 使用RMAN來PDB執行完全恢復
- MySQL備份和恢復具體實施(上)MySql