华为云用户手册

  • port 参数说明: GaussDB 服务侦听的TCP端口号。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 该参数由安装时的配置文件指定,请勿轻易修改,否则修改后会影响数据库正常通信。 取值范围:整型,1~65535 设置端口号时,请设置一个未被占用的端口号。设置多个实例的端口号,不可冲突。 1~1023为操作系统保留端口号,请不要使用。 通过配置文件安装数据库实例时,配置文件中的端口号需要注意通信矩阵预留端口。如:DN还需保留dataPortBase+1作为内部工具使用端口,保留dataPortBase+6作为流引擎(由于规格变更,当前版本已经不再支持本特性,请不要使用)消息队列通信端口等。故数据库实例安装阶段,port最大值为:DN可设置65529,同时需要保证端口号不冲突。 默认值:5432(实际值由安装时的配置文件指定)
  • enable_default_cfunc_libpath 参数说明:设置GaussDB创建C函数时的so文件是否使用默认路径。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on:代表创建C函数时,so文件必须放在指定的目录($libdir/proc_srclib)下。 off:代表创建C函数时,so文件可以放在任意可访问的目录下。 默认值:on 参数设置成off时,.so文件可以放在任意可访问的目录下或使用系统自带的.so,存在安全风险,不建议使用。
  • temp_file_limit 参数说明:限制一个会话中,触发下盘操作时,下盘文件占用的空间大小。例如一次会话中,排序和哈希表使用的临时文件,或者游标占用的临时文件。 此设置为会话级别的下盘文件控制。 该参数属于SUSET类型参数,请参考表1中对应设置方法进行设置。 SQL查询执行时使用的临时表空间不在此限制。 取值范围:整型,-1~2147483647,单位为KB。其中-1表示没有限制。 默认值:-1
  • DBE_SQL_UTIL.enable_sql_patch enable_sql_patch是用于开启SQL PATCH的接口函数,返回执行是否成功。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.enable_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 result OUT bool 执行是否成功。 父主题: DBE_SQL_UTIL Schema
  • DBE_PLDEBUGGER Schema DBE_PLDEBUGGER Schema下的系统函数用于调试存储过程,目前支持的接口及其描述如下所示。仅管理员有权限执行这些调试接口,且无权限修改和创建新函数。 当在函数体中创建用户时,调用attach、next、continue、 info_code、step、info_breakpoint、backtrace、 finish中会返回密码的明文。因此不建议用户在函数体中创建用户。 对应权限角色为gs_role_pldebugger,可以由管理员用户通过如下命令将debugger权限赋权给该用户。 GRANT gs_role_pldebugger to user; 需要有两个客户端连接数据库,一个客户端负责执行调试接口作为debug端,另一个客户端执行调试函数,控制server端存储过程执行。示例如下。 准备调试 通过PG_PROC,查找到待调试存储过程的oid,并执行DBE_PLDEBUGGER.turn_on(oid)。本客户端就会作为server端使用。 1 2 3 4 5 6 7 8 9101112131415161718 openGauss=# CREATE OR REPLACE PROCEDURE test_debug ( IN x INT) AS BEGIN INSERT INTO t1 (a) VALUES (x); DELETE FROM t1 WHERE a = x;END;/CREATE PROCEDUREopenGauss=# SELECT OID FROM PG_PROC WHERE PRONAME='test_debug'; oid------- 16389(1 row)openGauss=# SELECT * FROM DBE_PLDEBUGGER.turn_on(16389); nodename | port----------+------ datanode | 0(1 row) 开始调试 server端执行存储过程,会在存储过程内第一条SQL语句前hang住,等待debug端发送的调试消息。仅支持直接执行存储过程的调试,不支持通过trigger调用执行的存储过程调试。 1 openGauss=# call test_debug(1); 再起一个客户端,作为debug端,通过turn_on返回的数据,调用DBE_PLDEBUGGER.attach关联到该存储过程上进行调试。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.attach('datanode',0); funcoid | funcname | lineno | query---------+------------+--------+---------------------------------- 16389 | test_debug | 3 | INSERT INTO t1 (a) VALUES (x);(1 row) 在执行attach的客户端调试,执行下一条statement。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.next(); funcoid | funcname | lineno | query---------+------------+--------+---------------------- 16389 | test_debug | 0 | [EXECUTION FINISHED](1 row) 在执行attach的客户端调试,可以执行以下变量操作 1 2 3 4 5 6 7 8 9101112131415 openGauss=# SELECT * FROM DBE_PLDEBUGGER.info_locals(); --打印全部变量 varname | vartype | value | package_name | isconst---------+---------+-------+--------------+--------- x | int4 | 1 | | f(1 row)openGauss=# SELECT * FROM DBE_PLDEBUGGER.set_var('x', 2); --变量赋值 set_var--------- t(1 row)openGauss=# SELECT * FROM DBE_PLDEBUGGER.print_var('x'); --打印单个变量 varname | vartype | value | package_name | isconst---------+---------+-------+--------------+--------- x | int4 | 2 | | f(1 row) 直接执行完成当前正在调试的存储过程。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.continue(); funcoid | funcname | lineno | query---------+------------+--------+---------------------- 16389 | test_debug | 0 | [EXECUTION FINISHED](1 row) 直接退出当前正在调试的存储过程,不执行尚未执行的语句。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.abort(); abort------- t(1 row) client端查看代码信息并识别可以设置断点行号。 1 2 3 4 5 6 7 8 91011 openGauss=# SELECT * FROM DBE_PLDEBUGGER.info_code(16389); lineno | query | canbreak--------+-----------------------------------------------------------+---------- | CREATE OR REPLACE PROCEDURE public.test_debug( IN x INT) | f 1 | AS DECLARE | f 2 | BEGIN | f 3 | INSERT INTO t1 (a) VALUES (x); | t 4 | DELETE FROM t1 WHERE a = x; | t 5 | END; | f 6 | / | f(7 rows) 设置断点。 1 2 3 4 5 6 7 8 91011 openGauss=# SELECT * FROM DBE_PLDEBUGGER.add_breakpoint(16389,4); lineno | query | canbreak--------+-----------------------------------------------------------+---------- | CREATE OR REPLACE PROCEDURE public.test_debug( IN x INT) | f 1 | AS DECLARE | f 2 | BEGIN | f 3 | INSERT INTO t1 (a) VALUES (x); | t 4 | DELETE FROM t1 WHERE a = x; | t 5 | END; | f 6 | / | f(7 rows) 查看断点信息。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.info_breakpoints(); breakpointno | funcoid | lineno | query | enable--------------+---------+--------+---------------------------------+-------- 0 | 16389 | 4 | DELETE FROM t1 WHERE a = x; | t(1 row) 执行至断点。 12345 openGauss=# SELECT * FROM DBE_PLDEBUGGER.continue(); funcoid | funcname | lineno | query---------+------------+--------+--------------------------------- 16389 | test_debug | 4 | DELETE FROM t1 WHERE a = x;(1 row) 存储过程执行结束后,调试会自动退出,再进行调试需要重新attach关联。如果server端不需要继续调试,可执行turn_off关闭,或退出session。具体调试接口请见下面列表。 表1 DBE_PLDEBUGGER 接口名称 描述 DBE_PLDEBUGGER.turn_on server端调用,标记存储过程可以调试,调用后执行该存储过程时会hang住等待调试信息。 DBE_PLDEBUGGER.turn_off server端调用,标记存储过程关闭调试。 DBE_PLDEBUGGER.local_debug_server_info server端调用,打印本session内所有已turn_on的存储过程。 DBE_PLDEBUGGER.attach debug端调用,关联到正在调试存储过程。 DBE_PLDEBUGGER.info_locals debug端调用,打印正在调试的存储过程中的变量当前值。 DBE_PLDEBUGGER.next debug端调用,单步执行。 DBE_PLDEBUGGER.continue debug端调用,继续执行,直到断点或存储过程结束。 DBE_PLDEBUGGER.abort debug端调用,停止调试,server端报错长跳转。 DBE_PLDEBUGGER.print_var debug端调用,打印正在调试的存储过程中指定的变量当前值。 DBE_PLDEBUGGER.info_code debug和server端都可以调用,打印指定存储过程的源语句和各行对应的行号。 DBE_PLDEBUGGER.step debug端调用,单步进入执行。 DBE_PLDEBUGGER.add_breakpoint debug端调用,新增断点。 DBE_PLDEBUGGER.delete_breakpoint debug端调用,删除断点。 DBE_PLDEBUGGER.info_breakpoints debug端调用,查看当前的所有断点。 DBE_PLDEBUGGER.backtrace debug端调用,查看当前的调用栈。 DBE_PLDEBUGGER.enable_breakpoint debug端调用,激活被禁用的断点。 DBE_PLDEBUGGER.disable_breakpoint debug端调用,禁用已激活的断点。 DBE_PLDEBUGGER.finish debug端调用,继续调试,直到断点或返回上一层调用栈。 DBE_PLDEBUGGER.set_var debug端调用,为变量进行赋值操作。 DBE_PLDEBUGGER.turn_on DBE_PLDEBUGGER.turn_off DBE_PLDEBUGGER.local_debug_server_info DBE_PLDEBUGGER.attach DBE_PLDEBUGGER.info_locals DBE_PLDEBUGGER.next DBE_PLDEBUGGER.continue DBE_PLDEBUGGER.abort DBE_PLDEBUGGER.print_var DBE_PLDEBUGGER.info_code DBE_PLDEBUGGER.step DBE_PLDEBUGGER.add_breakpoint DBE_PLDEBUGGER.delete_breakpoint DBE_PLDEBUGGER.info_breakpoints DBE_PLDEBUGGER.backtrace DBE_PLDEBUGGER.enable_breakpoint DBE_PLDEBUGGER.disable_breakpoint DBE_PLDEBUGGER.finish DBE_PLDEBUGGER.set_var 父主题: Schema
  • 示例 --准备数据。openGauss=# CREATE TABLE t1(c1 int, c2 int);openGauss=# INSERT INTO t1 VALUES(1, 1);openGauss=# INSERT INTO t1 VALUES(2, 2);--创建全量物化视图。openGauss=# CREATE MATERIALIZED VIEW mv AS select count(*) from t1;CREATE MATERIALIZED VIEW--查询物化视图结果。openGauss=# SELECT * FROM mv; count ------- 2(1 row)--向物化视图中基表插入数据。openGauss=# INSERT INTO t1 VALUES(3, 3);INSERT 0 1--对全量物化视图做全量刷新。openGauss=# REFRESH MATERIALIZED VIEW mv;REFRESH MATERIALIZED VIEW--查询物化视图结果。openGauss=# SELECT * FROM mv; count ------- 3(1 row)--删除物化视图。openGauss=# DROP MATERIALIZED VIEW mv;DROP MATERIALIZED VIEW
  • 冲突处理 逻辑复制的行为类似于正常的DML操作,即便数据在订阅者节点本地被修改,逻辑复制也会根据收到的更改来更新数据。如果流入的数据违背了任何约束,复制将停止。这种情况被称为一个冲突。在复制UPDATE或DELETE操作时,缺失的数据将不会产生冲突并且这类操作将被简单地跳过。 冲突将会产生错误并且停止复制,它必须由用户手工解决。在订阅者的服务器日志中可以找到有关冲突的详细情况。 通过更改订阅者上的数据(这样它就不会与到来的数据发生冲突)或者跳过与已有数据冲突的事务可以解决这种冲突。通过调用pg_replication_origin_advance()函数可以跳过该事务,函数的参数是对应于该订阅名称的node_name以及一个xlog日志的 LSN位置。复制源头的当前位置可以在pg_replication_origin_status系统视图中看到。 父主题: 发布订阅
  • 不支持场景 物化视图中不支持多表Join连接计划以及subquery计划。 除少部分ALTER操作外,不支持对物化视图中基表执行绝大多数DDL操作。 物化视图不支持增删改操作,只支持查询语句。 不支持用临时表/hashbucket/unlog/分区表创建物化视图。 不支持物化视图嵌套创建(即物化视图上创建物化视图)。 仅支持行存表,不支持列存表。 不支持UN LOG GED类型的物化视图,不支持WITH语法。
  • 语法格式 创建增量物化视图 CREATE INCREMENTAL MATERIALIZED VIEW [ view_name ] AS { query_block }; 全量刷新物化视图 REFRESH MATERIALIZED VIEW [ view_name ]; 增量刷新物化视图 REFRESH INCREMENTAL MATERIALIZED VIEW [ view_name ]; 删除物化视图 DROP MATERIALIZED VIEW [ view_name ]; 查询物化视图 SELECT * FROM [ view_name ];
  • 示例 --准备数据。openGauss=# CREATE TABLE t1(c1 int, c2 int);openGauss=# INSERT INTO t1 VALUES(1, 1);openGauss=# INSERT INTO t1 VALUES(2, 2);--创建增量物化视图。openGauss=# CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM t1;CREATE MATERIALIZED VIEW--插入数据。openGauss=# INSERT INTO t1 VALUES(3, 3);INSERT 0 1--增量刷新物化视图。openGauss=# REFRESH INCREMENTAL MATERIALIZED VIEW mv;REFRESH MATERIALIZED VIEW--查询物化视图结果。openGauss=# SELECT * FROM mv; c1 | c2 ----+---- 1 | 1 2 | 2 3 | 3(3 rows)--插入数据。openGauss=# INSERT INTO t1 VALUES(4, 4);INSERT 0 1--全量刷新物化视图。openGauss=# REFRESH MATERIALIZED VIEW mv;REFRESH MATERIALIZED VIEW--查询物化视图结果。openGauss=# select * from mv; c1 | c2 ----+---- 1 | 1 2 | 2 3 | 3 4 | 4(4 rows)--删除物化视图。openGauss=# DROP MATERIALIZED VIEW mv;DROP MATERIALIZED VIEW
  • 语法格式 创建全量物化视图 CREATE MATERIALIZED VIEW [ view_name ] AS { query_block }; 全量刷新物化视图 REFRESH MATERIALIZED VIEW [ view_name ]; 删除物化视图 DROP MATERIALIZED VIEW [ view_name ]; 查询物化视图 SELECT * FROM [ view_name ];
  • 操作步骤 以数据库安装用户登录 GaussDB数据库 主节点。 使用如下命令通过连接默认数据库postgres。 gsql -d postgres -p 16000 -r 其中,16000为数据库端口号,用户可根据实际情况替换。 创建名称为slot1的逻辑复制槽。 12345 openGauss=# SELECT * FROM pg_create_logical_replication_slot('slot1', 'mppdb_decoding');slotname | xlog_position----------+---------------slot1 | 0/601C150(1 row) 在数据库中创建表t,并向表t中插入数据。 12 openGauss=# CREATE TABLE t(a int PRIMARY KEY, b int);openGauss=# INSERT INTO t VALUES(3,3); 读取复制槽slot1解码结果,解码条数为4096。 1 2 3 4 5 6 7 8 910 openGauss=# SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096);location | xid | data -----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0/601C188 | 1010023 | BEGIN 1010023 0/601ED60 | 1010023 | COMMIT 1010023 CS N 1010022 0/601ED60 | 1010024 | BEGIN 1010024 0/601ED60 | 1010024 | {"table_name":"public.t","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","3"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]} 0/601EED8 | 1010024 | COMMIT 1010024 CSN 1010023(5 rows) 删除逻辑复制槽slot1。 12345 openGauss=# SELECT * FROM pg_drop_replication_slot('slot1'); pg_drop_replication_slot--------------------------(1 row)
  • 架构 发布者上的更改会在它们发生时实时传送给订阅者。订阅者按照数据在发布者上被提交的顺序应用数据,这样任意单一订阅中的发布的事务一致性才能得到保证。 逻辑复制被构建在一种类似于物理流复制的架构上。它由“walsender”和“apply”进程实现。walsender进程开始对WAL的逻辑解码并且载入标准逻辑解码插件(pgoutput)。该插件把从WAL中读取的更改转换成逻辑复制协议并且根据发布说明过滤数据。然后数据会被连续地使用流复制协议传输到应用工作者,应用工作者会把数据映射到本地表并且以正确的事务顺序应用它们接收到的更改 订阅者数据库上的应用进程总是将session_replication_role设置为replica运行,这会产生触发器和约束上通常的效果。 逻辑复制应用进程当前仅会引发行触发器,而不会引发语句触发器。不过,初始的表同步是以类似一个COPY命令的方式实现的,因此会引发INSERT的行触发器和语句触发器。 父主题: 发布订阅
  • 快速设置 首先在postgresql.conf中设置配置选项: wal_level = logical 对于一个基础设置来说,其他所需的设置使用默认值就足够了。 需要调整pg_hba.conf已允许复制(这里的值取决于实际的网络配置以及用于连接的用户): host all repuser 0.0.0.0/0 sha256 然后在发布者数据库上: CREATE PUBLICATION mypub FOR TABLE users, departments; 并且在订阅者数据库上: CREATE SUBSCRIPTION mysub CONNECTION 'dbname=foo host=bar user=repuser' PUBLICATION mypub; 上面的语句将开始复制过程,复制对那些表的增量更改。 父主题: 发布订阅
  • 监控 因为逻辑复制是基于与物理流复制相似的架构的,一个发布节点上的监控也类似于对物理复制主节点的监控。 有关订阅的监控信息在pg_stat_subscription中可以看到。 每一个订阅工作者在这个视图都有一行。一个订阅能有零个或者多个活跃订阅工作者取决于它的状态。 通常,对于一个已启用的订阅会有单一的应用进程运行。一个被禁用的订阅或者崩溃的订阅在这个视图中不会有行存在。如果有任何表的数据同步正在进行,对正在被同步的表会有额外的工作者。 父主题: 发布订阅
  • 配置设置 发布订阅要求设置一些配置选项。 在发布者端,需要将wal_level设置为logical,而max_replication_slots中设置的值必须至少是预期要连接的订阅数的最小值。max_wal_senders应该至少被设置为max_replication_slots加上同时连接的物理复制体的数量。 订阅者还要求max_replication_slots被设置。在这种情况下,它必须至少被设置为将被加入到该订阅者的订阅数。max_logical_replication_workers必须至少被设置为订阅数的最小值。 父主题: 发布订阅
  • 安全性 用于复制连接的角色必须具有REPLICATION属性(或者是具有SYSADMIN权限用户)。 如果角色缺少SUPERUSER 和 BYPASSRLS,发布者的行安全策略可以执行。 角色的访问权限必须在pg_hba.conf中配置,并且必须具有LOGIN属性。 要创建发布,用户必须在数据库中有CREATE特权。 要把表加入到一个发布,用户必须在该表上有拥有权。要创建一个自动发布所有表的发布,用户必须是一个具有SYSADMIN权限用户。 要创建订阅,用户必须是一个具有SYSADMIN权限用户。 订阅的应用过程将在本地数据库上以具有SYSADMIN权限用户的特权运行。 特权检查仅在复制连接开始时被执行一次。在从发布者读到每一个更改记录时不会重新检查特权,在每一个更改被应用时也不会重新检查特权。 父主题: 发布订阅
  • 功能描述 GaussDB对数据复制能力的支持情况为: 支持通过数据迁移工具定期向异构数据库进行数据同步,不具备实时数据复制能力。不足以支撑与异构数据库间并网运行实时数据同步的诉求。 GaussDB提供了逻辑解码功能,通过反解xlog的方式生成逻辑日志。目标数据库解析逻辑日志以实时进行数据复制。具体如图1所示。逻辑复制降低了对目标数据库的形态限制,支持异构数据库、同构异形数据库对数据的同步,支持目标库进行数据同步期间的数据可读写,数据同步时延低。 图1 逻辑复制 逻辑复制由两部分组成:逻辑解码和数据复制。逻辑解码会输出以事务为单位组织的逻辑日志。业务或数据库中间件将会对逻辑日志进行解析并最终实现数据复制。GaussDB当前只提供逻辑解码功能,因此本章节只涉及逻辑解码的说明。 逻辑解码为逻辑复制提供事务解码的基础能力, GaussDB使用 SQL函数接口进行逻辑解码。此方法调用方便,不需使用工具,对接外部工具接口也比较清晰,不需要额外适配。
  • 发布 发布可以被定义在任何物理复制的主服务器上。定义有发布的节点被称为发布者。发布是从一个表或者一组表生成的改变的集合,也可以被描述为更改集合或者复制集合。每个发布都只存在于一个数据库中。 发布与模式不同,不会影响表的访问方式。如果需要,每个表都可以被加入到多个发布。当前,发布只能包含表。对象必须被明确地加入到发布,除非发布是用ALL TABLES创建的。 发布可以选择把它们产生的更改限制为INSERT、UPDATE、DELETE的任意组合,类似于触发器如何被特定事件类型触发的方式。默认情况下,所有操作类型都会被复制。 为了能够复制UPDATE和DELETE操作,被发布的表必须配置有一个“复制标识”,这样在订阅者那一端才能标识对于更新或删除合适的行。默认情况下,复制标识就是主键(如果有主键)。也可以在复制标识上设置另一个唯一索引(有特定的额外要求)。如果表没有合适的键,那么可以设置成复制标识“full”,它表示整个行都成为那个键。不过,这样做效率很低,只有在没有其他方案的情况下才应该使用。如果在发布者端设置了“full”之外的复制标识,在订阅者端也必须设置一个复制标识,它应该由相同的或者少一些的列组成。如何设置复制标识的细节请参考ALTER TABLE中的REPLICA IDENTITY。如果在复制UPDATE或DELETE操作的发布中加入了没有复制标识的表,那么订阅者上后续的UPDATE或DELETE操作将导致错误。不管有没有复制标识,INSERT操作都能继续下去。 每一个发布都可以有多个订阅者。 Publication通过使用CREATE PUBLICATION命令创建并且可以在之后使用相应的命令进行修改或者删除。 表可以使用ALTER PUBLICATION动态地增加或者移除。ADD TABLE以及DROP TABLE操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。 父主题: 发布订阅
  • 注意事项 不支持DDL语句解码,在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。 不支持列存、数据页复制的解码。 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。 单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。 GaussDB支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。 如果需要ssl连接需要保证前置条件GUC参数ssl=on。 逻辑复制槽名称必须小于64个字符,且只包含小写字母、数字或者下划线中的一种或几种。 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。 不支持强切,强切后需要重新全量导出数据。 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。 不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。 只支持主机创建删除复制槽。 数据库故障重启或逻辑复制进程重启后,解码数据可能存在重复,用户需自己过滤。 计算机内核故障后,解码可能存在乱码,需手动或自动过滤。 当前备机逻辑解码,不支持开启极致RTO。 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。 不支持interval partition表复制。 不支持全局临时表。 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。 为解析某个astore表的UPDATE和DELETE语句,需为此表配置REPLICA IDENITY属性,在此表无主键时需要配置为FULL,具体配置方式参照▪REPLICA IDENTITY { DEFA...。 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。 基于目标库可能需要源库的系统状态信息考虑,逻辑解码仅自动过滤模式'pg_catalog'和'pg_toast'下OID小于16384的系统表的逻辑日志。若目标库不需要复制其他相关系统表的内容,逻辑日志回放过程中需要对相关系统表进行过滤。 在开启逻辑复制的场景下,如需创建包含系统列的主键索引,必须将该表的REPLICA IDENTITY属性设置为FULL或是使用USING INDEX指定不包含系统列的、唯一的、非局部的、不可延迟的、仅包括标记为NOT NULL的列的索引。
  • 性能 在Benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时: 单次解码数据量4K行(对应约5MB~10MB日志),解码性能0.3MB/s~0.5 MB/s。 单次解码数据量32K行(对应约40MB~80MB日志),解码性能3MB/s~5MB/s。 单次解码数据量256K行(对应约320MB~640MB日志),解码性能3MB/s~5MB/s。 单次解码数据量再增大,解码性能无明显提升。 如果采用pg_logical_slot_peek_changes + pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。
  • DBE_SQL_UTIL.show_sql_patch show_sql_patch是用于显示给定patch_name对应的SQL PATCH的接口函数,返回运行结果。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.show_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 unique_sql_id OUT bigint 查询全局唯一ID。 enabled OUT bool PATCH是否生效。 abort OUT bool 是否是AbortHint。 hint_str OUT text Hint文本。 父主题: DBE_SQL_UTIL Schema
  • 发布订阅 发布和订阅基于逻辑复制实现,其中有一个或者更多订阅者订阅一个发布者节点上的一个或者更多发布。订阅者从它们所订阅的发布拉取数据。 发布者上的更改会被实时发送给订阅者。订阅者以与发布者相同的顺序应用那些数据,这样在一个订阅中能够保证发布的事务一致性。这种数据复制的方法有时候也被称为事务性复制。 发布订阅的典型用法是: 在一个数据库或者一个数据库的子集中发生更改时,把增量的改变发送给订阅者。 在更改到达订阅者时引发触发器。 把多个数据库联合到单一数据库中(例如用于分析目的)。 订阅者数据库的行为与任何其他GaussDB实例相同,并且可以被用作其他数据库的发布者,只需要定义它自己的发布。当订阅者被应用当作只读时,单一的订阅中不会有冲突。在另一方面,如果应用或者对相同表集合的订阅者执行了其他的写动作,冲突可能会发生。 发布 订阅 冲突处理 限制 架构 监控 安全性 配置设置 快速设置 父主题: 逻辑复制
  • 限制 发布订阅基于逻辑复制实现,继承所有逻辑复制的限制,同时发布订阅还有下列额外的限制或者缺失的功能。 数据库模式和DDL命令不会被复制。初始模式可以手工使用gs_dump --schema-only进行拷贝。后续的模式改变需要手工保持同步。 序列数据不复制。serial类型的数据或绑定到sequence的指定列如果是table的一部分则会被复制,但是订阅端上的序列本身的数据不会更新。如果订阅端是一个只读数据库,这不是问题。如果订阅端将要执行switchover或failover,那么序列需要被更新,可以拷贝发布端的数据(可以使用gs_dump)或根据订阅端的表数据指定其序列最大值。 只有表支持复制,包括分区表。试图复制其他类型的关系,例如视图、物化视图或外部表,将会导致错误。 同一数据库内的多个订阅不应当订阅内容重复的发布(指发布相同的表),否则会产生数据重复或者主键冲突。 如果被发布的表中包含不支持btree/hash索引的数据类型(如地理类型等),那么该表需要有主键,才能成功的复制UPDATE/DELETE操作到订阅端。否则复制会失败,同时订阅端会出现“FATAL: could not identify an equality operator for type xx”的日志。 父主题: 发布订阅
  • DBE_PLDEBUGGER.finish 执行存储过程中当前的SQL直到下一个断点触发或执行到上层栈的下一行。 表1 finish入参和返回值列表 名称 类型 描述 funcoid OUT oid 函数id funcname OUT text 函数名 lineno OUT integer 当前调试运行的下一行行号 query OUT text 当前调试的下一行函数源码 父主题: DBE_PLDEBUGGER Schema
  • DBE_SQL_UTIL.disable_sql_patch disable_sql_patch是用于禁用SQL PATCH的接口函数,返回执行是否成功。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.disable_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 result OUT bool 执行是否成功。 父主题: DBE_SQL_UTIL Schema
  • DBE_SQL_UTIL Schema DBE_SQL_UTIL模式存储了用于管理SQL PATCH的工具,包括创建、删除、开启、禁用SQL PATCH等系统函数。普通用户只有usage权限,没有create、alter、drop、comment等权限。 DBE_SQL_UTIL.create_hint_sql_patch DBE_SQL_UTIL.create_abort_sql_patch DBE_SQL_UTIL.drop_sql_patch DBE_SQL_UTIL.enable_sql_patch DBE_SQL_UTIL.disable_sql_patch DBE_SQL_UTIL.show_sql_patch 父主题: Schema
  • DBE_SQL_UTIL.create_abort_sql_patch create_abort_sql_patch是用于创建避险SQL PATCH的接口函数,返回执行是否成功。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.create_abort_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 unique_sql_id IN bigint 查询全局唯一ID。 description IN text PATCH的备注,默认值为NULL。 enabled IN bool PATCH是否生效,默认值为true。 result OUT bool 执行是否成功。 父主题: DBE_SQL_UTIL Schema
  • DBE_SQL_UTIL.create_hint_sql_patch create_hint_sql_patch是用于创建调优SQL PATCH的接口函数,返回执行是否成功。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.create_hint_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 unique_sql_id IN bigint 查询全局唯一ID。 hint_string IN text Hint文本。 description IN text PATCH的备注,默认值为NULL。 enabled IN bool PATCH是否生效,默认值为true。 父主题: DBE_SQL_UTIL Schema
  • DBE_SQL_UTIL.drop_sql_patch drop_sql_patch是用于删除SQL PATCH的接口函数,返回执行是否成功。 限制仅初始用户、sysadmin、opradmin、monadmin用户有权限调用。 表1 DBE_SQL_UTIL.drop_sql_patch入参和返回值列表 参数 类型 描述 patch_name IN name PATCH名称。 result OUT bool 执行是否成功。 父主题: DBE_SQL_UTIL Schema
共100000条