oracle归档日志相关常用操作

归档位置

归档目标位置相关初始化参数

方法 初始化参数 Host 示例
1 LOG_ARCHIVE_DEST_n
n取值1-31
1-10local or remote locations可用,
11-31仅用于remote locations
local or remote LOG_ARCHIVE_DEST_1 = 'LOCATION=/path1/arc'

LOG_ARCHIVE_DEST_2 = 'LOCATION=/path2/arc'

LOG_ARCHIVE_DEST_3 = 'SERVICE=standby1'
2 LOG_ARCHIVE_DEST and
LOG_ARCHIVE_DUPLEX_DEST
local only LOG_ARCHIVE_DEST = '/path1/arc'

LOG_ARCHIVE_DUPLEX_DEST = '/path2/arc'

归档目标位置优先级

Oracle建议使用==快速恢复区==(db_recovery_file_dest)作为归档日志文件的存放位置,因为归档日志可由数据库自动管理。

在快速恢复区中的归档日志的文件名为OMF,不由LOG_ARCHIVE_FORMAT参数决定。无论使用何种归档方案,始终建议在多个位置保存归档日志的多个副本。

有以下归档重做日志的基本选项,从最推荐到最不推荐列出:

  1. 启用归档到快速恢复区,并使用磁盘镜像来保护归档重做日志所需的冗余性。

    如果制定了DB_RECOVERY_FILE_DEST,并且没有指定LOG_ARCHIVE_DEST_n,则LOG_ARCHIVE_DEST_10隐式设置为恢复区。可通过将LOG_ARCHIVE_DEST_10设置为空字符串来覆盖此行为。

  2. 启用归档到快速恢复区,并将LOG_ARCHIVE_DEST_n设置为快速恢复区以外的位置。

    如果配置了快速恢复区,则可通过将任何LOG_ARCHIVE_DEST_n参数设置为LOCATION=USE_DB_RECOVERY_FILE_DEST以便明确将快速恢复区作为归档目的地。

  3. 仅将重做日志归档到LOG_ARCHIVE_DEST_n指定的,非快速恢复区位置。

如果使用了快速恢复区,则不能使用LOG_ARCHIVE_DESTLOG_ARCHIVE_DUPLEX_DEST参数,使用其中任何一个参数都会阻止实例启动。只有LOG_ARCHIVE_DEST_n参数可以和快速恢复区同时使用。

注意,如果启用归档,但并没有为LOG_ARCHIVE_DESTLOG_ARCHIVE_DEST_nDB_RECOVERY_FILE_DEST设置任何值,则重做日志将归档到特定于平台的默认位置。对于Linux为?/dbs,对于Windows为?/database

仅归档到一个目标位置:

  • 使用LOG_ARCHIVE_DEST参数指定归档的目标位置

归档到多个目标位置:

  • 使用 LOG_ARCHIVE_DEST_n 初始化参数选择存档到两个或更多位置,或者使用 LOG_ARCHIVE_DESTLOG_ARCHIVE_DUPLEX_DEST 初始化参数仅归档到主要和次要目的地。

对于==本地目标==,除了本地文件系统或 Oracle ASM 磁盘组之外,您还可以归档到快速恢复区。 数据库使用Fast Recovery Area来存储和自动管理与备份和恢复相关的各种文件的磁盘空间。

通常,您在数据库规划期间确定归档日志目的地,并在数据库安装期间设置归档目的地的初始化参数。 但是,您可以在数据库运行后使用 ALTER SYSTEM 命令动态添加或更改归档目标。 您==所做的任何目标更改都会在下一次日志切换(自动或手动)时生效==。

必须成功归档的最少位置

可选的初始化参数 LOG_ARCHIVE_MIN_SUCCEED_DEST=n 决定了数据库在重用联机日志文件之前必须成功将重做日志组归档到的最小目的地数。 默认值为 1。如果使用双工,则 n 的有效值为 1 到 2;如果使用多路复用,n 的有效值为 1 到 31。

自定义归档位置

1
2
3
4
5
6
7
-- oracle 用户下执行
mkdir -p /u01/app/oracle/arc
shutdown immediate
startup mount
alter database archivelog;
alter system set log_archive_dest_1='location=/u01/app/oracle/arc';
alter database open;

归档模式查询

