Перемещение Wordpress MySql сталкивается с DATETIME DEFAULT Ошибка SQL: 1067 - PullRequest
0 голосов
/ 06 апреля 2019

Я запускаю Wordpress с MySql 5.7.25.0ubuntu18.04.2 и хочу переместить базу данных на другую машину.

Когда я делаю это с Database Migration, я сталкиваюсь с ошибками с полями DATETIME, например,

Неверное значение по умолчанию для 'comment_date'.Ошибка SQL: 1067

Я выяснил, что данное значение DEFAULT 0000-00-00 00:00:00 больше не работает.Поэтому я попытался изменить его на 1000-01-01 00:00:00, но это работает только для

ALTER TABLE `wordpress`.`wp_links` ALTER `link_updated` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_users` ALTER `user_registered` SET DEFAULT '1000-01-01 00:00:00';

успешно без ошибок.

отлично!

Но эти следующие по-прежнему не работают: тот же тип поля, то же значение по умолчанию ...?

ALTER TABLE `wordpress`.`wp_comments` ALTER `comment_date` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_comments` ALTER `comment_date_gmt` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_posts` ALTER `post_date` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_posts` ALTER `post_date_gmt` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_posts` ALTER `post_modified` SET DEFAULT '1000-01-01 00:00:00';
ALTER TABLE `wordpress`.`wp_posts` ALTER `post_modified_gmt` SET DEFAULT '1000-01-01 00:00:00';

Например:

Код ошибки:1067. Неверное значение по умолчанию для 'post_date'

Вопросы

  • Как перенести MySql на другую машину?
  • Что не так сALTER TABLE x ALTER columnY SET DEFAULT '1000-01-01 00:00:00';?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Спасибо @ bill-karwin за объяснение, но, к сожалению, у меня возникла проблема при перемещении базы данных MySQL на новый сервер, на данный момент это не имеет ничего общего с установкой Wordpress, поэтому должно быть решение только для MySQL.

Я нашел очень простое решение: Просто скопируйте файлы данных!

Но так как я не могу войти в систему с root, я должен изменить временное владение:

на исходном сервере:

sudo su
/etc/init.d/mysql stop
cp -r /var/lib/mysql /home/myuser/mysql
chown myuser:myuser /home/myuser/mysql -R

на целевом сервере:

scp -r myserver:/home/myuser/mysql /home/myuser/mysql # I can't do it with root
sudo su
/etc/init.d/mysql stop
cd /var/lib
mv mysql mysql.save # backup
mv /home/myuser/mysql/ .
chown mysql:mysql mysql -R
/etc/init.d/mysql start # all is done and work properly
0 голосов
/ 06 апреля 2019

Значение в порядке, но я подозреваю, что вы не можете создать таблицу со старым значением, что вам нужно сделать, прежде чем вы сможете ее изменить.

Проблема в том, что MySQL 5.7 и более поздние версии по умолчанию включают строгий режим SQL, что делает бессмысленные даты, такие как 0000-00-00, ошибкой. Но это значение по умолчанию, назначаемое многим столбцам даты и времени в Wordpress.

Было обсуждение исправления Wordpress для работы в строгом режиме MySQL, поскольку теперь это значение по умолчанию для современных экземпляров MySQL. Но это заняло бы слишком много работы и рискует быть несовместимым со многими плагинами Wordpress, которые ожидают, что вместо пропущенной даты будет использоваться значение «0000-00-00 00:00:00» вместо NULL. Таким образом, ваше решение использовать '1000-01-01 00:00:00' может не работать в любом случае.

В этом обсуждении ведущий разработчик Wordpress писал:

«WordPress просто не поддерживает строгий режим».

Затем он удалил «веху: будущий выпуск» из запроса функции, что означает, что нет никакого намерения исправлять это в Wordpress.

Таким образом, решение состоит в том, чтобы отключить строгий режим на MySQL. Жаль.

В коде Wordpress вы можете найти includes/wp-db.php, в котором перечислены:

    /**
     * A list of incompatible SQL modes.
     *
     * @since 3.9.0
     * @var array
     */
    protected $incompatible_modes = array(
            'NO_ZERO_DATE',
            'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'STRICT_ALL_TABLES',
            'TRADITIONAL',
    );

Установите опцию sql_mode в файле my.cnf, чтобы пропустить эти режимы sql. Вы можете оставить другие режимы sql, например, в наборе режимов sql по умолчанию для MySQL 5.7:

[mysqld]
sql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Вы также можете изменить глобальный режим sql без необходимости перезапускать MySQL Server:

mysql> SET GLOBAL sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...