天天看點

MySQL核心月報 2014.09-MariaDB·主備複制·CREATE OR REPLACE

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