资讯专栏INFORMATION COLUMN

MySQL跨大版本的大表迁移

IT那活儿 / 2464人阅读
MySQL跨大版本的大表迁移

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!


  

生产环境数据库版本比较老,近来有需求需要将其中的某个库的几张大表剥离出来,放到新的环境(高版本)中去。小表通过mysqldump进行迁移,大表通过表空间迁移的方式进行迁移,以下介绍大表的迁移。





方案描述



1. 适用范围

  • MySQL5.6.6以上
  • 平台:Linux
2. 迁移前提要求
  • mysql版本5.6.6及以上;
  • 表存储引擎为innodb并且开启独立表空间innodb_file_per_table;
  • 处于导出状态的表只允许读也即是”read_only“状态;
  • DISCARD TABLESPACE不支持分区表[5.6.17才支持] 并且当表上具有外键关系的时候需要将 foreign_key_check设置为0
  • 源和目标实例的page size 必须大小一致
  • ALTER TABLE ... IMPORT TABLESPACE 不强制进行外键约束检查,所以需要将主表和子表都导出,然后在目标实例导入。

3. 优点

  1. 不需要消耗太多的资源;
  2. 很方便的将表从一个实例迁移到另一个实例;
  3. 相对于mysqldump来说你无须导出然后导入同时还的维护索引。

4. 导入的过程mysql内部会做如下事情

  1. 检查表空间每个page的一致性;
  2. 更新每个page的space id和lsn的信息;
  3. 启用头部页标记和更新LSN到头部页;
  4. page 状态信息设置为dirty ,这样page将很快会被刷新到磁盘。





操作步骤



1. 目标数据库

创建相同表结构:
use zdh;

DROP TABLE `user_basic_info`;
CREATE TABLE `user_basic_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) COLLATE utf8_unicode_ci NOT NULL DEFAULT  COMMENT 登录账号,
`password` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT  COMMENT 登录密码,
`name` varchar(30) COLLATE utf8_unicode_ci NOT NULL DEFAULT  COMMENT 用户姓名,
`mobile` varchar(11) COLLATE utf8_unicode_ci NOT NULL DEFAULT  COMMENT 手机号码,
`email` varchar(50) COLLATE utf8_unicode_ci DEFAULT  COMMENT 邮箱账号,
`address` varchar(100) COLLATE utf8_unicode_ci DEFAULT  COMMENT 地址信息,
`level` varchar(10) COLLATE utf8_unicode_ci DEFAULT  COMMENT 会员等级,
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 创建时间,
`utime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改时间,
PRIMARY KEY (`id`),
UNIQUE KEY `index_username` (`username`) USING BTREE COMMENT 登录账号唯一索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT=用户基本信息 ;
若报错(低版本到高版本):ERROR 1808 (HY000): Schema mismatch (Table flags dont match, server table has 0x4 and the meta-data file has 0x21)
请指定:row_format=COMPACT。
2. 目标数据库卸载表空间
ALTER TABLE user_basic_info DISCARD TABLESPACE;
3. 源数据执行表空间导出
use zdh

FLUSH TABLES user_basic_info FOR EXPORT;
4. 拷贝数据文件
scp -r user_basic_info.cfg user_basic_info.ibd mysql@XXX.XXX.XX.51:/data/mysql/data/zdh
5. 释放源数据库的metadata lock
use zdh

unlock table;
6. 目标数据库导入表空间
alter table user_basic_info import tablespace;
至此迁移完成,查看数据。


本文作者:赵栋辉(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129415.html

相关文章

  • 贝壳金服 TiDB 在线跨机房迁移实践

    摘要:截至年底,贝壳金服业务已覆盖全国多个城市及地区,为超过万用户提供了金融服务。老机房下线完成则表示数据迁移完成。机房迁移实施过程操作描述配置防火墙,将两个机房所需端口开通。执行下线命令,一次性下线所有旧机房的。跨机房迁移,网络延迟不能高于。 作者介绍 :李振环,贝壳金服数据基础架构负责人,目前负责数据平台和企业级数据仓库开发。 公司介绍 贝壳金服是专注居住场景的金融科技服务商,起步于2...

    Ashin 评论0 收藏0
  • 分表后需要注意的二三事

    摘要:分表字段的选择。问题产生之前提到在分表应用上线前我们需要将原有表的数据迁移到新表中,这样才能保证业务不受影响。虽说凌晨的业务量下降,但依然有少部分的请求过来,也会出现各种数据库异常。 showImg(https://segmentfault.com/img/remote/1460000019462791?w=496&h=285); 前言 本篇是上一篇《一次分表踩坑实践的探讨》,所以还没...

    dongxiawu 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<