将 SQL Server 转换为 MySQL - AWS Schema Conversion Tool

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 SQL Server 转换为 MySQL

要在转换后的 MySQL 代码中模拟 Microsoft SQL Server 数据库函数,请使用 AWS SCT 中的 SQL Server 到 MySQL 扩展包。有关扩展包的更多信息,请参阅使用 AWS SCT 扩展包

将 MySQL 用作目标数据库的权限

下面列出了将 MySQL 用作目标所需的权限:

  • CREATE ON *.*

  • ALTER ON *.*

  • DROP ON *.*

  • INDEX ON *.*

  • REFERENCES ON *.*

  • SELECT ON *.*

  • CREATE VIEW ON *.*

  • SHOW VIEW ON *.*

  • TRIGGER ON *.*

  • CREATE ROUTINE ON *.*

  • ALTER ROUTINE ON *.*

  • EXECUTE ON *.*

  • INSERT, UPDATE ON AWS_SQLSERVER_EXT.*

  • INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.*

  • CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.*

您可以使用以下代码示例创建数据库用户并授予权限。

CREATE USER 'user_name' IDENTIFIED BY 'your_password'; GRANT CREATE ON *.* TO 'user_name'; GRANT ALTER ON *.* TO 'user_name'; GRANT DROP ON *.* TO 'user_name'; GRANT INDEX ON *.* TO 'user_name'; GRANT REFERENCES ON *.* TO 'user_name'; GRANT SELECT ON *.* TO 'user_name'; GRANT CREATE VIEW ON *.* TO 'user_name'; GRANT SHOW VIEW ON *.* TO 'user_name'; GRANT TRIGGER ON *.* TO 'user_name'; GRANT CREATE ROUTINE ON *.* TO 'user_name'; GRANT ALTER ROUTINE ON *.* TO 'user_name'; GRANT EXECUTE ON *.* TO 'user_name'; GRANT INSERT, UPDATE ON AWS_SQLSERVER_EXT.* TO 'user_name'; GRANT INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name'; GRANT CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';

在前面的示例中,将 user_name 替换为用户名。然后,将 your_password 替换为安全密码。

如果将 MySQL 数据库版本 5.7 或更低版本作为目标,请运行以下命令。8.0 及更高版本的 MySQL 数据库不建议使用此命令。

GRANT SELECT ON mysql.proc TO 'user_name';

要使用 Amazon RDS for MySQL 或 Aurora MySQL 作为目标,请将 lower_case_table_names 参数设置为 1。此值意味着 MySQL 服务器在处理表、索引、触发器和数据库等对象名称的标识符时不区分大小写。如果目标实例中已开启二进制日志记录,请将 log_bin_trust_function_creators 参数设置为 1。在这种情况下,您无需使用 DETERMINISTICREADS SQL DATANO SQL 特性创建存储函数。要配置这些参数,请创建新的数据库参数组或修改现有数据库参数组。

SQL Server 到 MySQL 的转换设置

要编辑 SQL Server 到 MySQL 的转换设置,请在 AWS SCT 中选择设置,然后选择转换设置。从上方的列表中选择 SQL Server,然后选择 SQL Server – MySQL。AWS SCT 显示 SQL Server 到 MySQL 转换的所有可用设置。

AWS SCT 中的 SQL Server 到 MySQL 转换设置包括以下各项的选项:

  • 限制转换后的代码中操作项的注释数量。

    对于在转换后的代码中,为所选严重性级别及更高级别的操作项添加注释,请选择操作项的严重性。AWS SCT 会在转换后的代码中为所选严重性级别及更高级别的操作项添加注释。

    例如,要最大限度地减少转换后的代码中的注释数量,请选择仅错误。要在转换后的代码中包含所有操作项的注释,请选择所有消息

  • 允许源 SQL Server 数据库将 EXEC 的输出存储在表中。AWS SCT 创建临时表和模拟此功能的附加过程。要使用此模拟,请选择创建额外的例程处理开放数据集

迁移注意事项

将 SQL Server 架构迁移到 MySQL 时的注意事项:

  • MySQL 不支持 MERGE 语句。但是,AWS SCT 可以在转换过程中使用 INSERT ON DUPLICATE KEY 子句和 UPDATE FROM and DELETE FROM 语句来模拟 MERGE 语句。

    对于使用 INSERT ON DUPLICATE KEY 的正确模拟,请确保目标 MySQL 数据库上存在唯一约束或主键。

  • 可以使用一个 GOTO 语句和一个标签更改语句的运行顺序。将跳过接在 GOTO 语句后的任何 Transact-SQL 语句并且处理将在标签处继续。可在过程、批处理或语句块中的任意位置使用 GOTO 语句和标签。您也可以嵌套 GOTO 语句。

    MySQL 不使用 GOTO 语句。当 AWS SCT 转换包含 GOTO 语句的代码时,它将转换此语句以使用 BEGIN…ENDLOOP…END LOOP 语句。在下表中可以找到有关 AWS SCT 如何转换 GOTO 语句的示例。

    SQL Server 语句 MySQL 语句
    BEGIN .... statement1; .... GOTO label1; statement2; .... label1: Statement3; .... END
    BEGIN label1: BEGIN .... statement1; .... LEAVE label1; statement2; .... END; Statement3; .... END
    BEGIN .... statement1; .... label1: statement2; .... GOTO label1; statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: LOOP statement2; .... ITERATE label1; LEAVE label1; END LOOP; statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: statement2; .... statement3; .... statement4; .... END
    BEGIN .... statement1; .... label1: BEGIN statement2; .... statement3; .... statement4; .... END; END
  • MySQL 不支持多语句表值函数。AWS SCT 会在转换过程中通过创建临时表并重写使用这些临时表的语句,来模拟表值函数。