ORA-00257归档程序错误
ORA-00257归档程序错误
线上生成系统后台日志连接数据库报ORA-00257归档程序错误。借此了解下oracle日志归档模式和非归档模式以及如何解决该问题。
Oracle日志操作模式
Oracle数据库在运行过程中,每一个实例都有一个相关的重做日志,在实例故障情况下保护数据库。 我们对数据的DML,DDL操作都会结构化为重做记录,可以用来重建对数据库所做的所有更改的数据,包括撤销段。 重做记录在SGA的重做日志缓冲区中以循环方式进行缓冲,并被数据库后台进程log Writer (LGWR)写入其中一个重做日志文件(Redo log files)中 由数据库库后台进程log Writer(LGWR)写入联机重做日志(Redo log files)中,当重做日志文件被填满时,会发生日志切换,根据是否启用归档分为两种情况:
1、如果归档被禁用(NOARCHIVELOG模式),则在将在记录在其中的更改写入数据文件后,这个填满的重做日志文件可用。
2、如果启用了归档(ARCHIVELOG模式),则在将记录的更改写入数据文件并归档后,LGWR就可以使用这个被填满的重做日志文件。
归档优缺点
可以进行完全、不完全恢复:由于对数据库所做的全部改动都记录在日志文件中,如果发生硬盘故障等导致数据文件丢失的话,则可以利用物理备份和归档日志完全恢复数据库,不会丢失任何数据。
一般生产系统推荐都开启归档模式,毕竟数据无价。
归档常用操作
查看当前数据库归档模式
su - oracle #切换到oracle用户
sqlplus /nolog
conn /as sysdba;
select log_mode from v$database;
开启归档模式
shutdown immediate; #关闭数据库
startup mount; #启动数据库到mount状态
alter database archivelog; #修改数据库到归档模式
alter database open; #启动数据库
archive log list; #查看归档配置
解决ORA-00257问题
项目上面ORA-00257归档程序错误,为归档空间不足。解决办法: 1、删除多余的归档日志 2、增大归档日志的容量 3、关闭归档模式
删除多于归档日志
1、查看当前使用archivelog使用的百分比。
set linesize 200;
select * from V$FLASH_RECOVERY_AREA_USAGE;
2、查看当前归档日志所在目录 当前归档日志文件在/home/oracle/fast_recovery_area/AODB/archivelog/目录下
show parameter recovery;
3、在此目录下根据日期删除过久的归档日志 4、使用rman维护控制文件
rman target <管理员用户>/<管理员密码>
crosscheck archivelog all; #检查错误文档
delete expired archivelog all; #删除过期文档
修改归档日志存储大小跟容量
show parameter db_recover;
alter system set db_recovery_file_dest_size=2000G scope=spfile
关闭归档模式
如果不是生产系统而是测试环境,可以关闭归档模式
shutdown immediate; #关闭数据库
startup mount; #启动数据库到mount状态
alter database noarchivelog; #修改数据库到归档模式
alter database open; #启动数据库
archive log list; #查看归档配置
项目真实造成归档满原因
实际项目提供的归档大小为1T按照目前项目量没有这么大的日志。在线上归档日志1T一天就打满了。
联想到最近对程序升级过,部分软件模块中可能存在频繁的DML操作。
通过记录了几个小时的AWR日志,下载下来查看程序中存在不正常的SQL更新语句,造成了频繁的更新产生了大量的日志,修复了此SQL问题,解决了该问题。