表分区
<p><strong>实验环境:(都是mysql5.7)</strong></p>
<p>源库:192.168.2.200 mysql5.7.16 zhangdb下的emp_2分区表的 </p>
<p>目标库:192.168.2.100 mysql5.7.18 test下 (将zhangdb的emp表,导入到目标库的test schema下)</p>
<p>--:在源数据库中创建测试分区表emp_2,然后导入数据</p>
<p>MySQL [zhangdb]> CREATE TABLE emp_2(</p>
<p>id BIGINT unsigned NOT NULL AUTO_INCREMENT,</p>
<p>x VARCHAR(500) NOT NULL,</p>
<p>y VARCHAR(500) NOT NULL,</p>
<p>PRIMARY KEY(id)</p>
<p>)</p>
<p>PARTITION BY RANGE COLUMNS(id) </p>
<p>(</p>
<p>PARTITION p1 VALUES LESS THAN (1000), </p>
<p>PARTITION p2 VALUES LESS THAN (2000), </p>
<p>PARTITION p3 VALUES LESS THAN (3000) </p>
<p>); </p>
<p>(接着创建存储过程,导入测试数据)</p>
<p>DELIMITER //</p>
<p>CREATE PROCEDURE insert_batch()</p>
<p>begin </p>
<p>DECLARE num INT;</p>
<p>SET num=1;</p>
<p>WHILE num < 3000 DO</p>
<p>IF (num%10000=0) THEN</p>
<p>COMMIT;</p>
<p>END IF;</p>
<p>INSERT INTO emp_2 VALUES(NULL, REPEAT('X', 500), REPEAT('Y', 500));</p>
<p>SET num=num+1;</p>
<p>END WHILE;</p>
<p>COMMIT;</p>
<p>END //</p>
<p>DELIMITER ;</p>
<p>mysql> select TABLE_NAME,PARTITION_NAME from information_schema.partitions where table_schema='zhangdb';</p>
<p>+------------+----------------+</p>
<p>| TABLE_NAME | PARTITION_NAME |</p>
<p>+------------+----------------+</p>
<p>| emp | NULL |</p>
<p>| emp_2 | p1 |</p>
<p>| emp_2 | p2 |</p>
<p>| emp_2 | p3 |</p>
<p>+------------+----------------+</p>
<p>4 rows in set (0.00 sec)</p>
<p>mysql> select count(*) from emp_2 partition (p1);</p>
<p>+----------+</p>
<p>| count(*) |</p>
<p>+----------+</p>
<p>| 999 |</p>
<p>+----------+</p>
<p>1 row in set (0.00 sec)</p>
<p>mysql> select count(*) from emp_2 partition (p2);</p>
<p>+----------+</p>
<p>| count(*) |</p>
<p>+----------+</p>
<p>| 1000 |</p>
<p>+----------+</p>
<p>1 row in set (0.00 sec)</p>
<p>mysql> select count(*) from emp_2 partition (p3);</p>
<p>+----------+</p>
<p>| count(*) |</p>
<p>+----------+</p>
<p>| 1000 |</p>
<p>+----------+</p>
<p>1 row in set (0.00 sec)</p>
<p>从上面可以看出,emp_2分区表已经创建完成,并且有3个子分区,每个分区都有一点数据。</p>
<p>--:在目标数据库中,创建emp_2表的结构,不要数据(要在源库,使用show create table emp_2\G 的方法 查看创建该表的sql)</p>
<p>MySQL [test]> CREATE TABLE <code>emp_2</code> (</p>
<p><code>id</code> bigint(20) unsigned NOT NULL AUTO_INCREMENT,</p>
<p><code>x</code> varchar(500) NOT NULL,</p>
<p><code>y</code> varchar(500) NOT NULL,</p>
<p>PRIMARY KEY (<code>id</code>)</p>
<p>) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8mb4</p>
<p>/*!50500 PARTITION BY RANGE COLUMNS(id)</p>
<p>(PARTITION p1 VALUES LESS THAN (1000) ENGINE = InnoDB,</p>
<p>PARTITION p2 VALUES LESS THAN (2000) ENGINE = InnoDB,</p>
<p>PARTITION p3 VALUES LESS THAN (3000) ENGINE = InnoDB) */ ;</p>
<p>[root@localhost test]# ll</p>
<p>-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p0.ibd</p>
<p>-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p1.ibd</p>
<p>-rw-r----- 1 mysql mysql 98304 May 25 15:58 emp_2#P#p2.ibd</p>
<p>注意:</p>
<p>※约束条件、字符集等等也必须一致,建议使用show create table t1; 来获取创建表的SQL,否则在新服务器上导入表空间的时候会提示1808错误。</p>
<p>--:在目标数据库上,丢弃分区表的表空间</p>
<p>MySQL [test]> alter table emp_2 discard tablespace;</p>
<p>Query OK, 0 rows affected (0.12 sec)</p>
<p>[root@localhost test]# ll ---这时候在看,刚才的3个分区的idb文件都没有了</p>
<p>-rw-r----- 1 mysql mysql 8604 May 25 04:14 emp_2.frm</p>
<p>--:在源数据库上运行FLUSH TABLES … FOR EXPORT 锁定表并生成.cfg元数据文件,最后将cfg和ibd文件传输到目标数据库中</p>
<p>mysql> flush tables emp_2 for export;</p>
<p>Query OK, 0 rows affected (0.00 sec)</p>
<p>[root@localhost zhangdb]# scp emp_2* root@192.168.2.100:/mysql/data/test/ --将文件cp到目标数据库</p>
<p>mysql> unlock tables; ---最后将表的锁是否</p>
<p>--:在目标数据库中对文件授权,然后导入表空间查看数据是否完整可用</p>
<p>[root@localhost test]# chown mysql.mysql emp_2#*</p>
<p>MySQL [test]> alter table emp_2 import tablespace;</p>
<p>Query OK, 0 rows affected (0.96 sec)</p>
<p>MySQL [test]> select count(*) from emp_2;</p>
<p>+----------+</p>
<p>| count(*) |</p>
<p>+----------+</p>
<p>| 2999 |</p>
<p>+----------+</p>
<p>1 row in set (0.63 sec)</p>
<p>从上面的查看得知,分区表都已经导入到目标数据库中了,</p>
<p>另外,也可以将部分子分区导入到目标数据库中,(往往整个分区表会很大,可用只将需要用到的子分区导入到目标数据库中),</p>
<p>将部分子分区导入到目标数据库的方法是:</p>
<p>1、在创建目标表的时候,只需要创建要导入的分区即可,如: 只创建了p2 p3两个分区</p>
<p>CREATE TABLE <code>emp_2</code> (</p>
<p><code>id</code> bigint(20) unsigned NOT NULL AUTO_INCREMENT,</p>
<p><code>x</code> varchar(500) NOT NULL,</p>
<p><code>y</code> varchar(500) NOT NULL,</p>
<p>PRIMARY KEY (<code>id</code>)</p>
<p>) ENGINE=InnoDB AUTO_INCREMENT=3000 DEFAULT CHARSET=utf8mb4</p>
<p>/*!50500 PARTITION BY RANGE COLUMNS(id)</p>
<p>(</p>
<p>PARTITION p2 VALUES LESS THAN (2000) ENGINE = InnoDB,</p>
<p>PARTITION p3 VALUES LESS THAN (3000) ENGINE = InnoDB) */</p>
<p>2、从源库cp到目标库的文件,当然也就是这俩的,就不需要其他分区的了,</p>
<p>3、其他的操作方法都一样了。</p>