Debezium Oracle开启补充日志功能

启用补充日志记录

要使Debezium能够捕获数据库行变更前的状态,必须对被捕获的表或整个数据库开启补充日志记录。下列为一个简单的例子:

ALTER TABLE schema.table ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

开启补充日志记录会增加重做日志(redo log)的数量,生产环境务必预留足够的空间。为避免日志增长过快,可以按上述方式对需要的表才开启补充日志。

开启最小补充日志:

ALTER TABLE DATABASE ADD SUPPLEMENTAL LOG 
<think>嗯……用户这次的问题很聚焦啊,专门问如何通过日志查看Oracle的批次读取大小。看来之前关于动态视图监控和代码埋点的回答虽然全面,但没完全命中用户想要的"日志分析"这个特定方向。 用户引用的文献挺有意思,特别是[2]提到LogMiner分析重做日志功能——这应该就是突破口了。不过要注意,常规日志本身并不直接记录"批次大小"这种应用层概念,需要换个思路:通过分析SQL执行的物理读/逻辑读次数间接推算。 用户上次的问题历史显示ta对性能优化有深入研究需求,可能正在调优数据迁移或ETL流程。ta特意强调"不是动态视图",说明已经尝试过v$sql这类方法,现在需要更底层的日志证据。 准备这样组织回答: 1. 先明确告知Oracle日志不直接记录批次大小,但可通过LogMiner解析日志中的SQL执行痕迹 2. 重点展示如何用LogMiner提取特定SQL的物理读数据,结合SQL文本中的ROWNUM/ROWID线索反推批次处理逻辑 3. 补充日志分析与动态视图的联动方案,毕竟单纯靠日志效率太低 4. 最后提醒LogMiner的局限性,避免用户踩坑 用户引用的[3]提到分批次删除脚本,正好可以作为推算批次大小的案例。不过那些归档日志参数([1])和Debezium配置([4])暂时用不上,但可以作为备选方案提及。 突然想到个关键点:用户说的"批次"可能指应用层批量提交(batch commit)而不是SQL*Loader的batch。需要确认但不好打断用户,决定在回答里同时覆盖这两种场景。 </think>在Oracle中,日志本身不直接记录"批次读取大小"的显式数值,但可通过分析日志中的SQL执行踪迹和物理读操作间接推算批次处理情况。以下是具体方法: --- ### 一、通过LogMiner分析重做日志(核心方法) **原理**:重做日志记录所有数据块变更,结合SQL解析可反推读取批次特征[^2] ```sql -- 步骤1:启用LogMiner EXEC DBMS_LOGMNR_D.BUILD('dict.ora', '/oracle/dict/', OPTIONS => DBMS_LOGMNR_D.STORE_IN_FLAT_FILE); -- 步骤2:添加待分析日志 EXEC DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => '/archive/redo01.log', OPTIONS => DBMS_LOGMNR.NEW); -- 步骤3:启动分析(重点关注SELECT操作) EXEC DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_FLAT_FILE + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGMNR.PRINT_PRETTY_SQL ); -- 步骤4:查询批次读取特征 SELECT sql_redo, COUNT(*) OVER (PARTITION BY session_id) AS batch_operations, SUM(data_block_id) AS blocks_read -- 读取的数据块数 FROM v$logmnr_contents WHERE operation = 'SELECT' AND sql_redo LIKE '%BULK COLLECT%'; -- 识别批量操作 ``` **关键指标**: 1. `blocks_read`:读取的数据块总数 2. `batch_operations`:同一会话的连续SELECT操作次数 3. 结合数据块大小(通常8KB)可推算每批次数据量: $$ \text{批次大小(行)} \approx \frac{\text{blocks\_read} \times \text{db\_block\_size}}{\text{avg\_row\_size}} $$ --- ### 二、结合动态性能视图与日志特征 #### 1. 定位高负载SQL ```sql SELECT sql_id, executions, disk_reads, buffer_gets FROM v$sqlarea WHERE disk_reads > 10000 -- 筛选高I/O操作 ORDER BY disk_reads DESC; ``` #### 2. 关联日志分析 ```sql SELECT l.sql_redo, s.rows_processed FROM v$logmnr_contents l JOIN v$sql s ON (l.sql_id = s.sql_id) WHERE s.sql_id = '&target_sql_id'; ``` **输出示例**: ``` SQL_REDO | ROWS_PROCESSED -------------------------------------|--------------- SELECT /*+ BATCH */ * FROM orders... | 5000 SELECT /*+ BATCH */ * FROM orders... | 5000 ``` **结论**:连续出现相同SQL且固定`ROWS_PROCESSED`值 → 该值即为批次大小[^3] --- ### 三、跟踪文件分析(需诊断事件) #### 1. 启用SQL跟踪 ```sql ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; ``` #### 2. 解析跟踪文件 查找`BULK`操作特征: ``` PARSING IN CURSOR #1 len=47 dep=0 ... SELECT /*+ BATCH(1000) */ ... -- 批次大小硬编码提示 FETCH #1: count=1000 -- 实际获取行数 ``` **关键模式**: - `count=`后的数值即为实际批次大小 - `BATCH(n)`提示符指明代码中设定的批次量 --- ### 四、归档日志分析(长期监控) 配置归档日志包含完整SQL文本: ```sql ALTER SYSTEM SET "_cursor_bind_capture_interval"=1; -- 捕获所有绑定变量 ``` 通过AWR报告查看历史批次特征: ```sql SELECT snap_id, sql_id, rows_processed_delta / executions_delta AS avg_batch_size FROM dba_hist_sqlstat WHERE sql_id = '&target_sql_id'; ``` > **注意事项**: > 1. LogMiner需开启补充日志:`ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;`[^2] > 2. 批次操作通常伴随`BULK COLLECT`或`BATCH`提示词 > 3. 实际批次大小受`ARRAYSIZE`参数影响(默认15行) > ```sql > SHOW ARRAYSIZE -- 查看当前设置 > SET ARRAYSIZE 1000 -- 增大批次读取量 > ``` --- ### 理想批次大小计算公式 考虑内存与I/O平衡点: $$ \text{最佳批次大小} = \sqrt{\frac{\text{ PGA\_AGGREGATE\_TARGET } \times 0.2}{\text{行平均字节数}}} $$ 需满足:`批次内存 < PGA可用空间`,避免磁盘换页[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值