网站建设补贴,外贸营销型网站建站,有edi证书可以做网站运营么,高校精神文明建设网站问题背景#xff1a; 一早刚上班#xff0c;应用开发就在群里就发了一个语句执行ORA-01555的报错#xff0c;说他们的一条跑批语句昨天晚上跑了1个小时还没跑完#xff0c;最后出现了错误ORA-01555: snapshot too old: rollback segment number#xff0c;让我们帮忙看一下…问题背景 一早刚上班应用开发就在群里就发了一个语句执行ORA-01555的报错说他们的一条跑批语句昨天晚上跑了1个小时还没跑完最后出现了错误ORA-01555: snapshot too old: rollback segment number让我们帮忙看一下这条跑批语句 问题分析: 应用跑批的程序是调用了一个存储过程存储过程里面是将一条insert into select * from tabdblink的语句改写成每10W批量插入一次的形式通过dblink将目标端数据库表TAB_B查询的全量数据批量插入到本地数据库表O_TAB_B里面应用执行返回的ORA-01555报错是dblink指向的目标端select查询 查看目标库表TAB_B的查询语句性能由于查询语句没有where条件所以肯定是一个全表的扫描操作执行计划基本没有分析的必要直接查看目标库的性能以及语句执行消耗从语句的历史执行消耗来看执行时间正常查询1600W行的数据大概在60秒左右执行的效率还是不错的 查看语句的等待事件没有异常的等待事件SQL*Net more data to client查询数据发送给客户端的等待次数也很低说明本地和目标端之间的网络也没有存在瓶颈语句在目标库的执行性能看起来是正常的 接下来分析本地数据库的数据插入执行情况可以看到语句在本地数据库的执行效率很差波动很大平均10w一次的插入数据需要花费10秒-185秒的时间应该是跑批语句的本地的数据插入插入过慢导致dblink目标端的查询语句回滚段被覆盖了 分析语句插入阶段的执行等待事件可以看到语句在执行期间出现了很多的log buffer space日志缓冲区的申请等待这里难道是数据库的log buffer设置过小继续往下分析 拿了一份跑批语句执行期间的awr报告进行分析,可以看到问题期间的每秒redo生成量接近31Mlog buffer的配置44M这个配置相对日志的生成量有点小但只要日志写磁盘的IO性能不是特别差的话应该问题也不大不至于导致这么多的log buffer space等待 查看跑批时间段的等待事件都是跟日志文件的操作等待有关log buffer space写日志缓存等待log file switch completion日志切换等待log file sync日志同步写磁盘日志等待同一时间出现这么多的日志等待事件特别是log file sync的平均等待达到635ms,很有可能是日志的写IO能力出现瓶颈 查看日志写的延时跑批执行期间log file parallel write平均延时高达653mslgwr进程的后台日志也不断的出现日志写耗时警告很明显日志文件的IO性能出现了问题 通过osw iostat进一步确认磁盘的等待情况,可以看到部分的磁盘写平均等待很高。在磁盘写入压力不大的情况下延时可以达到几十ms进一步检查发现这些出现延时比较高的磁盘都属于归档磁盘组ARCHDG 查看日志文件的配置可以看到每个日志配置了两组路径分别为DATADG以及ARCHDG而写入日志文件慢应该就是出现在写入ARCHDG磁盘 问题解决: 跟存储进一步了解底层的磁盘配置情况DATADG使用的是NVME盘而ARCHDG使用的是SAS盘并且阵列卡写策略是使用直写的没有用到阵列卡的缓存所以ARCHDG的磁盘IO写性能很差 知道ARCHDG磁盘IO写性能很差之后我们做了一个小的优化调整将redo日志的路径进行了修改只配置DATADG的路径不往ARCHDG路径写调整之后立马就看到效果平常数据库空闲log file parallel write延时都要11ms调整之后只剩下0.29ms 到了晚上跑批跑批的insert语句速度也得到大幅度的提升10w一次的数据插入只需要花费3秒-5秒的时间log buffer space的等待事件也消失了整个跑批时间提升了10倍以上。