支持模式
- 调用YStream的API接口进行数据变更捕获(CDC,Change Data Capture)、获取并解析YashanDB的附加日志,包括DML和DDL。
1 配置
1.1 检查数据库归档模式
SELECT NAME,LOG_MODE FROM V$DATABASE;注:数据库要求开启归档模式,启用ARCHIVELOG模式需要数据库短暂脱机。要了解更多信息,请参阅官方归档日志说明文档。
https://doc.yashandb.com/yashandb/23.4/zh/All-Manuals/Database-Administration/Instance-Management/Archive-Management.html
1.2 开启附加日志
1.2.1 库级别
- 查看库级附加日志开启情况,要求至少开启最小级别附加日志
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE; - 库级开启附加日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
1.2.2 表级别
- 查看表级附加日志开启情况,要求开启标记ALL级别附加日志
SELECT OWNER,TABLE_NAME,LOG_GROUP_TYPE FROM DBA_LOG_GROUPS WHERE OWNER='<USERNAME>' and TABLE_NAME='<TABLE_NAME>'; - 表级开启附加日志
ALTER TABLE <USERNAME>.<TABLE_NAME> ADD SUPPLEMENTAL LOG DATA(ALL) COLUMNS;
1.3 创建用户及赋权
1.3.1 创建数据库用户
CREATE USER ZCBUS IDENTIFIED BY "********";1.3.2 数据库用户赋权
-- 连接数据库
GRANT CREATE SESSION TO ZCBUS;
GRANT SELECT ANY TABLE TO ZCBUS;
grant select on dba_users to zcbus;
grant select on dba_tables to zcbus;
grant select on dba_tab_comments to zcbus;
grant select on dba_tab_cols to zcbus;
grant select on dba_cons_columns to zcbus;
grant select on dba_constraints to zcbus;
grant select on dba_ind_columns to zcbus;
grant select on dba_indexes to zcbus;
-- 实时发布需要以下权限:
grant YSTREAM_CAPTURE to zcbus;1.4 YStream服务创建与启动
注:YStream API客户端连接YStream服务必须一对一,并且客户端只能连接启动对应YStream服务的数据库节点,同一个YStream服务不能同时连接多个YStream API客户端。要求一个YStream服务只能一个发布节点连接。
1.4.1 YStream服务创建
语法:
DBMS_YSTREAM_ADM.CREATE(
server_name IN VARCHAR(64),
connect_user IN VARCHAR(64) DEFAULT NULL,
start_scn IN BIGINT DEFAULT NULL
);说明:
- server_name:
YStream服务的名称,不能与已有服务名冲突,该参数不能为NULL - vconnect_user:
允许连接该YStream服务的数据库用户,指定用户必须具备YSTREAM_CAPTURE权限,设置为NULL表示允许所有数据库用户连接 由于YashanDB的语法模式会影响用户名的大小写敏感规则,在指定用户名时,请根据实际情况进行转义: yashan模式:大小写不敏感且会自动转为全大写。若用户名需区分大小写应使用双引号包围,例如用户名为User时应指定为'"User"' mysql模式:大小写敏感,且不会进行自动转换。若添加双引号会将其视作用户名的一部分,例如'"User"'将被解析为"User" - start_scn:
日志解析的起始点,设置为NULL表示从当前位置开始 如果start_scn位于一个DDL事务中间,则只能解析到该DDL事务在start_scn之后的部分日志,YStream无法通过不完整的DDL解析构建元数据,后续与该DDL相关的日志均无法解析而被忽略。如遇此种场景,需重新创建YStream服务,指定新的start_scn,以避免start_scn在某个DDL事务内部 您可以在创建和启动YStream服务后,调用TEST函数测试start_scn是否合适。 YStream仅支持解析归档模式下生成的redo或归档日志,请确保start_scn之后的日志都符合条件。
示例:
EXEC DBMS_YSTREAM_ADM.CREATE('server_1');
EXEC DBMS_YSTREAM_ADM.CREATE('server_2', 'zcbus');
EXEC DBMS_YSTREAM_ADM.CREATE('server_3', 'zcbus', 563517721634004992);1.4.2 YStream服务指定解析范围(模式或表)—可选
语法:
DBMS_YSTREAM_ADM.ADD_TABLES(
server_name IN VARCHAR(64),
table_names IN VARCHAR(4096),
schemas IN VARCHAR(4096)
);说明:
- server_name:
YStream服务的名称,该参数不能为NULL - table_names:
添加的表名清单,若表名或schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个表名以,分隔,每个服务最多支持1000000个表。指定表名时可以指定表所在的模式,例如'sales.tab',表的默认模式为当前模式。若不指定表名,请传入NULL - schemas:
添加的模式清单,若schema名称中存在空格、逗号等特殊字符需使用双引号""包围,多个模式以,分隔,每个YStream服务最多支持10000个模式。若不指定模式,请传入NULL
示例:
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_1', 'sales.employees', '');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_2', 'sales.employees,sales.employees,sales.department,sales.branches', '');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_3', '', 'schema1,schema2');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_4', 'sales.department,sales.branches', '"schema{3}",schema4');
EXEC DBMS_YSTREAM_ADM.ADD_TABLES('server_5', '', '');1.4.3 YStream服务启动
语法:
DBMS_YSTREAM_ADM.START(
server_name IN VARCHAR(64)
);说明:
- server_name:
YStream服务的名称,该参数不能为NULL
示例:
EXEC DBMS_YSTREAM_ADM.START('server_1');1.4.4 YStream服务状态查询
查询sql:
SELECT SERVER_NAME, STATUS FROM V$YSTREAM_SERVER where SERVER_NAME=服务名称;状态说明:
- CREATED:服务已创建,还未启动过
- STARTED:服务已启动,没有客户端通过当前实例连接服务
- RUNNING:服务已启动,客户端通过当前实例连接服务
- STOPPED:服务已停止
2 补充说明
2.1 db_name指定
说明:实时发布db_name需要指定cdc服务(即YStream服务)名称,定时发布可以指定为用户名。
2.2 数据类型支持列表
| 字段类型 | 字段描述 | 是否支持 |
|---|---|---|
| CHAR | 固定长度字符串,最大长度2000bytes | 是 |
| VARCHAR2 | 可变长度的字符串,最大长度4000bytes | 是 |
| NCHAR | 根据字符集而定的固定长度字符串,最大长度2000bytes | 是 |
| NVARCHAR2 | 根据字符集而定的可变长度字符串,最大长度4000bytes | 是 |
| VARCHAR | 可变长度字符串(Oracle兼容类型) | 是 |
| NVARCHAR | 根据字符集而定的可变长度字符串(Oracle兼容类型) | 是 |
| DATE | 日期(日-月-年),DD-MM-YY(HH-MI-SS),经过严格测试,无千虫问题 | 是 |
| TIMESTAMP | 日期(日-月-年),DD-MM-YY(HH-MI-SS:FF3),经过严格测试,无千虫问题 | 是 |
| TIMESTAMP WITH LOCAL TIME ZONE | 日期(日-月-年),该类型会转换成数据的时区来保存数据,即在数据库中保存的时间是数据库本地的时区。当别的地方用户访问数据库时在显示该类型数据时Oracle会将该时区转换成客户端的时间来显示。在数据库中保存占7到11字节 | 是 |
| TIMESTAMP WITH TIME ZONE | 日期(日-月-年),保存的是0时区的时间,和所处的时区信息。TIMESTAMP WITH TIME ZONE保存的是当前时间转化到0时区的对应的时间,并通过最后两位来保存时区信息 | 是 |
| TIME | 只存储时间,不包含日期 | 是 |
| INTERVAL YEAR TO MONTH | 年-月时间间隔 | 是 |
| INTERVAL DAY TO SECOND | 日-秒时间间隔 | 是 |
| LONG | 超长字符串,最大长度2G,足够存储大部头著作 (YashanDB中推荐由CLOB替代) | 是 |
| LONG RAW | 可变长度的二进制数据,最大长度2G (YashanDB中推荐由BLOB替代) | 是 |
| RAW | 固定长度的二进制数据,最大长度2000bytes | 是 |
| BLOB | 二进制数据,最大长度4G | 是 |
| CLOB | 字符数据,最大长度4G | 是 |
| NCLOB | 根据字符集而定的字符数据,最大长度4G | 是 |
| NUMBER(P,S) | 数字类型,P为整数位,S为小数位 | 是 |
| DECIMAL(P,S) | 数字类型,P为整数位,S为小数位 | 是 |
| INTEGER/INT | 整数类型,小的整数 (注意:在YashanDB中为严格的32位整数) | 是 |
| TINYINT | 1字节小整数(-128 到 127) | 是 |
| SMALLINT | 2字节小证书,范围 -32768 ~ 32767 | 是 |
| BIGINT | 8字节大整数 | 是 |
| FLOAT | 浮点数类型,NUMBER(38),双精度 | 是 |
| DOUBLE | 双精度浮点数类型 | 是 |
| BINARY_FLOAT | 32位单精度浮点型(Oracle兼容类型) | 是 |
| BINARY_DOUBLE | 64位双精度浮点数(Oracle兼容类型) | 是 |
| REAL | 实数类型,NUMBER(63),精度更高 | 是 |
| BOOLEAN | 存储TRUE/FALSE | 是 |
| BIT | 位数据类型,存储0或1 | 是 |
| XMLTYPE | XML类型,存储XML数据 | 是 |
| JSON | JSON数据类型 | 是 |
| ROWID | 行记录的物理地址 | 不支持 |
| UROWID | 行记录的物理地址(可存储逻辑或物理ROWID) | 不支持 |
| BFILE | 执行数据库外部二进制文件的指针 | 不支持 |
| ST_GEOMETRY | 地理空间数据 | 不支持 |
文档更新时间: 2026-08-11 23:00 作者:周风磊