1. 程式人生 > >MySQL5.7傳輸表空間——遷移分區表

MySQL5.7傳輸表空間——遷移分區表

flush 目標 utf8 存儲 nod db文件 否則 exp 完成

Mysql 傳輸表空間--將InnoDB分區表復制到另一個實例(二)


實驗環境:(都是mysql5.7)

源庫:192.168.2.200 mysql5.7.16 zhangdb下的emp_2分區表的

目標庫:192.168.2.100 mysql5.7.18 test下 (將zhangdb的emp表,導入到目標庫的test schema下)


--:在源數據庫中創建測試分區表emp_2,然後導入數據

MySQL [zhangdb]> CREATE TABLE emp_2(

id BIGINT unsigned NOT NULL AUTO_INCREMENT,

x VARCHAR(500) NOT NULL,

y VARCHAR(500) NOT NULL,

PRIMARY KEY(id)

)

PARTITION BY RANGE COLUMNS(id)

(

PARTITION p1 VALUES LESS THAN (1000),

PARTITION p2 VALUES LESS THAN (2000),

PARTITION p3 VALUES LESS THAN (3000)

);

(接著創建存儲過程,導入測試數據)

DELIMITER //

CREATE PROCEDURE insert_batch()

begin

DECLARE num INT;

SET num=1;

WHILE num < 3000 DO

IF (num%10000=0) THEN

COMMIT;

END IF;

INSERT INTO emp_2 VALUES(NULL, REPEAT('X', 500), REPEAT('Y', 500));

SET num=num+1;

END WHILE;

COMMIT;

END //


DELIMITER ;


mysql> select TABLE_NAME,PARTITION_NAME from information_schema.partitions where table_schema='zhangdb';

+------------+----------------+

| TABLE_NAME | PARTITION_NAME |

+------------+----------------+

| emp | NULL |

| emp_2 | p1 |

| emp_2 | p2 |

| emp_2 | p3 |

+------------+----------------+

4 rows in set (0.00 sec)


mysql> select count(*) from emp_2 partition (p1);

+----------+

| count(*) |

+----------+

| 999 |

+----------+

1 row in set (0.00 sec)


mysql> select count(*) from emp_2 partition (p2);

+----------+

| count(*) |

+----------+

| 1000 |

+----------+

1 row in set (0.00 sec)


mysql> select count(*) from emp_2 partition (p3);

+----------+

| count(*) |

+----------+

| 1000 |

+----------+

1 row in set (0.00 sec)

從上面可以看出,emp_2分區表已經創建完成,並且有3個子分區,每個分區都有一點數據。


--:在目標數據庫中,創建emp_2表的結構,不要數據(要在源庫,使用show create table emp_2\G 的方法 查看創建該表的sql)

MySQL [test]> CREATE TABLE `emp_2` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`x` varchar(500) NOT NULL,

`y` varchar(500) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8mb4

/*!50500 PARTITION BY RANGE COLUMNS(id)

(PARTITION p1 VALUES LESS THAN (1000) ENGINE = InnoDB,

PARTITION p2 VALUES LESS THAN (2000) ENGINE = InnoDB,

PARTITION p3 VALUES LESS THAN (3000) ENGINE = InnoDB) */ ;


[root@localhost test]# ll

-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p0.ibd

-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p1.ibd

-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p2.ibd


註意:

※約束條件、字符集等等也必須一致,建議使用show create table t1; 來獲取創建表的SQL,否則在新服務器上導入表空間的時候會提示1808錯誤。


--:在目標數據庫上,丟棄分區表的表空間

MySQL [test]> alter table emp_2 discard tablespace;

Query OK, 0 rows affected (0.12 sec)


[root@localhost test]# ll ---這時候在看,剛才的3個分區的idb文件都沒有了

-rw-r----- 1 mysql mysql 8604 May 25 04:14 emp_2.frm


--:在源數據庫上運行FLUSH TABLES … FOR EXPORT 鎖定表並生成.cfg元數據文件,最後將cfg和ibd文件傳輸到目標數據庫中

mysql> flush tables emp_2 for export;

Query OK, 0 rows affected (0.00 sec)


[root@localhost zhangdb]# scp emp_2* [email protected]:/mysql/data/test/ --將文件cp到目標數據庫


mysql> unlock tables; ---最後將表的鎖是否


--:在目標數據庫中對文件授權,然後導入表空間查看數據是否完整可用

[root@localhost test]# chown mysql.mysql emp_2#*


MySQL [test]> alter table emp_2 import tablespace;

Query OK, 0 rows affected (0.96 sec)


MySQL [test]> select count(*) from emp_2;

+----------+

| count(*) |

+----------+

| 2999 |

+----------+

1 row in set (0.63 sec)

從上面的查看得知,分區表都已經導入到目標數據庫中了,


另外,也可以將部分子分區導入到目標數據庫中,(往往整個分區表會很大,可用只將需要用到的子分區導入到目標數據庫中),

將部分子分區導入到目標數據庫的方法是:

1、在創建目標表的時候,只需要創建要導入的分區即可,如: 只創建了p2 p3兩個分區

CREATE TABLE `emp_2` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`x` varchar(500) NOT NULL,

`y` varchar(500) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8mb4

/*!50500 PARTITION BY RANGE COLUMNS(id)

(

PARTITION p2 VALUES LESS THAN (2000) ENGINE = InnoDB,

PARTITION p3 VALUES LESS THAN (3000) ENGINE = InnoDB) */


2、從源庫cp到目標庫的文件,當然也就是這倆的,就不需要其他分區的了,

3、其他的操作方法都一樣了。


MySQL5.7傳輸表空間——遷移分區表