在statement
格式下,所有对临时表的 *** 作都要记录binlog,包括创建、删除及DML
语句;但在row格式下,只有Drop table才会记录binlog,而对临时表的创建及DML语句是不记录binlog的。为什么会这样?通常情况下,
主机的临时表在备机上是没有用的,临时表只在当前session中有效,即使将临时表同步到备机,当用户从主机切换到备机时,原来session已经中断,与session关联的临时表也会被清除,用户会重建session到新的主机。但在一些特殊情况下,还是需要将主机的临时表同步到备机的,比如主机上执行insert into t1 select * from temp1,其中t1是普通表,而temp1是临时表。当binlog格式为statement时,这条语句会被记录到binlog,然后同步到备机,在备机上replay,若备机之前没有将主机上的临时表同步过来,那这条语句的replay就会出现问题。因此在statement格式下,对临时表的 *** 作如创建、删除及其它DML语句都必须记录binlog,然后同步到备机执行replay。但在row格式下,因为binlog中已经记录了实际的row,那么对临时表的创建、DML语句是不是记录binlog就不是那么重要了。这里有一点比较特殊,对临时表的删除还是要记录binlog。因为用户可以随时修改binlog的格式,若之前创建临时表时是statement格式,而创建成功后,又修改为row格式,若row格式下删除表不记录binlog,那么在备机上就会产生问题,创建了临时表,但却没有删除它。因此对drop table语句,无论binlog格式采用statement或是row格式,都会记录binlog。而对于创建临时表语句,只有statement格式会记录binlog,而在row格式下,不记录binlog。为防止row格式下在备机上replay时drop不存在的临时表,会将drop临时表的binlog中添加IF EXISTS,防止删除不存在的表replay失败。设个默认不就搞定了吗!像这样:
CREATE TABLE xm_tie (
tid INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ttype ENUM('g','v','h') NOT NULL DEFAULT 'g',
tbid MEDIUMINT( 10 ) UNSIGNED NOT NULL DEFAULT 0,
title varchar( 20 ) NOT NULL DEFAULT '',
tuname VARCHAR( 20 ) NOT NULL DEFAULT '',
tuid INT( 10 ) UNSIGNED NOT NULL DEFAULT 0,
tcontent TEXT NOT NULL DEFAULT '',
ftime INT( 10 ) UNSIGNED NOT NULL DEFAULT 0,
status ENUM('p','t','e') NOT NULL DEFAULT 'p',
clickcont INT( 10 ) UNSIGNED NOT NULL DEFAULT 0,
replaycount INT( 10 ) UNSIGNED NOT NULL DEFAULT 0
)
DEFAULT属性可设默认值数字行就写数字,子窜就写字串,没有就‘’,时间就写时间···
觉得有用就采纳一下谢谢!
评论列表(0条)