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