MariaDB 10.0.8 版本增加了一个CREATE OR REPLACE TABLE语法,这个语法的目的是让Replication更加可靠,为什么这个语句能让复制更可靠呢?
例如用户使用CREATE … SELECT语句,而这个语句回滚了又重新执行,备库有可能先收到一个CREATE语句,但是没收到INSERT的Events,主库重做一遍之后,备库收到CREATE语句时就会失败,而CREATE OR REPLACE则可以避免这个问题,存在的表会被替换掉。
最基本的使用例子:
CREATE OR REPLACE TABLE table_name (a int);
这个语句其实等价于:
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name (a int);
这两个语句的执行结果。
- 如果 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
当前内容版权归 阿里云RDS-数据库内核组 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 阿里云RDS-数据库内核组 .