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
定期更新数据库领域相关文章,欢迎点赞👍、评论📝、收藏❤️!