归档开启情况判断
通用方法:
1
SQL> SELECT log_mode from v$database;
sys用户:
1
SQL> archive log list;
如何开启日志归档
启用归档日志前要先停止数据库
1
SQL> shutdown immediate;
开启数据库至mount状态(打开控制文件,不打开数据文件)
1
SQL> startup mount;
改变日志模式
启用数据库归档
1
SQL> alter database archivelog;
关闭归档
1
SQL> alter database noarchivelog;
打开数据库(将数据文件打开)
1
SQL> alter database open;
验证当前日志模式
1
SQL> archive log list;
归档启动后的设置
归档进程设置:
查看
1
2
3SQL> show parameter log_archive_max_processes;
NAME TYPE VALUE
log_archive_max_processes integer 4修改:
1
2SQL> alter system set log_archive_max_processes=5;
System altered
归档占用情况判断
查看闪回空间已经占用情况
1
2# 如果空间使用率99%以上,证明归档空间已经满了,需要清理。
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;查看归档日志文件数量
1
SQL> select * from v$recovery_file_dest;
当出现ORA-00257: archiver error. Connect internal only, until freed错误连不上数据库时,如果数据库归档目标为USE_DB_RECOVERY_FILE_DEST且DB_RECOVERY_FILE_DEST目录为默认闪回空间目录时。
归档高占用处理方法
归档路径设置
单一归档路径
如果使用db_recovery_file_dest参数设置单一的归档目录,默认使用Fast Recovery Area闪回恢复区存放归档数据。
需要注意该区域有大小限制,建议将大小调大:
1
SQL> alter system set db_recovery_file_dest_size=8G scope=both;
修改闪回恢复区路径:
1
SQL> alter system set db_recovery_file_dest='location=C:\app\Administrator\oracle_log' scope=both;
查看闪回归档存储路径:
1
SQL> show parameter db_recovery_file_dest;
也可手工配置log_archive_dest初始化参数,使用本地路径存放归档日志,这里给出的是本地文件系统例子,可自行测试ASM磁盘组。
1
2
3
4
5# 需要将DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST_n参数置空参数置空
SQL> alter system set db_recovery_file_dest='';
SQL> alter system set log_archive_dest_1 ='';
# 然后设置log_archive_dest参数
SQL> alter system set log_archive_dest ="C:\log";
两路归档路径
配置log_archive_dest和log_archive_duplex_dest参数。
1 | # 设置log_archive_duplex_dest参数路径 |
查看新生成的归档日志文件,可以看到新生成的归档大小和文件名一致。两份归档日志互为冗余。
多路归档路径
使用log_archive_dest_n参数,其中,n的取值为1到31的整数,也就是说,可以指定1到31个独立的路径作为归档日志的路径。
log_archive_dest_n参数的取值可以选择LOCATION或SERVIDE关键字:
- 如果使用LOCATION关键字,可以选择本地文件系统、ASM磁盘组或USE_DB_RECOVERY_FILE_DEST代表的闪回恢复区;(在使用Fast Recovery Area归档的情况下,LOG_ARCHIVE_DEST_1的默认值为USE_DB_RECOVERY_FILE_DEST。)
- 如果使用SERVICE关键字,可以选择备库的网络连接标识符连接备份数据库。
需要将LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST参数置空:
1
2SQL> alter system set log_archive_duplex_dest='';
SQL> alter system set log_archive_dest='';修改多路归档日志路径:
1
2
3SQL> alter system set log_archive_dest_1='location=C:\log\arch1' scope=spfile;
SQL> alter system set log_archive_dest_2='location=C:\log\arch2' scope=spfile;
SQL> alter system set log_archive_dest_3='location=C:\log\arch3' scope=spfile;查看归档文件目录:
1
SQL> show parameter LOG_ARCHIVE_DEST_;
再次查看:
1
2
3
4
5
6
7SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 C:\orclBackUp\archive01
最早的联机日志序列 18
下一个存档日志序列 20
当前日志序列 20通过切换日志,查看归档路径下是否有归档日志产生来验证归档路径设置是否正确,切换日志命令如下
1
SQL> alter system switch logfile;
查看新生成的归档日志文件,显然新生成的归档大小和文件名一致。两份归档日志互为冗余。
归档路径参数区别
- DB_RECOVERY_FILE_DEST:闪回恢复区路径
- LOG_ARCHIVE_DEST:指定归档文件存放的路径,该路径只能是本地磁盘,默认为’’。
- LOG_ARCHIVE_DEST_n:指定归档文件存放的路径,Oracle最多支持把日志文件归档到31个地方,n从1到31。归档地址可以为本地磁盘,或者网络设备。
三个参数区别如下:
如果设置了DB_RECOVERY_FILE_DEST,就不能设置LOG_ARCHIVE_DEST,默认的归档日志存放于DB_RECOVERY_FILE_DEST指定的闪回恢复区中。
可以设置LOG_ARCHIVE_DEST_n,如果这样,那么归档日志不再存放于DB_RECOVERY_FILE_DEST中,而是存放于LOG_ARCHIVE_DEST_n设置的目录中。
如果想要归档日志继续存放在DB_RECOVERY_FILE_DEST中,可以通过如下命令:alter system set log_archive_dest_1=’location=USE_DB_RECOVERY_FILE_DEST’。
如果设置了LOG_ARCHIVE_DEST,就不能设置LOG_ARCHIVE_DEST_n和DB_RECOVERY_FILE_DEST。
如果设置了LOG_ARCHIVE_DEST_n,就不能设置LOG_ARCHIVE_DEST。
也就是说,LOG_ARCHIVE_DEST参数和DB_RECOVERY_FILE_DEST、LOG_ARCHIVE_DEST_n都不共存。而DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST_n可以共存。
LOG_ARCHIVE_DEST只能与LOG_ARCHIVE_DUPLEX_DEST共存。这样可以设置两个归档路径。LOG_ARCHIVE_DEST设置一个主归档路径,LOG_ARCHIVE_DUPLEX_DEST设置一个从归档路径。所有归档路径必须是本地的。
如果LOG_ARCHIVE_DEST_n设置的路径不正确,那么Oracle会在设置的上一级目录归档。比如设置LOG_ARCHIVE_DEST_1=’location=C:\archive1’,而OS中并没有archive1这个目录,那么Oracle会在C盘归档。
归档日志清理
cmd进入oracle的rman模式:
1
RMAN> rman target /
显示所有的日志及日志地址
1
RMAN> list archivelog all;
可以把无效的expired的archivelog标出来
1
RMAN> crosscheck archivelog all;
删除所有的无效日志
1
RMAN> delete expired archivelog all;
使用删除语句进行删除:
1
2
3# 其中sysdate-7代表保留近七天的归档日志。
# 如需保留近十天的,则需将sysdate-7修改为sysdate-10即可。
RMAN> delete archivelog until time 'sysdate-7';显示所有的日志及日志地址
1
RMAN> list archivelog all;
查看归档日志文件
1
2
3SQL> select name from v$archived_log;
或:
SQL> select substr(t.NAME,1) NAME,ROUND(sum(t.BLOCKS*t.BLOCK_SIZE)/1024/1024) TOTAL_MB from v$archived_log t where t.DELETED='NO' group by substr(t.NAME,1);
归档日志清理脚本
clear.bat
1 | rman target / @"D:\PMSALEX\clear.txt" |
clear.txt
1 | delete archivelog until time 'sysdate-10'; |