故障案例--binlog_format不为row模式下关于时区设置的一个坑

来源:互联网 发布:淘宝达人平台网址 编辑:程序博客网 时间:2024/05/29 08:36

故障现象

有个需求从北美的机房A的DB1为主,北美机房B的DB2为从,建立主从关系。A机房为UTC时区,B机房为PDT时区,结果由于system_time_zone由DB所在的linux时区决定,而这个不可擅自更改,采用了修改time_zone的方式来迂回解决,但是发现主从的时间数据依旧不一致。

复现方法

============这是主库的测试============
mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> use test
Database changed
mysql>  create table test(id int,curren_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(123,'2016-06-22 13:00:00');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| id   | curren_date         |
+------+---------------------+
|  123 | 2016-06-22 13:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

mysql> insert into test(id) values(321);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| id   | curren_date         |
+------+---------------------+
|  123 | 2016-06-22 13:00:00 |
|  321 | 2016-06-22 09:17:47 |
+------+---------------------+
2 rows in set (0.00 sec)
姜建剑 17:19:04 
============这是从库==============
mysql> select * from test;
+------+---------------------+
| id   | curren_date         |
+------+---------------------+
|  123 | 2016-06-22 20:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

mysql> select * from test;
+------+---------------------+
| id   | curren_date         |
+------+---------------------+
|  123 | 2016-06-22 20:00:00 |
|  321 | 2016-06-22 09:17:47 |
+------+---------------------+
2 rows in set (0.00 sec)

mysql> show variables like '%zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | PDT    |
| time_zone        | +00:00 |
+------------------+--------+
2 rows in set (0.00 sec)

原因分析

当插入的数值为时间戳时,两边的数据是一致的;当插入的数据为时间字符串时,两边的数据差了7个小时,查看binlog后发现是在binlog_format为mixed下时,在从库上插入这个时间字符串时,会根据这个时间字符串做一个时区转换。

解决措施

可以的话,保证两边的system_time_zone一致,这样就不用调整time_zone了,数据也可以为完全一致;

不行的话,将binlog_format改为row

0 0
原创粉丝点击