云数据库 GAUSSDB-逻辑解码支持DDL:规格约束

时间:2024-11-13 10:05:08

规格约束

  • 逻辑解码支持DDL规格:
    • 纯DDL逻辑解码性能标准环境下约为100MB/S,DDL/DML混合事务逻辑解码性能标准环境下约为100MB/S。
    • 开启此功能后(设置wal_level=logical且enable_logical_replication_ddl=on),对DDL语句影响性能下降小于15%。
  • 解码通用约束(串行和并行):
    • 不支持解码本地临时对象的DDL操作。
    • 不支持FOREIGN TABLE场景的DDL解码。
    • alter table add column的default值不支持stable类型和volatile类型的函数;create table和alter table的column的check表达式不支持stable类型和volatile类型的函数;alter table如果有多条子语句,只要其中一条子语句存在上述两种情况,则该条alter table整条语句不反解析。

      gaussdb=# ALTER TABLE tbl_28 ADD COLUMN b1 TIMESTAMP DEFAULT NOW(); -- 's' NOT DEPARSE
      gaussdb=# ALTER TABLE tbl_28 ADD COLUMN b2 INT DEFAULT RANDOM(); -- 'v' NOT DEPARSE
      gaussdb=# ALTER TABLE tbl_28 ADD COLUMN b3 INT DEFAULT ABS(1); -- 'i' DEPARSE
    • 不支持分布式CREATE MATERIALIZED VIEW的DDL解码。
    • 不支持CREATE/ALTER/DROP VIEW、COMMENT ON VIEW的DDL解码。
    • 不支持REINDEX DATABASE/SYSTEM的DDL解码。
    • 不支持视图上触发器相关的DDL解码。
    • 不支持CONCURRENTLY相关语句的DDL解码。
    • 创建对象时语句中存在IF NOT EXISTS时,如果对象已存在,则不进行解码。删除对象时语句中存在IF EXISTS时,如果对象不存在,则不进行解码。
    • 不对ALTER PACKAGE COMPILE语句进行解码,但会解码实例化内容中包含的DDL/DML语句。如果PACKAGE里没有DDL或DML部分的实例化内容,则alter package compile会被逻辑解码忽略。
    • 仅支持本版本之前版本的商用DDL语法,以下SQL语句不支持逻辑解码。
      • 创建行存表,设置ILM策略。

        原始SQL语句:

        gaussdb=# CREATE TABLE IF NOT EXISTS tb3 (c1 int) with (storage_type=USTORE,ORIENTATION=ROW) ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 7 day OF NO MODIFICATION;

        反解析结果:

        gaussdb=# CREATE TABLE IF NOT EXISTS public.tb3 (c1 pg_catalog.int4) WITH (storage_type = 'ustore', orientation = 'row', compression = 'no') NOCOMPRESS;
      • B兼容模式下创建或修改表时,给表或列添加注释。

        原始SQL语句:

        gaussdb=# CREATE TABLE IF NOT EXISTS tb6 (c1 integer comment 'Mysql兼容注释语法') with (ORIENTATION=ROW, STORAGE_TYPE=USTORE);

        反解析结果:

        gaussdb=# CREATE TABLE IF NOT EXISTS public.tb6 (c1 pg_catalog.int4) WITH (storage_type = 'ustore', orientation = 'row', compression = 'no') NOCOMPRESS;
    • 逻辑解码不支持DDL(DCL)/DML混合事务,混合事务中DDL之后的DML解码不支持。
      -- 均不反解析,DCL为不支持语句故不解析,DML处于DCL之后也不反解析
      gaussdb=# BEGIN;
      gaussdb=# GAINT ALL PRIVILEGES to u01;
      gaussdb=# INSERT INTO test1(col1) values(1);
      gaussdb=# COMMIT; 
      
      -- 只反解析第一句和第三句SQL语句
      gaussdb=# BEGIN;
      gaussdb=# CREATE TABLE mix_tran_t4(id int);
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# CREATE TABLE mix_tran_t5(id int);
      gaussdb=# COMMIT; 
      
      -- 只反解析第一句和第二句SQL语句
      gaussdb=# BEGIN;
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# CREATE TABLE mix_tran_t6(id int);
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# COMMIT; 
      
      -- 全反解析
      gaussdb=# BEGIN;
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# CREATE TABLE mix_tran_t7(id int);
      gaussdb=# CREATE TABLE mix_tran_t8(id int);
      gaussdb=# COMMIT; 
      
      -- 只反解析第一句和第三句SQL语句
      gaussdb=# BEGIN;
      gaussdb=# CREATE TABLE mix_tran_t7(id int);
      gaussdb=# CREATE TYPE compfoo AS (f1 int, f2 text);
      gaussdb=# CREATE TABLE mix_tran_t8(id int);
      gaussdb=# COMMIT; 
      
      -- 全反解析
      gaussdb=# BEGIN;
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# COMMIT; 
      
      -- 只反解析第一句SQL语句
      gaussdb=# BEGIN;
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# CREATE TYPE compfoo AS (f1 int, f2 text);
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# COMMIT; 
      
      -- 只反解析第一句和第三句SQL语句
      gaussdb=# BEGIN;
      gaussdb=# INSERT INTO mix_tran_t4 VALUES(111);
      gaussdb=# CREATE TYPE compfoo AS (f1 int, f2 text);
      gaussdb=# CREATE TABLE mix_tran_t9(id int);
      gaussdb=# COMMIT; 
    • 逻辑解码语句CREATE TABLE AS SELECT、SELECT INTO和CREATE TABLE AS仅能解码出CREATE TABLE语句,暂不支持解码INSERT语句。

      对于CTAS创建的表,仍会解码其ALTER和DROP语句。

      示例:

      原始SQL语句:

      CREATE TABLE IF NOT EXISTS tb35_2 (c1 int) with (storage_type=USTORE,ORIENTATION=ROW);
      INSERT INTO tb35_2 VALUES (6);
      CREATE TABLE tb35_1 with (storage_type=USTORE,ORIENTATION=ROW) AS SELECT * FROM tb35_2;

      最后一句SQL语句反解析结果:

       CREATE  TABLE  public.tb35_1 (c1 pg_catalog.int4) WITH (storage_type = 'ustore', orientation = 'row', compression = 'no') NOCOMPRESS;
    • 执行存储过程/函数/高级包时,若其本身包含DDL/DML混合事务或者其本身与同事务内其他语句组成DDL/DML混合事务,则按照混合事务原则执行解码。
    • 逻辑解码不支持账本数据库功能,创建账本数据库的DDL语句解码结果中会包含hash列。
      • 原始语句:
        CREATE SCHEMA blockchain_schema WITH BLOCKCHAIN;
        CREATE TABLE blockchain_schema.blockchain_table(mes int);
      • 解码结果:
        CREATE SCHEMA blockchain_schema WITH BLOCKCHAIN;
        CREATE TABLE blockchain_schema.blockchain_table (mes pg_catalog.int4, hash_a1d895 pg_catalog.hash16);  -- 此语句无法在目标端回放。

        需要在目标端手动关闭blockchain_schema的防篡改属性后,才可以正常回放,此时目标端的blockchain_table等同于一张普通表,再次执行DML命令可以正常回放。

        SQL命令:

        ALTER SCHEMA blockchain_schema WITHOUT BLOCKCHAIN;
        CREATE TABLE blockchain_schema.blockchain_table (mes pg_catalog.int4, hash_a1d895 pg_catalog.hash16);
  • 串行逻辑解码支持DDL特有约束:
    • sql_decoding插件不支持json格式的DDL。
support.huaweicloud.com/fg-gaussdb-dist-v8/gaussdb-18-0258.html