记一次MySQL数据同步问题排查

引言:来源于实际测试过程中出现的问题


  • 为了完成tidb数据库的测试配置,使用虚拟机安装了mysql后,要将测试环境的数据进行同步。
  • 用的客户端是navicate,但是同步的时候报了这个错误:Invalid default value for 'update_time'
  • 一开始以为是数据库编码的问题,在my.cnf中修改了编码:character_set_server=utf8mb4 (ps. 网上流传的default-character-set是错误的,会导致mysqld无法重启!)
  • 发现没有什么用,百度了一下,有人说是mysql版本问题,于是查看了一下版本,虚拟机上的版本是5.7.26,测试环境上是5.6.X。难道是由于向上不兼容导致的吗?
  • 考虑到重装mysql有点麻烦,又去百度了一下这个问题,看到一篇文章中提到如下观点 (附:文章链接

因为MySQL 5.6以后timestamp设定默认值规则改变,不能为”0000 00-00 00:00:00”
所以说,是由于默认值惹的祸了!

  • 那么怎么修复这个问题呢,这篇文章也提到了,使用如下方法实现:
mysql> show session variables like '%sql_mode%';

# 修改sql_mode,去掉NO_ZERO_IN_DATE,NO_ZERO_DATE:

mysql> set sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

mysql> source cms_user.sql
  • 由于使用的是客户端,我并没有使用source命令,同步的时候依然报错!!!
  • 看了一下,还是相同的错误,难道之前的修改没有生效?
  • 抱着试错的心态,试了一下flush privileges;,没用。
  • 关键时刻,依然是前人的文章救了我:
2.错误分析

  表中的第一个TIMESTAMP列(如果未声明为NULL或显示DEFAULT或ON UPDATE子句)将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性

  第一个之后的TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT '0000-00-00 00:00:00'(零时间戳),这不满足sql_mode中的NO_ZERO_DATE而报错。

  注:sql_mode有两种,一种是空值,一种是严格模式,会给出很多默认设置。在MySQL5.7之后默认使用严格模式。

    NO_ZERO_DATE:若设置该值,MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

3.解决方式

  方式一:先执行select @@sql_mode,复制查询出来的值并将其中的NO_ZERO_DATE删除,然后执行set sql_mode = '修改后的值'。

      此方法只在当前会话中生效

  方式二:先执行select @@global.sql_mode,复制查询出来的值并将其中的NO_ZERO_DATE删除,然后执行set global sql_mode = '修改后的值'。

      此方法在当前服务中生效,重新MySQL服务后失效

  方法三:在mysql的安装目录下,打开my.ini或my.cnf文件,新增 sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,

      然后重启mysql。

      此方法永久生效
发布了21 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fIsh1220Fish/article/details/104234674