数据库迁移上云

简介

随着云计算的兴起,越来越多的企业考虑到数据库的稳定性和运维成本,会将运行在本地服务器或是其他虚拟服务器上的数据库迁移到云上,我们推荐您使用DTS来进行迁移。下面将结合案例按照迁移评估、迁移准备、迁移操作、业务切换、验证等步骤详细介绍DTS迁移方案。

DTS迁移方案的优势

  • 减少了手工操作的成本,避免了因人为误操作导致数据迁移的问题。
  • 遇到网络问题时,避免中间找点和重新迁移的代价,可以平滑实现断点续传,保障迁移进度可控。
  • DTS解决了跨网络的连通性问题,代价更低,用户迁移过程更透明。

DTS不停机迁移的步骤

通过实时同步方式,使用户迁移过程不会影响正常业务,并可实现秒级别停机切换。具体步骤如下:

  • 在源实例入口对DTS服务器进行授权,允许DTS服务从源数据库中读取数据和拉取增量;
  • 源实例需要开启ROW格式的binlog,以便可以实时同步增量数据(5.1及以上版本支持);

    注意:如果源入口使用开启ROW格式的从库作为同步源时,在动态修改binlog格式之后,需要重启一下从库的同步线程以便让修改binlog格式生效。

  • 使用DTS来进行结构+全量+增量数据的迁移,具体操作步骤详见数据迁移

  • 停止应用程序写入,等到新数据库和老主库的数据一致后,修改应用程序的数据库访问地址,并开始写入。
  • 结束DTS迁移任务,从而完成上云迁移。

迁移方案

数据库作为应用程序中的关键组件之一,将数据库迁移到新的平台是一项非常大的变动,可能影响到程序的功能、稳定性和性能,所以在迁移之前必须进行充分的调研和测试。迁移的阶段包含如下:

迁移评估阶段

数据迁移前需要评估迁移前后对业务及应用程序的影响,包括:

  • 迁移上云之后数据库的版本和新特性是否会影响正常功能?(如RDS不允许使用myisam表,会自动转换成innodb表)
  • 是否需要修改代码来适配云上的环境?
  • 迁移前后容量问题是否造成响应耗时的增加从而导致业务性能下降?(需要通过性能测试来确保响应耗时差距不大)
  • RDS跨地域通过专线方式同步,需要考虑多地域的写入时延。

迁移准备阶段

迁移准备工作主要指迁移之前需要完成4项检查:授权检查、检查BINLOG格式、数据表是否有主键和sql_mode检查。

  1. 在源数据库中对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_@'%'查看账号权限。

  2. 检查源数据库的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可读的内容)说明已经修改成功。

  3. 检查要迁移的数据库中的表是否有主键

    为保障迁移过程更加顺利,我们要求迁移的表必须有主键,这样在全量迁移过程中由于网络或其他原因导致的中断可以断点续传,确保迁移进度可控。检查方法如下:

    • 执行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查看是否有主键。
  4. 检查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'进行模式设置。

迁移操作阶段

  1. 在百度智能云的RDS服务中创建数据库实例,创建方法参见登录并创建RDS for MySQL实例
  2. 进入DTS产品页面点击新建迁移任务

  3. 填写源数据库和目标数据库信息

  4. 选择需要迁移的库表

  5. 查看检查结果通过后,启动迁移

  6. 查看任务进度和增量延迟情况


    结构迁移进度详情:

    全量迁移进度详情:

    增量迁移进度详情:

进行到增量数据迁移阶段,并且延迟为0的情况,就说明已经追上同步,下一步开始切流量。

业务切换阶段

  1. 所有写入仍然走源数据库主库,数据通过DTS实时同步。
  2. 将业务程序部署到云服务器上,此时读写数据库还可以读写源数据库。
  3. 数据