log_archive_dest_6? ? ? ? ? ? ? ? ? string
log_archive_dest_7? ? ? ? ? ? ? ? ? string
log_archive_dest_8? ? ? ? ? ? ? ? ? string
log_archive_dest_9? ? ? ? ? ? ? ? ? string
指定目录位置即可用,但是这样很不利于管理。
简介下SCN:System change number | System Commit Number 但是很多情况下理解成第一种更为准确。
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
? ? ? ? ? 0
SQL> alter database open;
数据库已更改。
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232872
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232878
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232879
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232905
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232915
SQL>? select current_scn from v$database;
CURRENT_SCN
-----------
? ? 7232917
SCN是oracle的一种时钟机制,随时间而增加,每个数据库都有一个全局SCN,通过SCN oracle来维护数据库的一致性。SCN无处不在,resetlogs scn,checkpoint scn.......
除非数据库重建,否则永远不会为0,上面出现0,是因为数据库还没打开啦。
此时我们在sysY用户下:
SQL> show user;
USER 为 "SYS"
SQL> create table tt(id number,scn number);
表已创建。
SQL>? insert into tt values(1,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> insert into tt values(2,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from tt;
? ? ? ? ID? ? ? ? SCN
---------- ----------
? ? ? ? 1? ? 7235265
? ? ? ? 2? ? 7235294
通过查找tt,可以大致估算我们插入数据时的时间。
查看v$log:
SQL> select group#,status,archived,sequence#,first_change#,next_change# from v$log;
GROUP# STATUS? ? ? ? ? ARC? SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------------- --- ---------- ------------- ------------
? ? ? ? 1 INACTIVE? ? ? ? YES? ? ? ? 424? ? ? 7179754? ? ? 7189656
? ? ? ? 2 INACTIVE? ? ? ? YES? ? ? ? 425? ? ? 7189656? ? ? 7227701
? ? ? ? 3 CURRENT? ? ? ? ? NO? ? ? ? 426? ? ? 7227701? 2.8147E+14
有上述插入数据的SCN和目前日志的FIRST_CHANGE#知,上述数据的日志存放在当前日志文件中,也就是序列号为426。上述的FIRST_CHANGE#表示开始使用该组日志时的scn,
next_change#表示切换该组日志时的scn,也就是使用下一组日志的FIRST_CHANGE#。
分析一下status:
current:表示目前使用的日志,毫无疑问。
active:已经完成归档,日志文件已经写入磁盘,可??和该部分日志相对应的数据块的修改还没有写入磁盘,在内存里,所以该日志文件在数据库crash后恢复可能会用到。
inactive:此时已经完成归档,日志文件和对应修改的数据库已经写入磁盘。
由于这三组日志循环切换,产生的日志我们怎么标识呢,
这就是序列号重要的作用了:
SQL> alter system switch logfile;
系统已更改。
SQL> select name,thread#,sequence#,first_change#,next_change# from v$archived_log WHERE sequence# = 426;
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? THREAD#? SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ------------- ------------
/u01/app/oracle/flash_recovery_area/ORCL3939/archivelog/2015_04_27/o1_mf_1_426_bmvr5f9j_.arc? ? ? ? ? ? ? ? 1? ? ? ? 426? ? ? 7227701? ? ? 7236412
看上面的 name,sequence#,知道序列用来标识归档文件的作用了吧。
THREAD#:因为此时数据库是在单实例下,一个数据库对应一个实例:
所以此时thread#可以理解为实例编号。
在RAC下,此时的THREAD#对应的是节点号。
我们现在模拟:
SQL> insert into tt values(3,dbms_flashback.get_system_change_number?
? 2? );
已创建 1 行。