表遷移工具的選型-複製ibd的方法-傳輸表空間
阿新 • • 發佈:2019-01-07
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, |
檢視資料大小情況(磁碟上的資料大小)
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. 總結
如果是資料量比較大,並且可以忍受對伺服器有一點影響的,就可以考慮使用這種方法來處理。並且需要注意的是最好遷移的資料庫版本是相同的。