如何导入包含默认值为 CURRENT_TIMESTAMP 的 TIMESTAMP 字段的 INSERT 的 MySQL binlog

2024-02-16

我有一个数据库正在尝试迁移到 Amazon RDS。我通常按​​照说明进行操作https://engineering.gosquared.com/migration-mysql-to-amazon-rds https://engineering.gosquared.com/migrating-mysql-to-amazon-rds.

我已经对原始服务器进行了mysqldump,并将数据导入到RDS服务器中。现在,我准备导入自 mysqldump 以来发生的更改。当我将 mysqlbinlog 的输出通过管道传输到 mysql 时,出现有关 NULL 值的错误。

我的表有一个名为 TIMESTAMP 字段DateReceived默认值为 CURRENT_TIMESTAMP。当我们的应用程序插入记录时,它会留下DateReceived为 NULL,以便数据库处理填充当前时间。

当我们尝试导入 mysqlbinlog 时,它会因为 NULL 值插入而卡住。

以下是 mysqlbinlog 的输出片段:

BEGIN
/*!*/;
# at 42615369
#130813 13:41:12 server id 60  end_log_pos 42615397     Intvar
SET INSERT_ID=173164716/*!*/;
# at 42615397
#130813 13:41:12 server id 60  end_log_pos 42618804     Query   thread_id=680551        exec_time=0     error_code=0
use mydatabase/*!*/;
SET TIMESTAMP=1376426472/*!*/;
INSERT INTO email_History (`From`, `Subject`, `DateReceived`) VALUES ('[email protected] /cdn-cgi/l/email-protection', 'FW: Message', NULL)
/*!*/;
# at 42618804
#130813 13:41:12 server id 60  end_log_pos 42618831     Xid = 37399491

当我尝试导入它时,我从 mysql 得到的错误是:

ERROR 1048 (23000) at line 28: Column 'DateReceived' cannot be null

我的表的结构如下:

mysql> describe email_History;
+--------------+------------------------------+------+-----+-------------------+----------------+
| Field        | Type                         | Null | Key | Default           | Extra          |
+--------------+------------------------------+------+-----+-------------------+----------------+
| From         | varchar(512)                 | YES  | MUL | NULL              |                |
| Subject      | varchar(512)                 | YES  | MUL | NULL              |                |
| DateReceived | timestamp                    | NO   | MUL | CURRENT_TIMESTAMP |                |
+--------------+------------------------------+------+-----+-------------------+----------------+
3 rows in set (0.00 sec)

如何导入binlog?


我找到了答案,并为了社区的利益在这里分享。

MySQL 5.6.6 中引入了一个新的系统变量,称为“explicit_defaults_for_timestamp”。将此值设置为 FALSE,我上面的代码将起作用。但是,如果将此设置为 true,MySQL 会给出错误。

遗憾的是,Amazon RDS 不允许您更改该参数,并且无法针对每个会话进行设置。

mysql> SET SESSION explicit_defaults_for_timestamp=false;
ERROR 1238 (HY000): Variable 'explicit_defaults_for_timestamp' is a read only variable

您可以阅读有关该变量的更多信息here http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何导入包含默认值为 CURRENT_TIMESTAMP 的 TIMESTAMP 字段的 INSERT 的 MySQL binlog 的相关文章