oracle数据库对象的逻辑和物理结构

Database Storage Hierarchy

一、先谈谈数据库和实例:

简单来说有时候这两个名词有时可以互换使用、但是其概念还是不同的。

 
 
实例是个动态概念,它由一系列进程和内存区域组成;而数据库是个静态概念,主要指的是构成数据库的一系列文件。一般情况下实例与数据库是一对一的,但是在多实例数据库环境下,一个数据库可以对应多个实例。
实例 instance =进程 + 进程所使用的内存(SGA)
数据库 database=物理操作系统文件或磁盘(disk)的集合(redo文件+control文件+data文件+临时文件)
数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合.
1、一个数据库可以被多个实例访问(称为真正的应用群集选项).
2、一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
3、Oracle的实例在启动以后,只能load一次数据库,如果想把数据库与Instance断开,然后再重新挂在一个数据库Instance,那么就需要你首先把数据库Instance进程结束,然后重新建立这个instance的一个进程,再load另外一个数据库。否则肯定要抛除ORA-16169错误,说数据库已经被打开。因为一个数据库Instance在其生存期中最多只能load和打开一个instance。.
4、另外实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义

二、数据库的逻辑结构


数据库(实例)——X表空间——X段——X扩展(区)——X数据块--(OS Block)

对应的数据字典:

