共計 2482 個字符,預(yù)計需要花費(fèi) 7 分鐘才能閱讀完成。
本篇內(nèi)容主要講解“如何通過物理方式使 MySQL 恢復(fù)單表”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓丸趣 TV 小編來帶大家學(xué)習(xí)“如何通過物理方式使 MySQL 恢復(fù)單表”吧!
1、首先創(chuàng)建一個測試表 test1,并插入幾條數(shù)據(jù):
mysql create table test1 (id int auto_increment primary key,name varchar(20));
Query OK, 0 rows affected (0.05 sec)
mysql insert into test1 (name) values (張三),(李四),(王二
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql select * from test1;
+----+--------+
| id | name |
+----+--------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 王二 |
+----+--------+
3 rows in set (0.00 sec)
2、創(chuàng)建目標(biāo)表 test2:
mysql create table test2 like test1;
Query OK, 0 rows affected (0.10 sec)
查看數(shù)據(jù)目錄里面的 ibd 文件(test2.ibd、test1.ibd):
-rw-r-----. 1 * * 114688 Nov 2 16:20 test1.ibd
-rw-r-----. 1 * * 114688 Nov 2 16:23 test2.ibd
3、通過 alter table discard 的方法丟棄表 test2 的 idb 文件(為下一步復(fù)制 test1 的數(shù)據(jù)過來做準(zhǔn)備):
mysql alter table test2 discard tablespace;
Query OK, 0 rows affected (0.02 sec)
查看 ibd 文件情況,發(fā)現(xiàn) test2 的 ibd 文件已經(jīng)被刪除
-rw-r----- 1 * * 114688 Nov 2 16:20 test1.ibd
4、執(zhí)行下面的命令,生成一個 test1 的 cfg 文件,如下:
mysql flush table test1 for export;
Query OK, 0 rows affected (0.00 sec)
生成了一個 test1.cfg 的 cfg 文件
-rw-r----- 1 * * 655 Nov 2 16:25 test1.cfg
-rw-r----- 1 * * 114688 Nov 2 16:20 test1.ibd
5、拷貝源表 test1 的 cfg 文件和 ibd 文件到目標(biāo)表 test2,并修改文件權(quán)限:
cp test1.cfg test2.cfg
cp test1.ibd test2.ibd
chown -R mysql.mysql test2.*
6、復(fù)制完成之后,執(zhí)行 select 命令發(fā)現(xiàn)出現(xiàn)以下報錯:
mysql select * from test2;
ERROR 1100 (HY000): Table test2 was not locked with LOCK TABLES
7、執(zhí)行 unlock tables,釋放源表的 test1.cfg 文件,然后導(dǎo)入 ibd 文件:
mysql unlock tables;
Query OK, 0 rows affected (0.00 sec)
并用 alter table 的方法為目標(biāo)表 test2 導(dǎo)入這個 ibd 文件:
mysql alter table test2 import tablespace;
Query OK, 0 rows affected (0.03 sec)
1 row in set (0.00 sec)
8、再次執(zhí)行 select,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)導(dǎo)入:
mysql select * from test2;
+----+--------+
| id | name |
+----+--------+
| 1 | 張三 |
| 2 | 李四 |
| 3 | 王二 |
+----+--------+
3 rows in set (0.00 sec)
物理復(fù)制方法介紹
上述單表物理復(fù)制的方法,核心在于 cp 命令,因為是通過物理拷貝,所以如果復(fù)制的表非常大,那么通過物理拷貝,就會比邏輯上的 SQL 寫入快很多,比如 insert into select 語句。
簡單總結(jié)一下上述物理復(fù)制過程:
1、create table like 語法創(chuàng)建一個相同表結(jié)構(gòu)的空的目標(biāo)表
2、目標(biāo)表執(zhí)行 alter table discard,丟棄 ibd 文件
3、源表執(zhí)行 alter table for export 語法,生成.cfg 文件,并鎖表
4、使用 cp 命令復(fù)制源表 cfg 文件和 ibd 文件為目標(biāo)表
5、unlock tables 釋放源表的 cfg 文件和鎖
6、alter table import 命令導(dǎo)入目標(biāo)表的 ibd 數(shù)據(jù)文件。
alter table for export 語法介紹:
1、這個命令是為了將內(nèi)存中關(guān)于這個表的數(shù)據(jù)刷新到磁盤上,確保數(shù)據(jù)都能被 binlog 所記錄;
2、這個操作需要 flush table 或者 reload 權(quán)限;
3、這個操作會持有當(dāng)前表的共享 MDL 鎖,阻止其他會話修改表結(jié)構(gòu),在 FOR EXPORT 操作完成時不會釋放先前獲取的 MDL 鎖,需要手工釋放
4、InnoDB 會在與該表相同的數(shù)據(jù)庫目錄中生成一個名為 table_name.cfg 的文件
5、處理完表復(fù)制后,需要使用 UNLOCK tables 釋放源表的 MDL 鎖或者斷開連接。
注意:
因為 alter table for export 鎖表,所以這種方法更適合在從庫上停掉復(fù)制關(guān)系,然后執(zhí)行這個表復(fù)制的操作。如果有業(yè)務(wù)操作當(dāng)前的源表,需要謹(jǐn)慎考慮。
到此,相信大家對“如何通過物理方式使 MySQL 恢復(fù)單表”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!