1. 程式人生 > >mysql 5.6 使用傳輸表空間遷移表或恢復誤刪除的表

mysql 5.6 使用傳輸表空間遷移表或恢復誤刪除的表

以前在網上也看過一些對5.6傳輸表空間的介紹,不過都寫的不夠具體詳細,今天有空就具體操作了一把,並詳細記錄了一下算留個檔

一,簡單說明:

1),傳輸表空間的限制:
  1,mysql 版本 5.6.6 及其以上,並且版本建議源和目標版本建議都是GA版並且大版本一樣
  2,表引擎為innodb並且開啟獨立表空間  innodb_file_per_table
  3,處於匯出狀態的表只允許讀也即是”read_only“狀態
  4,DISCARD TABLESPACE不支援分割槽表[5.6.17才支援] 並且當表上具有外來鍵關係的時候需要將 foreign_key_check設定為0
  5,源和目標例項的page size 必須大小一致
  6,ALTER TABLE ... IMPORT TABLESPACE  不強制進行外來鍵約束檢查,所以需要將主表和子表都匯出,然後在目標例項匯入,
     另外該操作不需要.cfg 元資料檔案,當然如果沒有改檔案在匯入的時候是不做元資料檢查的
  7,在windows上,innodb引擎內部都是以小寫格式儲存資料庫,表名和表空間名,故為了避免匯入因為大小寫出現檔案建議在大小寫敏感, 如linux、unix的作業系統上都以小寫的格式建立資料庫和表同時在[mysqld]項下 新增
      [mysqld]
      lower_case_table_names=1 
      
2),傳輸表空間的優點:
  1,不需要消耗太多的資源
  2,很方便的將表 從一個例項遷移到另一個例項
  3,相對於mysqldump來說你無須匯出然後匯入同時還的維護索引


二,正常的表空間遷移

     1, 源資料庫:
          use test;
          create table lidan(id int) engine=innodb;
          insert into lidan values(10);
     2,目標資料庫:
          use test;
          create table lidan(id int) engine=innodb;
          insert into lidan values(10); 
     3,目標資料庫解除安裝表空間:
         ALTER TABLE lidan DISCARD TABLESPACE;
         解除安裝表空間後lidan.ibd 檔案和表空間分離並且會對錶加一個排他鎖,此時如果執行dml則會直接報錯如圖:
           

     4,源資料執行表空間匯出:
         use test;
         FLUSH TABLES lidan FOR EXPORT;
        flush操作會觸發表lidan的dirty page重新整理到磁碟,並且stop purge 執行緒,同時將元資料資訊寫入lidan.cfg 如圖:
         
        元資料檔案儲存的資訊如下:
          
         主要就是一些資料庫和表名、row_id 、回滾指標、事物id等 
        該會話會一直持有表lidan的metadata鎖,故此時其他會話只能進行SELECT二更新和插入操作會被阻塞 。
        如圖:
         

        
     5,將匯出的表(源資料庫)所在資料檔案目錄下對應的lidan.ibd file和lidan.cfg 拷貝到目標資料庫對應的資料夾下
        cp -p  lidan.cfg lidan.ibd /data/percona-data-3307/test/ 
         
        注意:檔案的拷貝必須在下一步釋放metadata lock 之前
     6,釋放源資料庫的metadata lock
         use test;
         unlock table;
        unlock 這一步會刪除之前生成的lidan.cfg檔案,同時釋放metadata lock 並且重新啟動purge 執行緒
     7,目標資料庫將表匯入到表空間
        alter table lidan import tablespace; 
        然後檢視匯入成功如圖:
         
        匯入的過程mysql內部會做如下事情:
        a,檢查表空間每個page的一致性
        b,更新每個page的space id和lsn的資訊
        c,啟用頭部頁標記和更新LSN到頭部頁
        d,page 狀態資訊設定為dirty ,這樣page將很快會被重新整理到磁碟
       具體如圖
                 
三,誤刪除情況下的恢復
    這裡只討論備庫誤刪除的恢復,如果是主庫誤刪表那隻能通過備份來恢復了
     1,首先備庫上執行drop操作,模擬誤刪除
       (user:root  time: 16:37 port: 3307)[db: test]drop table lidan;
     2,備庫恢復必須要有.frm檔案,故這裡需要從源庫查看錶結構然後在目標庫建立
        create table lidan(id int) engine=innodb;  
     接下來的步驟就按照(二)當中從3開始做即可,具體請自行測試。
 
     
  參考:
http://dev.mysql.com/doc/refman/5.6/en/flush.html                                                        
http://dev.mysql.com/doc/refman/5.6/en/tablespace-copying.html