表空间的管理
表空间的管理实际就是区空间的管理,因为区是最小的分配单元。
查看表空间的类型,都是LOCAL,称为本地化管理表空间。早期的是用数据字典管理,缺点产生空间碎片,过于复杂化。
所谓本地化管理就是指oracle不再利用数据字典来记录表空间的使用情况,而是在每个表空间的数据文件的头部加入了一个
byte位图,代表1个区的位图,0或者1,放的是一手房,记录每个区的使用情况。每当区被使用,或者释放,oracle会更新
数据文件头部的这个记录,反映变化。
SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT,ALLOCATION_TYPE from dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ---------- ---------
SYSTEM LOCAL SYSTEM
SYSAUX LOCAL SYSTEM
UNDOTBS1 LOCAL SYSTEM
TEMP LOCAL UNIFORM
USERS LOCAL SYSTEM
EXAMPLE LOCAL SYSTEM
EYGLE LOCAL SYSTEM
EYGLE1 LOCAL SYSTEM
EYGLE02 LOCAL UNIFOR
在本地管理表空间中,若db_block_size=8kb,则文件头会保留8个数据块。其中数据块1和2 用于记录
数据文件头信息,数据库3~8用于记录区间的位图信息
select file_id,tablespace_name from dba_data_files;
alter system dump datafile 8 block min 1 block max 3;
select value from v$diag_info where name ='Default Trace File';
查看的信息如下:
Start dump data blocks tsn: 9 file#:8 minblk 1 maxblk 3
Block 1 (file header) not dumped:use dump file header command
Block dump from cache:
*** 2013-08-02 14:41:10.914
Dump of buffer cache at level 4 for tsn=9, rdba=33554434
BH (0x36fe2ba4) file#: 8 rdba: 0x02000002 (8/2) class: 13 ba: 0x36c1e000
set: 5 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 272,28
dbwrid: 0 obj: -1 objn: -1 tsn: 9 afn: 8 hint: f
hash: [0x4e6ab384,0x4e6ab384] lru: [0x36fe2b7c,0x36fe2df8]
ckptq: [NULL] fileq: [NULL] objq: [0x4b920614,0x4b920614]
修改命令: alter session set events 'immediate trace name file_hdrs level 10';
DATA FILE #1:
name #13: +DATA/orcl/datafile/system.256.820439857
creation size=0 block size=8192 status=0xe head=13 tail=13 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:130 scn: 0x0000.00134d00 08/02/2013 09:58:12
Stop scn: 0xffff.ffffffff 08/02/2013 09:47:21
begin-hot-backup file size: 0
Checkpointed at scn: 0x0000.00134d00 08/02/2013 09:58:12
thread:1 rba:(0x19.2.10)
enabled threads: 01000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
01代表00000001,倒过来10000000即used,free,free,free,free,free,free,free,代表已经分配一个区间。
alter table EYGLE02 allocate extent;
03代表00000011,转换11000000,代表used,used,free,free,free,free,free,free,代表已经分配两个区间。
查看所有用户:
select username from dba_users;或者all_users
查看当前用户:
select username from user_users;或者show user
system表空间:
转储数据文件头信息:只有system文件头才有root dba,直接指向了引导表BOOTSTRAP$的数据块
SQL> alter session set events 'immediate trace name FILE_HDRS level 10';
Session altered.
SQL> select value from v$diag_info where name ='Default Trace File';
创建getbfno函数:
create or replace function getbfno(p_dba in varchar2)
return varchar2
is
l_str varchar2(255) default null;
begin
l_str:=
'datafile# is:'
||DBMS_UTILITY.data_block_address_file(TO_NUMBER(LTRIM(p_dba,'0x'),'xxxxxxxx'))
||chr(10)||'datablock is:'
||DBMS_UTILITY.data_block_address_block(TO_NUMBER(LTRIM(p_dba,'0x'),'xxxxxxxx'));
RETURN l_str;
END;
查看位于哪个文件,哪个数据块:
SQL> select getbfno('0x00400208') bfno from dual;
BFNO
--------------------------------------------------------------------------------
datafile# is:1
datablock is:520
查看存储的是什么对象,结果显示数据库启动引导表,这个对象正是创建其他对象需要的语句,这些语句需要
在数据库启动时被加载到内存中,再从硬盘上加载启动数据库元数据,从而启动数据库:
select segment_name,segment_type,header_file,
2* header_block from dba_segments where header_block=520
SQL> /
SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK
------------------------------ ------------------ ----------- ------------
BOOTSTRAP$ TABLE 1 520
select *from bootstrap$ order by obj#;
LINE# OBJ#
---------- ----------
SQL_TEXT
--------------------------------------------------------------------------------
CREATE TABLE FET$("TS#" NUMBER NOT NULL,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER
NOT NULL,"LENGTH" NUMBER NOT NULL) STORAGE ( OBJNO 12 TABNO 1) CLUSTER C_TS#(TS
#)
13 13
CREATE TABLE UET$("SEGFILE#" NUMBER NOT NULL,"SEGBLOCK#" NUMBER NOT NULL,"EXT#"
NUMBER NOT NULL,"TS#" NUMBER NOT NULL,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NO
T NULL,"LENGTH" NUMBER NOT NULL) STORAGE ( OBJNO 13 TABNO 1) CLUSTER C_FILE#_BL
OCK#(TS#,SEGFILE#,SEGBLOCK#)
LINE# OBJ#
---------- ---------- 。。。。。。。。。。