迁移到 Azure Database for MySQL 时的已知问题

以下部分介绍了与迁移到 Azure Database for MySQL 相关的已知问题。

v8.0 MySQL 灵活服务器目标的架构迁移问题

  • 错误:如果启用了为 InnoDB 表生成不可见主键的功能,则迁移到引擎版本为 8.0.30 或更高版本的 MySQL 灵活服务器可能会失败(请参阅 MySQL :: MySQL 8.0 参考手册 :: 13.1.20.11 生成的不可见主键)。 将表架构从源迁移到目标时、在联机迁移的复制阶段应用更改时、重试迁移时或迁移到手动迁移架构的目标时,可能会失败。

    可能的错误消息

    • “未知错误。”
    • “无法生成不可见主键。 自动递增列已存在。”
    • “database”数据库“中目标表“table name”中的列“my_row_id”在源表上不存在。”

    限制:DMS 不支持迁移到启用了 sql_generate_invisible_primary_key 的 MySQL 灵活服务器实例。

    解决方法:将目标 MySQL 灵活服务器的服务器参数 sql_generate_invisible_primary_key 设置为 OFF。 可以在目标 MySQL 灵活服务器的“所有”选项卡下的“服务器参数”边栏选项卡中找到服务器参数。 此外,请删除目标数据库并启动 DMS 迁移,以没有任何不匹配的架构。

不兼容的 SQL 模式

一种或多种不兼容的 SQL 模式可能导致许多不同的错误。 下面是一个示例错误以及发生此错误时应检查的服务器模式。

  • 错误:在活动“{activity}”期间准备服务器“{server}”上数据库“{database}”中要迁移的表“{table}”时出错。 因此,不会迁移此表。

    限制:如果在一台服务器上设置以下 SQL 模式之一,但在另一台服务器上未设置,则会发生此错误。

    解决方法

    NO_ZERO_DATE NO_AUTO_CREATE_USER
    如果源中表上的日期或数据的默认值为 0000-00-00,并且目标服务器设置了 NO_ZERO_DATE SQL 模式,则架构和/或数据迁移将会失败。 有两种可能的解决方法,第一种方法是将列的默认值更改为 NULL 或有效日期。 第二种方法是从全局 SQL 模式变量中删除 NO_ZERO_DATE SQL 模式。 从 MySQL 源服务器 5.7 迁移到 MySQL 目标服务器 8.0 并执行例程架构迁移时,如果在 MySQL 源服务器 5.7 上设置了 no_auto_create_user SQL 模式,则会遇到错误。

Binlog 保留期问题

  • 错误:读取 binlog 时出现灾难性错误。 此错误可能表示未正确指定 binlog 文件名和/或初始位置。

    限制:如果二进制日志保留期太短,则会发生此错误。

    解决方法:在这种情况下可以配置多个变量:binlog_expire_logs_seconds 确定保留期,并可以通过将 binlog_expire_logs_auto_purge 设置为 off 来完全防止删除二进制日志。 MySQL 5.7 已弃用系统变量 expire_logs_days。

获取表锁超时

  • 错误:尝试获取服务器“{server}”上的读取锁以创建一致视图时发生异常。

    限制:如果在启用事务一致性的情况下获取所有表的锁超时,则会发生此错误。

    解决方法:确保选定的表未锁定,或者目前并未对其运行长时间运行的事务。

将超过 4 MB 的数据写入 Azure 存储

  • 错误:请求正文太大,超过了最大允许限制。

    限制:当要迁移的表太多(超过 1 万个)时,可能会发生此错误。 对 Azure 存储服务的每次调用存在 4 MB 限制。

    解决方法:请创建支持请求以联系支持人员,我们可以提供自定义脚本来直接访问 REST API。

密钥输入重复问题

  • 错误:此错误通常是超时、网络问题或目标缩放的表现。

    可能的错误消息:由于目标服务器引发的 SQL 错误,无法将批处理写入表“{table}”。 对于上下文,批包含由以下源查询返回的行的子集。

    限制:此错误可能是由超时或与目标的连接断开导致主键重复引起的。 它还可能与同一时间向正在运行的目标进行了多个迁移,或者迁移运行时,用户正在目标上运行测试工作负载有关。 此外,目标可能要求主键是唯一的,即使在源上没有此要求也是如此。

    解决方法:若要解决此问题,请确保没有重复的迁移正在运行,并且源主键是唯一的。 如果问题仍然处在,请创建支持请求以联系支持人员,我们可以提供自定义脚本来直接访问 REST API。

复制操作出现行不匹配错误

  • 错误:联机迁移无法复制预期的更改数。

    可能的错误消息:将记录应用于从源服务器的二进制日志读取的目标服务器时出错。 更改从二进制日志“{mysql-bin.log}”和位置“{position}”开始,并在二进制日志“{mysql-bin.log}”和位置“{position}”处结束。 源服务器上位于二进制日志“{mysql-bin.log}”的“{position}”位置之前的所有记录都已提交到目标。

    限制:在源上,表中存在插入和删除语句,删除操作由明显唯一索引执行。

    解决方法:建议手动迁移表。

表数据截断错误

  • 错误:枚举列在一行或多行中具有 null 值,并且目标 SQL 设置为严格模式。

    可能的错误消息:由于数据截断错误,无法将批写入表“{table}”。 请确保数据对于 MySQL 表列的数据类型来说不会太大。 如果列类型是枚举,请确保 SQL 模式未设置为 TRADITIONAL、STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES,并且源和目标相同。

    限制:当历史数据在具有特定设置时写入源服务器,但当设置发生更改时,数据无法移动,就会出现此错误。

    解决方法:若要解决此问题,建议将目标 SQL 更改为非严格模式,或者将所有 null 值更改为有效值。

创建对象失败

  • 错误:视图验证失败后出错。

    限制:尝试迁移视图时发生错误,并且找不到该视图应引用的表。

    解决方法:建议手动迁移视图。

无法找到表

  • 错误:找不到引用表时出错。

    可能的错误消息:由于查询执行,管道无法使用策略 MySqlSchemaMigrationViewUsingTableStrategy 为活动“{object}”创建对象“{object}”的架构。

    限制:当视图引用已删除或重命名的表,或者创建包含不正确或不完整信息的视图时,可能会发生此错误。 如果迁移了表的子集,但它们所依赖的表不迁移,则会发生此错误。

    解决方法:建议手动迁移视图。 检查是否选择了外键和 CREATE VIEW 语句中引用的所有表进行迁移。

所有共用连接断开

  • 错误:源服务器上的所有连接都断开。

    限制:在初始加载开始时获取的所有连接由于服务器重启、网络问题、源服务器上的流量过大或其他暂时性问题而丢失时,会发生此错误。 此错误不可恢复。 此外,如果在维护时段内尝试迁移服务器,则会发生此错误。

    解决方法:必须重启迁移,建议提高源服务器的性能。 另一个问题是脚本会终止长时间运行的连接,从而妨碍这些脚本正常工作。

一致的快照中断

限制:当客户在迁移实例的初始加载期间执行 DDL 时,会发生此错误。

解决方法:若要解决此问题,建议避免在初始加载期间进行 DDL 更改。

外键约束

  • 错误:当表中引用的外键类型发生更改时,会发生此错误。

    可能的错误消息:外键约束“{key}”中的引用列“{pk column 1}”和被引用列“{fk column 1}”不兼容。

    限制:此错误可能导致表的架构迁移失败,因为表 1 中的 PK 列可能与表 2 中的 FK 列不兼容。

    解决方法:若要解决此问题,建议删除外键并在迁移过程完成后重新创建它。

后续步骤