天天看点

数据迁移的预检测及修复方案预检查失败修复数据传输

数据传输(data

transmission)是阿里云提供的一种支持以数据库为核心的结构化存储产品之间的数据传输服务,它提供了数据迁移、数据订阅及实时同步等多种数据传输功能。使用数据传输服务实现数据一键上云的同时,您还可以轻松得构建安全、可扩展、高可用的数据架构。数据传输服务支持常见数据库类型,例如oracle、mysql、sql server、postgres plus

advanced server的数据迁移,同时,它支持云数据库rds

mysql的增量数据订阅及云数据库rds实例间的实时同步。

<b>本文将简单介绍云数据库rds在数据迁移启动之间的预检查阶段检查的内容,失败原因及具体修复方法。</b>

<b>源库连接性检查</b>

检测数据传输服务器是否能够连通要迁移的源数据库。数据传输服务通过jdbc协议创建到源数据库的连接,当创建连接失败时,这个检查项即失败。

当源库连接性预检查失败时,可能是由于如下表中几种原因:

1.1   <b>1. 创建迁移任务时,提供的账号或密码不正确</b>

<b>检测方法</b>:在任何一台能够网络能够跟源数据库互通的服务器上,使用创建迁移任务使用的账号/密码,通过客户端软件连接源数据库,确认是否能够正常连接。如果连接报错,且报错信息中含有access deny,那么说明账号或密码有误。

<b>修复方法</b>:在数据传输服务控制台修改迁移任务,将账号密码修改成正确的配置后重新预检查。 

<b>2. 源库迁移账号限制了来源ip</b>

 <b>检测方法</b>:

(1) 在一台网络能够跟源数据库连通的服务器上,使用创建迁移任务使用的账号/密码, 通过客户端软件连接源数据库,能够正常连接。此时说明源数据库限制了来源ip,只有允许的服务器可以连接,而数据传输服务器的ip不在授权列表,所以不能正常连接。

(2)如果源数据库为mysql数据库,那么直接使用mysql客户端连接源数据库,执行select host from

mysql.user where user='迁移账号',password=‘迁移账号密码’,如果查询结果不为"%",那么说明数据传输服务器ip不在授权ip列表中,所以不能正常连接

(3) 如果是sql server,那么检查sql server安装服务器上是否设置了防火墙,或者检查源数据库中有endpoint或trigger限制了访问来源ip

(4) 如果是oracle,那么检查源数据库的挽留过配置文件sqlnet.ora,确认配置项tcp.validnode_checking是否为yes,如果为yes,说明源数据库限制了访问来源ip

<b>修复方法</b>:

(1) 如果源数据库为mysql,那么在源数据库中执行grant all on . to "迁移账号"@"%" identified by “迁移密码”给迁移账号重新授权。这个命令中的迁移账号用真实的迁移账号替换,迁移密码用真实的迁移密码替换。授权后重新进行预检查

(2) 如果源数据库为sqlserver,那么需要先关闭掉防火墙或禁用掉trigger后,重新进行预检查

(3) 如果源数据库为oracle,那么先修改tcp.validnode_checking=no并重启监听后,重新进行预检查

<b> </b>

<b> </b>    <b>  3. 源数据库安装服务器设置了防火墙</b>

<b>检测方法</b>: 如果源数据库安装服务器为linux,那么在shell中运行 iptables -l,检查服务器是否配置了防火墙。如果安装服务器为window,那么在控制面板中查找到windows防火墙,查看是否配置了防火墙

<b>修复方法</b>: 先将防火墙关闭后,重新进行预检查

<b>目标库连接性检查</b><b></b>

检测数据传输服务器是否能够连通要迁移的目标数据库。数据传输服务通过jdbc协议创建到目标数据库的连接,当创建连接失败时,这个检查项即失败。

当目标库连接性预检查失败时,可能是由于如下的两种原因:

1. 创建迁移任务时,提供的账号或密码不正确

<b>检测方法</b>:在任何一台能够网络能够跟目标数据库互通的服务器上,使用创建迁移任务使用的账号/密码,通过客户端软件连接源数据库,确认是否能够正常连接。如果连接报错,且报错信息中含有access deny,那么说明账号或密码有误

<b>修复方法</b>:在数据传输服务控制台修改迁移任务,将账号密码修改成正确的配置后重新预检查

2. 数据传输服务器与目标数据库网络不通

如果不是迁移账号密码不正确的话,那么可能是由于数据传输服务器跟目标数据库网络不连通,当处于这种情况时,请联系数据传输服务值班同学协助解决。 

<b>schema</b><b>存在性检查</b><b> </b>

主要检查待迁移的数据库在目标rds实例中是否存在。如果不存在,那么数据传输服务会自动创建。但是对于如下几种情况,自动创建数据库会失败,所以直接报预检查失败。

(1) 数据库名中含有小写字母、数字、下划线、中划线的其他特殊字符

当遇到这种情况时,预检查的失败原因为:迁移的数据库迁移库名的名称不符合rds规范

修复方法为:到rds控制台的数据库管理页面中,创建满足rds规范的数据库,将新建库的读写权限赋给迁移账号。然后使用数据传输服务提供的库名映射功能将要迁移的数据库映射至新创建的数据库后,然后重新进行预检查

(2) 数据库的字符集不为utf8、gbk、latin1、utf8mb4中的一种

