数据库迁移上云
概览
随着云计算的兴起,越来越多的企业考虑到数据库的稳定性和运维成本,会将运行在本地服务器或是其他虚拟服务器上的数据库迁移到云上,我们推荐您使用DTS来进行迁移。下面将结合案例按照迁移评估、迁移准备、迁移操作、业务切换、验证等步骤详细介绍DTS迁移方案。
DTS迁移方案的优势
- 减少了手工操作的成本,避免了因人为误操作导致数据迁移的问题。
- 遇到网络问题时,避免中间找点和重新迁移的代价,可以平滑实现断点续传,保障迁移进度可控。
- DTS解决了跨网络的连通性问题,代价更低,用户迁移过程更透明。
DTS不停机迁移的步骤
通过实时同步方式,使用户迁移过程不会影响正常业务,并可实现秒级别停机切换。具体步骤如下:
- 在源实例入口对DTS服务器进行授权,允许DTS服务从源数据库中读取数据和拉取增量。
-
源实例需要开启ROW格式的binlog,以便可以实时同步增量数据(5.1及以上版本支持)。
注意:如果源入口使用开启ROW格式的从库作为同步源时,在动态修改binlog格式之后,需要重启一下从库的同步线程以便让修改binlog格式生效。
- 使用DTS来进行结构+全量+增量数据的迁移,具体操作步骤详见数据迁移。
- 停止应用程序写入,等到新数据库和老主库的数据一致后,修改应用程序的数据库访问地址,并开始写入。
- 结束DTS迁移任务,从而完成上云迁移。
需求场景
适用于业务需要不停机迁移上云场景的用户。
方案概述
数据库作为应用程序中的关键组件之一,将数据库迁移到新的平台是一项非常大的变动,可能影响到程序的功能、稳定性和性能,所以在迁移之前必须进行充分的调研和测试。迁移的阶段包含如下:
迁移评估阶段
数据迁移前需要评估迁移前后对业务及应用程序的影响,包括:
- 迁移上云之后数据库的版本和新特性是否会影响正常功能?(如RDS不允许使用myisam表,会自动转换成innodb表)
- 是否需要修改代码来适配云上的环境?
- 迁移前后容量问题是否造成响应耗时的增加从而导致业务性能下降?(需要通过性能测试来确保响应耗时差距不大)
- RDS跨地域通过专线方式同步,需要考虑多地域的写入时延。
迁移准备阶段
迁移准备工作主要指迁移之前需要完成4项检查:授权检查、检查BINLOG格式、数据表是否有主键和sql_mode检查。
-
在源数据库中对DTS服务器增加授权。
- 由于DTS服务器的出口IP是变化的,对于外网用户的上云迁移,需要对所有网段进行授权。
-
内网数据库上云迁移只需授权固定的几个IP即可,具体授权的IP需要咨询DTS维护人员。授权语句如下:
GRANT SELECT,LOCK TABLES,SUPER,REPLICATION SLAVE,REPLICATION CLIENT,SHOW VIEW on *.* to _dts_trans_@'%' identified by 'your_password'
;不同迁移类型需要的权限说明如下:- 结构或全量迁移:SELECT、LOCK TABLES、SUPER、SHOW VIEW(LOCK TABLES权限是为了迁移无主键的表,SUPER权限是为了检查源库binlog是否存在)。
- 增量迁移:REPLICATION SLAVE、REPLICATION CLIENT。
- 如果需要数据校验功能,还需要给baidudts系统库授权CREATE、INSERT、UPDATE、DELETE、DROP权限,否则将无法使用数据校验等高级功能。数据校验授权命令请参考`GRANT CREATE,INSERT,UPDATE,DELETE,DROP on baidu_dts.* to _dts_trans@'%' identified by 'your_password'`。
- 授权完之后,请检查授权是否生效。执行命令
mysql -h 源数据库ip -P 源数据库端口 -u 用户名 -p密码
使用账号密码的方式连接mysql,登录成功之后,执行SHOW GRANTS FOR _dts_trans_@'%'
查看账号权限。
-
检查源数据库的BINLOG格式。
- 首先执行命令
mysql -h 源数据库ip -P 源数据库端口 -u 用户名 -p密码
查看源库的BINLOG是否已经开启。 - 登录成功之后,执行
show variables like 'log_bin'
查看log_bin是否打开。 - 执行
show master logs
查看是否已经有binlog在实时写入。 - 最后执行
show variables like 'binlog_format'
检查binlog格式是否改成ROW格式。
正常的检查结果如下:
注意:
如果源数据库选择的是MYSQL的一个从库,而且通过动态方式修改binlog_format(set global binlog_format='ROW';),必须重启同步线程(stop slave; start slave;)从而让ROW格式正式生效。
若源库为自建数据库单实例,在修改binlog格式后,需排查并kill源库的长连接,以保证binlog格式生效。最好的方式执行
mysql/bin/mysqlbinlog mysql-bin.000040
查看最新的binlog内容是否已经被改成了ROW格式。出现如下红框中的类似内容(非sql可读的内容)说明已经修改成功。 - 首先执行命令
-
检查要迁移的数据库中的表是否有主键。
为保障迁移过程更加顺利,我们要求迁移的表必须有主键,这样在全量迁移过程中由于网络或其他原因导致的中断可以断点续传,确保迁移进度可控。检查方法如下:
- 执行
mysql -h 源数据库ip -P 源数据库端口 -u 用户名 -p密码
命令连接数据库。 - 登录成功之后,执行
select * from information_schema.TABLE_CONSTRAINTS where TABLE_SCHEMA='db1' and TABLE_NAME='t1' and CONSTRAINT_TYPE='PRIMARY KEY'
或show create table db1.t1
查看是否有主键。
- 执行
-
检查sql_mode配置。
由于部分情况的sql_mode有潜在数据不一致的风险,sql_mode需要设置为如下集合中的某一项或某几项。
合法的sql_mode集合("", "REAL_AS_FLOAT", "PIPES_AS_CONCAT", "ANSI_QUOTES", "IGNORE_SPACE", "ONLY_FULL_GROUP_BY", "NO_UNSIGNED_SUBTRACTION", "NO_DIR_IN_CREATE", "POSTGRESQL", "ORACLE", "MSSQL", "DB2", "MAXDB", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS", "MYSQL323", "MYSQL40", "ANSI", "NO_AUTO_VALUE_ON_ZERO", "NO_BACKSLASH_ESCAPES", "STRICT_TRANS_TABLES", "STRICT_ALL_TABLES", "NO_ZERO_IN_DATE", "NO_ZERO_DATE", "ALLOW_INVALID_DATES", "ERROR_FOR_DIVISION_BY_ZERO", "TRADITIONAL", "HIGH_NOT_PRECEDENCE", "NO_ENGINE_SUBSTITUTION", "PAD_CHAR_TO_FULL_LENGTH", "NO_AUTO_CREATE_USER")
我们推荐登录成功后执行命令set global sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
进行模式设置。
迁移操作阶段
- 在百度智能云的RDS服务中创建数据库实例,创建方法参见登录并创建RDS for MySQL实例。
-
进入DTS产品页面点击新建迁移任务。
-
填写源数据库和目标数据库信息。
-
选择需要迁移的库表。
-
查看检查结果通过后,启动迁移。
-
查看任务进度和增量延迟情况。
结构迁移进度详情:
全量迁移进度详情:
增量迁移进度详情:
进行到增量数据迁移阶段,并且延迟为0的情况,就说明已经追上同步,下一步开始切流量。
业务切换阶段
- 所有写入仍然走源数据库主库,数据通过DTS实时同步。
- 将业务程序部署到云服务器上,此时读写数据库还可以读写源数据库。
- 数据库流量上云过程:读测试 -> 单地域读小流量 -> 单地域读百分比分阶段切上云 -> 其他地域读百分比分阶段切上云 -> 全部读上云 -> 写流量全量切上云。
- "写流量全量切上云"过程需要选择一个合适流量低峰时间,停写(业务层有MQ,不会丢失),检查数据已经实时同步到云上,停DTS任务,写逻辑切换至云,启动业务。
- 如需回滚,需要创建DTS增量同步任务,从RDS把增量数据同步到源数据库的主库,需要回滚时进行流量回切。
验证阶段
业务需验证应用程序正常功能是否可用,观察业务程序错误日志。观察RDS数据库负载情况,如果发现容量不足,需及时扩容,补充只读副本。 迁移完成。至此,数据库上云迁移流程全部完成,切换流量前如需数据校验,可联系DTS同学发起数据校验流程,进一步保障上云前后的数据一致性。
相关产品
云服务器BCC:高性能、高可靠、安全稳定的弹性计算服务
云数据库 SCS:兼容 Redis、Memcached 协议的分布式缓存服务
云数据库 RDS:专业、高性能、高可靠的关系型数据库
云数据库 DocDB for MongoDB:兼容 MongoDB 协议的文档数据库服务