oracle中控制文件的最大个数是,Oracle 增加控制文件的个数

实验的目的是增加控制文件的个数,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

a4c26d1e5885305701be709a3d33442f.png

黑色的为文件头,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';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值