1. 程式人生 > >表遷移工具的選型-複製ibd的方法-傳輸表空間

表遷移工具的選型-複製ibd的方法-傳輸表空間

1.1. 場景

有的時候開放人員自己的庫需要幫忙導一些資料,但是表的資料量又很大。雖然說使用mysqldump或mysqlpump也可以導。但是這耗時需要比較久。

記得之前建議開放人員可以直接使用navicat去抽取測試庫的資料。但是發現但遇到大表的時候,發現navicat會卡死。

1.2. 使用方法

使用拷貝*.ibd的方法。

注意:使用這種方法會鎖表。因為是測試庫,對伺服器有一些影響還是可以接受的。

1.3. 先決條件

前提必須開啟innodb_file_per_table選項,並且使用InnoDB儲存引擎:

 
1 set global innodb_file_per_table = 1;

 

1.4. 製造大表

下面我們製造表資料,下面模擬的資料比較小,主要是為了節省時間:

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 USE test; -- 建立表t1 DROP TABLE IF EXISTS t1; CREATE TABLE t1(   id BIGINT unsigned NOT NULL AUTO_INCREMENT,   x VARCHAR(500) NOT NULL,
  y VARCHAR(500) NOT NULL,   PRIMARY KEY(id) );   -- 建立新增資料儲存過程 DROP PROCEDURE insert_batch; DELIMITER // CREATE PROCEDURE insert_batch() begin   DECLARE num INT;   SET num=1;   WHILE num < 1000000 DO     IF (num%10000=0) THEN       COMMIT;     END IF;     INSERT INTO t1 VALUES(NULL, REPEAT('X', 500), REPEAT('Y', 500));     SET num=num+1;   END WHILE;   COMMIT; END //   DELIMITER ;   -- 新增資料 CALL insert_batch(); DROP PROCEDURE insert_batch;

檢視資料大小情況(磁碟上的資料大小)

 
1 2 3 ls -lh /u02/data/test/t1.* -rw-r----- 1 mysql mysql 8.5K Mar 10 13:54 /u02/data/test/t1.frm -rw-r----- 1 mysql mysql 1.2G Mar 10 14:20 /u02/data/test/t1.ibd

檢視真實的大小情況

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 select count(*) from t1; +----------+ | count(*) | +----------+ |   999999 | +----------+   SELECT table_name,   data_length/1024/1024 AS 'data_length(MB)',   index_length/1024/1024 AS 'index_length(MB)',   (data_length + index_length)/1024/1024 AS 'total(MB)' FROM information_schema.tables WHERE table_schema='test'   AND table_name = 't1'; +------------+-----------------+------------------+---------------+ | table_name | data_length(MB) | index_length(MB) | total(MB)     | +------------+-----------------+------------------+---------------+ | t1         |   1048.00000000 |       0.00000000 | 1048.00000000 | +------------+-----------------+------------------+---------------+

從上面可以看出在磁碟上的資料大小是1.2G,而實際的大小才1048MB(估計值),實際情況會比上面的資料大很多。

1.5. 將test.t1遷移到test2.t1中

1、test2庫中建立和test.t1相同的表結構

 
1 2 3 CREATE DATABASE test2; USE test2; CREATE TABLE t1 LIKE test.t1;

2、廢棄test2.t1表空間,等待新表空間匯入

 
1 2 USE test2; ALTER TABLE t1 DISCARD TABLESPACE;

3、鎖表匯出test.t1表元資料

 
1 2 USE test; FLUSH TABLES t1 FOR EXPORT;

4、將test.t1表*.ibd和*.cfg檔案拷貝到test2庫中

 
1 2 3 4 5 6 cp t1.cfg /u02/data/test2/ cp t1.ibd /u02/data/test2/ ll -h /u02/data/test2/ -rw-r----- 1 root  root   424 Mar 10 14:41 t1.cfg -rw-r----- 1 mysql mysql 8.5K Mar 10 14:33 t1.frm -rw-r----- 1 root  root  1.2G Mar 10 14:41 t1.ibd

5、釋放test.t1鎖

 
1 2 USE test; UNLOCK TABLES;

6、test2匯入t1資料

 
1 2 3 chown -R mysql:mysql /u02/data/test2 USE test2; ALTER TABLE t1 IMPORT TABLESPACE;

7、檢視test2.t1資料

 
1 2 3 4 5 6 7 USE test2; SELECT COUNT(*) FROM t1; +----------+ | COUNT(*) | +----------+ |   999999 | +----------+

 

1.6. 總結

如果是資料量比較大,並且可以忍受對伺服器有一點影響的,就可以考慮使用這種方法來處理。並且需要注意的是最好遷移的資料庫版本是相同的。