实验的目的是增加控制文件的个数,1到8个,保护控制文件。认识控制文件的一致性.什么是控制文件
的版本.控制文件的结构.
增加控制文件
1.修改参数文件
2.停止数据库
3.复制控制文件
4.启动数据库
5.验证,查看v$controlfile
修改二进制的初始化参数文件中的control_files选项
SQL> alter system set control_files=
2 'D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL',
3 'D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL'
4 scope=spfile;
System altered.
SQL> select value from v$spparameter where
name='control_files';
验证参数文件已经被修改
VALUE
-----------------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL
D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL
SQL> select * from v$controlfile;
验证现在内存中的控制文件个数
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
---------- ------------------------------------------ ---
---------- --------------
D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL NO 16384 450
SQL> startup force;
ORACLE instance started.
重新启动数据库,使修改的参数起作用
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 75498852 bytes
Database Buffers 88080384 bytes
Redo Buffers 2945024 bytes
ORA-00214: control file 'D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL'
version 9499
inconsistent with file
'D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL' version 9483
因为CONTROL02.CTL 刚才脱离了数据库,没有参加修改,CONTROL01.CTL 已经变化了,二
CONTROL02.CTL没有变化,所以时间戳不正确了。
SQL> host copy
D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL
D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL
使用操作系统的命令将老的控制文件覆盖
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01507: database not mounted
因为我们处于数据库的nomount状态,想要open不能跨越mount台阶,所以必须先mount数据库。
SQL> alter database mount;
启动到mount状态
Database altered.
SQL> alter database open;
启动到open状态
Database altered.
SQL> select value from v$spparameter where
name='control_files';
验证参数文件中control_files选项的值
VALUE
------------------------------------------------------------------------------------------
D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL
D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL
SQL> select * from v$controlfile;
验证现在内存中的控制文件个数
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
---------- ------------------------------------------ ---
---------- --------------
D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL NO 16384 450
D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL NO 16384 450
再次修改参数文件control_files的值为3个控制文件
SQL> alter system set control_files=
2 'D:\ORACLE\ORADATA\ORA10\CONTROL01.CTL',
3 'D:\ORACLE\ORADATA\ORA10\CONTROL02.CTL',
4 'D:\ORACLE\ORADATA\ORA10\CONTROL03.CTL'
5 scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
重新启动数据库,使修改的参数起作用
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 75498852 bytes
Database Buffers 88080384 bytesBT4
黑色的为文件头,8个数据块
红的为每个8k
绿的为红的块的镜像
控制文件已经使用空间和剩余空间
select TYPE,RECORD_SIZE,RECORDS_TOTAL,RECORDS_USED from V
$CONTROLFILE_RECORD_SECTION;
控制文件是预留空间
控制文件的估计大小
例子中db_block_size=8k
select sum(ceil(RECORD_SIZE*RECORDS_TOTAL/(8192-24))*2*8)+8*8 kb
from V
$CONTROLFILE_RECORD_SECTION;
8*8 为控制文件头,8个块
8192-24,24为块头
Ceil取整,因为分配单位为块
2倍,因为控制文件是内部镜像的思科学习视频资料下载中心
如何将控制文件的信息转储到跟追文件呢?
alter session set events 'immediate trace name controlf level
1';
level 1代表只dump文件头的信息.
show parameter user_d
你的转储文件在udump目录下.根据日期和时间来查找,也可以根据进程号码来查找.以后再介绍.
*** 2007-09-25 21:52:45.467
DUMP OF CONTROL FILES, Seq # 10721 = 0x29e1
V10 STYLE FILE HEADER:
Compatibility Vsn = 169869568=0xa200100
Db ID=568967312=0x21e9c090, Db Name='ORA10'
Activation ID=0=0x0
Control Seq=10721=0x29e1, File size=450=0x1c2
File Number=0, Blksiz=16384, File Type=1 CONTROL
*** END OF DUMP ***
alter session set events 'immediate trace name controlf level
10';
level 10代表只dump文件的所有信息.
日志文件
日志文件是二进制文件
它记录了数据文件的变化
Select * from v$logfile;
查看日志文件的位置等信息
SQL> Select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
------- ---------- ---------------
----------------------------------- ---
3 ONLINE D:\ORACLE\ORADATA\ORA10\REDO03.LOG NO
2 ONLINE D:\ORACLE\ORADATA\ORA10\REDO02.LOG NO
1 ONLINE D:\ORACLE\ORADATA\ORA10\REDO01.LOG NO
4 STANDBY D:\ORACLE\ORADATA\ORA10\REDO04.LOG NO
5 STANDBY D:\ORACLE\ORADATA\ORA10\REDO05.LOG NO
日志文件是物理存在的文件
它的组织模式是组思科路由器配置
组是逻辑的组织方式
每个实例至少要两个组
Select * from v$log;
Select * from v$log_history;
查看日志组的信息
SQL> Select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
FIRST_CHANGE#
FIRST_TIME
------- -------- ---------- ---------- ---------- --- ----------
------------- ----------
1 1 184 5242880 1 NO CURRENT 3331887 26-JUN-07
2 1 182 5242880 1 YES INACTIVE 3320448 25-JUN-07
3 1 183 5242880 1 YES INACTIVE 3331659 26-JUN-07
SQL> select to_char(FIRST_TIME,'yyyy/mm/dd')
day,count(*) from
2 v$log_history
3 group by to_char(FIRST_TIME,'yyyy/mm/dd');
DAY COUNT(*)思科路由器交换机
-------------------- ----------
2007/06/14 4
2007/04/29 1
2007/06/25 1
2007/06/07 34
2007/04/30 8
2007/06/13 84
2007/05/01 7
2007/05/02 1
2007/06/26 1
2007/05/28 25
2007/06/12 10
2007/06/23 7
该语句可以查看每天产生日志的多少,估计我们应用的日志量,可以估计归档的大小。
组和组间是平等的关系
实例同一时刻只能向一个组写入日志
一个组写满后,写下一个组
这个过程叫切换(switch)
自动切换:日志写满 oracle会写下一个组
手工切换:alter system switch logfile;
日志组的切换要产生检查点(checkpoint)
检查点有增量检查和完全检查两种
完全检查
1。一致性shutdown数据库的时候。
2。Alter system checkpoint;
结果为:
所有的脏数据块都写入数据文件
改写文件的头
除了完全检查点以外的所有其它检查点都是增量检查点,增量检查是查找检查点列表,将某一个时间点
做标记,该时间点前的脏块写入到数据文件,增量检查不一定马上执行,根据我们脏的块多少来决定,
这就出现了检查点滞后的情况。
参数log_checkpoints_to_alert决定是否将检查点的信息写入报警日志。默认为假,不写日志。
我们可以将这个参数改为真,可以看到检查点的信息。
日志的部分信息如下
Fri Jul 06 12:30:52 2007思科路由器交换机模拟软件
ALTER SYSTEM SET log_checkpoints_to_alert=TRUE SCOPE=BOTH;
Fri Jul 06 12:31:15 2007
Beginning log switch checkpoint up to RBA [0xb9.2.10], SCN:
3334816
Thread 1 advanced to log sequence 185
Current log# 2 seq# 185 mem# 0:
D:\ORACLE\ORADATA\ORA10\REDO02.LOG
Beginning log switch checkpoint up to RBA [0xba.2.10], SCN:
3334818
Thread 1 advanced to log sequence 186
Current log# 3 seq# 186 mem# 0:
D:\ORACLE\ORADATA\ORA10\REDO03.LOG
Thread 1 cannot allocate new log, sequence 187
Checkpoint not complete
Current log# 3 seq# 186 mem# 0:
D:\ORACLE\ORADATA\ORA10\REDO03.LOG
Fri Jul 06 12:31:21 2007
Completed checkpoint up to RBA [0xb9.2.10], SCN: 3334816
Fri Jul 06 12:31:22 2007
Beginning log switch checkpoint up to RBA [0xbb.2.10], SCN:
3334826
Thread 1 advanced to log sequence 187
Current log# 1 seq# 187 mem# 0:
D:\ORACLE\ORADATA\ORA10\REDO01.LOG
Fri Jul 06 12:31:27 2007
Completed checkpoint up to RBA [0xba.2.10], SCN: 3334818
System change number(scn),数据库的更改号码,如果你不懂SCN就绝对不懂数据库,这句话一
点都不夸张,因为数据库中的一切运转都离开不了SCN,SCN的地位在数据库中就向我们生活中的时
间一样,你觉察不到,但又处处离不开。SCN存在于数据块的块头,文件头,也可以建立特殊的表,使
SCN存在于表的行头,SCN存在内存中,它是维护数据库的运行基本保证。备份和恢复更是根据SCN
来决定我们要重做那些操作和交易。SCN的发生机制在不同版本会不同,我们也不用去关心,我们可以
理解为数据库的一切进程操作都要有一个时间的标志,这就是SCN。Select ,update,delete,insert数
据库的一切操作都有SCN。
数据库内的任何操作都产生scn。SCN小的就是先操作的,SCN大的就是后操作的,数据库使用SCN
来维护因果关系。我们可以将SCN理解为数据库的内部时间。
Scn的最大值为
SQL> select
to_number('ffffffffffff','xxxxxxxxxxxxxxxxxxxxxxxxxxxx') from
dual;
TO_NUMBER('FFFFFFFFFFFF','XXXX
------------------------------
2.8147E+14
为什么最大值是'ffffffffffff'呢?
SQL> alter system dump datafile 1 block 2;
System altered.
我们随便将一个数据文件的块转存到udump的跟踪文件.
Start dump data blocks tsn: 0 file#: 1 minblk 2 maxblk 2
buffer tsn: 0 rdba: 0x00400002 (1/2)
scn: 0x0000.c666400e seq: 0x02 flg: 0x04 tail: 0x400e1d02
frmt: 0x02 chkval: 0x91eb type: 0x1d=KTFB Bitmapped File Space
Header
Hex dump of block: st=0, typ_found=1
我们看到了吧.最大就是12位的十六进制数值.
数据文件头会保存一个特殊的SCN
Stop scn 记录在数据文件头上。当数据库处在打开状态时,stop scn 被设成最大值
0xffff.ffffffff。在数据库正常关闭过程中,stop scn被设置成当前系统的最大scn值。在数据库打
开过程中,Oracle会比较各文件的stop scn和checkpoint scn,如果值不一致,表明数据库
先前没有正常关闭,需要做恢复。
查看数据库当前scn
select current_scn from V$database;(10g才有)
select dbms_flashback.get_system_change_number() from
dual;(9i以后才有)
检查点的scn,检查点是一个特殊的SCN,小于该号码的块都已经存盘了,数据库的恢复只需要恢复
该SCN号码以后的操作就可以了。
SCN号码和物理的时间有对照表。SMON_SCN_TIME
select * from SMON_SCN_TIME;
这个表在每个版本的结果会不同,9I的信息较少,10G的信息更多一些。
select name,checkpoint_change# from v$datafile;
NAME CHECKPOINT_CHANGE#
------------------------------------------ ------------------
D:\ORACLE\ORADATA\ORA10\SYSTEM01.DBF 3334818
D:\ORACLE\ORADATA\ORA10\UNDOTBS01.DBF 3334818
D:\ORACLE\ORADATA\ORA10\SYSAUX01.DBF 3334818
D:\ORACLE\ORADATA\ORA10\USERS01.DBF 3334818
D:\ORACLE\ORADATA\ORA10\TL.DBF 3334818
D:\ORACLE\ORADATA\ORA10\TS1.1 3334818
D:\ORACLE\ORADATA\ORA10\TS1.2 3334818
日志记录的范围
SQL> select
GROUP#,sequence#,STATUS,FIRST_CHANGE#,
2 to_char(FIRST_TIME,'yyyy/mm/dd:hh24:mi:ss') time from
V$log;
GROUP# SEQUENCE# STATUS FIRST_CHANGE# TIME
------- ---------- ---------- -------------
---------------------
1 187 CURRENT 3334826 2007/07/06:12:31:22
2 185 INACTIVE 3334816 2007/07/06:12:31:14
3 186 INACTIVE 3334818 2007/07/06:12:31:16
185号日志记录了3334816到3334818之间的数据库变化。
186号日志记录了3334818到3334826之间的数据库变化。
187号日志记录了3334826到最后的SCN之间的数据库变化。
如何将日志文件的信息转储到dump文件中.
ALTER SESSION SET EVENTS 'immediate trace name redohdr level
n';
1 控制文件中的redo log信息
2 level 1 + 文件头信息
3 level 2 + 日志文件头信息
ALTER SYSTEM DUMP LOGFILE 'FileName';