Database
一、先谈谈数据库和实例:
简单来说有时候这两个名词有时可以互换使用、但是其概念还是不同的。
实例是个动态概念,它由一系列进程和内存区域组成;而数据库是个静态概念,主要指的是构成数据库的一系列文件。一般情况下实例与数据库是一对一的,但是在多实例数据库环境下,一个数据库可以对应多个实例。
实例 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_data_files)、操作系统块为物理结构
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>
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
SYS_XDBPD$565_L
SYS_XDBPD$564_L
SYS_XDBPD$563_L
SYS_XDBPD$562_L
SYS_XDBPD$561_L
EXTRADATA566_L
NAMESPACES567_L
SYS_LOB0000074465C00
010$$
SYS_LOB0000074465C00
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
005$$
SYS_LOB0000074461C00
004$$
SYS_C0011041
SYS_C0011040
SYS_C0011039
SYS_C0011038
SYS_FK0000074510N000
07$
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
SYS_FK0000074510N000
09$
SYS_C0011037
ACTION_TABLE_MEMBERS
LINEITEM_TABLE_MEMBE
RS
SYS_IL0000074460C000
33$$
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
SYS_IL0000074460C000
26$$
SYS_IL0000074460C000
17$$
SYS_IL0000074460C000
12$$
SYS_IL0000074460C000
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
08$$
SYS_IL0000074460C000
05$$
SYS_IL0000074460C000
04$$
SYS_C0011034
SYS_C0011034
SYS_C0011034
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
SYS_IL0000074465C000
10$$
SYS_IL0000074465C000
05$$
SYS_C0011033
SYS_IL0000074461C000
04$$
PK_EMP
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
PK_DEPT
CATEGORIES_TAB
SUBCATEGORY_REF_LIST
_NESTEDTAB
PRODUCT_REF_LIST_NES
TEDTAB
PURCHASEORDER
PURCHASEORDER
LINEITEM_TABLE
SEGMENT_NAME
-------------------- ---------- ---------- ---------- ----------
LINEITEM_TABLE
LINEITEM_TABLE
LINEITEM_TABLE
LINEITEM_TABLE
LINEITEM_TABLE
ACTION_TABLE
SALGRADE
EMP
DEPT
已选择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
--------------------------------------------------------------------------------
---------- ---------- ---------- ----------
DEPT
4
EMP
4
BONUS
4
SEGMENT_NAME
--------------------------------------------------------------------------------
---------- ---------- ---------- ----------
SALGRADE
4
PK_DEPT
4
PK_EMP
4
数据库逻辑上最小的单元就是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
SQL> set linesize 100
SQL>
SQL> column
SQL> select SEGMENT_NAME,TABLESPACE_NAME from user_segments;
3、当前用户(scott)下的数据段:
SQL> desc user_segments
SQL> set linesize 100
SQL>
SQL> column
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
---------------------------------------- ----------
DEPT
EMP
SALGRADE
PK_DEPT
PK_EMP
基本上每个对象对应一个段(