Mysqlスレーブをmysql5.0からmysql5.1にアップグレードしました。キャッチアップ中に、日時値が正しくないクエリでレプリケーションが失敗しました。
110919 13:56:18 [ERROR] Slave SQL: Error 'Incorrect datetime value: '2010-03-14 02:35:34.0' for column 'creation_date' at row 1' on query.
クエリを再挿入しようとしましたが、再度失敗し、値を次のように修正しました。
2010-03-14 02:35:34
クエリが受け入れられました。
将来の問題を防ぐために、そのような日時値を承認するようにmysqlを設定するにはどうすればよいですか?
私の推測では、それはテーブルの説明で設定され、mysql_upgrade中にリセットされたと思います。
Mysql 5.1は、mysql 5.0と同じようにマイクロ秒を操作しますが、マイクロ秒を時間データ型の列に格納することはできません。 Mysql Doc: http://dev.mysql.com/doc/refman/5.1/en/datetime.html に従って、マイクロ秒の部分は破棄されます。ただし、これでエラーが発生するため、mysqlのSQLモード設定を使用して無効な日付を許可することを有効にできます。
sql-mode=allow_invalid_dates
my.cnfまたはmy.ini(OSによって異なります)。
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates
PS:あなたが質問で提供した日時が実際にはDSTに存在しない時刻であることは驚くべきことです(2010年3月14日):)
My.cnfでdatetime_formatを設定する必要がある場合があります
これが非常に珍しいことです。変数 date_format および datetime_format MySQL 5.xに存在します:
mysql> select version();
+----------------------+
| version() |
+----------------------+
| 5.0.81-community-log |
+----------------------+
1 row in set (0.00 sec)
mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name | Value |
+-----------------+-------------------+
| date_format | %Y-%m-%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)
MySQLドキュメントでそれらを調べると、未使用であると表示されます。それでも、驚いたことに、セッションでそれらを設定できます。方法は次のとおりです。
mysql> set date_format = '%Y%m%d';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name | Value |
+-----------------+-------------------+
| date_format | %Y%m%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)
質問:グローバルに設定できますか? (この例はWindowsのMySQL 5.5.12です)
mysql> set global date_format = '%Y%m%d';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable
少なくとも、コマンドラインではできません。 my.cnf(my.ini)ではどうですか?
これをPCのmy.iniに追加しました
[mysqld]
date_format="%Y%m%d"
mysqlを再起動し、これを取得しました:
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.12-log |
+------------+
1 row in set (0.00 sec)
mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name | Value |
+-----------------+-------------------+
| date_format | %Y%m%d |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)
公式には文書化されていませんが、自由にフォーマットを試すことができます。
試してみる !!!
免責事項:あなたの日時データのいずれかがキャッチまたは殺された場合、私はあなたの行動の知識を否認します。