DBA必备工具之Oracle环境中自动删除归档日志
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">简介</a></li><li><a href="#_label1">获取脚本</a></li><li><a href="#_label2">使用方法</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">语法</a></li><li><a href="#_lab2_2_1">参数说明</a></li><li><a href="#_lab2_2_2">示例</a></li></ul><li><a href="#_label3">日志说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">版本信息</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">获取脚本</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">功能说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label8">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>简介</h2><p><code>delete_archive</code> 是一个用于自动化管理 Oracle 数据库归档日志的 Go 语言脚本。</p>
<p>此脚本来源于之前有2个客户的需求:</p>
<ul><li>一是一次迁移几百套数据库,其中要用ADG来迁移,即不能影响到客户当前归档删除策略或者是原来非归档数据库中转为归档模式后磁盘空间的容量,又不能因为过度删除归档日志影响到我们迁移的同步,所以当时就写了shell版本的一键自动删除归档的脚本。</li><li>而是一个客户归档日志采用了自动删除策略,但是在还原过程中发现归档日志缺失,最后分析原因是自动删除策略将未备份的归档日志删除了。</li></ul>
<p>脚本的初衷就是尽可能保留旧的归档日志,同时也考虑到空间自定义规则。</p>
<p class="maodian"><a name="_label1"></a></p><p class="maodian"><a name="_label5"></a></p><h2>获取脚本</h2>
<p>公众号回复delete_archive即可获得下载链接</p>
<p class="maodian"><a name="_label2"></a></p><h2>使用方法</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>语法</h3>
<div class="jb51code"><pre class="brush:sql;">Usage: ./delete_archive
</pre></div>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>参数说明</h3>
<ul><li><code>-s <instance></code> 指定要处理的 Oracle 实例名,<code>0</code> 表示所有实例(默认:htz)</li><li><code>-n <num></code> 归档日志删除的磁盘使用率阈值,达到该百分比时触发删除(默认:90),删除时,自动删除最旧的2个已经成功备份的归档日志。</li><li><code>-f <num2></code> 强制删除的磁盘使用率阈值,达到该百分比时强制删除(默认:98),不会进行是否进行备份的判断。</li><li><code>-d</code> 启用脚本调试模式,输出详细调试日志(默认false)</li><li><code>-v</code> 显示脚本版本号和联系方式</li><li><code>-h, --help</code> 显示帮助信息</li></ul>
<div class="jb51code"><pre class="brush:ps;">$ ./deletearchive -help
Usage: ./deletearchive
Options:
-s <instance> instance name you will delete archivelog, 0 means all instances (default: htz)
-n <num> Threshold (percent) to trigger log deletion (default: 90)
-f <num2> Threshold (percent) to trigger forced log deletion (default: 98)
-d Enable script debugging
-v display script version and contact info
-h, --help display this help information
Version: 0.1
Contact: For the latest version, contact phone/WeChat: 18081072613
</pre></div>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>示例</h3>
<ul><li>删除所有实例归档日志,使用默认阈值:</li></ul>
<div class="jb51code"><pre class="brush:ps;">./delete_archive -s 0
$ ./deletearchive -s 0
2025-07-02 00:48:03.184868 main.main : Script started at: 2025-07-02T00:48:03+08:00
2025-07-02 00:48:03.212655 main.getRunningInstances : Running instances: htz191, htz192
2025-07-02 00:48:03.212726 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:03.212754 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:03.238535 main.setOracleSID : Set ORACLE_SID to: htz191
2025-07-02 00:48:03.314795 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:03.314854 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:03.337470 main.setOracleSID : Set ORACLE_SID to: htz191
2025-07-02 00:48:03.511368 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:48:03.581760 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:48:03.644475 main.deleteMain : Current archive used PCT :76
2025-07-02 00:48:03.644534 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:03.644555 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:03.666678 main.setOracleSID : Set ORACLE_SID to: htz192
2025-07-02 00:48:03.749803 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:03.749859 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:03.772382 main.setOracleSID : Set ORACLE_SID to: htz192
2025-07-02 00:48:03.923390 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:48:03.998782 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:48:04.078302 main.deleteMain : Current archive used PCT :76
2025-07-02 00:48:04.078363 main.main : Script ended at: 2025-07-02T00:48:04+08:00
</pre></div>
<ul><li>删除指定实例(如 htz1)归档日志,删除阈值 85%,强制阈值 95%:</li></ul>
<div class="jb51code"><pre class="brush:sql;">./delete_archive -s htz1 -n 85 -f 95
部分日志:
$ ./deletearchive -s $ORACLE_SID -f 75
2025-07-02 00:48:42.010254 main.main : Script started at: 2025-07-02T00:48:42+08:00
2025-07-02 00:48:42.010318 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:42.010336 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:42.041291 main.setOracleSID : Set ORACLE_SID to: htz191
2025-07-02 00:48:42.107775 main.setOracleSID : beging executing modify Oracle sid
2025-07-02 00:48:42.107832 main.checkCkptProcess : beging executing check ckpt process
2025-07-02 00:48:42.131013 main.setOracleSID : Set ORACLE_SID to: htz191
2025-07-02 00:48:42.267686 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:48:42.340124 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:48:42.415996 main.deleteMain : Current archive used PCT :76 and Force delete archive log
2025-07-02 00:48:42.416059 main.deleteArchLog : Begin delete archive log
2025-07-02 00:48:50.260200 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:48:50.337404 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:48:50.404294 main.deleteMain : Current archive used PCT :76 and Force delete archive log
2025-07-02 00:48:50.404363 main.deleteArchLog : Begin delete archive log
2025-07-02 00:48:57.816066 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:48:57.895482 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:48:57.975555 main.deleteMain : Current archive used PCT :76 and Force delete archive log
2025-07-02 00:48:57.975615 main.deleteArchLog : Begin delete archive log
2025-07-02 00:49:04.846875 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:49:04.919516 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:49:04.996407 main.deleteMain : Current archive used PCT :76 and Force delete archive log
2025-07-02 00:49:04.996468 main.deleteArchLog : Begin delete archive log
2025-07-02 00:49:12.081336 main.getDiskUsage : The archive path is configured as a file system
2025-07-02 00:49:12.160922 main.getDiskUsage : Using FRA to manage archive logs
2025-07-02 00:49:12.245844 main.deleteMain : Current archive used PCT :76 and Force delete archive log
2025-07-02 00:49:12.245906 main.deleteArchLog : Begin delete archive log
2025-07-02 00:49:12.322223 main.deleteArchLog : Get error archive log info :no rows selected
</pre></div>
<ul><li>启用调试模式:<div class="jb51code"><pre class="brush:ps;">./delete_archive -d
</pre></div></li><li>查看帮助信息:<div class="jb51code"><pre class="brush:ps;">./delete_archive -h
./delete_archive --help
./delete_archive -help
</pre></div></li><li>查看版本信息:<div class="jb51code"><pre class="brush:ps;">./delete_archive -v
</pre></div></li></ul>
<p class="maodian"><a name="_label3"></a></p><h2>日志说明</h2>
<ul><li>日志文件默认保存在脚本同级目录下的 <code>log/</code> 目录中。</li><li>主要日志文件:<ul><li><code>delete_archiveerrors.txt</code> 错误日志</li><li><code>delete_archivedebug.txt</code> 调试日志</li></ul></li><li>日志内容包括操作时间、函数名、日志级别和详细信息。</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>版本信息</h2>
<ul><li>当前版本:0.1</li><li>联系方式:如有问题或建议,请联系 18081072613(电话/微信同号)</li></ul>
<h2>获取脚本</h2>
<p>公众号回复delete_archive即可,目前脚本只编译了Linux版本。</p>
<p class="maodian"><a name="_label6"></a></p><h2>注意事项</h2>
<ul><li>需以有权限的 Oracle 用户运行,确保能访问数据库和相关归档目录。</li><li>需在 Oracle 数据库服务器上运行,且环境变量 <code>ORACLE_SID</code> 可被正确设置。</li><li>脚本会自动检测并切换 <code>ORACLE_SID</code>,无需手动干预。</li><li>强制删除模式下,归档日志即使未备份也会被删除,请谨慎设置阈值。</li><li>如遇脚本报错或异常退出,请检查日志文件获取详细信息。</li></ul>
<p class="maodian"><a name="_label7"></a></p><h2>功能说明</h2>
<ul><li>自动检测 Oracle 实例归档日志的存储使用率。</li><li>支持文件系统和 ASM 磁盘组归档路径的检测与处理。</li><li>支持 FRA(闪回恢复区)和手动归档管理模式。</li><li>根据设定的阈值自动删除最老的归档日志,优先删除已备份的归档。</li><li>支持强制删除(无备份也可删除),防止磁盘空间耗尽。</li><li>支持多实例批量处理。</li><li>详细日志输出,便于问题追踪。</li></ul>
<p class="maodian"><a name="_label8"></a></p><h2>总结</h2>
頁:
[1]