通过 AWS DMS 迁移 MySQL 时由于时区导致的数据验证错误, 查看DMS 执行。
如何查看 AWS DMS 到底做了些什么,或者执行了哪些语句?
我们可以在配置 DMS任务时,开启日志的 Debug 模式。
并且将数据库的日志模式设置为最高。 比如 MySQL 中开启 general_log.
如果数据库中的时区设置不为 UTC。
那么当表中使用 timestamp 时, DMS 做 validation 就会有问题。
这是因为 valiedation 时, 对 源库 的连接会自动使用 UTC 的设置,而对 目标库 的连接不会增加这个设置,所以在 awsdms_control.awsdms_validation_failures_v1 表中会看到时间不一致。
解决问题的办法就是将对目标端的连接也设置为 UTC。 这样在比对时就不会出现不一致的情况。
源端连接
onnecting to MySQL through ODBC connection string: DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=source.rds.cn-northwest-1.amazonaws.com.cn;port=3306;UID=dbadmin;PWD=***;DB=;CHARSET=binary;initstmt=SET time_zone='+00:00';Option=74448896;NO_LOCALE=1; (mysql_endpoint_imp.c:692)
目标端连接
Going to connect to ODBC connection string: DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=target.rds.cn-northwest-1.amazonaws.com.cn;PORT=3306;FOUND_ROWS=1;CHARSET=binary;NO_LOCALE=1;ENABLE_LOCAL_INFILE=1;initstmt=SET time_zone=UTC;UID=dbadmin;
在终端节点的目标节点设置中,将 额外的连接属性添加以下的值
initstmt=SET time_zone=UTC
从mysql 的general log 中查看执行语句。
Connect [email protected] on using SSL/TLS
Query SET time_zone=UTC
Query SET NAMES utf8
Query SET character_set_results = NULL
Query SET SQL_AUTO_IS_NULL = 0
Query select database()
Query SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
Query set @@max_execution_time=900000
Query set @@sql_select_limit=1
Query SELECT `id` , date_format(`idate`, '%Y-%m-%d') FROM `testdb`.`test02` WHERE `id` IN ( 10 , 11 , 30 , 12 , 31 , 13 , 32 , 14 , 50 , 33 , 15 , 34 , 16 , 17 , 35 , 18 , 36 , 19 , 37 , 38 , 39 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 20 , 21 , 22 , 40 , 23 , 41 , 24 , 42 , 25 , 43 , 26 , 44 , 27 , 45 , 28 , 46 , 29 , 47 , 48 , 49 ) ORDER BY `id` ASC
Query set @@sql_select_limit=DEFAULT
Query SELECT `id` , date_format(`idate`, '%Y-%m-%d') FROM `testdb`.`test02` WHERE `id` IN ( 10 , 11 , 30 , 12 , 31 , 13 , 32 , 14 , 50 , 33 , 15 , 34 , 16 , 17 , 35 , 18 , 36 , 19 , 37 , 38 , 39 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 20 , 21 , 22 , 40 , 23 , 41 , 24 , 42 , 25 , 43 , 26 , 44 , 27 , 45 , 28 , 46 , 29 , 47 , 48 , 49 ) ORDER BY `id` ASC