表迁移工具的选型-复制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.?總結
如果是數據量比較大,并且可以忍受對服務器有一點影響的,就可以考慮使用這種方法來處理。并且需要注意的是最好遷移的數據庫版本是相同的。
轉載于:https://www.cnblogs.com/DataArt/p/10231920.html
總結
以上是生活随笔為你收集整理的表迁移工具的选型-复制ibd的方法-传输表空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS2.X架构及工作原理
- 下一篇: Makefile:160: recipe