Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


DBMS_REPLICATION系统包

📄字数 4.6K
👁️阅读量 加载中...

一、概述

DBMS_REPLICATION系统包用于变更记载。变更记载是一种针对DDL/DML操作的日志归档服务,其日志归档的格式为二进制格式,因此简称BINLOG。开启变更记载后,数据库系统会以事务为单位,将事务内部涉及变更对象的所有DDL/DML操作以二进制消息的形式发往集群中GATHER节点进行处理(单机自带GATHER属性),随后GATHER节点将收到的变更消息以二进制日志的形式写入/XMODI/目录下对应的库ID目录内的日志文件中。变更记载功能可根据用户需求开启库级、模式级以及对象级变更记载,可用于数据同步、操作审计、容灾恢复、日志追溯等多种应用场景。

在该系统包中提供了以下接口:

包体函数名简要描述
CREATE_MODIFY_SOURCE用于开启变更记载
CREATE_SUBSCRIBER用于创建变更数据的订阅者
DROP_MODIFY_SOURCE用于关闭变更记载
DROP_SUBSCRIBER用于删除订阅者
DUMP_TABLE导出指定表的DDL结构以及数据到文件中
POLL_MODIFY_DATA读取当前用户订阅的变更数据
SWITCH_FILE用于向所有同步复制服务器发送切换日志写入文件消息

典型应用场景,如:

  • 精确记录每条DDL/DML,具备可追踪性

二、CREATE_MODIFY_SOURCE

2.1 功能描述

该接口用于开启变更记载,支持库级、模式级、表级变更记载,是对结构或数据的变更操作进行跟踪记录

注意

当前用户需具有创建权限

2.2 方法声明

sql
  PROCEDURE CREATE_MODIFY_SOURCE(
    schema_name         VARCHAR,
    table_name          VARCHAR
    );

2.3 参数说明

参数名类型取值范围是否可选描述
schema_nameVARCHAR模式名
table_nameVARCHAR表名

提示

参数schema_name取值为*时,表示当前库下的所有模式;参数table_name取值为*时,表示当前库下指定模式中的所有表。

2.4 示例

sql
-- 1.*表示所有,开启当前库级变更记载:当前库下所有模式和所有表记载
SQL> exec DBMS_REPLICATION.CREATE_MODIFY_SOURCE('*','*');

-- 2.开启指定模式级变更记载
SQL> create schema test_schema;
SQL> exec DBMS_REPLICATION.CREATE_MODIFY_SOURCE('test_schema','*');

-- 3.开启指定表级变更记载
SQL> create table test_schema.tab(i1 int);
SQL> exec DBMS_REPLICATION.CREATE_MODIFY_SOURCE('test_schema','tab');

2.5 场景应用

  • 场景一:企业合规要求对结果变更、敏感表操作进行记录,作为安全与合规证明
  • 场景二:开启变更记载,可定位数据错乱、越权操作等问题

三、DROP_MODIFY_SOURCE

3.1 功能描述

该接口用于关闭变更记载,通常与CREATE_MODIFY_SOURCE搭配使用

3.2 方法声明

sql
   PROCEDURE DROP_MODIFY_SOURCE(
    SCHEMA_NAME         VARCHAR,
    TABLE_NAME          VARCHAR
    );

3.3 参数说明

参数名类型取值范围是否可选描述
SCHEMA_NAMEVARCHAR模式名
TABLE_NAMEVARCHAR表名

3.4 示例

sql
-- 1.关闭当前库级变更记载
SQL> exec DBMS_REPLICATION.DROP_MODIFY_SOURCE ('*','*');
  
-- 2.关闭指定模式级变更记载
SQL> exec DBMS_REPLICATION.DROP_MODIFY_SOURCE ('test_schema','*');
  
-- 3.关闭指定表级变更记载
SQL> exec DBMS_REPLICATION.DROP_MODIFY_SOURCE ('test_schema','tab');

3.5 场景应用

  • 场景一:长期启用变更记载会积累日志数据,占用磁盘空间
  • 场景二:某些系统写入频繁,开启变更记载可能影响写性能,评估后可选择关闭

四、CREATE_SUBSCRIBER

4.1 功能描述

若用户想获取BINLOG日志中详细的内容,需要订阅者的协助。该方法用于创建变更数据的订阅者,创建好的订阅者信息可通过系统表SYS_SUBSCRIBERS查看

4.2 方法声明

