天天看点

Oracle的奇葩设置之归档清理作业与rm -rf

    虽然,Linux、Unix主机的定时任务crontab对于应用或数据库服务器的日常维护起到了很大的作用,但是,一旦设置不合理,就会给应用或数据库服务器的正常运行带来潜在的安全隐患。

    在联通有这么奇葩的设置,那个超级不合理的设置是关于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

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

通过归档文件清理脚本的调整,该双击数据库因归档误删除的问题解决了。