文章目录

  • 查看归档模式
  • 单实例
  • 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

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