Oracle 归档日志简介

一、Oracle 归档日志的作用

归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。

二、归档模式和非归档模式的优缺点

(一)归档模式的优点

  1. 可以进行完全、不完全恢复:由于对数据库所做的全部改动都记录在日志文件中,如果发生硬盘故 障等导致数据文件丢失的话,则可以利用物理备份和归档日志完全恢复数据库,不会丢失任何数据;
  2. 可以进行联机热备:所谓联机热备,就是在数据库运行状态下,对数据库进行备份。备份时用户对 数据库的使用不受任何影响;
  3. 可以实施 Data Guard:可以部署 1 个或多个备用数据库,从而最大限度地提供灾难保护手段;
  4. 可以实施 Stream:利用 Stream 技术,可以实现最简单的单向复制到复杂的双向复制、多向复制, 提供更加灵活的数据冗余方案;
  5. 表空间可以脱机:可以备份部分数据库,比如重要的表空间;
  6. 能够增量备份:只需做一次完全备份,以后只备份发生改变的数据,可以提高备份速度;
  7. 更多的优化选项:随着 Oracle 版本升级,在联机热备方面不断有新的优化策略出现。

(二)归档模式的缺点

  1. 需要更多的磁盘空间保存归档日志;
  2. DBA 会有更多的管理工作,包括维护归档空间、备份归档日志。

(三)非归档模式的缺点

  1. 只能进行脱机备份,也就是所谓的「 冷备份」,和联机备份的「 热备份」 相对应,数据库必须完全 关闭后备份,在备份过程中数据库不可用;
  2. 必须备份整个数据库,不能只备份部分数据库;
  3. 不能增量备份,对于 TB 级数据库(VLDB) ,这是一个非常大的缺点;
  4. 只能部分恢复,如果数据文件丢失需要恢复,DBA 只能恢复最后一次的完全备份,而之后的所有 数据库改变全部丢失。

(四)非归档模式的优点

  1. DBA 的管理工作减少,因为非归档模式不产生归档日志,因此 DBA 不用考虑对归档的管理;
  2. 性能会有提升。

三、如何开启归档日志

(一)查看是否开启归档

oracle@frontend01.oracle:/u01/oracle>sqlplus / as sysdba;

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 22 15:51:09 2022

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oracle_11/app/oracle/oradata/arch
Oldest online log sequence     112619
Next log sequence to archive   112621
Current log sequence           112621
SQL> 

Automatic archivalEnabled 则为开启,Disable 则为未开启。

(二)开启归档日志

如果数据库未开启归档日志,可通过如下操作开启归档日志(需要重启数据库,谨慎操作!)

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>  startup mount;
ORACLE instance started.

Total System Global Area 2421825536 bytes
Fixed Size                  2255632 bytes
Variable Size             620758256 bytes
Database Buffers         1778384896 bytes
Redo Buffers               20426752 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

四、清理归档日志

(一)错误代码:ORA-00257

开启归档日志后,如果未做好磁盘空间监控,大概率会出现 ORA-00257 错误,官方解释如下:

oracle@frontend01.oracle:/u01/oracle>oerr ORA 00257
00257, 00000, "archiver error. Connect internal only, until freed."
// *Cause:  The archiver process received an error while trying to archive
//       a redo log.  If the problem is not resolved soon, the database
//       will stop executing transactions. The most likely cause of this
//       message is the destination device is out of space to store the
//       redo log file.
// *Action:  Check archiver trace file for a detailed description
//        of the problem. Also verify that the
//       device specified in the initialization parameter
//       ARCHIVE_LOG_DEST is set up properly for archiving.
oracle@frontend01.oracle:/u01/oracle>

也就是说当空间问题导致归档日志无法继续写入的时候会报错误,当前也只能允许内部链接。这种情况下也只能最快速的清理归档日志。 不建议直接删除 arch 目录下的归档日志文件,这将会导致 rman 备份会检测到日志缺失,从而无法进一步继续执行。如果不小心删除,需进入 rman,手动执行 crosscheck archivelog all 校验日志有效性(如果空间不足连 rman 都无法进入,可使用此方式)。

(二)手动清理归档日志

oracle@frontend01.oracle:/u01/oracle>rman target /;

Recovery Manager: Release 11.2.0.1.0 - Production on Thu Sep 22 15:11:46 2022

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1514519298)

RMAN> crosscheck archivelog all;  --->校验日志的可用性
RMAN> delete noprompt archivelog all completed before 'sysdate-3';  --->删除当前时间-3天的归档日志(保留3天日志)
RMAN> delete expired archivelog all;   --->删除所有过期或无效的归档日志

# 以下是几种常用的命令:
delete noprompt archivelog until time "to_date('XXXX-XX-XX','YYYY-MM-DD')";    ---> 清理到某天日期之前的归档
delete noprompt archivelog until time "to_date('2016-09-14 18:00:00','YYYY-MM-DD hh24:mi:ss')";   ---> 清理到具体时分秒之前的归档日志
crosscheck archivelog all;                           --->校验日志的可用性
list expired archivelog all;                         --->列出所有失效的归档日志
delete archivelog until sequence 16;                 --->删除log sequence为16及16之前的所有归档日志
delete archivelog all completed before 'sysdate-7';   --->删除系统时间7天以前的归档日志,不会删除闪回区有效的归档日志
delete archivelog all completed before 'sysdate-1'; --->同上,1天以前的
delete archivelog from time 'sysdate-1';             --->注意这个命令,删除系统时间1天以内到现在的归档日志
delete noprompt archivelog all completed before 'sysdate';  --->该命令清除当前所有的归档日志
delete noprompt archivelog all completed before 'sysdate-0';  --->该命令清除当前所有的归档日志
delete noprompt archivelog all;              --->同上一命令
delete force archivelog all completed before 'sysdate-1/24';      --->清理一个小时前的归档日志

(三)定期清理归档日志

编写脚本 archivelog_clear.sh

#!/usr/bin/env bash
# 定期删除 Oracle 归档日志
echo -e "\n"
echo "----------------------$(date)--------------------"
source ~/.bash_profile
rman target / <

使用 oracle 用户,配置 Crontab 定时器即可:

0 8 * * * bash /home/oracle/scripts/archivelog_clear.sh > /tmp/archivelog_clear.log 2>&1
消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息