当遇到这种情况时,预检查的失败原因为:迁移的数据库迁移库名的字符集不满足rds的要求

修复方法为:到rds控制台的数据库管理页面中,创建满足rds规范的数据库,然后将新建库的读写权限赋给迁移账号。如果新创建的库名与待迁移的库名不同,那么使用数据传输服务提供的库名映射功能将要迁移的数据库映射至新创建的数据库后,重新进行预检查

(3) 目标库迁移账号无迁移库的读写权限

当遇到这种情况时,预检查的失败原因为:该用户没有权限使用库迁移库名 

修复方法为:先到rds控制台的数据库管理页面中账号管理页面,修改权限,将迁移库的读写权限授予迁移账号后,重新进行预检查

<b>同名对象存在性检查</b><b> </b>

这个检查项主要检查目标库是否已经存在跟待迁移对象同步的对象。当这个检查项失败时,说明目标rds实例中已经存在了跟待迁移的对象一样名字的对象,这会导致迁移失败。

当这个检查项失败时,失败原因为:目标库存在跟待迁移对象同名的结构对象:迁移库名。

当这个检查项失败时,修复方式为:

(1)使用数据传输服务提供的库表映射功能,将待迁移对象迁移到目标库中的另外一个对象名的对象中

(2)删除或重命名目标库中跟迁移对象同名的对象

(3)修改迁移任务配置,将同名对象从迁移对象中删除掉,暂时不迁移这些同名对象

<b>约束完整性检查</b><b> </b>

这个检查项主要检查迁移的对象列表中,有外键依赖关系的父子表是否都被迁移,防止破坏外键约束完整性。

当这个检查项失败时,失败原因为:待迁移表子表名字依赖的父表父表名字没有迁移

对于这种错误的修复方式为:

(1) 不进行约束完整性检查失败的子表的迁移,修改迁移任务配置,将这些约束完整性检查失败的子表从迁移列表中删除后,重新进行预检查

(2) 进行约束完整性检查失败的子表对应的父表的迁移,修改迁移任务配置,将这些约束完整性检查失败的子表对应的父表添加到迁移列表中后,重新进行预检查

(3) 删除约束完整性检查失败的子表的外键依赖,修改源数据库将这些子表的外键依赖删除掉,重新进行预检查 

<b>源库</b><b>server-id</b><b>检查</b><b> </b>

这个配置项只有当进行mysql-&gt;mysql增量迁移时,才会进行检查。这个检查项主要检查源数据库的server-id是否设置为大于1的整数。

当检查失败时,只要在源数据库执行set global server_id=某个不为1的数,然后重新进行预检查。 

<b>源库</b><b>binlog</b><b>是否开启检查</b><b></b>

这个配置项只有当进行mysql-&gt;mysql增量迁移时,才会进行检查。这个检查项主要检查源数据库是否开启binlog日志。如果检查项失败,那么说明源数据库没有开启binlog。

如果binlog没有打开,那么需要修改源数据库配置文件中的 log_bin,配置完成后重启源数据库后,重新进行预检查。

<b>源库</b><b>binlog</b><b>模式检查</b><b> </b>

这个配置项只有当进行mysql-&gt;mysql增量迁移时,才会检查。这个检查项主要检查源数据库的binlog模式是否为row。如果检查失败,那么说明源数据库的binlog格式不为row。

如果检查项失败,那么在源数据库中执行“set global binlog_format=row”后重新进行预检查。建议修改后重启mysql,否则连接中的session可能以非row模式继续写入,这会导致数据丢失。

<b>源库</b><b>binlog</b><b>存在性检查</b><b> </b>

这个配置项只有当进行mysql-&gt;mysql增量迁移时,才会检查。这个检查项主要检查源数据库存在的binlog文件是否被删除。如果检查失败,那么说明源数据库的binlog文件不完整。

如果检查失败,那么在源数据库执行“purge binary logs to 未被删除的第一个binlog文件名 ”后,重新进行预检查。 具体purge的文件名参考预检查的修复方法。

<b>mysql</b><b>源库</b><b>binlog_row_image</b><b>是否为</b><b>full </b>

这个配置项只有当进行进行mysql-&gt;mysql增量迁移时,才会检查。这个检查项主要检查源数据库的binlog_row_image是否为full,即是否记录全镜像。如果检查失败,那么说明源数据库的binlog未记录全镜像。

如果检查失败,那么在源库执行"set global

binlog_row_image=full"命令后,重新进行预检查<b></b>

<b>federated</b><b>类型的表的存在性检查</b><b></b>

这个配置项只有当进行进行mysql-&gt;mysql增量迁移时,才会检查。这个检查项主要检查员数据库中是否存在增量迁移不支持的存储引擎。目前增量迁移不支持federated, mrg_myisam两种存储引擎。

当检查失败,且失败原因为:源数据库中存在引擎为federated的表时,说明源数据库中要迁移的部分表的存储引擎为federated,所以导致检查失败。

当检查失败,失败原因为:源数 据库中存在引擎为mrg_myisam的表时,说明源数据库中要迁移的部分表的存储引擎为mrg_myisam,所以导致检查失败。

当检查失败时,对于这些存储引擎为federated或mrg_myisam的表,修改迁移任务,将这些表从迁移列表删除掉。然后单独创建一个迁移任务,对这些表进行结构迁移+全量数据迁移。

<b>参考</b>