谢谢exitgogo和blue_stone的鼓励,继续贴!更好的格式可见
http://wangyl1977.cublog.cn
6 管理控制文件
当数据库的结构发生变化的时候,控制文件随即发生变化。
添加控制文件步骤:
1)sql>alter system set control_files='/opt/oradata/u01/ctrl01.ctl',
'/opt/oradata/u01/ctrl02.ctl' scope=spfile;(必须加spfile,因为修改不能写到内存里
2)sql>shutdown immediate;
3) cp /opt/oradata/u01/ctrl01.ctl /opt/oradata/u01/ctrl02.ctl
4) startup;
重要的视图:
V$CONTROLFILE:
V$PARAMETER:
V$CONTROLFILE_RECORD_SECTION:
V$BACKUP
V$DATAFILE
V$TEMPFILE
V$TABLESPACE
V$ARCHIVE
V$LOG
V$LOGFILE
V$LOGHIST
V$ARCHIVED_LOG
V$DATABASE
show parameter control;
select * from v$controlfile_record_section;
select * from v$tempfile;
备份控制文件
alter database backup controlfile to '../filepath/control.bak';
备份控制文件,并将二进制控制文件变为了arc 的文本文件
alter database backup controlfile to trace;
控制文件在备份中意义重大,建议每次对其单独备份。同时应该增大CONTROL_FILE_RECORD_KEEP_TIME这个初始化参数的值。以便备份信息能更长时间的保留。
7 管理在线重做日志
redo log会记录数据库的所有操作,不仅仅只包括修改操作!
Redo log switch时会触发checkpoint,同时信息会写到controlfile里。
alter system switch logfile;强行进行一次日志switch,归档/非归档均可使用
alter system archive log current;强行归档并进行日志切换,用于归档模式下
alter system checkpoint;--强制进行一次checkpoint
FAST_START_MTTR_TARGET:checkpoint 同步频率参数,9I新参数,表示将来系统crash后你期望recover的时间。用来替代以前版本里的FAST_START_IO_TARGET,LOG_CHECKPOINT_TIMEOUT
将参数LOG_CHECKPOINT_TO_ALERT设为true(默认为false),系统会将每个SCN记录在alert_SID.log里!
加入一个日志组
alter database add logfile group 3 ('opt/oracle/log6.rdo' size 10M);
向日志组中加入一个成员
alter database add logfile member '/opt /oracle/log6b.rdo' to group 3;
删除日志组:当前日志组不能删;活动的日志组不能删;非归档的日志组不能删
alter database drop logfile group 3;
删除日志组中的某个成员,但每个组的最后一个成员不能被删除 ???????
alter databse drop logfile member '/opt/oracle/log6.rdo';
redo log的状态:
1) inactive :非活动的状态
2) active: 活动的状态,oracle认为可疑的状态
3) current:当前将要写的redo log,执行归档后,current之前的redo log肯定也必须被归档,否则数据库处于挂死状态。
4) unused:新增加的redo log状态
重命名日志文件
1--- shutdown immediate;
2---移动online redo log
3---startup mount
4---alter database rename file '/6.rdo' to '/6a.rdo';
5---alter database open
清除在线日志
alter database clear logfile '/opt/oracle/ora_log_file6.rdo';
alter database clear logfile group 3;
清除非归档日志
alter database clear unarchived logfile group 3;
归档模式到非归档模式的互换
1---startup mount;
2---alter database noarchivelog/archivelog;
3---alter database open
achive log start;---启动自动归档
alter system archive all;--手工归档所有日志文件
archive log list;
alter system archive log start;--启动自动存档
show parameter log_archive;
LOGMINOR的使用
v$log;
v$log_history;
能看出已归档的redo log seq.
v$archived_log;
v$logfile;
从v$Log重要列:
ARC : redo log是否被归档
STATUS: current / inactive/ active/
First_time: 记录该redo log记录数据库第一次修改的时间
8.管理表空间和数据文件
Locally managed tablespace:空闲extent的管理放在本地表空间里,位图用于记录空闲extent,位图的值0,1对应free or used,每个bit对应一个extent。优点:由于空闲extent的管理放在本地表空间里,因而减少了对数据字典的竞争,空间的分配和回收也不会产生系统undo段。由于采用标准大小,无需愈合!默认的,分配的空间按标准大小来划分。
若创建时UNIFORM SIZE为128K,则新建的extent初始划分了128K,即使你创建的表只分配了64K;
uniform size=sort_area_size*N
sort_area_size在PGA区
Dictionary-managed tablespace: 空闲extent的管理放在数据字典里,空间的分配和回收会修改相关表!易产生碎片!
Temp表空间:初始创建时分配的大小只是最大值,并不是立刻就分配的大小,磁盘空间足够的话就可以创建永旧表空间来排序,不一定非要用,也不推荐用,会产生OS级别的碎片!restart时由SMON收回。
创建默认Temp表空间:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE default_temp2;
Temp表空间的限制:不能在没有新的临时表空间的情况下删除当前的临时表空间,不能被offline或改为永久表空间。
Create temporary tablespace userdata tempfile '/opt/oradata/undo101.dbf' size 10m extent management local;
设置数据库缺省的临时表空间
alter database default temporary tablespace tablespace_name;
系统/临时/在线的undo表空间不能被offline
永久表空间:初始创建时分配的大小就是立刻就分配的大小。
将表空间设为read only的限制条件:
1) 表空间必须online
2) 在线备份该表空间时不能设为read only
3) 系统会等待当前事务完成
4) 不能包含活动回滚段
只读表空间里的对象可以删除,因为删除只是在数据字典里删除这个对象
将数据字典管理的表空间转换为本地管理表空间:
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL(’SYSTEM’);
创建undo tablespace(只能用本地管理模式下)
create undo tablespace undo1 datafile '*.dbf' size 40M extent management local;
Dropping Tablespaces user
• INCLUDING CONTENTS :drops the segments.
• INCLUDING CONTENTS AND DATAFILES :deletes data files.
• CASCADE CONSTRAINTS drops all referential integrity constraints.
检查数据文件是否有extent的方法:检查DBA_EXTENT里是否有extent,如果无,则表明无数据!
使数据文件自动扩展:
1)create tablespace userdata datafile '*.dbf' size 100M AUTOEXTEND ON NEXT 5M MAXSIZE 200M;
2) alter database datafile '*.dbf' autoextend on/off;
手工修改数据文件大小(在open时操作,只要resize的大小大于已使用的即可)
alter database datafile '/opt/oradata/undo102.dbf' resize 50m;
给表空间扩展空间
alter tablespace userdata add datafile '*.dbf' size 10m;
移动数据文件:
1)将对应的表空间offline(系统会等待当前事务结束)
2)alter tablespace user rename datafile '*01.dbf' to '*02.dbf';
重命名系统表空间
1) sql>shutdown immediate;
2) sql>startup mount;
3) sql>alter database rename file '*1.dbf' to '*2.dbf';
表空间和数据文件的对应关系
select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts=t2.ts;
在创建表空间时,设置表空间内的段空间管理模式,这里用的是自动管理
create tablespace userdata datafile '*01.dbf' size 100M extent management dictionary default storage(initial 100k next 100k pctincrease 10) offline;
alter tablespace userdata mininum extent 10;
alter tablespace userdata default storage(initial 1m next 1m pctincrease 20);
将表的某分区移动到另一个表空间
alter table test move partition partition_name tablespace tablespace_name;
重要视图:
DBA_TABLESPACES
V$TABLESPACE
DBA_DATA_FILES
V$DATAFILE
DBA_TEMP_FILES
V$TEMPFILE
DATABASE_PROPERTIES
9. ORACLE 存储结构及关系
segment: 常用的有table,index,undo segment.
Extent: 在表空间里由segment使用的一大块空间,是segment的下一级。刚建立的tablespace没有新建segment,也就没有extent. Segment可以跨越多个datafile,但extent不可以。
存储字句优先顺序:
首先调用在segment级(除非在tablespace级使用minimum extent or uniform size),若没定义,就使用tablespace的定义,甚至db定义(数据库级initial 5个block,next 5 block)。
Extent的分配:当创建/扩展/修改segment时。
Extent的回收:当删除/修改/truncate segment时。
Drop:删除segment
Truncate:删除数据并重新初始化,truncate后只被初始化1个extent。
DB BLOCK:由一个或多个OS block组成,大小由DB_BLOCK_SIZE决定。 在创建表空间时建立,DB_BLOCK_SIZE只能通过重建数据库时重新修改。
Db_Cache_Size:早期版本用Db_Block_Buffers, 定义标准Block默认的Buffer Cache,至少一个颗粒。
非标准的block size: 最小为一个颗粒。若建立了2k的block size(非标准的),oracle会分配DB_2K_CACHE_SIZE的内存,此时DB_nk_Cache_Size(nk为标准块大小)无意义,因为标准块对应的内存大小已由Db_Cache_Size定义。
创建非标准块大小的表空间:
CREATE TABLESPACE tbs_1 DATAFILE ’tbs_1.dbf’ SIZE 10M BLOCKSIZE 4K;
多个block大小的限制条件:临时表空间必须使用标准块大小,分区对象的所有分区所在的表空间的块大小必须一致。
数据块管理的方式:
1) 自动segment空间管理方式:使用Bitmap(这个BITMAP存于??)来管理数据库segment,只能在tablespace级别Enable.
CREATE TABLESPACE data02 DATAFILE ‘/u01/oradata/data02.dbf’ SIZE 5M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO; 不定义则采用默认的手工管理,要改变只能重建tablespace.
2) 手动管理BLOCK(默认)。
pctused:如果数据块的使用率小于pctused的值,则该数据块重新加入到fresslist(位于segment)中。该数据块就可以插入数据。默认40.
pctfree:如果数据块的空余率小于pctfree的值,则该数据块从freelist中移出。该数据块不可以插入数据。留下一部分free值用于update。默认10.
Inittrans: 事务要访问数据block时系统会在block头里初始化事务槽(用于记录事务)。
Maxtrans: 最大的事务槽,事务槽越大,占用Block空间越多。
手工分配表空间段的分区(extent)大小
alter table kong.test12 allocate extent(size 1m datafile '/opt/oradata/undo102.dbf');
alter table kong.test12 deallocate unused; ---释放表中没有用到的分区
show parameter db;
alter system set db_8k_cache_size=10m; ---配置8k块的内存空间块参数。
碎片率: 临时表空间碎片率最大,undo表空间次之
数据对象所占用的字节数
select sum(bytes) from dba_extents where onwer='kong' and segment_name ='test';
重要的视图:
DBA_EXTENTS (relative_fno ??)
DBA_SEGMENTS(min_extents:若为20,初始化1个extent后再自动扩展19个)
DBA_TABLESPACES
DBA_DATA_FILES
DBA_FREE_SPACE
第十章:管理回滚段
undo 段应用于DML操作(insert,update,delete,merge),对应smon在做recovery时用到。
回滚段的作用:
1) 事务回滚(当执行rollback,会将会滚段数据写到数据表里
2) 事务恢复
3) 读一致性
读一致性:读取的数据是从undo段还是从数据文件的表里读取决于时间点(也即SCN),如果读的时间点(SCN)比commit时的SCN小,系统从undo段读取数据,如果比commit时的SCN大,就从数据文件的表里读取数据!
回滚段的类别:
1) 系统回滚段 (用于system 表空间)
2) 非系统回滚段 (用于其他表空间)
自动模式: 要求有一个undo tablespace
手工模式:
3) deferred :用于将表空间设为offline immediate,temporary或置于recovery状态
自动管理回滚段是oracle9i默认的方式,对应参数
undo_management=auto
undo_tablespace=undotbs
创建回滚段:
create undo tablespace undo1 datafile ‘*.dbf” size 50M;
alter tablespace undo1 add datafile
切换回滚段表空间:
1) create undo tablespace undo1 datafile ‘*.dbf” size 50M;
先创建一个回滚段表空间(一个DB里可以有多个undo 表空间,但一个实例只能激活一个undo表空间)
2) alter system set undo_tablepspace=undo1
3) 检查以前的UNDO表空间是否已无活跃事务
SQL> SELECT a.name,b.status FROM v$rollname a, v$rollstat b WHERE a.name IN ( SELECT segment_name FROM dba_segments)
AND a.usn = b.usn;
NAME STATUS
------------------------- ---------------
_SYSSMU4$ PENDING OFFLINE
若status为pending offline,可将旧undo段删除。
4) set rollback_segment为空
5) 检查参数文件里的undo表空间是否为现在的
6) restart db
仔细理解ORA-01555错误的原因
在自动化管理模式下执行手动管理命令,忽略回滚段的错误提示
alter system set undo_suppress_errors=true;
undo_rention 保留undo数据的时间,值越大,所需的数据空间越大。
show parameter undo;
select * from v$undostat 每隔十分钟间隔取undo的统计值
undo表空间的大小计算公式:
UndoSpace=[UR * (UPS * DBS)] + (DBS * 24)
UR :UNDO_RETENTION 保留的时间(秒)
UPS :每秒的回滚数据块
DBS:系统EXTENT和FILE SIZE(也就是db_block_size)
UPS(每秒的回滚数据块)的计算方法:
SQL> SELECT (SUM(undoblks) / SUM) ((end_time - begin_time) * 86400) FROM v$undostat;
undo表空间的大小计算
SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
FROM (SELECT value AS UR FROM v$parameter WHERE name = ’undo_retention’),(SELECT (SUM(undoblks)/SUM (((end_time-begin_time)*86400))) AS UPS
FROM v$undostat),(SELECT value AS DBS FROM v$parameter
WHERE name = ’db_block_size’);
select * from dba_rollback_segs;
-----------------------------------------------------------仔细看看
在自动管理模式下,不会真正建立rbs1;在手工管理模式则可以建立,且是私有回滚段。
create rollback segment rbs1 tablespace undotbs;
desc dbms_flashback;
在提交了修改的数据后,9i提供了旧数据的回闪操作,将修改前的数据只读给用户看,但这部分数据不会又恢复在表中,而是旧数据的一个映射
execute dbms_flashback.enable_at_time('26-JAN-04:12:17:00 pm');
execute dbms_flashback.disable;
回滚段的统计信息
select end_time,begin_time,undoblks from v$undostat;
select * from dba_rollback_segs;
v$rollname,v$rollstat,v$undostat,v$session,v$transaction;
show parameter transactions;
show parameter rollback;
在手工管理模式下,建立公共的回滚段
create public rollback segment prbs1 tablespace undotbs;
alter rollback segment rbs1 online;----在手工管理模式
在手工管理模式中,initSID.ora中指定 undo_management=manual 、rollback_segment=('rbs1','rbs2',...)、
transactions=100 、transactions_per_rollback_segment=10
然后 shutdown immediate ,startup pfile=....\???.ora
select * from dba_rollback_segs;
深入:
1) 回滚段探究(BY biti_rainy)
2) checkpointinginstructors.ppt
3) redo logs and recovery.ppt
原帖由 blue_stone 于 2006-11-17 17:35 发表
鼓励, 支持, 继续贴...