【问题标题】:Wordpress move MySql runs into DATETIME DEFAULT SQL Error: 1067Wordpress move MySql 遇到 DATETIME DEFAULT SQL 错误:1067
【发布时间】:2019-08-28 01:03:15
【问题描述】:

我用 MySql 5.7.25.0ubuntu18.04.2 运行 Wordpress 并想将数据库移动到其他机器。

当我使用 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'; 有什么问题?

【问题讨论】:

    标签: mysql wordpress


    【解决方案1】:

    值没问题,但我怀疑您无法使用旧值创建表,您需要先执行此操作才能更改它。

    问题是 MySQL 5.7 及更高版本默认启用严格的 SQL 模式,这会使诸如 0000-00-00 之类的无意义日期成为错误。但这是分配给 Wordpress 中许多日期时间列的默认值。

    discussion 修复了 Wordpress 以使用 MySQL 严格模式,因为现在这是现代 MySQL 实例的默认设置。但这需要太多的工作,并且可能与许多希望使用值 '0000-00-00 00:00:00' 代替 NULL 来代替缺失日期的 Wordpress 插件兼容。因此,您使用 '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',
        );
    

    my.cnf 文件中设置sql_mode 选项以省略这些sql 模式。您可以保留其他 sql 模式,例如 MySQL 5.7 的默认 sql 模式集:

    [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';
    

    【讨论】:

      【解决方案2】:

      感谢@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
      

      【讨论】:

        【解决方案3】:

        您无法使用ALTER TABLE 解决的日期时间列默认值无效 (0000-00-00 00:00:00) 的问题适用于所有具有多个默认值列的表(在您的情况下,wp_cmets 有 2 个列,wp_posts 有 4 个列)。

        问题是修复一列会使表格仍处于不一致的状态,因为其他列默认设置错误。如果多个命令有一个ALTER TABLE 命令(也许有?),这可能会解决。

        但是有一个解决方案,在当前会话中disable STRICT_TRANS_TABLES mode

        SET sql_mode = '';
        

        然后运行ALTER TABLE 命令,在你的情况下:

        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';
        

        关闭 mysql 会话 (CTRL+D) 并再次启动新的 mysql cli 会话什么会将模式重置为默认值

        SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
        -- returns long string that contains: STRICT_TRANS_TABLES 
        

        现在您可以测试表格是否处于一致状态。 mysql-server 安装过程指示我运行(请不要运行它,除非你知道这是做什么的 - 我不知道!!!):

        ALTER TABLE `wp_posts` FORCE; 
        -- previously this reported: ERROR 1067 (42000): Invalid default value for 'post_date'
        

        【讨论】:

          猜你喜欢
          • 2016-05-21
          • 2023-03-22
          • 1970-01-01
          • 2012-11-21
          • 2018-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多