在作報表的時候,一般須要把額外幾張服務器中的表導入到一個數據庫中,這時候就須要表遷移!html
mysqldump方式導入表mysql
這種方式適合用於表數據不是太大時候,這是一種邏輯導入與導出,導出的文件時sql語句,而後把導出的sql語句在另外一臺服務器上執行便可!sql
1:先備份要導出的那個表數據庫
#備份出須要遷移的表 mysqldump -utest -p123456 --single-transaction fi_repayplan fi_tdaymoney > ` +%F`.sql [root@test3 ~]# ll -h 2018-12-04.sql #這個文件總共103M -rw-r--r-- 1 root root 103M Dec 4 15:58 2018-12-04.sq
2:把備份文件考到另外一臺服務器上恢復服務器
[root@test2 ~]# mysql -utest -p123456 mytest < 2018-12-04.sql
若是這裏沒有報錯就能夠恢復了,能夠進入數據庫中,查看一行表的行數,對比確認一下!app
使用INNODB表空間的方式遷移表ide
這種方式的遷移數據,屬於物理遷移,適合數據量比較大的表!spa
第一種:鎖表遷移日誌
首先建立一個表,插入一些數據!htm
() () InnoDB CHARSET insert_data( s UNSIGNED c () REPEAT("a", s tb1 s s ); #表空間大小 [root@test3 mydb]# ll -h tb1.* -rw-rw---- 1 mysql mysql 760 Dec 5 08:00 tb1.frm -rw-rw---- 1 mysql mysql 884M Dec 5 08:01 tb1.ibd [root@test3 mydb]#
咱們把test3上的tb1表遷移到test2上面!
首先在test3上作以下操做:
MariaDB flush tb1 rows affected ( sec) #這條語句會強制進行fsync操做,會把當前的表加上一個read lock!這時候表不能寫入數據,只能讀數據,在對應目錄下面生成.cfg文件! #須要注意當前的會話不能關閉,不然.cfg文件會自動消失!.cfg文件存儲的是表的一些元信息 [root@test3 mydb]# ll tb1.* -rw-rw---- 1 mysql mysql 417 Dec 5 08:05 tb1.cfg -rw-rw---- 1 mysql mysql 760 Dec 5 08:00 tb1.frm -rw-rw---- 1 mysql mysql 926941184 Dec 5 08:01 tb1.ibd [root@test3 mydb]# strings tb1.cfg #.cfg文件的內容 test3 mydb/tb1 content DB_ROW_ID DB_TRX_ID DB_ROLL_PTR GEN_CLUST_INDEX DB_ROW_ID DB_TRX_ID DB_ROLL_PTR content
在test2上操做:
第一步:把test3上tb1的建表語句在test2上面執行,【建表語句必定不要錯,不然會報1808 schema 不匹配錯誤】 MariaDB [mytest]> CREATE TABLE `tb1` ( `id` int(10) DEFAULT NULL, `content` varchar(100) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.02 sec) 第二步:刪除新建表tb1的表空間 MariaDB [mytest]> alter table tb1 discard tablespace; Query OK, 0 rows affected (0.02 sec) 這條語句會刪除表的ibd文件,慎重執行 第三:拷貝表數據文件 把test3上的tb1.ibd文化和tb1.cfg文件拷貝到test2的對應表文件目錄下面[root@test3 mydb]# scp tb1.cfg tb1.ibd 10.0.102.204:/data/mariadb/mytest tb1.cfg 100% 417 698.3KB/s 00:00 tb1.ibd 100% 884MB 50.6MB/s 00:17 #第四步,修改文件屬主和屬組[root@test2 mytest]# chown -R mysql:mysql tb1.*#第五步:導入表空間文件 MariaDB [mytest]> alter table tb1 import tablespace; Query OK, 0 rows affected (10.49 sec)
最後解除test3上對錶tb1加的讀鎖!
MariaDB [mydb]> unlock tables; Query OK, 0 rows affected (0.00 sec)
第二種:不鎖表遷移
上面的方法咱們對tb1加上了讀鎖,在線上環境中,對一整張表加上讀鎖的代價是有點大的,所以咱們取巧,使用不鎖表遷移!
咱們知道innobackupex能夠在線備份,所以咱們能夠先把要遷移的表,備份出來,而後再導入表結構文件和元數據文件!
首先備份要遷移的表:
[root@test3 ~]# innobackupex --user=test --password=123456 --include="mydb.tb1" --no-timestamp tb1.sql#執行apply-log 操做[root@test3 ~]# innobackupex --apply-log --export tb1.sql/ 這一步要執行,刷新重作日誌[root@test3 ~]# cd tb1.sql/mydb/[root@test3 mydb]# ll #這裏的文件多了兩個, total 905244-rw-r--r-- 1 root root 428 Dec 5 08:25 tb1.cfg-rw-r----- 1 root root 16384 Dec 5 08:25 tb1.exp-rw-r----- 1 root root 760 Dec 5 08:25 tb1.frm-rw-r----- 1 root root 926941184 Dec 5 08:25 tb1.ibd
在test2上執行tb1的建表語句,而後discard掉表空間文件:過程和上面的是同樣的,咱們直接執行拷貝文件這一步!
roottb1.sql# scp tb1.cfg tb1.ibd .:datamariadbmytest
tb1 import tablespace; Query OK, 0 rows affected (10.57 sec) #這個時間是10.57秒
這兩種方法的本質是同樣的,只不過不鎖表遷移,只是把要遷移的數據備份了出來,而後對備份的數據進行操做而已!
第三種:使用select ...into file的方式
這種方式屬於邏輯遷移的方式,本質和第一種mydump是同樣的,只是這樣操做會相對於mydump會快點!
把數據導入到文件中:
MariaDB [mydb]> system mkdir /data/tb1; MariaDB [mydb]> system chown -R mysql:mysql /data/tb1; #文件的屬主與屬組須要改成mysql,不然沒有寫入權限 MariaDB [mydb]> select * from tb1 into outfile "/data/tb1/tb.txt"; Query OK, 6100000 rows affected (8.83 sec)
導入建表語句:
# mysqldump utest p123456 d mydb tb1 mysql utest p123456 h10.. mytest -d: 只導出表結構不導表數據 #當數據量少的時候,咱們能夠直接使用這條命令完成表的遷移
而後拷貝上面導出的表文件,而且導入!
[root@test3 mydb]# scp /data/tb1/tb.txt 10.0.102.204:/data tb.txt 100% 573MB 40.8MB/s 00:14 [root@test3 mydb]# #在test2上面導入表數據文件 MariaDB [mytest]> load data infile "/data/tb.txt" into table tb1; Query OK, 6100000 rows affected (1 min 2.29 sec) #這裏的時候是62秒,物理遷移導入時10秒鐘,時間相差6倍 Records: 6100000 Deleted: 0 Skipped: 0 Warnings: 0MariaDB [mytest]>