LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

oracle数据库逻辑结构(2)

时间:2012-07-01 18:53来源:未知 编辑:admin 点击:
3. 表空间分类 表空间主要分为系统表空间(system、sysaux),数据表空间(user),回滚表空间(undotbs),临时表空间(temp)。 系统表空间 每个数据库都必


3. 表空间分类
表空间主要分为系统表空间(system、sysaux),数据表空间(user),回滚表空间(undotbs),临时表空间(temp)。
 
Ø    系统表空间
每个数据库都必须具备一个system表空间,该表空间是在数据库创建或数据库安装时自动创建的,名称不能更改,任何时候均必须保持online状态,用于存储系统的数据字典表,程序系统单元,过程函数,包和触发器等,也可用于存储用户数据表,索引对象。
为避免系统表空间产生磁场碎片以及争用系统资源的问题,应单独创建至少一个独立的表空间用来单独抽出用户数据。
sysaux表空间也随数据库的创建而创建,是system表空间的辅助表空间,主要存储存放支持oracle系统活动的多种工具如logminer等,sysaux降低了system表空间的负荷。
 
Ø    数据和索引表空间
由用户在数据建立完毕自行创建,是数据库空间的最主要组成部分,数据表空间应该建立多个,建立不同用户及性质的数据库对象时应指定其存放在指定的数据表空间中,索引表空间也应建立多个,并分类将不同对象的索引按大小及访问频度分别指定存放到指定的数据表空间中。
通常情况下,数据和索引表空间应建立适当多个,太少则单个表空间过大,数据不安全且恢复费时,太小则难管理。
数据库创建时默认创建users表空间,包含一个数据文件user01.dbf,新建用户的未指定存储表空间时默认使用该表空间。
 
SQL> create tablespace data01 datafile '/u01/data01.dbf' size 50M;
新建数据表空间
SQL> create tablespace index01 datafile '/u01/index01.dbf' size 50M;
                                                         新建索引表空间
SQL> create user kitty identified by "123456";      纯数字口令用“”
SQL> grant connect,resource to kitty;                     赋一组权限
$sqlplus kitty/123456
SQL> create table i (i char);
SQL> select table_name,tablespace_name from user_tables where table_name='I';
 
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
I                              USERS
 
SQL> select index_name,tablespace_name from user_indexes where index_name='II';
INDEX_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
II                             USERS
新建用户kitty所建表与索引都被查处在缺省users表空间中
SQL> conn sys as sysdba
SQL> alter user kitty default tablespace data01;
以sysdba更改默认使用表空间
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
I                              USERS
O                              DATA01
用户kitty所建表已被存储data01表空间中
SQL> create index oo on o (o);
SQL> select table_name,tablespace_name from user_indexes;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
O                              DATA01
I                              USERS
kitty所建索引也被查处在data01表空间中,要指定其存储表空间为index01,只能在建索引是显示指定。
SQL> drop index oo;
SQL> create index oo on o (o) tablespace index01;
SQL> select table_name,tablespace_name from user_indexes;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
O                              INDEX01
 
Ø    回滚表空间
undo数据又称回滚(rollback)数据,用户确保数据的一致性,当执行DML操作时,事务操作前的数据被称undo记录,undo表空间用于保存undo记录。undo表空间用户保存undo记录,是数据库空间的最关键的组成部分,其对数据库的运行影响很大。oracle 8i及之前称rollback tablespace,oracle 9i及之后成为undo tablespace
对delete操作,undo记录整行数据,update操作则只记录被修改的字段变化前数据,insert操作则记录插入记录的rowid(唯一)。
Oracle 9i以前使用回滚来管理undo数据,灵活但管理麻烦。oracle 9i后数据库通过建立undo表空间,由oracle自动分配回滚段的个数和大小来自动管理undo数据,管理简单但欠灵活。
数据库创建时默认建立一个回滚段表空间undotbs1,包含一个数据文件undotbs01.dbs。
SQL> show parameter undo;
NAME                                 TYPE        VALUE
-------------------- ----------- ---------------------------
undo_management       string      AUTO  undo数据的管理方式
undo_retention      integer     900
事务提交后undo数据继续保留(flashback查询)的秒数
undo_tablespace       string    UNDOTBS1  
当前使用的undo表空间名,默认系统中可回滚表空间,但只能一个能被在当前实例中使用
 
SQL> select tablespace_name,contents from dba_tablespaces;
                                  查询数据库中那些表空间是undo表空间
SQL> select to_char(begin_time,'hh24:mi:ss')
begin_time,to_char(end_time,'hh24:mi:ss') end_time,undoblks from v$undostat;
BEGIN_TI END_TIME   UNDOBLKS
-------- -------- ----------
18:32:39 18:43:24          8
查DB运行过程中每10分钟周期内事务所占block数。DB默认每10分钟自动生成统计。
 
SQL> create table t1 as select * from dba_objects where 1=2;
SQL> insert into t1 select *  from dba_objects;
SQL> select to_char(begin_time,'hh24:mi:ss')
begin_time,to_char(end_time,'hh24:mi:ss') end_time,undoblks from v$undostat;
BEGIN_TI END_TIME   UNDOBLKS
-------- -------- ----------
18:42:39 18:49:53        139
18:32:39 18:42:39          9
 
SQL>select r.name,s.serial#,s.sid,s.username,t.status,t.cr_get,t.phy_io,t.use
d_ublk,t.noundo,substr(s.program,1,40) from sys.V_$session s,sys.v_$transac
tion t,sys.v_$rollname r where t.addr = s.taddr and t.xidusn = r.usn;
查当前所有事务在回退段上所占的block数
 
SQL> select name,value from v$sysstat where name in
('user commits','transaction rollbacks');
NAME                                                                  VALUE
---------------------------------------------------------------- ----------
user commits                                                            114
transaction rollbacks                                                     1
查DB中回退事务与提交事务所占比例,回退事务应该尽量少

转载请保留固定链接: https://linuxeye.com/database/666.html

------分隔线----------------------------
标签:逻辑结构Oracle
栏目列表
推荐内容