MySQL表空間傳輸

壹頁書發表於2015-06-07
MySQL(5.6.6及以上)也支援表空間傳輸了
當然,innodb_file_per_table是一定要開啟的

表空間傳輸可以很方便的將一個表或者多個表,從一個資料庫例項匯入到另一個資料庫例項.
在資料恢復和資料遷移的時候,非常有用,尤其是資料量很大的表.
相對於mysqldump,表空間傳輸的方式更快,更靈活.

使用表空間傳輸有兩種方式
1.MySQL原生命令
實驗將一個表從源例項遷移至目標例項
首先,在源例項執行
show create table sod_song_ksc\G
得到建立表的SQL語句,在目標例項執行該SQL建立一個同名的表.
並且在目標例項執行
alter table sod_song_ksc discard tablespace;(用於刪除ibd檔案)

然後在源例項執行
flush table 表名 for export;

可以看到,執行命令之後,innodb_buffer_pool中的髒頁重新整理到了磁碟。併產生了一個 cfg檔案.
在命令執行之後,該表只能只讀訪問.


開啟另外一個終端,將該表的ibd檔案,cfg檔案,TRG檔案(記錄觸發器資訊)拷貝到目標例項的資料庫中
然後源例項執行 unlock tables; 

最後在目標例項執行
alter table sod_song_ksc import tablespace;
匯入表空間


2.使用innobackupex,協助表空間傳輸
原生的方式適合小範圍匯出,比如一兩個表.
如果匯出的表很多,可以用innobackupex進行輔助,並且innobackupex沒有鎖,不影響線上的業務.

首先,批量匯出表結構
http://blog.itpub.net/29254281/viewspace-1259796/
在目標例項建立表,然後執行
alter table 表名 discard tablespace;(用於刪除ibd檔案)

然後在源例項執行匯出
innobackupex --user=root --password=xxx --defaults-file=/home/mysql/mysql-5.6.14/my.cnf  --socket=mysql.sock --include='songod.sod_song_log*' /tmp
或者使用 tables-file的方式
innobackupex --user=root --password=xxx --defaults-file=/home/mysql/mysql-5.6.14/my.cnf  --socket=mysql.sock --tables-file=/tmp/tables.file /tmp

匯出完成之後,執行恢復
innobackupex --apply-log --export .

然後將ibd檔案,cfg檔案和exp檔案拷貝到目標例項資料庫

最後在目標例項執行
alter table 表名 import tablespace;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1689997/,如需轉載,請註明出處,否則將追究法律責任。

相關文章