Я обновил подчиненное устройство mysql с mysql 5.0 до mysql 5.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 для утверждения таких значений datetime, чтобы предотвратить проблемы в будущем?
Я предполагаю, что он был установлен в описании таблицы и был сброшен во время mysql_upgrade.
Mysql 5.1 управляет микросекундами так же, как и mysql 5.0, однако микросекунды не могут быть сохранены в столбце любого временного типа данных. Любая часть микросекунд отбрасывается согласно Mysql Doc: http://dev.mysql.com/doc/refman/5.1/en/datetime.html. Однако, поскольку вы получаете ошибку при этом, вы можете разрешить недопустимые даты, используя настройку режима sql в mysql.
sql-mode=allow_invalid_dates
в my.cnf или my.ini (в зависимости от вашей ОС).
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates
PS: Удивительно, что дата и время, которые вы указали в своем вопросе, на самом деле не существуют в DST (14 марта 2010 г.) :)
Возможно, вам придется установить datetime_format в my.cnf
Вот что очень и очень необычно. Переменные Формат даты и 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)
Вопрос: Можно ли глобально установить ??? (Этот пример - MySQL 5.5.12 в Windows)
mysql> set global date_format = '%Y%m%d';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable
По крайней мере, в командной строке нельзя. А как насчет my.cnf (my.ini) ???
Я добавил это в 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)
Хотя официально это не документировано, вы можете поиграть с форматом по своему усмотрению.
Попробуйте !!!
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: если какие-либо ваши данные datetime будут обнаружены или уничтожены, я откажусь от каких-либо сведений о ваших действиях.