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

Tra*_*tin 4 mysql amazon-rds

我有一个数据库,我正在尝试迁移到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 ('someone@acme.com', 'FW: Message', NULL)
/*!*/;
# at 42618804
#130813 13:41:12 server id 60  end_log_pos 42618831     Xid = 37399491
Run Code Online (Sandbox Code Playgroud)

我在尝试导入时从mysql获得的错误是:

ERROR 1048 (23000) at line 28: Column 'DateReceived' cannot be null
Run Code Online (Sandbox Code Playgroud)

这是我的表格结构:

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)
Run Code Online (Sandbox Code Playgroud)

如何导入binlog?

Tra*_*tin 5

我找到了答案,并在这里分享,以造福社区.

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
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关变量的更多信息.