为什么这对mysql复制不安全

时间:2012-12-14 11:25:27

标签: mysql replication

121214 11:54:30 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave. Statement: update db_ds_pax p
        set p.mbp_id = 8861912, updated_ts = now()
        where p.flight_id = 2506912 
        and p.logically_deleted = 0
        and (
            exists (
                    select * from db_bkg_passenger bkgp 
                    where bkgp.bkg_pax_id = p.bkg_pax_id
                    and bkgp.ticket_num = '2202326623256'
                    and bkgp.logically_deleted = 0 )
            or exists (
                    select * from db_dcs_pax dcsp 
                    where dcsp.dcs_pax_id = p.dcs_pax_id
                    and dcsp.ticket_num = '2202326623256'
                    and dcsp.logically_deleted = 0 ))

本声明中有什么不安全之处?我没有插入任何东西,只是更新。我实际上甚至没有选择任何用于更新的东西。

我曾尝试使用左连接重写,但它仍然抱怨。我也认为updated_ts = now()可能是罪魁祸首并将其设定为固定时间,但仍然是相同的警告。

服务器是Oracle的5.5.27

1 个答案:

答案 0 :(得分:0)

  

从另一个表中选择后写入带有自动增量列的表的语句是不安全的,因为检索行的顺序决定了将写入哪些行(如果有)。此订单无法预测,可能在主设备和从设备上有所不同

我什么都没做,只是从警告信息中复制粘贴了解释。

似乎UPDATE被视为“写入表格”