在联通有这么奇葩的设置,那个超级不合理的设置是关于oracle数据库归档清理的。主机维护人员为了减轻日常维护负担,将清理任务交给了crontab,放了一个清理脚本在数据库服务器上。令谁都想不到的是脚本清理归档的命令是:rm -rf ....。由于数据库服务器存储空间压力很大,需要该脚本没30分钟运行一次,来释放空间。由于数据库归档进程会不定时运行,有与该脚本耦合的可能,结果还真的发生了。导致数据库正在归档的归档文件被rm -rf强制删除掉了,因而数据库无法完成归档,告警日志一直报错如下:
Wed Jul 9 22:30:46 2014
Errors in file /oracle/admin/cdma/bdump/cdma_arc1_25303.trc:
ORA-19510: 无法设置 984377 区块的大小给文件 "/oradata2/cdma/archivelog/1_2302874_696954518.dbf" (块大小 = 512)
ORA-27037: 无法获得文件状态
经过查找,/oradata2/cdma/archivelog/1_2302874_696954518.dbf已经不存在了。更严重的后果是,由于正在归档的归档被删除还导致双击异常而发生切换,而且这种由于归档误删除发生双击切换还不止一次。从操作系统的messages文件有印证,如上述告警报错,只要是归档进程正在归档还没完成,而rm -rf定时任务删除了正在归档的文件,都是半点发生的。然后solaris双击软件日志文件检测数据库核心进程异常,就切换oracle数据库到另外一个节点运行,但是数据库到对端运行还是不能完成归档,又发生切换。
后来,通过与主机、应用协商采用rman自动删除归档来避免正在归档的文件被误删除,具体的命令如下:
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2.0.5/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl105
rman target / nocatalog log /tmp/rman_delete_arch.log append allocate channel c1 type disk;
后来,通过与主机、应用协商采用rman自动删除归档来避免正在归档的文件被误删除,具体的命令如下:
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_HOME=/oracle/app/oracle/product/10.2.0.5/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl105
rman target / nocatalog log /tmp/rman_delete_arch.log append allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
sql 'alter system archive log current';
crosscheck backup;
crosscheck archivelog all;
delete noprompt obsolete;
delete noprompt archivelog all;
EOF
通过归档文件清理脚本的调整,该双击数据库因归档误删除的问题解决了。