在ORACLE10g和11g版本,ORACLE默认的日志归档路径为闪回恢复区($ORACLE_BASE/flash_recovery_area)。对于这个路径,ORACLE有一个限制,就是默认只有2G的空间,而且 不只是归档日志 的默认路径,也是 备份文件 和 闪回日志 的默认地址,这样的话归档日志锁使用的空间就达不到2G,在没有设置好这个路径大小的情况下,很多系统都遇到过归档日志满而无法归档导致数据库夯住的问题,可以使用下面的SQL语句去查看归档信息。
一.在数据库开启的情况下 检测是否已开启归档SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 19Current log sequence 20SQL>select log_mode from v$database;如果为ARCHIVELOG则表示已成功归档 查看,Disabled表示未开启归档 二. 开启归档模式 2.1 重新启动挂起状态SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.--如果安装多个库,会报错,找不到句柄--exit 再用管理员进入 Total System Global Area 1258291200 bytesFixed Size 1219160 bytesVariable Size 318768552 bytesDatabase Buffers 922746880 bytesRedo Buffers 15556608 bytesDatabase mounted. 行至此步,真正的问题才出现。mount了无数次始终startup不上,说是监听程序无法监听到你当前的例程了。当然,如果监听程序配置得当,此类问题是不会在这里出现的。既然是监听程序出现问题,那么就从这里入手进行解决。在oracle数据库的安装目录下(路径可能如:oracle\product\10.2.0\db_1\NETWORK\ADMIN)可以找到listener.ora这种参数文件, 2.2 修改启动归档模式SQL> alter database archivelog;Database altered.--打开数据库SQL> alter database open;Database altered.--查看是否开启SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination USE_DB_RECOVERY_FILE_DESTOldest online log sequence 15Next log sequence to archive 17Current log sequence 17 2.3 修改归档日志目录及大小 查看参数db_recovery_file_dest,存档终点USE_DB_RECOVERY_FILE_DEST默认就是闪回恢复区($ORACLE_BASE/flash_recovery_area),可以通过下面的SQL查看闪回恢复区的信息。SQL> show parameter db_recoverNAME TYPE VALUE-------------------------- ----------- ----------------------------db_recovery_file_dest string oracle\flash_recovery_areadb_recovery_file_dest_size big integer 2G 默认情况下,归档日志会存放到 闪回恢复区(oracle\flash_recovery_area)内,如果闪回恢复区已经使用到2G,归档日志就有可能无法继续归档,数据库夯住,通常的解决方法是增大闪回恢复区,可以用以下SQL实现。Oracle 里面有个叫做spfile的东西,就是动态参数文件,里面设置了Oracle 的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。语法:alter system set 参数=值 scope=spfile;注意:ALTER SYSTEM 中 SCOPE=SPFILE/MEMORY/BOTH 的区别:SCOPE = SPFILE : 此更改写入初始化参数文件,更改将在下次启动时生效。动态参数与静态参数都一样可以。也是静态参数唯一可以使用的方式。SCOPE = MEMORY : 只在内存上修改,立即生效,但重启后将不再生效,因为并没有写入到初始化参数文件。只适用于动态参数,静态参数则不允许SCOPE = BOTH : 默认选项,既写入到初始化参数文件,也在内存上修改,立即生效。同样也只适用于动态参数,静态参数则不允许SQL> alter system set db_recovery_file_dest_size=3G;系统已更改。 即使用这种方法解决的当前燃眉之急,虽然闪回恢复区ORACLE会自动管理,如果闪回恢复区空间不足就会清理掉没用的数据,但是如果备份策略不是很完善,数据库非常繁忙的情况下,还有可能遇到这种情况,通常需要修改归档日志的路径,将归档日志放到其他不受限制的路径下来解决这个问题,可通过下面的SQL来修改归档日志的存放路径。SQL> alter system set log_archive_dest_1='location=oracle\log1\archive_log';系统已更改。SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination oracle\log1\archive_logOldest online log sequence 30Next log sequence to archive 32Current log sequence 32 实际上从Oracle 10g开始,可以生成多份一样的日志,保存多个位置,以防不测,方法如下:SQL>alter system set log_archive_dest_2='location=oracle\log2\archive_log';SQL> archive log list;Database log mode Archive ModeAutomatic archival EnabledArchive destination oracle\log1\archive_logOldest online log sequence 30 Next log sequence to archive 32 Current log sequence 32 2.4 修改日志文件命名格式://设置归档进程数SQL> alter system set log_archive_max_processes = 5;归档日志的名字受log_archive_format参数限制,可以通过下面的命令查看。SQL> show parameter log_archive_formatNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_format string %t_%s_%r.dbfSQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile; 2.5归档当前重做日志重做归档alter system archive log current;查看归档日志select name from v$archived_log;SQL> select name from v$archived_log;NAME--------------------------------------------------------------------------------/oracle/archivelog1/archive_log1_5_927044427.dbf注:< alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开,就不归档当前重做日志。) alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。 主要的区别在于: alter system switch logfile 对单实例数据库或RAC中的当前实例执行日志切换; alter system archive log current 会对数据库中的所有实例执行日志切换。> 2.6重启数据库shutdown immediate;startup SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /opt/app/oracle/archivelog2/archive_log Oldest online log sequence 9 Next log sequence to archive 11 Current log sequence 11已开启归档 三.修改为非归档模式 3.1以 mount状态启动数据库SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 1603411968 bytesFixed Size 2213776 bytesVariable Size 973080688 bytesDatabase Buffers 620756992 bytesRedo Buffers 7360512 bytesDatabase mounted. 3.2 归档当前重做日志 alter system archive log current; 3.3 以 mount状态启动数据库 3.4 更改归档模式为非归档模式SQL> alter database noarchivelog;Database altered.SQL> alter database open;Database altered.SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination /oracle/archivelog2/archive_logOldest online log sequence 9Current log sequence 11 四. 归档日志检查 4.1 首先看archiv log所在位置 很有可能,归档日志存放位置不在 闪回恢复区SQL> show parameter log_archive_dest;会看到类似下面的结果NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string log_archive_dest_10 string这时候如果value是空的,可以尝试SQL> archive log list; 如果已开启归档,则在Value列,可以看到日志路径,不过可能有多个日志副本,请注意NAME TYPE VALUE------------------------------------ ----------- ------------------------------log_archive_dest stringlog_archive_dest_1 string location=/oracle/archivelog1/archive_logNAME TYPE VALUE------------------------------------ ----------- ------------------------------log_archive_dest_2 string location=/oracle/archivelog2/archive_log 4.2 使用情况 -----这里可以看到闪回恢复区里的空间使用情况:SQL> select * From v$flash_recovery_area_usage;FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES ------------ ------------------ ------------------------- --------------- CONTROLFILE .13 0 1 ONLINELOG 2.93 0 3 ARCHIVELOG 99.72 0 122 BACKUPPIECE 0 0 0 IMAGECOPY 0 0 0 FLASHBACKLOG 0 0 0 这里只是个案例,假如快满了,使用了超过99%的日志空间 ------注意这一步才是真正查看归档空间的实际使用情况 --本人没有测试过,后续再验证,参考原文中是这么说的SQL> select * from v$recovery_file_dest;NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES----------- ---------- ----------------- ---- --------------- -------------------/oracle/flash_recovery_area 2147483648 1804771840 0 51 五. 已满处理 archive log空间满可能会导致不能远程登录,因此ssh到服务器后,使用sqlplus sys/pass as sysdba登陆oracle。 这里使用ORACLE自带的备份恢复工具RMAN 5.1 设置环境变量 ORACLE_SID 使用RMAN连接本地数据库之前必须首先设置操作系统环境变量:ORACLE_SID,并指定该值等于目标数据库的实例名。如果本地库只有一个实例并已经设置了ORACLE_SID环境变量,则不需要再指定ORACLE_SID。RMAN会自动连接到默认实例。 SET ORACLE_SID =jssbook 5.2 启动RMAN连接数据库 如果连接本地数据库,则使用RMAN TARGET /登录管理员账户 如果远程连接,则使用RMAN TARGET SYS/CHANGE_ON_INSTALL@TESTDB,例如:RMAN TARGET SYS/sysadmin@orcl 必须在建立连接时指定一个有效的网络服务名(Net Service Name),本地的tnsname.ora文件中必须已经建立了该网络服务名的正确配置 5.3 查看归档日志状态 $ rman target /Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 7 17:26:27 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.connected to target database: jssbook(DBID=1314906249)RMAN> list archivelog all;using target database control file instead of recovery catalogList of Archived Log Copies for database with db_unique_name WETALK=====================================================================Key Thrd Seq S Low Time ------- ---- ------- - ---------1 1 5 A 04-NOV-16 Name: /oracle/archivelog1/archive_log1_5_927044427.dbf2 1 5 A 04-NOV-16 Name: /oracle/archivelog2/archive_log1_5_927044427.dbf 5.3 手动删除归档日志 方法一: 先删除物理的归档日志,然后执行下列命令RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';说明: SYSDATA-7,表明当前的系统时间7天前,before关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。 同样道理,也可以删除从7天前到现在的全部日志,不过这个命令要考虑清楚,做完这个删除,最好马上进行全备份数据库 DELETE ARCHIVELOG from TIME 'SYSDATE-7'; 删除从7天前到现在的全部日志,慎用 方法二: UNIX/LINUX下也可以通过FIND找到7天前的归档数据,使用EXEC子操作删除 find /oracle/oraarchive -xdev -mtime +7 -name "*.dbf" -exec rm -f {} ; 或find /mnt/oradb/archivelog -type f -mtime +1 -exec rm {} \;这样做仍然会在RMAN里留下未管理的归档文件 仍需要在RMAN里执行下面2条命令 crosscheck archivelog all; delete expired archivelog all; 最后再输入一次crosscheck archivelog all;就行了 【参考原文】http://blog.itpub.net/26508908/viewspace-1663566/【参考原文】http://www.linuxidc.com/Linux/2014-02/96188.htm【参考原文】http://blog.itpub.net/14293828/viewspace-1425794/