数据库时间与系统时间不一致,如何更改数据库默认时区
问题现象
数据库时间与操作系统不一致,查询GaussDB(DWS)数据库默认时间SYSDATE,结果数据库时间比北京时间慢8个小时,导致无法准确定位到更新数据。
原因分析
GaussDB(DWS)数据库显示和解释时间类型数值时使用的时区默认为“UTC”。如果操作系统时间所设置的时区不是UTC时区,就会出现GaussDB(DWS)数据库时间和系统时间不一致的情况。通常情况下集群时区不需要进行修改,设置客户端时区可以对SQL执行产生影响。例如,如果系统时间所设置的时区为北京时区,北京时区是东八区,比UTC时间早8小时。
前提条件
建议在业务低峰期修改“timezone”参数。
处理方法
方法一:更改某个GaussDB(DWS)集群的数据库默认时区。
- 登录GaussDB(DWS)管理控制台。
- 在左侧导航栏中,单击“集群管理”。
- 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。
- 单击“参数修改”页签,修改参数“timezone”,修改为您所在的时区,然后单击“保存”。
- 在“修改预览”窗口,确认修改无误后,单击“保存”。
- 用户可根据界面中参数“timezone”所在行的“是否重启”列,判断修改参数后无需进行重启操作。
修改“timezone”参数后无需重启集群操作 ,则修改后立即生效。
方法二:通过后台命令查询和更改数据库时区。
- 查询客户端时区和当前时间。其中客户端时区为UTC时区,now()函数返回当前时间。
1 2 3 4 5 6 7 8 9 10 11
SHOW time zone; TimeZone ---------- UTC (1 row) select now(); now ------------------------------- 2022-05-16 06:05:58.711454+00 (1 row)
- 创建数据表,其中timestamp、timestamptz是常用的时间类型。timestamp不保存时区,timestamptz保存时区。
1 2 3 4 5 6 7 8 9
CREATE TABLE timezone_test (id int, t1 timestamp, t2 timestamptz) DISTRIBUTE BY HASH (id); \d timezone_test Table "public.timezone_test" Column | Type | Modifiers --------+-----------------------------+----------- id | integer | t1 | timestamp without time zone | t2 | timestamp with time zone |
- 向timezone_test表插入当前时间并查询当前表。
1 2 3 4 5 6 7 8 9 10 11 12
INSERT INTO timezone_test values (1, now(), now() ); show time zone; TimeZone ---------- UTC (1 row) SELECT * FROM timezone_test; id | t1 | t2 ----+----------------------------+------------------------------- 1 | 2022-05-16 06:10:04.564599 | 2022-05-16 06:10:04.564599+00 (1 row)
t1(timestamp类型)在保存数据时丢弃了时区信息,t2(timestamptz类型)保存了时区信息。
- 把客户端时区设置为东8区(UTC-8),再次查询timezone_test表。
1 2 3 4 5 6 7 8 9 10 11 12
SET time zone 'UTC-8'; SHOW time zone; TimeZone ---------- UTC-8 (1 row) SELECT now(); now ------------------------------- 2022-05-16 14:13:43.175416+08 (1 row)
- 继续插入当前时间到timezone_test表,并查询。此时t1新插入的值使用的是东8区时间,t2根据客户端时区对查询结果进行转换。
1 2 3 4 5 6 7
INSERT INTO timezone_test values (2, now(), now() ); SELECT * FROM timezone_test; id | t1 | t2 ----+----------------------------+------------------------------- 1 | 2022-05-16 06:10:04.564599 | 2022-05-16 14:10:04.564599+08 2 | 2022-05-16 14:15:03.715265 | 2022-05-16 14:15:03.715265+08 (2 rows)
- timestamp类型只受数据在插入时的时区影响,查询结果不受客户端时区影响。
- timestamptz类型在数据插入时记录了时区信息,查询时会根据客户端时区做转换,以客户端时区显示数据。