您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中如何使用undrop來恢復(fù)drop的表,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
MySQL中可以使用編程語言(比如Python)來解析binlog中DML的逆操作來達(dá)到閃回的效果,如果數(shù)據(jù)不多,手工解析也可以。這也是現(xiàn)在大家碰到的很多DML Flashback的一個(gè)基本原理。而如果是DDL,比如DROP,那就得嘆聲氣了。
GitHub上有一個(gè)很不錯(cuò)的項(xiàng)目是undrop,基于InnoDB,也就意味著如果你所在的環(huán)境有了drop操作還是存在恢復(fù)的可能了,當(dāng)然這個(gè)過程需要謹(jǐn)慎,建議大家在測試環(huán)境先練習(xí)測試論證后再做決定,當(dāng)然我們希望這個(gè)工具永遠(yuǎn)不要排上用場。
這個(gè)項(xiàng)目貌似現(xiàn)在關(guān)注的人還不太多,最近看阿里的內(nèi)核月報(bào)中也做了解讀。http://mysql.taobao.org/monthly/2017/11/01/,所以引起了我的注意,帶著好奇心,自己也測試一把。
安裝部署很簡單。
gitclone https://github.com/twindb/undrop-for-innodb.git
make
這里需要注意的是,你的環(huán)境很可能沒有flex包,可以在make之前安裝一下。
yum install flex
然后我們來嘗試編譯一個(gè)文件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
這個(gè)工具的一個(gè)基本原理就是解析ibdata,從里面解析出我們需要的頁的信息,即對應(yīng)的數(shù)據(jù)字典。
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個(gè)數(shù)據(jù)字典是需要重點(diǎn)關(guān)注的。
SYS_COLUMNS| SYS_FIELDS | SYS_INDEXES | SYS_TABLES
這個(gè)工具功能蠻豐富,在目錄下有個(gè)sakila的文件夾,是一些示例的腳本,我們可以創(chuàng)建一些看起來和業(yè)務(wù)相關(guān)的表,不過實(shí)際上我們可以做個(gè)減法,只創(chuàng)建一個(gè)我們需要重點(diǎn)關(guān)注的表,然后導(dǎo)入數(shù)據(jù)即可。
-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
否則,這一套表結(jié)構(gòu)還算是比較復(fù)雜的,存在外鍵關(guān)聯(lián),處理起來需要花些額外的時(shí)間。
整個(gè)初始化的工作,我們以表actor為例,手工摘取出actor的建表語句,然后運(yùn)行sakila-data.sql腳本即可。
mysql> checksum table actor;
+--------------+------------+
| Table | Checksum |
+--------------+------------+
| sakila.actor | 1702520518 |
+--------------+------------+
1 row in set (0.00 sec)
查詢一下表actor的數(shù)據(jù)量。
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
整個(gè)操作很快,會(huì)在當(dāng)前目錄下生成一個(gè)pages-ibdata1的文件夾,下面包含兩個(gè)文件夾。
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
要解析里面的內(nèi)容,我們可以使用另外一個(gè)命令c_parser,根據(jù)關(guān)鍵字sakila/actor來過濾。
./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep 'sakila/actor'
其中參數(shù)4DF,代表文件格式(4代表文件格式是 REDUNDANT),D(D 表示只恢復(fù)被刪除的記錄),f生成文件
然后依次使用c_parser來解析頁得到其他幾個(gè)數(shù)據(jù)字典的信息,比如(SYS_INDEXES,SYS_COLUMNS,SYS_FIELDS)
以上是“MySQL中如何使用undrop來恢復(fù)drop的表”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。