Oracle 数据库归档模式和非归档模式的区别以及设置

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net


文章目录

        查看归档模式
        单实例
            Oracle 9i 之前
            Oracle 10g 以后
        RAC 集群
            Oracle 9i 之前
            Oracle 10g 以后

Oracle 在线重做日志(online redo log)记录了数据库的各种增删改操作。数据库至少拥有 2 个在线重做日志组,并且循环使用;日志组 1 写满后切换到日志组 2,日志组 2 写满后再切换到日志组 1,不停地重复这个过程。

切换日志组会覆盖原来日志文件中的内容,如果不对已经写满的日志文件进行归档,重做日志记录就会丢失;如果选择归档日志模式,发生日志切换会对写满的日志会进行归档存储,意味着历史重做日志记录都会被保存。这两种配置的主要优缺点如下:

    非归档模式只能进行冷备,只能还原到备份点,之后的数据无法恢复;一般在开发或者测试环境使用;
    归档模式可以执行热备,同时支持增量备份,可以执行时间点恢复;归档日志文件需要占用额外的磁盘空间。

    ⚠️对于生产数据库,必须要工作在归档模式。

接下来我们介绍如何为 Oracle 单实例和 RAC 集群环境设置数据库的归档模式和非归档模式。
查看归档模式

首先,可以使用 ARCHIVE LOG LIST 命令查看数据库当前归档模式:

SQL> ARCHIVE LOG LIST;
Database log mode           No Archive Mode
Automatic archival           Disabled
Archive destination           /u01/app/oracle/product/12.2.0/dbhome_1/dbs/arch
Oldest online log sequence     285
Current log sequence           287


No Archive Mode 意味着非归档模式。

另外,也可以通过 v$database 系统视图查看当前的归档模式:

SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
ORCL      NOARCHIVELOG


单实例
Oracle 9i 之前

在 Oracle 9i 单节点实例中,可以使用以下方法将数据库设置为归档日志模式:

ALTER SYSTEM SET log_archive_start=TRUE SCOPE=spfile;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SID/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s.arc' SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ARCHIVE LOG START;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;


记得替换归档目录中的 SID,也可以设置自己的归档目录和日志文件名的格式。

    ⚠️切换为归档日志模式之后一定要执行一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式不可用。

另一方面,我们可以使用以下方法将数据库设置为非归档模式:

ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ARCHIVE LOG STOP;
ALTER DATABASE NONARCHIVELOG;
ALTER DATABASE OPEN;


Oracle 10g 以后

从 Oracle 10g 开始,LOG_ARCHIVE_START 参数以及 ARCHIVE LOG START 命令已经被废弃(归档模式默认启用自动归档),因此设置更为简单。以下操作将数据库设置为归档模式:

ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SID/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=spfile;

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;


记得替换归档目录中的 SID,也可以设置自己的归档目录和日志文件名的格式。

    ⚠️切换为归档日志模式之后一定要执行一次完全备份,因为非归档日志模式下产生的备份日志对于归档模式不可用。

同样,我们可以使用以下方法将数据库设置为非归档模式:

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE NONARCHIVELOG;
ALTER DATABASE OPEN;


RAC 集群

Oracle RAC 集群环境中的归档模式和非归档模式的设置略有不同。ALTER DATABASE ARCHIVELOG 命令只能在数据库以独占模式 MOUNT 时执行,这就意味着必须停止整个集群数据库,然后执行操作。
Oracle 9i 之前

首先,设置相关的归档参数:

ALTER SYSTEM SET log_archive_start=TRUE SCOPE=spfile;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s.arc' SCOPE=spfile;


由于需要以独占模式装载数据库,还必须设置以下参数:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;


然后使用 srvctl 停止整个集群数据库:

$ srvctl stop database -d db_name


集群停止之后,我们可以连接到其中一个节点执行以下命令:

STARTUP MOUNT;
ARCHIVE LOG START;
ALTER DATABASE ARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;


注意,参数 CLUSTER_DATABASE 被重新设置为 TRUE。由于数据文件和 SPFILE 被所有实例共享,以上操作只需要从一个节点执行。

然后,再次从命令行启动集群数据库:

$ srvctl start database -d db_name


以上设置将多个实例的归档日志放在了同一个目录中。归档格式中包含了线程(%t),可以防止实例之间的归档日志文件名冲突。如果需要为不同实例指定单独的归档目录,可以在 LOG_ARCHIVE_DEST_1 参数前加上实例 SID 前缀:

ALTER SYSTEM SET SID1.log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET SID2.log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;

同样,我们可以使用以下方法将集群数据库设置为非归档模式,只需要在一个节点进行操作:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;


$ srvctl stop database -d db_name


STARTUP MOUNT;
ARCHIVE LOG STOP;
ALTER DATABASE NONARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;


$ srvctl start database -d db_name


Oracle 10g 以后

从 Oracle 10g 开始,LOG_ARCHIVE_START 参数以及 ARCHIVE LOG START 命令已经被废弃(归档模式默认启用自动归档),因此设置更为简单。首先,设置相关的归档参数:

ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/db_name/archive/' SCOPE=spfile;
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=spfile;


如果是 Oracle 10gR1,由于需要以独占模式装载数据库,还必须设置以下参数:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;


Oracle 10gR2 以后的版本不再需要设置 cluster_database 参数。

然后从命令行停止整个集群数据库:

$ srvctl stop database -d db_name


集群停止之后,我们可以连接到其中一个节点执行以下命令:

STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;


再次从命令行启动集群数据库:

$ srvctl start database -d db_name

同样,我们可以使用以下方法将集群数据库设置为非归档模式,只需要在一个节点进行操作:

ALTER SYSTEM SET cluster_database=FALSE SCOPE=spfile;


Oracle 10gR2 以后的版本不再需要设置 cluster_database 参数。

$ srvctl stop database -d db_name


STARTUP MOUNT;
ALTER DATABASE NONARCHIVELOG;
ALTER SYSTEM SET cluster_database=TRUE SCOPE=spfile;
SHUTDOWN IMMEDIATE;


$ srvctl start database -d db_name


定期更新数据库领域相关文章,欢迎点赞👍、评论📝、收藏❤️!