表遷移

在作報表的時候,一般須要把額外幾張服務器中的表導入到一個數據庫中,這時候就須要表遷移!html

  • 利用mysqldump方式導入表
  • 使用INNODB表空間的方式遷移表
  • 使用select ...into file的方式遷移表

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]>
相關文章
相關標籤/搜索