Skip to content

某行维护的一些事,顺便附上自动清除Oracle归档日志的脚本

某银行的数据中心,核心不是Orcale,今年在迁移到Oracle,为此我也做了大量的准备工作,当然这是题外话。这个数据中心可以说是整个行的数据集中地点,从初步搭建到目前的成型,大部分的Oracle数据库以及衍生的相关产品都有我手上实施以及维护的汗水,但是整个中心的配套项目并没有跟上系统的脚步,几十套系统上线,再更新,数据库换平台,性能问题,冗余问题,安全问题,一个个在日常的维护工作中发生。举个例子,有一批的40多套Oracle数据库,10g版本,由行里的工程师安装,在老鸟看来是很简单的工作,但是对于一个赶进度的经理来讲就是一个粗糙的担心过程,在最后一步2个脚本没执行,40多套清一色都没有执行!这在我后期升级数据库的版本工作中,带来不小的麻烦,因为2天之内要升级40多套小系统的Oracle版本!对没错,测试 + 生产!类似这类问题等,还有很多~

配套的设施不完善,比如由于没有备份系统,成型的备份机制,在多次报告(china 的流程)陈述严重性后,经过十多个月,终于要盼来备份系统了~但是这个还只是在招标。为此,我不得不为众多的Oracle Db考虑归档日志的事情(因为我把所有数据库置为归档模式了!TAT!小系统也不放过),客户对一些系统有设置exp的导出备份,由于众多因素,设备也好,人力也好,很多东西不是我们工程师能控制的,所以我都争取保证每个没有备份的db置为归档模式下,采取保留archivelog 最大时间的方式,一般视为空间而定(最多30天吧,也有设置rman备份保留机制,但是只被允许在部分系统上设置),这里就把我把通用的Oracle归档定时清楚脚本粘上来,算是一个小解决方案吧~

步骤一:
在root用户下设置crontab的任务,脚本方式。当然了如果配置了Oracle用户的crontab的执行权限也可以使用oracle相关用户。

0 2 * * * /oracle/delete_arch01.sh >> /oracle/log/`/bin/date +”%Y%m%d”`.log  2>&1

步骤二:
设置脚本delete_arch01.sh,这个脚本的作用是调动oralce用户的归档清除shell脚本,具体如下:

脚本1.
需要注意的是脚本的权限,目录的权限,该脚本为root用户拥有

#delete_arch01.sh
#user:root
#It will excute at am 02:00
#user for delete archivelog of oracle database
su - oracle -c /oracle/delete_arch02.sh

步骤三:
该脚本为oracle用户拥有
设置脚本delete_arch02.sh,这个脚本的作用是登陆rman,使用rman清除7天前的归档日志,
这样做和rm比起来,
一方面可以避开归档日志的刷选问题,
一方面可以将控制文件的相关物理信息更新(以避免dg或者rman中报错)

脚本2.

#delete_arch_02.sh
#user:oracle
#It used by delete_arch_01.sh.
#export ORACLE_SID=xybank
rman target / log=/oracle/log/rman/sxbank_`/bin/date +"%Y%m%d"`_rman.log < <eof
crosscheck archivelog all;
delete noprompt expired archivelog all;
#delete noprompt obsolete; 清除过期的备份
delete noprompt archivelog all completed before 'sysdate - 7';
exit;
EOF

 

最近

现在的工作呢,是比较freedom的,可以自己去做好安排,及时的把服务按合同提交即可,然后就是解决突发故障以及保证性能,这应该是大部分乙方DBA的工作内容吧。

我习惯做计划,自己有自己的计划大到5年内,小到1年内,1个月内。而在工作方面,从这几年在这家公司工作的经验累计下来,我习惯把自己的计划排好一个月,然后按周实施计划,这样的话就能够非常的清楚这个月在trouble以及other call事件外的行程以及安排。而我按照全部指定责任的客户排好计划,我发现总是有一个共同点:我一个人是无法完成所有客户的合同面上的人天的。如果中间碰到trouble或者其他事情,我就必须再次去申请调动其他的工程师来支援。这个情况出现得最频繁的是2012年,公司还很不合理的把我指派到三菱银行做架构设计。我觉得当时这个安排是十分有问题的,我一个人的手上有16个客户,每个月都出现service delay的情况,历经一年,朝九朝三。这个情况我也不止反应了一次,而当时整个团队压力非常大,技术部一度只有7个人,顶着巨大压力负责整个华东那么多客户的support。2012这一年我没有很多的时间去陪家人,去做自己想要的事情,大部分时间在路上,在客户现场。我做着我的plan,实施着我的plan,有时候我也很庆幸我顶住了压力,和几个同事熬了过来。

今年以来公司各方面都走了调整,流程也好,还是技术部人员也好,目前整个team已经超过了20人,随着新技术经理的习惯以及安排,客户负责不均的情况得到比较大的改善,而公司也把几个比较有经验的工程师调整到更加有意义的合作support上面,比如集中售前,分享等。而我在晚上时间就更加充足,也和出版商签了合同,关于安全方面的新书也正式开始写了,我会更加努力的更新blog,把自己所理解所学,分享出来。

重新编译存储过程中遭遇ORA-04021

在今晚的客户现场遭遇了另外一个客户的数据库紧急宕机,处理完毕后这边编译存储过程遭遇ORA-04021,这个错误在编译存储过程的时候比较常遇见,通常这类错误的出现是由于锁的问题导致,一开始运行UTLRP.sql修复整个库的invalid objects,但是修复完后发现还存在1个package body为invalid,
逐用alter方式修复,具体如下:

SQL> @?/rdbms/admin/utlrp.sql

PL/SQL procedure successfully completed.

Table created.

Table created.

Table created.

Index created.

Table created.

Table created.

View created.

View created.

Package created.

No errors.

Package body created.

No errors.

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

SQL> select owner,object_name,object_type from dba_objects where status=’INVALID’ order by owner;

OWNER OBJECT_NAME OBJECT_TYPE
—————————— —————————————- ——————
SYS DBMS_AQ PACKAGE BODY

SQL> alter package DBMS_AQ compile;
alter package DBMS_AQ compile
*
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object SYS.DBMS_AQ

遇见这个问题基本上判断是由锁造成,而查锁时候并未发现由锁引起的等待,倒是发现了锁未释放的情况,重启数据库后,再次查询,此对象为valid的状态,由此可见是因为utlrp修复完之后,DBMS_AQ上的锁未释放,导致重新申请修复的时候引发04021