2013-08-16 70 views
4

我有一個數據庫,我試圖遷移到Amazon RDS。我通常按​​照說明https://engineering.gosquared.com/migrating-mysql-to-amazon-rds如何導入包含帶默認值TIMESTAMP字段INSERT的MySQL binlog CURRENT_TIMESTAMP

我已經完成了原始服務器的mysqldump,並且已經將數據導入RDS服務器。現在,我準備好導入自mysqldump以來發生的更改。當我將mysqlbinlog的輸出傳遞給mysql時,我得到一個關於NULL值的錯誤。

我的表有一個名爲DateReceived的TIMESTAMP字段,其默認值爲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]', '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?

+0

我們的舊數據庫服務器正在運行MySQL 5.1。新版本運行5.6。當我在5.1上進行INSERT時,並將DateReceived = NULL設置爲有效。當我在5.6上做同樣的事情時,它會拒絕它。 –

+0

我以爲我正在改變SQL_MODE,但我沒有找到任何改變爲TIMESTAMP字段插入NULL的值的SQL_MODE。 MySQL文檔確實說我應該能夠爲我的TIMESTAMP字段插入NULL值,並且它應該自動插入CURRENT_TIMESTAMP。 http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html ...但做一個INSERT INTO email_History SET DateReceived = NULL會引發錯誤。 –

回答

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 

你可以閱讀更多關於變量here

+1

我在AWS論壇上啓動了一個對話框,以查看我能否找到答案,說明爲什麼他們不允許您編輯變量。 https://forums.aws.amazon.com/thread.jspa?threadID=132676 –

+0

這節省了一天!謝謝! –

+0

現在可以爲RDS實例修改參數組「explicit_defaults_for_timestamp」。 – Yasir

相關問題