4_1_Oracle逻辑结构篇之重做日志和归档日志管理-如何打开
如何打开归档
Oracle 数据库可运行在两种模式下: ARCHIVELOG 模式和NOARCHIVELOG 模式。
NOARCHIVELOG 模式只能用于保护实例失败,而不能用于保护介质失败。为了避免数据库物理文件损坏所引起的数据丢失,数据库可运行在ARCHIVELOG 模式。后者就是所谓的归档模式。
Oracle 能够将已经写满的重做日志文件在被覆盖之前保存到指定位置上,被保存的重做日志文件的集合称为“归档重做日志”,这个操作过程称为“归档”,根据是否进行归档,数据库可以运行在归档模式(ARCHIVELOG)和非归档模式(NOARCHIVELOG)下,归档操作可
由ARCH 后台进程自动完成,也可由DBA 手工完成。
在NOARCHIVELOG 模式下,每次联机重做日志文件已满并发生日志切换时,都要覆盖原来联机重做日志文件。直到对重做日志文件组的检查点操作完成后,LGWR 才覆盖该重做日志文件组。
如果数据库配置为在ARCHIVELOG 模式运行下,那么必须将已满的联机重做日志文件的不活动(INACTIVE)组归档。因为对数据库所做的所有更改都记录在联机重做日志文件内,数据库管理员可以使用数据库物理备份和归档的联机重做日志文件恢复数据库,而不
会丢失任何已提交数据。
数据库创建时,缺省为NOARCHIVELOG 模式。
使用归档日志有两个好处:
• 恢复:数据库物理备份连同联机重做日志文件和归档重做日志文件可共同确保恢复所有已提交的事务处理。
• 备份:可在数据库打开时执行备份。
1.查询当前数据的日志模式
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
2.设置归档路径
SQL> show parameter archi
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/arch/orcl';
System altered.
另启一个会话设置保存路径
[oracle@ocm oracle]$ mkdir -p arch/orcl
[oracle@ocm oracle]$ cd arch/orcl/
[oracle@ocm orcl]$ pwd
/u01/app/oracle/arch/orcl
3.关闭数据库并打开到mount状态
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 368263168 bytes
Fixed Size 1345016 bytes
Variable Size 247466504 bytes
Database Buffers 113246208 bytes
Redo Buffers 6205440 bytes
Database mounted.
4.配置数据库为归档
SQL> alter database archivelog;
Database altered.
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
SQL> alter database open;
Database altered.
注意:修改了日志操作模式之后,必须重新备份数据库。
如果关闭归档模式,命令为:
ALTER DATABASE NOARCHIVELOG;
此时在归档日志目录,可以看到当前还没有归档日志
[oracle@ocm orcl]$ pwd
/u01/app/oracle/arch/orcl
[oracle@ocm orcl]$ ll
total 0
我们进行日志切换,就会有归档日志产生
SQL> set linesize 500
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 19 20971520 512 1 YES INACTIVE 883967 24-JUL-17 894057 24-JUL-17
2 1 21 20971520 512 1 NO CURRENT 896741 24-JUL-17 2.8147E+14
3 1 18 20971520 512 1 YES INACTIVE 883961 24-JUL-17 883967 24-JUL-17
4 1 20 8388608 512 1 YES INACTIVE 894057 24-JUL-17 896741 24-JUL-17
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 19 20971520 512 1 YES INACTIVE 883967 24-JUL-17 894057 24-JUL-17
2 1 21 20971520 512 1 YES ACTIVE 896741 24-JUL-17 901128 24-JUL-17
3 1 22 20971520 512 1 NO CURRENT 901128 24-JUL-17 2.8147E+14
4 1 20 8388608 512 1 YES INACTIVE 894057 24-JUL-17 896741 24-JUL-17
SQL>
上面可以看到日志CURRENT由21变成了22,确实发生了日志切换。
此时在归档日志目录,可以看到当前备份的归档日志
[oracle@ocm orcl]$ ll
total 3328
-rw-r----- 1 oracle oinstall 3400704 Jul 24 14:04 1_21_950125053.dbf
SQL> set linesize 500
SQL> col member for a50
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------- ---
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
4 ONLINE /u01/app/oracle/oradata/orcl/redo04.log NO
SQL> alter database orcl add logfile ( '/u01/app/oracle/oradata/orcl/redo05a.log','/u01/app/oracle/oradata/orcl/redo05b.log') size 8M;
Database altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------- ---
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
4 ONLINE /u01/app/oracle/oradata/orcl/redo04.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05a.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05b.log NO
6 rows selected.
SQL> alter database orcl add logfile group 6 ( '/u01/app/oracle/oradata/orcl/redo06a.log','/u01/app/oracle/oradata/orcl/redo06b.log') size 8M;
Database altered.
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------- ---
3 ONLINE /u01/app/oracle/oradata/orcl/redo03.log NO
2 ONLINE /u01/app/oracle/oradata/orcl/redo02.log NO
1 ONLINE /u01/app/oracle/oradata/orcl/redo01.log NO
4 ONLINE /u01/app/oracle/oradata/orcl/redo04.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05a.log NO
5 ONLINE /u01/app/oracle/oradata/orcl/redo05b.log NO
6 ONLINE /u01/app/oracle/oradata/orcl/redo06a.log NO
6 ONLINE /u01/app/oracle/oradata/orcl/redo06b.log NO
8 rows selected.
设置日志归档
当数据库处于ARCHIVELOG 模式时,在进行了日志切换后必须要归档重做日志。因为日志组只有在归档后才能被覆盖,所以如果不归档该日志组,那么当下次切换到该日志组时将会导致LGWR 处于等待状态。为了避免出现这种情况,必须要及时归档重做日志,归档重做日志有手工归档和自动归档两种方法。
1.自动归档
DBA 可以选择在实例启动前或实例启动后启用自动归档功能。
如果要在实例启动前启用自动归档功能, 需要将初始化参数文件中参数LOG_ARCHIVE_START 的值改为TRUE。步骤如下:
1)以管理员身份登录数据库
CONN / AS SYSDBA
2)修改服务器端初始化参数
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE;
3)重新启动数据库,使参数生效
SHUTDOWN;
STARTUP;
如果实例启动时没启用自动归档,不必关闭实例再对初始化参数行修改,可以直接使用
如下语句启用自动归档功能:
ALTER SYSTEM ARCHIVE LOG START;
执行上述语句后,无须重新启动实例,即可立即启用自动归档功能,但是实例在下一次启动时,自动归档功能仍然FALSE。
2.手工归档
一旦禁用自动归档功能,DBA 必须手动执行一条命令,对所有或特定的联机重做日志文件进行手动归档。在归档模式下,如果禁用自动归档模式,但是又没有及时进行手工归档,
LGWR 进程无法写入下一个已经写满的可用重做日志组,这时数据库将被挂起,直到完成对重做日志组的归档为止。
可以使用下面语句对日志文件进行归档:
ALTER SYSTEM ARCHIVE LOG ALL;