华为云用户手册

  • require_ssl 参数说明:设置服务器端是否强制要求SSL连接,该参数只有当参数ssl为on时才有效。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示服务器端强制要求SSL连接。 off表示服务器端对是否通过SSL连接不作强制要求。 GaussDB 目前支持SSL的场景为客户端连接数据库主节点场景,该参数目前建议只在数据库主节点中开启。 默认值:off
  • application_name 参数说明:当前连接请求当中,所使用的客户端名称。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 在备机请求主机进行日志复制时,如果该参数非空串,那么会被用来作为备机在主机上的流复制槽名字。此时,如果该参数长度超过61个字节,那么流复制槽名字只会截取使用前61个字节的字符。 取值范围:字符串。 默认值:空字符串(连接到后端的应用名,以实际安装为准)
  • unix_socket_permissions 参数说明:设置Unix域套接字的访问权限。 Unix域套接字使用普通的Unix文件系统权限集。这个参数的值应该是数值的格式(chmod和umask命令可接受的格式)。如果使用自定义的八进制格式,数字必须以0开头。 建议设置为0770(只有当前连接数据库的用户和同组的人可以访问)或者0700(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限)。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:0000-0777 默认值:0700 在Linux中,文档具有十个属性,其中第一个属性为文档类型,后面九个为权限属性,分别为Owner,Group及Others这三个组别的read、write、execute属性。 文档的权限属性分别简写为r,w,x,这九个属性三个为一组,也可以使用数字来表示文档的权限,对照表如下: r:4 w: 2 x:1 -:0 同一组(owner/group/others)的三个属性是累加的。 例如,-rwxrwx---表示这个文档的权限为: owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others = --- = 0+0+0 = 0 所以其权限为0770。
  • connection_info 参数说明:连接数据库的驱动类型、驱动版本号、当前驱动的部署路径和进程属主用户。 该参数属于USERSET类型参数,属于运维类参数,不建议用户设置。 取值范围:字符串。 默认值:空字符串。 空字符串,表示当前连接数据库的驱动不支持自动设置connection_info参数或应用程序未设置。 驱动连接数据库的时候自行拼接的connection_info参数格式如下: 1 {"driver_name":"ODBC","driver_version": "(GaussDB Kernel VxxxRxxxCxx build 290d125f) compiled at 2020-05-08 02:59:43 commit 2143 last mr 131 release","driver_path":"/usr/local/lib/psqlodbcw.so","os_user":"omm"} 默认显示driver_name和driver_version,driver_path和os_user的显示由用户控制(参见连接数据库和Linux下配置数据源)。
  • max_inner_tool_connections 参数说明:允许和数据库连接的工具的最大并发连接数。此参数会影响GaussDB的工具连接并发能力。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,最小值为1,最大值为MIN(262143, max_connections),max_connections的计算方法见上文。 默认值:数据库节点为50。如果该默认值超过内核支持的最大值(在执行gs_initdb的时候判断),系统会提示错误。 设置建议: 数据库主节点中此参数建议保持默认值。 增大此参数可能导致GaussDB要求更多的SystemV共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。
  • local_bind_address 参数说明:声明当前节点连接数据库其他节点绑定的本地IP地址。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 默认值:数据库实例安装好后,根据public_cloud.conf配置文件中不同实例的IP地址配置不同默认值。DN的默认参数值为:local_bind_address = 'data.net网卡对应的IP地址'。 public_cloud.conf文件保存的网卡信息,包括:mgr.net(管理网卡)、data.net(数据网卡)、virtual.net(虚拟网卡)
  • unix_socket_directory 参数说明:设置GaussDB服务器侦听客户端连接的Unix域套接字目录。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 该参数的长度限制于操作系统的长度,超过该限制将会导致Unix-domain socket path "xxx" is too long的问题。 取值范围:字符串 默认值:空字符串(实际值由安装时配置文件指定)
  • port 参数说明:GaussDB服务侦听的TCP端口号。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 该参数由安装时的配置文件指定,请勿轻易修改,否则修改后会影响数据库正常通信。 取值范围:整型,1~65535 设置端口号时,请设置一个未被占用的端口号。设置多个实例的端口号,不可冲突。 1~1023为操作系统保留端口号,请不要使用。 通过配置文件安装数据库实例时,配置文件中的端口号需要注意通信矩阵预留端口。如:DN还需保留dataPortBase+1作为内部工具使用端口,保留dataPortBase+6作为流引擎(由于规格变更,当前版本已经不再支持本特性,请不要使用)消息队列通信端口等。故数据库实例安装阶段,port最大值为:DN可设置65529,同时需要保证端口号不冲突。 默认值:5432(实际值由安装时的配置文件指定)
  • listen_addresses 参数说明:声明服务器侦听客户端的TCP/IP地址。 该参数指定GaussDB服务器使用哪些IP地址进行侦听,如IPV4。服务器主机上可能存在多个网卡,每个网卡可以绑定多个IP地址,该参数就是控制GaussDB到底绑定在哪个或者哪几个IP地址上。而客户端则可以通过该参数中指定的IP地址来连接GaussDB或者给GaussDB发送请求。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围: 主机名或IP地址,多个值之间用英文逗号分隔。 星号“*”或“0.0.0.0”表示侦听所有IP地址。配置侦听所有IP地址存在安全风险,不推荐用户使用。必须与有效地址结合使用(比如本地IP等),否则,可能造成Build失败的问题。同时,主备环境下配置为“\*”或“0.0.0.0”时,主节点数据库路径下postgresql.conf文件中的localport端口号不能为数据库dataPortBase+1,否则会导致数据库无法启动。 置空则服务器不会侦听任何IP地址,这种情况下,只有Unix域套接字可以用于连接数据库。 默认值:数据库实例安装好后,根据public_cloud.conf配置文件中不同实例的IP地址配置不同默认值。DN的默认参数值为:listen_addresses = 'data.net网卡对应的IP地址'。 public_cloud.conf文件保存的网卡信息,包括:mgr.net(管理网卡)、data.net(数据网卡)、virtual.net(虚拟网卡)。
  • max_connections 参数说明:允许和数据库连接的最大并发连接数。此参数会影响数据库的并发能力。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型。最小值为10(要大于max_wal_senders),理论最大值为262143,实际最大值为动态值,计算公式为“262143 - job_queue_processes - autovacuum_max_workers - AUXILIARY_BACKENDS - AV_LAUNCHER_PRO CS - max_inner_tool_connections - min(max(newValue/4,64),1024)”,job_queue_processes、autovacuum_max_workers和max_inner_tool_connections的值取决于对应GUC参数的设置,AUXILIARY_BACKENDS为预留辅助线程数固定为20,AV_LAUNCHER_PROCS为预留autovacuum的launcher线程数固定为2,min(max(newValue/4,64),1024)公式中newValue为新设置的值。 默认值: 55000(128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存);40000(96核CPU/768G内存);25000(64核CPU/512G内存);24000(60核CPU/480G内存);11000(32核CPU/256G内存);5000(16核CPU/128G内存);2048(8核CPU/64G内存);100(4核CPU/32G内存,4核CPU/16G内存) 设置建议: 数据库主节点中此参数建议保持默认值。 配置不当时影响: 若配置max_connections过大,超过计算公式所描述的最大动态值,会出现节点拉起失败问题,报错提示“invalid value for parameter "max_connections"”;或在拉起时申请内存失败,报错提示“Cannot allocate memory”。 若未按照对外出口规格配置仅调大max_connections参数值,未同比例调整内存参数。业务压力大时,容易出现内存不足,报错提示“memory is temporarily unavailable”。 对于管理员用户的连接数限制会略超过max_connections设置,目的是为了让管理员在链接被普通用户占满后仍可以连接上数据库,再超过一定范围(sysadmin_reserved_connections参数)后才会报错。即管理员用户的最大连接数等于max_connections + sysadmin_reserved_connections。 对于普通用户来说,由于内部作业也会使用一些链接,因此会略小于max_connections,具体值取决于内部链接个数。
  • sysadmin_reserved_connections 参数说明:为管理员用户预留的最少连接数,不建议设置过大。该参数和max_connections参数配合使用,管理员用户的最大连接数等于max_connections + sysadmin_reserved_connections。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,最小值为0,最大值为MIN(262143, max_connections),max_connections的计算方法见上文。 默认值:3 注意:当启用线程池功能时,若线程池占满将形成处理瓶颈,导致管理员预留连接无法正常建立;作为逃生手段,此时可使用gsql通过主端口+1端口号连入,清理无用会话,即可正常连入。
  • 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
  • 不支持场景 物化视图中不支持多表Join连接计划以及subquery计划。 除少部分ALTER操作外,不支持对物化视图中基表执行绝大多数DDL操作。 物化视图不支持增删改操作,只支持查询语句。 不支持用临时表/hashbucket/unlog/分区表创建物化视图。 不支持物化视图嵌套创建(即物化视图上创建物化视图)。 仅支持行存表,不支持列存表。 不支持UN LOG GED类型的物化视图,不支持WITH语法。
  • 示例 --准备数据。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系统视图中看到。 父主题: 发布订阅
  • 语法格式 创建全量物化视图 CREATE MATERIALIZED VIEW [ view_name ] AS { query_block }; 全量刷新物化视图 REFRESH MATERIALIZED VIEW [ view_name ]; 删除物化视图 DROP MATERIALIZED VIEW [ view_name ]; 查询物化视图 SELECT * FROM [ view_name ];
  • 语法格式 创建增量物化视图 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
  • 操作步骤 以数据库安装用户登录 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 CSN 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; 上面的语句将开始复制过程,复制对那些表的增量更改。 父主题: 发布订阅
  • 安全性 用于复制连接的角色必须具有REPLICATION属性(或者是具有SYSADMIN权限用户)。 如果角色缺少SUPERUSER 和 BYPASSRLS,发布者的行安全策略可以执行。 角色的访问权限必须在pg_hba.conf中配置,并且必须具有LOGIN属性。 要创建发布,用户必须在数据库中有CREATE特权。 要把表加入到一个发布,用户必须在该表上有拥有权。要创建一个自动发布所有表的发布,用户必须是一个具有SYSADMIN权限用户。 要创建订阅,用户必须是一个具有SYSADMIN权限用户。 订阅的应用过程将在本地数据库上以具有SYSADMIN权限用户的特权运行。 特权检查仅在复制连接开始时被执行一次。在从发布者读到每一个更改记录时不会重新检查特权,在每一个更改被应用时也不会重新检查特权。 父主题: 发布订阅
  • 监控 因为逻辑复制是基于与物理流复制相似的架构的,一个发布节点上的监控也类似于对物理复制主节点的监控。 有关订阅的监控信息在pg_stat_subscription中可以看到。 每一个订阅工作者在这个视图都有一行。一个订阅能有零个或者多个活跃订阅工作者取决于它的状态。 通常,对于一个已启用的订阅会有单一的应用进程运行。一个被禁用的订阅或者崩溃的订阅在这个视图中不会有行存在。如果有任何表的数据同步正在进行,对正在被同步的表会有额外的工作者。 父主题: 发布订阅
  • 配置设置 发布订阅要求设置一些配置选项。 在发布者端,需要将wal_level设置为logical,而max_replication_slots中设置的值必须至少是预期要连接的订阅数的最小值。max_wal_senders应该至少被设置为max_replication_slots加上同时连接的物理复制体的数量。 订阅者还要求max_replication_slots被设置。在这种情况下,它必须至少被设置为将被加入到该订阅者的订阅数。max_logical_replication_workers必须至少被设置为订阅数的最小值。 父主题: 发布订阅
  • 功能描述 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操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。 父主题: 发布订阅
  • 性能 在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%。
共100000条