Oracle归档日志

Oracle归档日志

归档日志是用来将redo log里面的日志永久保存下来所使用的日志,我们知道redo log 是循环使用的,新的redo log将覆盖原来的日志,这样的话,如果数据库数据文件损坏,将丢失数据,我们可以用备份来进行恢复,但是利用备份不可能完全恢复,还需要使用日志来恢复到数据库崩溃的那个时间点。

查看归档日志模式

SQL> select log_mode from v$database;

LOG_MODE
------------
NOARCHIVELOG

查看归档是否启动

SQL> select archiver from v$instance;

ARCHIVE
-------
STOPPED

查看是不是归档方式及归档的路径

SQL> archive log list;
Database log mode           No Archive Mode
Automatic archival          Disabled
Archive destination         USE_DB_RECOVERY_FILE_DEST   ##这里默认使用闪回区作为归档日志的存放目录,存放归档日志格式为xxxx.arc
Oldest online log sequence     17
Current log sequence        19

打开归档日志

sqlplus / as  sysdba
sql> shutdown immediate;    
sql> startup mount;               #打开控制文件,不打开数据文件  
sql> alter database archivelog;   #将数据库切换为归档模式  
sql> alter database open;         #将数据文件打开

SQL> archive log list;
Database log mode           Archive Mode
Automatic archival          Enabled
Archive destination         USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     17
Next log sequence to archive   19
Current log sequence        19

禁用归档日志

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;
Database log mode           No Archive Mode
Automatic archival          Disabled
Archive destination         USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     17
Current log sequence        19

根据上面的USE_DB_RECOVERY_FILE_DEST,来查找DB_RECOVERY_FILE_DEST

SQL> show parameter DB_RECOVERY_FILE_DEST;

NAME                      TYPE   VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest           string      /oracle/11g/flash_recovery_are
                                 a
db_recovery_file_dest_size      big integer 3882M

修改归档日志的路径

归档日志默认使用闪回区来存储归档日志,如上所示,可以修改使用其他路径;
查看归档日志路径,可以使用31个路径存放归档日志,我们通常只需要1个存储就行了,没必要搞很多,且开启多份归档需要消耗一部分性能。

SQL> show parameter log_archive_dest_;

NAME                      TYPE   VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1              string
......
log_archive_dest_31             string
sql> archive log list;  #查看是不是归档方式  
sql> alter system set log_archive_start=true scope=both; #启用自动归档  

sql> alter system set log_archive_dest_1="location=/oracle/11g/arch/orcl/arch01" scope=both;  
sql> alter system set log_archive_dest_2="location=/oracle/11g/arch/orcl/arch02" scope=both; 

#如果归档到两个位置,则可以通过上边方法实现,归档日志存放格式为xxxx.dbf

设置归档日记格式

sql> alter system set log_archive_format=''arch_%d_%t_%r_%s.log''

切换日志组

sql> alter system switch logfile;

SQL> alter system archive log current;

这次日志切换将归档写到两个目标地, 即上边的/oracle/11g/arch/orcl/arch0n
alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开,就不归档当前重做日志。)
alter system archive log current 是归档当前的重做日志文件,不管自动归档有没有打都归档。

主要的区别在于:
ALTER SYSTEM SWITCH LOGFILE对单实例数据库或RAC中的当前实例执行日志切换;
而ALTER SYSTEM ARCHIVE LOG CURRENT会对数据库中的所有实例执行日志切换。
为什么执行热备后要执行alter system archive log current 这个语句,看到很多脚本都是这样写的。
是不是必须的?

一般的RMAN脚本都是这样写的,因为RMAN是可以备份归档日志的。alter system archive log current 这样后就可以将所有的归档都备份出来了。这样做是为了保证数据的完整和一致。

查看现在归档日志的大小

select sum(a.BLOCK_SIZE*a.BLOCKS)/1024/1024 from v$archived_log a where a.DELETED='NO';

查看归档日志最大大小

show parameter db_recovery_file_dest_size;

设置归档日志最大值,处理归档日志满,无法启动

startup nomount;
alter system set db_recovery_file_dest_size = 4G;
alter database mount;
alter database on;

查看归档日志的使用率

select PERCENT_SPACE_USED from V$FLASH_RECOVERY_AREA_USAGE where file_type LIKE 'ARCHIVED LOG';

获取闪回区的使用率

select sum(PERCENT_SPACE_USED )  from V$RECOVERY_AREA_USAGE;

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com