1
2
3
4
5
6
7
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/19.3.0/dbhome_1/dbs/arch
Oldest online log sequence 289
Current log sequence 291
SQL>

快速恢复区域空间使用情况查询

1
2
3
4
5
6
7
8
9
10
11
SQL> select file_type,percent_space_used from v$flash_recovery_area_usage;

FILE_TYPE PERCENT_SPACE_USED
-------------------- ------------------
CONTROL FILE 0
REDO LOG 0
ARCHIVED LOG 99.99
BACKUP PIECE 0
IMAGE COPY 0
FLASHBACK LOG 0
FOREIGN ARCHIVED LOG 0

查询归档日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SQL>  SELECT NAME,SEQUENCE#,DELETED FROM V$ARCHIVED_LOG WHERE SEQUENCE# = 90041;

NAME SEQUENCE# DEL
-------------------- ---------- ---
90041 YES

-- 查询当前已经产生的归档日志
>SELECT name,sequence# seq#,status,completion_time FROM v$archived_log;

-- 通过sequence#过滤归档日志
>SELECT name,sequence# seq#,status,completion_time FROM v$archived_log where sequence#>=28;

-- 查询归档日志中是否包含特定的记录(是否包含robinson字符串)
>ho strings /u02/DB/oradb/arch/2013_07_05/o1_mf_1_29_8xdbnqx9_.arc | grep "Robinson"
Robinson

dg备库中的归档日志

实时应用模式,是将主库中的REDOLOG传送到备库中的Stdlog中,然后备库从Stdlog中应用数据。其他情况则是将主库中的归档日志复制到备库中的归档日志,然后备库从备库中的归档日志中应用数据。

关于归档日志的自动删除策略的详细信息,参见[[归档日志自动删除策略.sql]]

查询备库中存储的归档日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
-- 查询本地归档目标位置
SQL> col DEST_NAME for a20
SQL> col DESTINATION for a30
SQL> select DEST_NAME,DESTINATION from v$archive_dest where dest_id=1;

DEST_NAME DESTINATION
-------------------- ------------------------------
LOG_ARCHIVE_DEST_1 USE_DB_RECOVERY_FILE_DEST
SQL> select DEST_NAME,DESTINATION from v$archive_dest where dest_id=2;

DEST_NAME DESTINATION
-------------------- ------------------------------
LOG_ARCHIVE_DEST_2 orcl_primary

-- 查询目标位置存储的尚未被删除的归档日志的数量
SQL> select count(1) from v$archived_log where dest_id=1 and deleted='NO';

COUNT(1)
----------
486

