如何粗略估计使用Oracle NOARCHIVELOG示例生成的归档日志的大小

xdyibdwo  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(132)

这个问题可能听起来很奇怪,但问题是:我试图估计PL/SQL过程在部署到生产环境时将生成的归档日志量。我在一个以NOARCHIVELOG模式运行的DEV DB上,没有机会让一个启用了ARCHIVELOG模式的示例可用于测试。
哪些视图可能值得查看,以获取一些数字,这些数字可能有助于粗略了解启用ARCHIVELOG模式时将生成的数量或归档日志?DEV数据库是19 c企业版。

u5rb5r59

u5rb5r591#

只要您没有使用任何并行DML(PDML),您就可以在活动之前利用v$sesstat获取会话的redo size计数器,然后在活动之后再次查询它以获取计数器,差异在于流程生成的重做量。只要您有一个归档日志dest,那么它就是您在生产中预期消耗的归档日志空间。

DECLARE
  var_start_redo integer;
  var_end_redo integer;
BEGIN
  SELECT ss.value
    INTO var_start_redo
    FROM v$sesstat ss,
         v$statname sn
   WHERE ss.statistic# = sn.statistic#
     AND sn.name = 'redo size'
     AND ss.sid = SYS_CONTEXT('USERENV','SID');

   // DO STUFF

  SELECT ss.value
    INTO var_end_redo
    FROM v$sesstat ss,
         v$statname sn
   WHERE ss.statistic# = sn.statistic#
     AND sn.name = 'redo size'
     AND ss.sid = SYS_CONTEXT('USERENV','SID');

  dbms_output.put_line(TO_CHAR(var_end_redo - var_start_redo)|| ' redo bytes generated');
END;

如果这很重要的话,可以通过除以重做日志文件大小(v$log.bytes)来计算将产生的归档日志的数量。
如果你 * 正在 * 使用并行DML,这就困难得多了,因为你需要的会话信息只在每个PX从站的生命周期内可用,而这个生命周期在DML操作结束时结束,所以你不能同步地做“之前和之后”的事情。获取这些数字的唯一方法是让应用程序外部的监视器进程频繁轮询(例如:每秒)的v$sesstat上的SID s(如果是RAC,则INST_ID来自gv$sesstat),您可以通过在QC字段上连接gv$px_sessiongv$session来获得。这里的目标是在会话结束之前获得重做计数器的最大值(或接近最大值),这将是仍然找到数据的最后一个轮询事件。但是,禁用并行DML可能要容易得多,这样您就不必做所有这些,因为重做的数量在有和没有并行DML的情况下不会有明显的不同。
或者,* 如果 * 开发系统是安静的,并且 * 没有其他 * 正在发生,您可以假设您的块更改是唯一发生的,只需通过将v$sysstat替换为v$sesstat来使用系统级计数器。这将涵盖PX slave在并行DML模式下所做的任何事情,并且也不需要您检测代码本身。

相关问题