您的位置:首页 > 其它

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

2016-07-21 18:21 447 查看

故障现象

有个需求从北美的机房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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: