久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL中如何使用undrop來恢復drop的表

138次閱讀
沒有評論

共計 3877 個字符,預計需要花費 10 分鐘才能閱讀完成。

丸趣 TV 小編給大家分享一下 MySQL 中如何使用 undrop 來恢復 drop 的表,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

MySQL 中可以使用編程語言(比如 Python)來解析 binlog 中 DML 的逆操作來達到閃回的效果,如果數據不多,手工解析也可以。這也是現在大家碰到的很多 DML Flashback 的一個基本原理。而如果是 DDL,比如 DROP, 那就得嘆聲氣了。

GitHub 上有一個很不錯的項目是 undrop, 基于 InnoDB, 也就意味著如果你所在的環境有了 drop 操作還是存在恢復的可能了,當然這個過程需要謹慎,建議大家在測試環境先練習測試論證后再做決定,當然我們希望這個工具永遠不要排上用場。

這個項目貌似現在關注的人還不太多,最近看阿里的內核月報中也做了解讀。http://mysql.taobao.org/monthly/2017/11/01/,所以引起了我的注意,帶著好奇心,自己也測試一把。

安裝部署很簡單。

gitclone https://github.com/twindb/undrop-for-innodb.git

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)

以上是“MySQL 中如何使用 undrop 來恢復 drop 的表”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-27發表,共計3877字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 监利县| 霍城县| 鹰潭市| 松溪县| 固镇县| 上高县| 京山县| 齐齐哈尔市| 绵竹市| 山东省| 台东县| 泽库县| 徐闻县| 安平县| 四会市| 陇南市| 建瓯市| 通城县| 庄浪县| 民和| 隆尧县| 阳信县| 开平市| 镇雄县| 长武县| 吉木萨尔县| 台安县| 莱阳市| 阳高县| 泽库县| 阳春市| 集安市| 三河市| 喀什市| 陆良县| 安吉县| 酒泉市| 中牟县| 曲阳县| 潜江市| 怀柔区|