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_name | VARCHAR | 无 | 否 | 模式名 |
table_name | VARCHAR | 无 | 否 | 表名 |
提示
参数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_NAME | VARCHAR | 无 | 否 | 模式名 |
TABLE_NAME | VARCHAR | 无 | 否 | 表名 |
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_NAME | VARCHAR | 无 | 否 | 订阅者名 |
USEER_NAME | VARCHAR | 无 | 否 | 用户名 |
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_NAME | VARCHAR | 无 | 否 | 订阅者名 |
USEER_NAME | VARCHAR | 无 | 否 | 用户名 |
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_NAME | VARCHAR | 无 | 否 | 订阅者名 |
PARTI_NO | INTEGER | 无 | 否 | 分区号 |
FILTER | VARCHAR | 无 | 否 | 过滤表达式 |
POLL_LEN | BIGINT | 无 | 否 | 读取长度,0表示一直读 |
KEEP_POS | BOOLEAN | TRUE/FALSE | 否 | 是否自动变更读起点位置 |
FNO | INTEGER | 无 | 是,默认为-1 | 日志文件号编号 |
FPOS | BIGINT | 无 | 是,默认为0 | 文件内偏移 |
RET_TYPE | INTEGER | 0/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_NAME | VARCHAR | 无 | 否 | 目标表名 |
FILTER | VARCHAR | 无 | 否 | 过滤条件,用于过滤不需要的表数据 |
PATH | VARCHAR | 无 | 否 | 导出数据的文件路径 |
IS_SEND | BOOLEAN | TRUE/FALSE | 是,默认为false | 是否输出到客户端 |
IS_DUMP_META | BOOLEAN | TRUE/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能及时同步