mariadb 10.0.8 版本增加了一個create or replace table文法,這個文法的目的是讓replication更加可靠,為什麼這個語句能讓複制更可靠呢?
例如使用者使用create ... select語句,而這個語句復原了又重新執行,備庫有可能先收到一個create語句,但是沒收到insert的events,主庫重做一遍之後,備庫收到create語句時就會失敗,而create or replace則可以避免這個問題,存在的表會被替換掉。
最基本的使用例子:
這個語句其實等價于:
這兩個語句的執行結果。
如果 table_name被lock tables鎖住了,create or replace table會忽略鎖定,然後在語句執行完成後把建立的表加上鎖定。
臨時表隻有在指定了temporary關鍵字時才會被drop掉。(用drop table的話,同名的臨時表會比普通表先被删除)
使用create or replace tabl必須意識到的問題:
表會首先被drop掉(如果這張表存在的話),然後create動作才會執行。正是因為如此,如果create步驟失敗了,那麼執行這個語句後表可能會不存在了。如果表是被lock tables鎖住的,那麼表的鎖會被釋放掉先。
or replace和if exists語句不可同時使用
slave在複制中當create語句沒有使用if exists辨別時,會預設使用create or replace語句來執行。這個行為可以通過slave-ddl-exec-mode變量來改變,設定為strict則不會做這個替換。
相關的新增參數:
slave_ddl_exec_mode
描述: slave控制如何執行ddl的event的模式。可選值有strict、idempotent (預設值)。
在 idempotent 模式下,slave不會因為那些不會導緻主備不一緻的ddl執行失敗而停止。
尤其是create table 會被當做 create or replace table,而 drop table 會被當做drop table if exists.
預設值: idempotent
可選值: idempotent, strict