-- 查询备库接收到的最新归档seq
-- 即,你要么在主库中查询dest_id=2,要么在备库中查询dest_id=1
SQL> select max(sequence#) from v$archived_log where dest_id=1 and applied='YES';

MAX(SEQUENCE#)
--------------
118383

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 118380
Next log sequence to archive 0
Current log sequence 118385 -- 备库中的这个仅表示备库归档日志当前seq,并非应用的seq
-- 查询备库归档日志中的最高SEQ
SQL> select max(sequence#) from v$archived_log where dest_id=1;

MAX(SEQUENCE#)
--------------
118384

SQL>

-- dg备库归档最新应用位置
V$ARCHIVED_LOG.APPLIED
SELECT PROCESS,CLIENT_PROCESS,SEQUENCE#,STATUS FROM V$MANAGED_STANDBY;

查询哪些归档日志已经应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
-- 在主库或备库查询哪些归档日志已经应用到备库,这些日志可以被删除了
SELECT THREAD#,
NAME,
SEQUENCE#,
ARCHIVED,
APPLIED,
A.NEXT_CHANGE#,
A.COMPLETION_TIME,
'delete archivelog sequence ' || A.SEQUENCE# || ' thread ' ||
A.THREAD# || ';' EXEC_SQL
FROM V$ARCHIVED_LOG A
WHERE (A.THREAD#, A.SEQUENCE#, a.RESETLOGS_CHANGE#) IN
(SELECT b.THREAD#,
b.SEQUENCE#,
b.RESETLOGS_CHANGE#
FROM V$ARCHIVED_LOG B
WHERE B.APPLIED = 'YES'
AND b.COMPLETION_TIME <= SYSDATE - 3)
AND a.NAME NOT IN (SELECT b.DESTINATION
FROM v$archive_dest b
WHERE b.DESTINATION IS NOT NULL)
AND A.COMPLETION_TIME <= SYSDATE - 3
ORDER BY A.THREAD#,
A.SEQUENCE#;

-- 在备库查询归档日志的应用情况
COL NAME FOR A100
SET LINESIZE 9999 PAGESIZE 9999
COL NEXT_CHANGE# FOR 999999999999999
SELECT THREAD#, NAME, SEQUENCE#, ARCHIVED, APPLIED, A.NEXT_CHANGE#
FROM V$ARCHIVED_LOG A
WHERE A.SEQUENCE# >= (SELECT MAX(B.SEQUENCE#) - 3
FROM V$ARCHIVED_LOG B
WHERE B.THREAD# = A.THREAD#
AND B.RESETLOGS_CHANGE# = A.RESETLOGS_CHANGE#
AND B.RESETLOGS_CHANGE# =
(SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)
AND B.APPLIED = 'YES'
GROUP BY B.THREAD#)
ORDER BY A.THREAD#, A.SEQUENCE#;

THREAD# NAME SEQUENCE# ARC APPLIED NEXT_CHANGE#
---------- ---------------------------------------------------------------------------------------------------- ---------- --- --------- ----------------
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199063_m6wjmz9l_.arc 199063 YES YES 52002672778
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199064_m6wjn18d_.arc 199064 YES YES 52002704492
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199065_m6wjn18p_.arc 199065 YES YES 52002716500
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199066_m6wjn69n_.arc 199066 YES YES 52002726288
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199067_m6wjndh3_.arc 199067 YES IN-MEMORY 52002764556
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199068_m6wjnh8w_.arc 199068 YES NO 52002765047
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199069_m6wjnsjk_.arc 199069 YES NO 52002804503
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199070_m6wjnsx8_.arc 199070 YES NO 52002826462
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199071_m6wjny1l_.arc 199071 YES NO 52002837499
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199072_m6wjnyyt_.arc 199072 YES NO 52002895560
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199073_m6wjnyz3_.arc 199073 YES NO 52002896093
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199074_m6wjobcc_.arc 199074 YES NO 52002921653
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199075_m6wjpndy_.arc 199075 YES NO 52002954282
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199076_m6wjpnpo_.arc 199076 YES NO 52002954880
1 /u01/app/oracle/fast_recovery_area/ORCL_STANDBY/archivelog/2024_06_16/o1_mf_1_199077_m6wjpnq4_.arc 199077 YES NO 52002996212

RMAN中查询归档日志

1
2
3
4
5
-- 切换日志
alter system switch logfile;

-- 查询已归档的日志(非备份的归档日志)
list archivelog all;

启用禁用归档模式

启用归档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 1.快速恢复区域相关设置
-- 如果配置了快速恢复区域,则默认归档日志存储在此区域中。
show parameter db_recovery_dest;

-- 2.如果要自定义归档位置,则配置以下参数:
alter system set db_recovery_dest='';
alter system set log_archive_dest='/path/arch1';

-- 3.修改归档日志文件的文件名称格式
alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;

-- 4.启用归档
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

禁用归档

1
2
3
4
shutdown immediate;
startup mount;
alter database noarchivelog;
alter database open;

手动归档

使用以下语句手动归档已填充的重做日志文件。例如,以下语句归档所有尚未归档的重做日志文件:

1
ALTER SYSTEM ARCHIVE LOG ALL;

当您使用手动归档模式时,您不能在归档目标中指定任何备用数据库。

即使启用了自动归档,您也可以使用手动归档来执行诸如将已填充的重做日志成员的非活动组重新归档到另一个位置等操作。 在这种情况下,实例有可能在您完成手动归档之前重用重做日志组,从而覆盖文件。 如果发生这种情况,数据库会将错误消息写入警报日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 74062 YES INACTIVE
2 74063 NO CURRENT
3 74061 YES INACTIVE

SQL> alter system archive log all;
alter system archive log all

ORA-00271: there are no logs that need archiving

SQL> alter system archive log all;
alter system archive log all

ORA-00271: there are no logs that need archiving

SQL> select group#,sequence#,archived,status from v$log;

GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 74062 YES INACTIVE
2 74063 NO CURRENT
3 74061 YES INACTIVE

删除归档日志

删除归档日志的备份

1
2
3
4
-- 删除归档日志的备份
delete noprompt backup of archivelog all; -- 删除归档日志的备份
delete noprompt expired backup of archivelog all;
delete noprompt backup of archivelog all completed befor 'sysdate -14';

删除归档日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- 关于sysdate
SYSDATE-7 -- 表明当前的系统时间 7天前
before 关键字表示在7天前的归档日志,如果使用了闪回功能,也会删除闪回的数据。

-- RMAN中查询已归档的日志
list archivelog all;

-- 删除无效的归档日志记录
CROSSCHECK ARCHIVELOG ALL;
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;

-- 删除所有归档日志
delete noprompt archivelog all;
delete noprompt archivelog all completed before 'sysdate';
-- 强制删除所有归档日志
delete noprompt force archivelog all;

-- 依据RMAN备份保留策略删除
report obsolete;
delete obsolete; -- 这个是清理过期备份,它也会删除过期的归档日志。但是特殊情况下,除闪回区有效的归档日志不会删除。

-- 删除已经备份指定次数,到指定设备的归档日志
delete noprompt archivelog all [until time 'sysdate - 0.3'] backed up 1 times to {disk|sbt};

-- 删除dg主库中的归档日志
-- 主库RMAN自动删除策略如下
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
-- 删除归档日志,此时自动删除已经被应用的日志,尚未应用的日志无法删除
delete noprompt archivelog all;
-- 经测试发现,ADG模式下,dg备库可以直接delete noprompt archivelog all; 并不会请删除尚未应用的已接收到的日志

-- 参照当前时间来删除归档日志
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE -7'; -- 删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE -1'; -- 1天以前的
delete noprompt archivelog all completed before 'sysdate'; -- 该命令清除所有的归档日志
delete noprompt archivelog until time 'SYSDATE-7';
DELETE ARCHIVELOG ALL FROM TIME 'SYSDATE-7'; -- 删除最近7天的归档日志
-- 删除某个时间段的归档日志,例如删除20天前到2天前的归档日志。
delete archivelog from time 'sysdate-20' until time 'sysdate-2'; -- 此命令会删除闪回区的有效归档日志。

-- 删除指定sequence之前的归档日志
DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE 200; -- 删除200以及200之前的所有归档日志

备份归档日志

  • 备份归档日志时仅仅备份归档过的日志文件(不备份联机重做日志文件)
  • 备份归档日志时总是对归档日志做完整备份
  • RMAN对归档日志进行备份前,会自动做一次日志切换,且从一组归档日志中备份未损坏的归档日志
  • RMAN会自动判断哪些归档日志需要进行备份
  • 归档日志的备份集不能包含其它类型的文件

单独备份归档日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
RMAN> backup
2> format '/u01/app/oracle/rmanbak/lf_%d_%U'
3> archivelog all delete input; -- delete input 删除所有已经备份过的归档日志

RMAN> backup -- 此种写法实现了上述相同的功能
2> archivelog all delete input
3> format '/u01/app/oracle/rmanbak/lf_%d_%U';

-- 在Oracle数据库备份归档日志时,通常会保存最近几天的归档日志文件不删除。例如:
backup archivelog all;
delete noprompt archivelog all completed before 'sysdate-2'; -- 删除两天前的日志
-- 再备份时,归档会重复再备份一次。
-- 加上一个子句 not backed up 1 times,就可以实现不备份已经归档的日志。命令如下:
backup archivelog all not backed up 1 times;  -- 不备份上次已经备份的归档
backup archivelog all not backed up 2 times;  -- 归档备份过两次的 第三次是不进行备份的

plus archivelog
使用plus archivelog时备份数据库完成的动作(backup database plus archivelog)

  1. 首先执行alter system archive log current 命令(对当前日志归档)
  2. 执行backup archivelog all 命令(对所有归档日志进行备份)
  3. 执行backup database命令中指定的数据文件、表空间等
  4. 再次执行alter system archive log current
  5. 备份在备份操作期间产生的新的归档日志

执行下面的命令,并观察备份列出的信息,可以看到使用plus archivelog时使用了上面描述的步骤来进行备份

1
2
RMAN> backup database plus archivelog
2> format '/u01/app/oracle/rmanbak/lg_%d_%U' delete input;