数据库时间戳不匹配

2admgd59  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(359)

在我们的数据库中有一个名为order的表,该表有一个名为created\的列,在该列上有一个timestamp列。当客户创建订单时,我们根据当前时间戳设置该字段。所以问题是,当我们通过mysqldump(直接从服务器)转储sql文件时,sql文件显示,在-2017-01-01 10:27:35创建的第一个订单,这是完全正确的。
sql转储查询:

INSERT INTO `orders` VALUES (1,'2017-01-01 10:27:35'');

但当我们从web应用程序打开该订单时,显示该订单创建于2017年1月1日下午4:27(+提前6小时,这是错误的)。

另外,当我们创建一个mysql查询时,它还显示了在2017年1月1日下午4:27创建的订单(提前6小时,这是错误的)。

这个问题发生在2018年4月24日,当天的ubuntu将mysql服务器从5.7.21更新到5.7.22。在mysql错误日志上,有一个不匹配+6小时。

第44行-缓冲池。转储在180424 21:34:16完成(日志条目在15:34:16,但详细日志显示转储在180424 21:34:16完成,其中延迟6小时)。
目前,当我们创建订单时,在web应用程序和mysql查询中,created的\u at字段会完美地显示出来,但是当我们转储sql数据时,它会显示created at 6小时延迟。

注:

我们的应用时区设置为utc+6,亚洲/达卡
mysql版本:服务器版本5.7.22-0ubuntu0.16.04.1
sql转储到另一个-/!40103设置时区='+00:00'/;
有问题的字段-所有时间戳列
我们的系统时间设置为utc+6,mysql全局和会话时间设置为system。
systemctl状态systemd-timesyncd.service
输出:

$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
           └─disable-with-time-daemon.conf
   Active: active (running) since Tue 2018-02-06 16:53:59 +06; 2 months 18 days ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 11383 (systemd-timesyn)
   Status: "Synchronized to time server 91.189.94.4:123 (ntp.ubuntu.com)."
    Tasks: 2
   Memory: 564.0K
      CPU: 4.272s
   CGroup: /system.slice/systemd-timesyncd.service
           └─11383 /lib/systemd/systemd-timesyncd
68de4m5k

68de4m5k1#

从mysql文档(我的重点):
当前会话时区设置影响区域敏感时间值的显示和存储。这包括函数显示的值,例如 NOW() 或者 CURTIME() ,以及从中存储和检索的值 TIMESTAMP 柱。的值 TIMESTAMP 列从当前时区转换为utc进行存储,从utc转换为当前时区进行检索。
既然你说过你的mysql全局和会话时区变量是为 SYSTEM ,系统时区为 Asia/Dhaka (utc+6),然后看起来一切都在按设计工作。
请注意,根据 --tz-utc 选项:
... mysqldump将其连接时区设置为utc并添加 SET TIME_ZONE='+00:00' 到转储文件。。。 --tz-utc 默认情况下启用。要禁用它,请使用 --skip-tz-utc .
既然您说转储文件的输出有正确的时间,那么除非您传递 --skip-tz-utc 标志,则您的数据是按utc插入的(即,会话时区设置为 +00:00 插入过程中)。
然后,由于您的应用程序看到时间提前6小时移动,因此您的应用程序可能没有设置会话时区,因此 SYSTEM 占上风。
有两种选择:
呼叫 SET TIME_ZONE='SYSTEM' 在insert语句之前(或者弄清楚要设置的位置) +00:00 停止这样做)这将使数据库中的项基于系统时区。
呼叫 SET TIME_ZONE='+00:00' 在应用程序中,以utc而不是提前6小时查询值。这使得数据库中的项基于utc(这是首选)。

相关问题