我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL分区如何迁移

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL分区如何迁移

| 背景
需求来源

MySQL越来越流行,而且存储在MySQL的数据量也越来越大,单表数据达亿行已经是非常常见的现象,而这些表里面保存了大量的历史记录,严重影响SQL执行的效率。本文是针对客户需求,迁移MySQL Innodb大表分区中部分历史归档分区到其他实例或者其他库表,而且迁移过程尽量减少对业务环境的影响。

环境介绍
  • MySQL 5.7.21

  • Centos 7.4

  • innodb_file_per_table=1


| MySQL常用的Innodb迁移方法
  • MySQL Enterprise Backup(物理备份,类似于xtrabackup)

  • Copying Data Files (冷备份)

  • 逻辑导出和导入(mysqldump,mydumper,mysqlpump)

  • 可传输的表空间


| 迁移方案(可传输的表空间)
准备工作
  • MySQL版本必须是5.7

  • 迁移过程中存在短暂时间内业务不可写,建议提前做好准备

操作步骤
查看需要迁移表(原表)结构

root@localhost : testdba 02:03:18> use test
Database changed
root@localhost : test 08:37:50> show create table sbtest2;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest2 | CREATE TABLE `sbtest2` (
`id` int(10) DEFAULT NULL,
`name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`date` int(20) DEFAULT NULL,
KEY `idx_fenqu` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost : test 12:04:03> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sbtest2';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p0 | 22 |
| p1 | 2 |
| p2 | 2 |
| p3 | 2 |
| p4 | 2 |
| p5 | 2 |
| p6 | 2 |
| p7 | 2 |
| p8 | 2 |
| p9 | 2 |
| p10 | 2 |
| p11 | 2 |
| p12 | 2 |
| p13 | 2 |
| p14 | 2 |
| p15 | 2 |
| p16 | 2 |
| p17 | 2 |
| p18 | 2 |
| p19 | 14 |
+----------------+------------+
20 rows in set (0.00 sec)
按照个人迁移分区表需求,可以把历史分区迁移到其他MySQL实例,也可以迁移到同一MySQL实例的其他库中。首先创建与原表相同表结构的分区表,在创建分区表时,我们只需要创建我们需要迁移的表分区结构。例:下面是迁移案例,由于只迁移2017年数据,所以表结构只创建了存储2017年数据的分区(也就是分区p2-p13)。  

root@localhost : test 01:59:36> create database testdba;
Query OK, 1 row affected (0.12 sec)
root@localhost : test 01:59:44> use testdba;
Database changed
root@localhost : testdba 06:04:26> CREATE TABLE `sbtest2` (
-> id int(10),
-> name varchar(20),
-> date int(20),
-> key idx_fenqu(date)
-> )
-> PARTITION BY RANGE (date) (
-> PARTITION p2 VALUES LESS THAN (20170201),
-> PARTITION p3 VALUES LESS THAN (20170301),
-> PARTITION p4 VALUES LESS THAN (20170401),
-> PARTITION p5 VALUES LESS THAN (20170501),
-> PARTITION p6 VALUES LESS THAN (20170601),
-> PARTITION p7 VALUES LESS THAN (20170701),
-> PARTITION p8 VALUES LESS THAN (20170801),
-> PARTITION p9 VALUES LESS THAN (20170901),
-> PARTITION p10 VALUES LESS THAN (20171001),
-> PARTITION p11 VALUES LESS THAN (20171101),
-> PARTITION p12 VALUES LESS THAN (20171201),
-> PARTITION p13 VALUES LESS THAN (20180101)
-> );
Query OK, 0 rows affected (0.22 sec)
清除新表所有的分区独立表空间,为导入原表的分区独立表空间做准备

root@localhost : testdba 02:00:05> use testdba;
Database changed
root@localhost : testdba 02:00:23> ALTER TABLE sbtest2 DISCARD PARTITION p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 TABLESPACE;
Query OK, 0 rows affected (0.27 sec)
在原表中执行FLUSH TABLES ... FOR EXPORT(在分区表空间传输没有完成之前,不要退出该会话或者执行unlock tables;操作),用来获取元数据校验文件.cfg和确保该表的脏页刷到磁盘,并加共享表锁

root@localhost : testdba 02:00:24> USE test;
Database changed
root@localhost : test 02:00:29> FLUSH TABLES test.sbtest2 FOR EXPORT;
Query OK, 0 rows affected (0.00 sec)
[root@slave test]# cd /var/lib/mysql/data/mydata/test
[root@slave test]# ls 
db.opt sbtest2#P#p10.cfg sbtest2#P#p12.ibd sbtest2#P#p15.cfg sbtest2#P#p17.ibd sbtest2#P#p2.cfg sbtest2#P#p4.ibd sbtest2#P#p7.cfg sbtest2#P#p9.ibd
sbtest2#P#p0.cfg sbtest2#P#p10.ibd sbtest2#P#p13.cfg sbtest2#P#p15.ibd sbtest2#P#p18.cfg sbtest2#P#p2.ibd sbtest2#P#p5.cfg sbtest2#P#p7.ibd sbtest2.frm
sbtest2#P#p0.ibd sbtest2#P#p11.cfg sbtest2#P#p13.ibd sbtest2#P#p16.cfg sbtest2#P#p18.ibd sbtest2#P#p3.cfg sbtest2#P#p5.ibd sbtest2#P#p8.cfg
sbtest2#P#p1.cfg sbtest2#P#p11.ibd sbtest2#P#p14.cfg sbtest2#P#p16.ibd sbtest2#P#p19.cfg sbtest2#P#p3.ibd sbtest2#P#p6.cfg sbtest2#P#p8.ibd
sbtest2#P#p1.ibd sbtest2#P#p12.cfg sbtest2#P#p14.ibd sbtest2#P#p17.cfg sbtest2#P#p19.ibd sbtest2#P#p4.cfg sbtest2#P#p6.ibd sbtest2#P#p9.cfg
进入到原表ibd所在的目录下,把原表需要迁移的分区表空间和元数据校验文件.cfg传输到新表所在的位置,并赋予权限

[root@slave test]# cp sbtest2#P#p2.* sbtest2#P#p3.* sbtest2#P#p4.* sbtest2#P#p5.* sbtest2#P#p6.* sbtest2#P#p7.* sbtest2#P#p8.* sbtest2#P#p9.* sbtest2#P#p10.* sbtest2#P#p11.* sbtest2#P#p12.* sbtest2#P#p13.* /var/lib/mysql/data/mydata/testdba/
[root@slave test]# ls ../testdba/
db.opt sbtest2#P#p11.cfg sbtest2#P#p12.ibd sbtest2#P#p2.cfg sbtest2#P#p3.ibd sbtest2#P#p5.cfg sbtest2#P#p6.ibd sbtest2#P#p8.cfg sbtest2#P#p9.ibd
sbtest2#P#p10.cfg sbtest2#P#p11.ibd sbtest2#P#p13.cfg sbtest2#P#p2.ibd sbtest2#P#p4.cfg sbtest2#P#p5.ibd sbtest2#P#p7.cfg sbtest2#P#p8.ibd sbtest2.frm
sbtest2#P#p10.ibd sbtest2#P#p12.cfg sbtest2#P#p13.ibd sbtest2#P#p3.cfg sbtest2#P#p4.ibd sbtest2#P#p6.cfg sbtest2#P#p7.ibd sbtest2#P#p9.cfg
[root@slave test]# chown -R mysql:mysql /var/lib/mysql
切回到执行FLUSH TABLES ... FOR EXPORT语句窗口,释放共享表锁

root@localhost : test 02:00:29> USE test;
Database changed
root@localhost : test 02:01:07> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
进入新表所在的实例或新表所在的库,手动导入分区表空间,进行数据恢复(应用传输到新表的分区表空间)

root@localhost : test 02:01:07> USE testdba;
Database changed
root@localhost : testdba 02:01:14> ALTER TABLE sbtest2 IMPORT PARTITION p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 TABLESPACE;
Query OK, 0 rows affected (0.62 sec)
表空间迁移完成,数据恢复完成,最后校验数据准确性

root@localhost : testdba 02:03:16> SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'sbtest2' and TABLE_SCHEMA='testdba';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p2 | 2 |
| p3 | 2 |
| p4 | 2 |
| p5 | 2 |
| p6 | 2 |
| p7 | 2 |
| p8 | 2 |
| p9 | 2 |
| p10 | 2 |
| p11 | 2 |
| p12 | 2 |
| p13 | 2 |
+----------------+------------+
12 rows in set (0.00 sec)
| 总结

以上是我们使用MySQL的分区表空间传输方法,解决了分区表历史数据归档到其他实例或者同一实例其他库的问题。对比逻辑迁移方式mysqldump或者insert .. select ...方式速度更快,数据立即可用,而且对业务的影响更小。


| 作者简介

岳雷·沃趣科技数据库工程师

熟悉MySQL体系结构和innodb存储引擎工作原理;以及MySQL备份恢复、复制、数据迁移等技术;专注于MySQL、MariaDB开源数据库,喜好开源技术。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL分区如何迁移

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何快速迁移MySQL数据

本篇内容主要讲解“如何快速迁移MySQL数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速迁移MySQL数据”吧!我们通常会遇到这样的一个场景,就是需要将一
2023-02-02

mysql镜像数据如何迁移

mysql 镜像数据迁移步骤如下:创建源数据库快照。在目标系统上创建新数据库。将快照文件复制到目标系统。使用 mysqlpump 或其他恢复工具恢复数据到目标数据库。验证数据完整性。如何迁移 MySQL 镜像数据MySQL 镜像数据迁移是
mysql镜像数据如何迁移
2024-06-15

redis如何迁移

redis 迁移的目的是升级版本、扩大容量、优化拓扑和避免数据丢失。迁移步骤包括:准备源服务器、创建目标服务器、复制数据、切换到目标服务器。常见的迁移方法有 rdb 迁移、aof 迁移和增量复制。最佳实践包括仔细计划、选择合适的方法、使用缓
redis如何迁移
2024-06-12

如何在 Linux 上将 MySQL 迁移到 MariaDB?

本文将帮助您将数据库从 MySQL 迁移到 MariaDB,因为迁移过程中 MySQL 到 MariaDB 的二进制兼容性非常简单。Oracle 收购 MySQL 后,社区推动了此类运动的成果,并开发了一个名为 MariaDB 的新数据库。
2023-10-22

技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25

作者:秦广飞爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节操是路人。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。背景客户环境数据库目
技术分享 | MariaDB 10.1.9 迁移到 MySQL 5.7.25
2015-04-25

如何使用 PHP 进行 MySQL 数据迁移?

php mysql 数据迁移指南:建立到源和目标数据库的连接。从源数据库提取数据。在目标数据库中创建匹配源表的结构。使用逐行插入逐行将数据从源数据库迁移到目标数据库。如何使用 PHP 进行 MySQL 数据迁移简介数据迁移是将数据从一个
如何使用 PHP 进行 MySQL 数据迁移?
2024-05-12

编程热搜

目录