学习了oracle的归档之后,现对所学的知识进行小结,以便日后复习之用。
一 noarchived vs. archived
Oracle数据库由三种文件组成,其中之一为联机重做日志文件。这个日志文件记录对数据库所做的任何修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组,每组至少一个成员。现假设最简单的情况,数据库只有两个重做日志文件组。当联机重做日志组1被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。
如果数据库处于非归档模式,联机日志在切换时就会丢弃。而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志组1,当组1写满的时候,发生日志切换,开始写联机重做日志2,但日志切换之前联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。数据库使用归档方式运行时才可以进行灾难性恢复。
从备份和恢复的角度来看,非归档模式只能做冷备份,并且恢复时只能做完全备份。最近一次完全备份到系统出错期间的数据不能恢复。归档模式可以做热备份,并且可以做增量备份,可以做部分恢复。数据库使用归档方式运行时才可以进行灾难性恢复。
从上所述,在创建数据库之后切忌要将数据库更改为归档模式。
二 查看数据库是否处于归档模式
查看是否处于归档模式有两种各种方法:
a)
SQL> select name,log_mode from V$database;
NAME LOG_MODE
--------- ------------
BASE ARCHIVELOG
b) SQL> archive log list;
Database log
mode Archive Mode
Automatic
archival Enabled
Archive
destination /u01/flash_recovery_area/BASE/archivelog
Oldest online log
sequence 24
Next log sequence to
archive 26
Current log
sequence 26
从上所述,oracle数据库已经处于archive mode。
二 手工归档 VS. 自动归档
oracle数据库处于归档模式之后,接下来考虑手动归档还是自动归档。
所谓归档,就是说当日志要进行切换时,切换可能是日志将满,或是dba执行了切换操作,这时候oracle先暂停日志切换,发出一个checkpoint操作,后台进程DWWn将database
buffer cache 里的dirty buffer写到数据文件,接着将日志文件拷贝到归档路径,最后重启日志切换。
将日志文件拷贝到归档路径,可以有oracle自动进行,这就是自动归档;如果日志切换前要dba发送sql语句将日志文件拷贝到某一路径下,这就是手动归档。
很显然归档是一个比较重复单一的工作,做这种事是计算机的特长,快速而准确。oracle也推荐使用自动归档,以后要尽量使用自动归档。
三 配置自动归档模式
1)一致性的关闭数据库(shutdown normal/immediate/transational)
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
2) mount数据库
SQL> startup mount
ORACLE instance started.
Total System Global Area 369098752 bytes
Fixed
Size 1219448 bytes
Variable
Size 83887240 bytes
Database
Buffers 276824064 bytes
Redo
Buffers 7168000 bytes
Database mounted.
3)将数据库更改为归档模式
SQL> alter database archivelog;
Database altered.
4)open数据库
SQL> alter database open;
Database
altered.
5)完全backup数据库,以便日后restore数据库。
通过上面五步就将配置数据库配置为归档模式了,下面查看一下是否配置成功。
SQL> archive log list;
Database log
mode Archive Mode
Automatic
archival Enabled
Archive
destination /u01/flash_recovery_area/BASE/archivelog
Oldest online log
sequence 24
Next log sequence to
archive 26
Current log
sequence 26
从上面的打印的信息可以看到已经成功将数据库配置为归档模式;从第二行可以看出数据库已经配置为自动模式。这也是oracle9i与oracle10g不同的地方之一,在oracle9i中,要将数据库配置成自动模式,除了以上步骤之外,还须设置参数log_archive_start=true。
现在在oracle10g将参数log_archive_start为true看有什么反应。
1)先查询参数log_archive_start的值。
SQL> show parameter
log_archive_start;
NAME TYPE VALUE
-------------------- -----------
------------------------------
log_archive_start boolean FALSE
2)将参数log_archive_start设置为true。
SQL> alter system set log_archive_start=true
scope=spfile;
System altered.
3)重启数据库。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE
instance shut down.
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE
instance started.
Total System Global Area 369098752 bytes
Fixed
Size 1219448 bytes
Variable
Size 83887240 bytes
Database
Buffers 276824064 bytes
Redo
Buffers 7168000 bytes
Database mounted.
Database opened.
可以看出数据库可以打开,但报了一个ORA-32004的问题,
4)查看oracle给出的问题描述:
SQL> host oerr ora 32004;
32004, 00000, "obsolete and/or deprecated parameter(s)
specified"
// *Cause: One or more obsolete
and/or parameters were specified in // the SPFILE or the PFILE on the server side.
// *Action: See alert log for a list of parameters that are
obsolete.
// or deprecated. Remove them from the SPFILE or the server
// side PFILE.
很明显,这可能是由于设置了一些被淘汰的参数,一般这种参数仅仅为了向前兼容,oracle不推荐使用。
另外,还可从alert log 文件进一步查看。
5)查看alert log文件,显示如下信息:
Deprecated system parameters with specified values:
log_archive_start End of deprecated system parameter listing
查了查资料说是oracle 10G已经不支持该参数了,当打开归档模式(archive log mode) ,则 ARCH
进程被隐性的自动设定。10g 中也就不会出现 9i 以前那种数据库已经在归档模式,但是自动归档没有被设定的情况了。要解决该问题需要重置
log_archive_start 参数。
6)重置log_archive_start参数。
SQL>
alter system reset log_archive_start scope=spfile sid='*';
System
altered.
7)重启数据库。
SQL>
shutdown immediate
Database
closed.
Database
dismounted.
ORACLE
instance shut down.
SQL> startup
ORACLE
instance started.
Total
System Global Area 369098752 bytes
Fixed
Size 1219448 bytes
Variable
Size 83887240 bytes
Database
Buffers 276824064 bytes
Redo
Buffers 7168000 bytes
Database
mounted.
Database
opened.
重启数据库后问题解决了,想一下,oracle9i在配置归档时,首先将数据库设置为归档模式,但此时数据库为手动归档,若要更改为自动模式还须设置参数log_archive_start。在oracle10g中,若将数据库设为归档模式,则自动设为自动模式,并且不再支持log_archive_start参数。可以看出,oracle是推荐使用自动归档模式的。
四 配置手动归档
oracle9i设置为归档模式之后,数据库就为手动模式,二oracle10g设置为归档模式之后数据库就为自动模式,oracle10能不能配置为自动模式。这是可以的。
1)一致性的关闭数据库(shutdown normal/immediate/transational)
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
2) mount数据库
SQL> startup mount
ORACLE instance started.
Total System Global Area 369098752 bytes
Fixed
Size 1219448 bytes
Variable
Size 83887240 bytes
Database
Buffers 276824064 bytes
Redo
Buffers 7168000 bytes
Database mounted.
3)将数据库更改为手动归档模式
SQL> alter database archivelog manual;
Database altered.
4)open数据库
SQL> alter database open;
Database
altered.
5)完全backup数据库,以便日后restore数据库。
通过上面五步就将配置数据库配置为归档模式了,下面查看一下是否配置成功。
SQL> select name,log_mode from V$database;
NAME LOG_MODE
--------- ------------
BASE MANUAL
SQL> archive log list;
Database log
mode Archive Mode
Automatic
archival Enabled (
?) Archive
destination /u01/flash_recovery_area/BASE/archivelog
Oldest online log
sequence 24
Next log sequence to archive 26
Current log
sequence 26
SQL> select * from V$archive_processes;
PROCESS STATUS LOG_SEQUENCE STAT
---------- ---------- ------------ ----
0 ACTIVE 0 IDLE
1 ACTIVE 0 IDLE
2 ACTIVE 0 IDLE
下面验证手动归档。
SQL> select group#,archived,status from V$log;
GROUP#
ARC STATUS
------ --- ----------------
1 YES
INACTIVE
2 YES
ACTIVE
3 NO CURRENT
SQL> select group#,archived,status from V$log;
GROUP# ARC STATUS
------
--- ----------------
1 YES
INACTIVE
2 YES
ACTIVE
3 NO CURRENT
SQL> select group#,archived,status from V$log;
GROUP# ARC STATUS
------ --- ----------------
1 YES
INACTIVE
2 YES
ACTIVE
3 NO CURRENT
SQL> select group#,archived,status from V$log;
GROUP#
ARC STATUS
------ --- ----------------
1 YES INACTIVE
2 YES ACTIVE
3 NO CURRENT
SQL> alter system switch logfile;
System altered.
SQL> select group#,archived,status from V$log;
GROUP# ARC STATUS
------ --- ----------------
1 NO CURRENT
2 YES ACTIVE
3 NO ACTIVE
SQL> alter system switch logfile;
System altered.
SQL>
select group#,archived,status from V$log;
GROUP#
ARC STATUS
----- --- ----------------
1 NO ACTIVE
2 NO CURRENT
3 NO ACTIVE
SQL> alter system switch logfile;
可以看出,数据库有三个日志文件组,日志文件经过两次日志切换之后均没有被归档,在第三次日志切换后,oracle就stall在那儿。
打开另一个窗口,以sys用户登入。
SQL> select
group#,archived,status from V$log;
GROUP#
ARC STATUS
---------- --- ----------------
1 NO INACTIVE
2 NO CURRENT
3 NO INACTIVE
SQL> alter
system archive log current;
System altered.
SQL> select
group#,archived,status from V$log;
GROUP#
ARC STATUS
-------
--- ----------------
1 YES INACTIVE
2 YES ACTIVE
3 NO CURRENT
同时第一个窗口也能正常运行了。
五自动归档模式其他参数配置
自动归档,就是设置好一些参数,oracle按照这些设置的参数自动将redo log
拷贝到某个地方。这个过程其实很简单,打个比方,摸个壮汉搬运砖头,这些砖头就是redo
log,这个壮汉是谁了?在oracle就是ARVn后台进程,通过配置log_archive_max_processe就可以调几个壮汉搬砖头,在oracle中就是ARV0,ARV1...,最多可以调10个壮汉。另外,这个壮汉把砖头搬到哪里?在oracle中就是ARVn把redo
log
归档到哪里? 这可以设置log_archive_dest_n来配置归档点,n可以为1到10。最后,可能出现安全问题,可以在每条搬砖头的路上设置路障,用来告诉壮汉这条路不安全,要他把砖头搬到别的地方去,oracle也在每个归档点设置了路障,一般这些路障不是关闭的,但某些特殊情况下可以打开,表示这个归档点不能归档数据,这通过配置log_archive_status_n来完成。
六动态性能视
V$archived_log
V$archive_dest
V$archive_processes
V$log_history
V$database