sql
   PROCEDURE CREATE_SUBSCRIBER(
    SUBSCRIBER_NAME     VARCHAR,
    USEER_NAME          VARCHAR
    );

4.3 参数说明

参数名类型取值范围是否可选描述
SUBSCRIBER_NAMEVARCHAR订阅者名
USEER_NAMEVARCHAR用户名

4.4 示例

sql
SQL> set pass_mode to 1;
SQL> create user test_user identified by '12345678';

-- 为用户test_user创建一个订阅者test_sub
SQL> exec DBMS_REPLICATION.CREATE_SUBSCRIBER('test_sub', 'test_user');

-- 查询订阅者
SQL> SELECT ds.SUBS_NAME, du.USER_NAME FROM DBA_SUBSCRIBERS ds JOIN DBA_USERS du USING(USER_ID) WHERE du.USER_NAME='TEST_USER';

+-----------+-----------+
| SUBS_NAME | USER_NAME |
+-----------+-----------+
| test_sub  | TEST_USER |
+-----------+-----------+

4.5 场景应用

  • 场景一:用于创建变更数据的订阅者

五、DROP_SUBSCRIBER

5.1 功能描述

当不再有变更记载需求,关闭变更记载功能后,通常也需要对环境做一些清理工作。该方法用于删除订阅者

5.2 方法声明

sql
  PROCEDURE DROP_SUBSCRIBER(
    SUBSCRIBER_NAME VARCHAR,
    USEER_NAME      VARCHAR
    );

5.3 参数说明

参数名类型取值范围是否可选描述
SUBSCRIBER_NAMEVARCHAR订阅者名
USEER_NAMEVARCHAR用户名

5.4 示例

sql
-- 删除订阅者test_sub
SQL> exec DBMS_REPLICATION.DROP_SUBSCRIBER('test_sub', 'test_user');

-- 查询订阅者信息
SQL> SELECT ds.SUBS_NAME, du.USER_NAME FROM DBA_SUBSCRIBERS ds JOIN DBA_USERS du USING(USER_ID) WHERE du.USER_NAME='TEST_USER';

+-----------+-----------+
| SUBS_NAME | USER_NAME |
+-----------+-----------+
+-----------+-----------+

5.4 场景应用

  • 场景一:某业务的数据同步停止维护,不在需要订阅,需删除订阅
  • 场景二:某系统关闭后,其对应的订阅者也应被清理,释放资源

六、POLL_MODIFY_DATA

6.1 功能描述

该接口用于读取当前用户订阅的变更数据

6.2 方法声明

sql
PROCEDURE POLL_MODIFY_DATA (
    SUBSCRIBER_NAME  VARCHAR,
    PARTI_NO         INTEGER,
    FILTER           VARCHAR,
    POLL_LEN         BIGINT,
    KEEP_POS         BOOLEAN,
    FNO              INTEGER DEFAULT -1,
    FPOS             BIGINT DEFAULT 0,
    RET_TYPE         INTEGER DEFAULT 0
    );

6.3 参数说明

参数名类型取值范围是否可选描述
SUBSCRIBER_NAMEVARCHAR订阅者名
PARTI_NOINTEGER分区号
FILTERVARCHAR过滤表达式
POLL_LENBIGINT读取长度,0表示一直读
KEEP_POSBOOLEANTRUE/FALSE是否自动变更读起点位置
FNOINTEGER是,默认为-1日志文件号编号
FPOSBIGINT是,默认为0文件内偏移
RET_TYPEINTEGER0/1/2是,默认为0返回类型,0表示返回SQL和二进制原始数据;1表示只返回SQL;2表示只返回二进制原始数据

6.4 示例

sql
-- 开启库级变更记载
SQL> exec DBMS_REPLICATION.CREATE_MODIFY_SOURCE('*','*');
-- 为用户sysdba创建一个订阅者test_sub
SQL> exec DBMS_REPLICATION.CREATE_SUBSCRIBER('test_sub', 'sysdba');

-- 从0号分区0号日志文件的头部开始解析长度为10MB的内容,查找obj_id=1048577的所有DDL/DML操作。
SQL> EXEC DBMS_REPLICATION.POLL_MODIFY_DATA('test_sub',0,'obj_id=1048577',10*1024*1024,true,0,0,1);

