【问题标题】:How to import MySQL binlog that contains INSERTs of a TIMESTAMP field with default value CURRENT_TIMESTAMP如何导入包含默认值 CURRENT_TIMESTAMP 的 TIMESTAMP 字段的 INSERT 的 MySQL binlog
【发布时间】:2013-08-16 02:33:29
【问题描述】:

我有一个正在尝试迁移到 Amazon RDS 的数据库。我通常遵循https://engineering.gosquared.com/migrating-mysql-to-amazon-rds 的说明。

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

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

当我们尝试导入 mysqlbinlog 时,它会阻塞那些 NULL 值插入。

这是 mysqlbinlog 输出的 sn-p:

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

我在尝试导入时从 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.1。新的运行5.6。当我在 5.1 上执行 INSERT 并设置 DateReceived = NULL 时,它可以工作。当我在 5.6 上做同样的事情时,它会拒绝它。
  • 我以为我正在尝试更改 SQL_MODE,但我在 SQL_MODE 中没有发现任何更改为 TIMESTAMP 字段插入 NULL 的值的内容。 MySQL 文档确实说我应该能够为我的 TIMESTAMP 字段插入一个 NULL 值,并且它应该自动插入 CURRENT_TIMESTAMP。 dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html ... 但是执行 INSERT INTO email_History SET DateReceived = NULL 会引发错误。

标签: mysql amazon-rds


【解决方案1】:

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

在 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 的更多信息。

【讨论】:

  • 我在 AWS 论坛上发起了一个对话,看看我能否找到关于他们为什么不允许您编辑变量的答案。 forums.aws.amazon.com/thread.jspa?threadID=132676
  • 这拯救了一天!谢谢!
  • 现在可以为 RDS 实例修改参数组“explicit_defaults_for_timestamp”。
猜你喜欢
  • 1970-01-01
  • 2017-07-12
  • 2013-12-29
  • 2014-07-03
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2020-01-24
相关资源
最近更新 更多