在我们的数据库中有一个名为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
1条答案
按热度按时间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(这是首选)。