+---------+--------+----------+---------+-------+---------+--------------------------+--------------------------+-----+------+---------+---------+--------+--------------------------------+----------+
| TRAN_ID | ACTION | PARTI_NO | SRC_NID | DB_ID | OBJ_ID  |       DILIVER_TIME       |       COMMIT_TIME        | FNO | FPOS | LOB_NUM | DAT_LEN |  DATA  |    SQL       | SQL_UNDO |
+---------+--------+----------+---------+-------+---------+--------------------------+--------------------------+-----+------+---------+---------+--------+--------------------------------+----------+
| 1266    | 8      | 0        | 1       | 1     | 1048577 | 2025-06-21 14:22:03.201  | 2025-06-21 14:22:03.201  | 0   | 0    | 0       | 62 | <NULL> |SET SCHEMA TO SYSDBA;load meta|<NULL>|
| 1305    | 8      | 0        | 1       | 1     | 1048577 | 2025-06-21 16:01:36.712  | 2025-06-21 16:01:36.727  | 0   | 779  | 0 | 62    | <NULL> | SET SCHEMA TO SYSDBA;load meta| <NULL>|
+---------+--------+----------+---------+-------+---------+--------------------------+--------------------------+-----+------+---------+---------+--------+--------------------------------+----------+

6.5 场景应用

  • 场景一:运维可以读取变更记录,有助于排查异常

七、DUMP_TABLE

7.1 功能描述

该接口用于导出目标表的DDL结构以及表数据到指定路径的文件中,其中表数据格式为INSERT语句格式

7.2 方法声明

sql
PROCEDURE DUMP_TABLE(
    TABLE_NAME   VARCHAR,
    FILTER       VARCHAR,
    PATH         VARCHAR,
    IS_SEND      BOOLEAN DEFAULT false,
    IS_DUMP_META BOOLEAN DEFAULT false
    );

7.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR目标表名
FILTERVARCHAR过滤条件,用于过滤不需要的表数据
PATHVARCHAR导出数据的文件路径
IS_SENDBOOLEANTRUE/FALSE是,默认为false是否输出到客户端
IS_DUMP_METABOOLEANTRUE/FALSE是,默认为false是否导出目标表的DDL结构

提示

PATH为内部的逻辑路径,并非操作系统层的路径,其操作系统层的路径跟路径映射配置相关(详情见mount.ini系统配置

7.4 示例

sql
SQL> use system;

SQL> create table tab(id int, c1 varchar);
SQL> insert into tab values(1,'测试语句1');
SQL> insert into tab values(2,'测试语句2');

-- 目标表tab,过滤条件为ID > 2,保存路径为/backup/t_sale_list_bak.sql,并输出到客户端以及导出表结构
SQL> exec DBMS_REPLICATION.DUMP_TABLE('sysdba.tab', 'ID < 2', '/backup/tab.sql', TRUE, TRUE);

+-------------------------------------------------------+
|                          SQL                          |
+-------------------------------------------------------+
| CREATE TABLE "TAB" (                                 +|
| "ID" INTEGER,                                        +|
| "C1" VARCHAR                                         +|
| )                                                    +|
| PCTFREE 15                                           +|
| COPY NUMBER 3                                        +|
| ;                                                    +|
|                                                       |
| INSERT INTO "TAB" ("ID","C1") VALUES (1,'测试语句1'); |
+-------------------------------------------------------+

7.5 场景应用

  • 场景一:运维人员可定时导出业务表结构+数据,保存在安全目录,防止数据丢失
  • 场景二:将生产环境的表导出后,迁移至测试、预发布环境中
  • 场景三:将表导出为sql文件,在导入其他数据库平台使用
  • 场景四:修改表数据前,先导出当前快照,避免误操作无法恢复

八、SWITCH_FILE

8.1 功能描述

该接口用于向所有同步复制服务器发送切换日志写入文件消息。前提需开启库级或着模式级变更记载

8.2 方法声明

sql
SWITCH_FILE()

8.3 参数说明

8.4 示例

sql
-- 开启库级变更记载
SQL> exec DBMS_REPLICATION.CREATE_MODIFY_SOURCE('*','*');

-- 向所有的同步复制服务器发送DDL消息
SQL> exec DBMS_REPLICATION.SWITCH_FILE();

8.5 场景应用

  • 场景一:主库执行DDL后强制同步到从库。如执行了ALTER TABLE,可用SWITCH_FILE()保证所有从库立即接受并应用该结构变更
  • 场景二:切换日志以防堆积。在高并发DDL场景中,主动切日志确保DDL能及时同步

九、相关系统表与视图