v$database--dba_tablespaces(user_tablespaces)-- dba_segments(user_segments--dba_extents(user_Extents)--extent(或segment)表中的一个字段BLOCKS

数据库、表空间、段、扩展、数据块为逻辑结构

数据文件(dba_data_files)、操作系统块为物理结构


 段(segment)是一种在数据库中消耗物理存储空间的任何实体,在11g中段的类型由:表(table),索引(Index), 回滚(Rollback),分区等11种组成,下面的sql可查看所有段的类型。

SQL> select distinct segment_type from dba_segments;


SEGMENT_TYPE

------------------------------------------------------

LOBINDEX

INDEX PARTITION

NESTED TABLE

TABLE PARTITION

ROLLBACK

LOB PARTITION

LOBSEGMENT

TABLE

INDEX

CLUSTER

TYPE2 UNDO


已选择11行。



表和段的关系:表是段的一种(一个表可对应一个或多个段),但段不一定是表。表是逻辑对象;段是物理存储对象


通过下面的sql语句可以查看某个表空间的段、区、块的分布情况。

SQL>  select SEGMENT_NAME, extent_id,block_id,blocks,bytes  from dba_extents where  tablespace_name='USERS'; 


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

SYS_XDBPD$565_L      0        352    8   65536

SYS_XDBPD$564_L      0        336    8   65536

SYS_XDBPD$563_L      0        320    8   65536

SYS_XDBPD$562_L      0        304    8   65536

SYS_XDBPD$561_L      0        288    8   65536

EXTRADATA566_L      0        272    8   65536

NAMESPACES567_L      0        256    8   65536

SYS_LOB0000074465C00      0        224    8   65536

010$$


SYS_LOB0000074465C00      0        208    8   65536


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

005$$


SYS_LOB0000074461C00      0        176    8   65536

004$$


SYS_C0011041      0        520    8   65536

SYS_C0011040      0        512    8   65536

SYS_C0011039      0        504    8   65536

SYS_C0011038      0        496    8   65536

SYS_FK0000074510N000      0        464    8   65536

07$


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------


SYS_FK0000074510N000      0        480    8   65536

09$


SYS_C0011037      0        384    8   65536

ACTION_TABLE_MEMBERS      0        376    8   65536

LINEITEM_TABLE_MEMBE      0        368    8   65536

RS


SYS_IL0000074460C000      0        360    8   65536

33$$


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------


SYS_IL0000074460C000      0        344    8   65536

26$$


SYS_IL0000074460C000      0        328    8   65536

17$$


SYS_IL0000074460C000      0        312    8   65536

12$$


SYS_IL0000074460C000      0        296    8   65536


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

08$$


SYS_IL0000074460C000      0        280    8   65536

05$$


SYS_IL0000074460C000      0        264    8   65536

04$$


SYS_C0011034      0        240    8   65536

SYS_C0011034      1        408    8   65536

SYS_C0011034      2        448    8   65536


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

SYS_IL0000074465C000      0        232    8   65536

10$$


SYS_IL0000074465C000      0        216    8   65536

05$$


SYS_C0011033      0        192    8   65536

SYS_IL0000074461C000      0        184    8   65536

04$$


PK_EMP      0        152    8   65536


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

PK_DEPT      0        136    8   65536

CATEGORIES_TAB      0        488    8   65536

SUBCATEGORY_REF_LIST      0        472    8   65536

_NESTEDTAB


PRODUCT_REF_LIST_NES      0        456    8   65536

TEDTAB


PURCHASEORDER      0        248    8   65536

PURCHASEORDER      1        424    8   65536

LINEITEM_TABLE      0        200    8   65536


SEGMENT_NAME      EXTENT_ID   BLOCK_ID     BLOCKS   BYTES

-------------------- ---------- ---------- ---------- ----------

LINEITEM_TABLE      1        392    8   65536

LINEITEM_TABLE      2        400    8   65536

LINEITEM_TABLE      3        416    8   65536

LINEITEM_TABLE      4        432    8   65536

LINEITEM_TABLE      5        440    8   65536

ACTION_TABLE      0        168    8   65536

SALGRADE      0        160    8   65536

EMP      0        144    8   65536

DEPT      0        128    8   65536


已选择50行。





DBA_TABLESPACES记录的是表空间的逻辑信息,而DBA_DATA_FILES视图则记录的是物理数据文件的信息,这些信息包括数据文件的名称、大小、所属表空间等信息:

SQL>select file_id,relative_fno,file_name,tablespace_name,round(bytes/1024/1024,2) MB from dba_data_files;


可以通过DBA_SEGMENTS查询数据库中段的信息,这些信息包括对象名称、类型、所属表空间、空间使用等信息。


DBA_EXTENTS视图记录了Segment中区的分配情况,可以通过以下两个查询获得某个用户每个区的分配情况:

SQL> select distinct OWNER from dba_extents ;


OWNER

--------------------------------------------------------------------------------

MDSYS

TSMSYS

DMSYS

OUTLN

CTXSYS

OLAPSYS

SYSTEM

EXFSYS

SCOTT

DBSNMP

ORDSYS


OWNER

--------------------------------------------------------------------------------

SYSMAN

XDB

SYS

 

WMSYS


SQL> select segment_name,file_id,extent_id,block_id,blocks from dba_extents where OWNER='SCOTT';


SEGMENT_NAME

--------------------------------------------------------------------------------

   FILE_ID  EXTENT_ID BLOCK_ID     BLOCKS

---------- ---------- ---------- ----------

DEPT

4    0       9  8


EMP

4    0      25  8


BONUS

4    0      41  8



SEGMENT_NAME

--------------------------------------------------------------------------------

   FILE_ID  EXTENT_ID BLOCK_ID     BLOCKS

---------- ---------- ---------- ----------

SALGRADE

4    0      49  8


PK_DEPT

4    0      17  8


PK_EMP

4    0      33  8




数据库逻辑上最小的单元就是data block, block 可以设置为2K, 4K, 8K....

extent由block组成,segment则由extent组成,tablespace由segment组成,
datafile是数据库的物理表现形式,一个tablespace可以对应多个datafile,一个datafile只能属于一个tablespace。



利用dba_tablespaces可以用来查看所有表空间的基本信息;而dba_data_files可以用来查看相关数据文件的信息(需要管理员权限)

例:

1、查看当前数据库所有表空间

SQL> select TABLESPACE_NAME from dba_tablespaces;


TABLESPACE_NAME

----------------------------------------

SYSTEM

UNDOTBS1

SYSAUX

TEMP

USERS

MYMOTIF_TS


2、查询当前数据库中的所有表空间和对应的操作系统数据文件
SQL>   select file_name,tablespace_name from dba_data_files;

FILE_NAME TABLESPACE_NAME
---------------------------------------- ----------------------------------------
/opt/oracle/oradata/test/users01.dbf USERS
/opt/oracle/oradata/test/sysaux01.dbf SYSAUX
/opt/oracle/oradata/test/undotbs01.dbf UNDOTBS1
/opt/oracle/oradata/test/system01.dbf SYSTEM
/opt/oracle/oradata/test/mymotif_ts.dbf   MYMOTIF_TS


SQL> set linesize 100

SQL>  column  SEGMENT_NAME format a40

SQL> column  TABLESPACE_NAME format a40

SQL> select SEGMENT_NAME,TABLESPACE_NAME from user_segments;


3、当前用户(scott)下的数据段:

SQL> desc user_segments

 名称                                                是否为空? 类型

 ----------------------------------------------------- -------- ------------------------------------

 SEGMENT_NAME VARCHAR2(81)

 PARTITION_NAME VARCHAR2(30)

 SEGMENT_TYPE VARCHAR2(18)

 SEGMENT_SUBTYPE VARCHAR2(10)

 TABLESPACE_NAME VARCHAR2(30)

 BYTES NUMBER

 BLOCKS NUMBER

 EXTENTS NUMBER

 INITIAL_EXTENT NUMBER

 NEXT_EXTENT NUMBER

 MIN_EXTENTS NUMBER

 MAX_EXTENTS NUMBER

 MAX_SIZE NUMBER

 RETENTION VARCHAR2(7)

 MINRETENTION NUMBER

 PCT_INCREASE NUMBER

 FREELISTS NUMBER

 FREELIST_GROUPS NUMBER

 BUFFER_POOL VARCHAR2(7)

 FLASH_CACHE VARCHAR2(7)

 CELL_FLASH_CACHE VARCHAR2(7)


SQL> set linesize 100

SQL>  column  SEGMENT_NAME format a40

SQL> column  TABLESPACE_NAME format a40

SQL> select SEGMENT_NAME,TABLESPACE_NAME from user_segments;


SEGMENT_NAME TABLESPACE_NAME

---------------------------------------- ----------------------------------------

DEPT USERS

EMP USERS

SALGRADE USERS

PK_DEPT USERS

PK_EMP USERS


SQL> select SEGMENT_NAME,EXTENT_ID from user_extents;


SEGMENT_NAME  EXTENT_ID

---------------------------------------- ----------

DEPT  0

EMP  0

SALGRADE  0

PK_DEPT  0

PK_EMP  0



基本上每个对象对应一个段( Segment),只有分区对应多个段,这里的对象包括tableindexpartition等等,段可以跨越多个数据文件。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值