学习成长

提供在线文档,方便大家学习


表分区

<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]&gt; 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 &lt; 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&gt; 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&gt; 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&gt; 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&gt; 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]&gt; 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]&gt; 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&gt; 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&gt; unlock tables; ---最后将表的锁是否</p> <p>--:在目标数据库中对文件授权,然后导入表空间查看数据是否完整可用</p> <p>[root@localhost test]# chown mysql.mysql emp_2#*</p> <p>MySQL [test]&gt; alter table emp_2 import tablespace;</p> <p>Query OK, 0 rows affected (0.96 sec)</p> <p>MySQL [test]&gt; 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>

页面列表

ITEM_HTML