您的位置:首页 > 数据库 > Oracle

Oracle归档日志空间不足引发的问题及解决方法

2014-07-31 06:35 821 查看
**************************************************************************************
归档日志空间不足现的问题的现象

软件正在操作,突然点击任何菜单无反应;
重启软后,长时间没反应或直接报数据库连接错误;

以下系统管理员操作
oracle用户登录操作系统,输入以下命令:
[oracle@OASERVER ~]$sqlplus
sql>connect cawy_cas/密码 //回车后出现报错
打开EM时(IE中输入http://10.31.1.200:1158/em),报ORA-00257、ORA-01033等错误;
oracle客户端工具(如:PLSQL Developer等)连接数据库时报ORA-00257、ORA-01033等错误;

**************************************************************************************
说明:因oracle归档日志还在开启,需定期检测归档日志占用空间大小,归归档日志达到一定比例时要及时清理,以防止归档日志

问题导致的oracle服务停止现象,从而影响系统。

1、检测oracle是否可以正常归档
oracle用户登录系统
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>select * from v$log

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ------------
1 1 263 52428800 1 NO CURRENT
5924771 13-DEC-10

2 1 261 52428800 1 YES INACTIVE
5878129 12-DEC-10

3 1 262 52428800 1 YES INACTIVE
5899219 13-DEC-10

说明:上面列表可看出ARC列可正常归档,如果全部为NO,oracle将无法进行归档,此时oracle实例会自动关闭。

2、查看FLASH_RECOVERY_AREA空间中各部分使用情况:

oracle用户登录系统
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql> select * from v$recovery_file_dest; //查看FLASH_RECOVERY_AREA空间大小
sql>select * from v$flash_recovery_area_usage; //查看FLASH_RECOVERY_AREA空间使用情况,下面可以看出已使用5.57%

FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 5.57 0 14
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0

6 rows selected.

注意:当使用比例达到90%以上,就必须及时清理日志,否则oracle服务会随时停止。

**************************************************************************************
恢复oracle归档日志正常归档的方法

1、重构归档日志文件

此操作在oracle用户下完成
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>shutdown immediate;
sql> startup mount;
sql>select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ------------
1 1 263 52428800 1 NO CURRENT
5924771 13-DEC-10

2 1 261 52428800 1 NO INACTIVE
5878129 12-DEC-10

3 1 262 52428800 1 NO INACTIVE
5899219 13-DEC-10

sql>alter database clear unarchived logfile group 1; //执行此行时可能出错,如有报错直接把 1 修改成 2 或 3 之后

再执行1。
sql>alter database clear unarchived logfile group 2;
sql>alter database clear unarchived logfile group 3;
sql>shutdown immediate;
sql>startup;
说明:此操作之后需用root用户登录系统重启resin服务

增加一日志组
alter database add logfile group 4 ('+data','+fra','/u01/app/oracle/redo403.log') size 50M;

添加日志文件最后一步 要切换日志 使用一次
切换:
1* select GROUP# ,SEQUENCE#,BYTES/1024/1024 ||'M' "log_size" ,STATUS ,ARCHIVED from v$log
SQL> /

GROUP# SEQUENCE# log_size STATUS ARC
---------- ---------- --------------- ---------------- ---
1 7 50M CURRENT NO
2 5 50M INACTIVE NO
3 6 50M INACTIVE NO
4 0 50M UNUSED YES

alter system switch logfile ;
SQL> select GROUP# ,SEQUENCE#,BYTES/1024/1024 ||'M' "log_size" ,STATUS ,ARCHIVED from v$log
2 ;

GROUP# SEQUENCE# log_size STATUS ARC
---------- ---------- --------------- ---------------- ---
1 7 50M ACTIVE NO
2 5 50M INACTIVE NO
3 6 50M INACTIVE NO
4 8 50M CURRENT NO

检查一下日志文件的状态
select GROUP# ,MEMBER,STATUS from v$logfile order by 1

SQL> /

GROUP# MEMBER STATUS
---------- --------------------------------------------- -------
1 +FRA/orcl/onlinelog/group_1.257.822001547
1 /u01/app/oracle/redo103.log
1 +DATA/orcl/onlinelog/group_1.261.822001539
2 +FRA/orcl/onlinelog/group_2.258.822001559
2 /u01/app/oracle/redo203.log
2 +DATA/orcl/onlinelog/group_2.262.822001551
3 +DATA/orcl/onlinelog/group_3.263.822001563
3 /u01/app/oracle/redo303.log
3 +FRA/orcl/onlinelog/group_3.259.822001571
4 +FRA/orcl/onlinelog/group_4.260.822010503
4 /u01/app/oracle/redo403.log

GROUP# MEMBER STATUS
---------- --------------------------------------------- -------
4 +DATA/orcl/onlinelog/group_4.267.822010497

12 rows selected.

模拟:一个日志组有3个文件,损坏一个
select GROUP# ,MEMBER,STATUS from v$logfile order by 1

SQL> /

GROUP# MEMBER STATUS
---------- --------------------------------------------- -------
1 +FRA/orcl/onlinelog/group_1.257.822001547
1 /u01/app/oracle/redo103.log
1 +DATA/orcl/onlinelog/group_1.261.822001539

删除一个: rm -rf /u01/app/oracle/redo103.log
startup force ---->可以成功!!!----》看警告日志文件
cd /u01/app/oracle/diag/rdbms/orcl/orcl/trace/
vim alert_orcl.log

Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_1450.trc:
ORA-00321: log 1 of thread 1, cannot update log file header
ORA-00312: online log 1 thread 1: '/u01/app/oracle/redo103.log'
Checker run found 1 new persistent data failures

修复一下:
删除坏的,添加好的
alter database drop logfile member '/u01/app/oracle/redo103.log';

alter database add logfile member '/u01/app/oracle/redo103.log' to group 1;

切换一下
alter system switch logfile ;
alter system switch logfile ;
alter system switch logfile ;
1* select GROUP# ,MEMBER,STATUS from v$logfile where group#=1
SQL> /

GROUP# MEMBER STATUS
---------- --------------------------------------------- -------
1 +DATA/orcl/onlinelog/group_1.261.822001539
1 +FRA/orcl/onlinelog/group_1.257.822001547
1 /u01/app/oracle/redo103.log

2、增大闪存空间FLASH_RECOVERY_AREA大小

此操作在oracle用户下完成
[oracle@OASERVER ~]$sqlplus
sql>connect / as sysdba
sql>shutdown immediate;
sql>startup mount;
sql>show parameter db_recovery_file_dest; //查看回闪恢复区的大小和存放目标
SQL> show parameter recovery

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string +FRA
db_recovery_file_dest_size big integer 3882M
alter system set db_recovery_file_dest_size =5G ;
alter system set db_recovery_file_dest='+FRA'; (磁盘组 文件目录)

sql>alter system set db_recovery_file_dest_size = 10G(缺省是2G,可以根据实际情况调整大小,最大不能超过分区可用空

间大小,否则重启后自动恢复2G)

sql>alter database open;

说明:此操作之后需用root用户登录系统重启resin服务
[root@OASERVER /]cd /app/weaver/resin/bin/
[root@OASERVER bin]./stopresin.sh
[root@OASERVER bin]./startresin.sh

===================================================================
*****ORACLE 归档日志打开关闭方法***********
===================================================================
一 设置为归档方式
------------------------
view plaincopy to clipboardprint?
sql> archive log list; #查看是不是归档方式
sql> alter system set log_archive_start=true scope=spfile; #启用主动归档
sql> alter system set log_archive_dest='location=/oracle/ora9/oradata/arch' scope=spfile;
#设置归档路径
sql> alter system set log_archive_dest_1='location=/oracle/ora9/oradata/arch1' scope=spfile;
sql> alter system set log_archive_dest_2='location=/oracle/ora9/oradata/arch2' scope=spfile;
#如果归档到两个位置,则可以通过上边方法实现
sql> alter system set log_archive_format='arch_%d_%t_%r_%s.log' #设置归档日记款式
sql> shutdown immediate;
sql> startup mount; #打开控制文件,不打开数据文件
sql> alter database archivelog; #将数据库切换为归档模式
sql> alter database open; #将数据文件打开
sql> archive log list; #查看此时是否处于归档模式
查询以确定数据库位于archivelog模式中且归档过程正在运行
sql> select log_mode from v$database;
sql> select archiver from v$instance;
日志切换
sql> alter system switch logfile;
这次日志切换将归档写到两个目标地,
即第二步的/oracle/ora9/oradata/arch1和/oracle/ora9/oradata/arch1,要是要对目录确认

在oracle情况中运行如下查询:
sql> select name from v$archived_log;
而后在操作系统中确认查询所列出的文件

二 设置非归档方式
------------------------------------------

view plaincopy to clipboardprint?
sql> archive log list; #查看是否是归档方式
sql> alter system set log_archive_start=false scope=spfile; #禁用自动归档
sql> shutdown immediate;
sql> startup mount; #打开控制文件,不打开数据文件
sql> alter database noarchivelog; #将数据库切换为非归档模式
sql> alter database open; #将数据文件打开
sql> archive log list; #查看此时便处于非归档模式

三 归档相关命令
---------------------------------------

view plaincopy to clipboardprint?
archive log stop;
archive log start;
archive log list;

show parameters;
show parameters log_archive_start;
show parameters log_archive_max_process; #归档进程数
alter system set log_archive_max_process=5; #将归档进程数改为5
select * from v$bgprocess; #检查后台进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle archivelog