You are on page 1of 63

1.

oracle 服务器=oracle 实例+oracle 数据库


2. oracle 实 例 = 共 享 内 存 区 域 (sga)+ 后 台 进 程 或 线 程 ( 主 要 进 程 dbwn ,lgwr,ckpt
,arch,pmon,smon)
3. oracle 数据库即一系列的 os 文件,主要的文件有数据文件,日志文件和控制文件。
4. 其他文件:参数文件和口令文件
5. 其它进程: 高级队列,RAC,共享服务器,高级复制,

Oracle server 运行环境:


1. Client – application server – server : 客户端通过应用服务器访问 oracle
2. Client – server : 客户端直接通过网络访问服务器
3. Host—base : 客户端和服务器位于一台机器上

Oracle 服务器的两大重要组成部分:

一 。Oracle 实例
1. oracle instance 由共享内存结构和后台进程(windows 下线程)组成,用来管理数据库
2. 实例与数据库的关系
一个时刻,一个实例有且仅能 mount 一个数据库,而一个数据库可以由多个实例来管
理(例如 9i 以前的 ops,以及 9i 以后的 rac,都是可以一个数据库对应多个实例)
4. 区别实例和数据库
实例就是共享内存结构+后台进程(线程)
数据库就是一系列的 os 文件

连接到 oracle 实例

用户连接实例的过程:
1. 用户打开一个客户端工具,如 sqlplus,oracle forms.
2. 用户进程登陆到服务器,oracle 服务器为用户进程开启一个服务器进程 (这个应该是指
独占服务器模式下,共享服务器模式下用户进程不会直接连接到服务器进程而是连接
到调度器,如果存在空闲的服务器进程,调度器就将用户的请求传递给服务器进程 ),
服务器进程代表用户进程于 oracle 实例通信以及执行 sql 语句。

Connection:

用户进程和服务器的一个通路,建立连接的三种方式

1. 客户端和服务器位于一台机器上,通过 interprocess 建立 connection


2. 客户端和通过网络连接到 oracle 服务器,这也就是常见的 cs 结构
3. 客户端通过网络连接到应用服务器,应用服务器再通过网络连接 oracle 服务器,这就
是常说的三层结构。
Session
Session 是用户到数据库的特殊连接,这里的特殊是指用户是合法的 (即用户名和密码是正
确的),当用户正常退出或者异常中断的时候都会导致 session 结束。一个用户可以起很多个
session,如运行不同的客户端工具。

共享服务器和独占服务器的区别:
独占服务器是指一个服务器进程只能为一个客户端进程服务,并且用户进程直接和服务器
进程连接。对于共享服务器进程,一个服务器进程可以为不同的客户进程服务,共享服务器
中,客户进程是直接于调度器连接,并非是服务器进程。

二.Oracle 数据库

Oracle 数据库即一系列的 os 文件,由三个部分组成,控制文件,数据文件和日志文件。


数据库由逻辑结构和物理结构之分:

1.
数据库的物理结构,主要由三个类型的文件组成,控制文件,数据文件和日志文件。

控制文件:存储了数据库的结构信息,还有 checkpoint 信息,同时 rman 的备份信息也是存


储在控制文件中,对于 rman 没有使用 catalog 的话,控制文件是很重要的,控制文件中的
内容分为可重用和不可重用,如数据文件和日志文件的信息就属于不可重用的部分, rman
的信息就属于可重用的部分和 control_file_record_keep_time 这个参数有关(控制文件必须
保留 rman 信息的最短时间), 建议将控制文件保存在多个不同的磁盘,这几个文件互为镜
象,如果所有控制文件都损坏可以重建,重建控制文件读取数据头的信息。

数据文件: 数据库中所有的数据都存储在这类文件中,我将它分为四类, system 文件(10g


中是 system,sysaux,9i 中的 system), 撤消文件( undo ,一个数据库虽然可以建立多个 undo
tablespace ,但是一个时刻只能使用其中的一个) ,临时文件(主要用来排序 ),用户数据文件
(除去以上三类)

日志文件: 日志记录了数据库中的重做信息,用户的操作都会被记录在日志文件中,实例恢
复利用 status 为 active 和 current 的日志。

当数据库异常关机(abort),或者因为某种原因而异常当机,那么下次启动的时候就要做实例
恢复,实例恢复的第一个过程是 roll forward(前滚),即将数据库恢复到当机前的那个时刻。
接着就 open 数据库,数据库打开后做 roll back。

2.
其它的文件主要有参数文件(initsid.ora 或者服务端参数文件),口令文件,归档日志文件。

参数文件:记载了数据库启动信息,nomount 的时候就要读取参数文件。
Oracle 的认证模式主要有口令文件认证和 os 认证。

认证就要通过口令文件。
口令文件存储了 sysoper 和 sysdba 用户的密码信息,可以通过查询 v$pwfile_users 来查询具
有 sysoper 或 sysdba 的用户。
Os 认证:
对 于 windows , os 的 用 户 要 在 oracle_dba 组 中 , 同 时 SQLNET.AUTHENTICATION_SERVICES=
(NTS)
对于 linux ,只要 os 的用户在 oracle_dba 组中即可。

归档文件:这类文件只会在归档模式下存在 ,就是日志文件的副本,alter system switch


logfile,alter system archive log current 以及数据库自己引起的日志切换都会触发 arch
进程归档。

Oracle 内存结构: sga+pga

Sga :共享内存区域,所有的进程共享,sga 在数据库 nomount 的过程中分配


Pga :进程全局区,又称私有全局区,和进程一一对应,其他进程不能访问。服务器进程进程
启动的时候分配。
Uga: 用户全局区域,和会话对应。对于共享服务器模式,uga 来自 sga,独占服务器模式 uga
来自 pga 。

Sga 分类:
1. 动态 sga : 允许在线修改 sga 的组成部分,直接生效。动态修改的 2 个前提(1)使
用服务端参数文件 (2) 修改后的 sga 的总和小于或等于 sga_max_size。
2. 定制(size)sga :在参数文件中把 sga 的各个组件设置好。

Sga 的分配:

粒度(granule): sga 分配和收缩的最小单元。


9i : if sga_max_size<128m
then granule=4m
else if platform=windows
then granule=8m
else
granule=16m

10g :
if sga_max_size<1g
then granule=4m
else if platform=windows
then granule=8m
else
granule=16m

也可以查视图 v$sga_dynamic_components

Sga 的最小值是三个粒度 , one granule for fixed sga (include log_buffer), one for buffer cache
,one for shared_pool (摘自 sg)

Sga 的主要组成部分:
一.Shared pool
Shared pool : 存储最近使用的 sql 语句和数据定义 ,大小设置 shared_pool_size ,可以通过
alter system 在线改。
Shared pool 的主要组成部分
1. 库高速缓存区(library cache) ,大小受限于 shared_pool_size, 为了共享相同的 sql 语句,
避免不要的硬分析,library cache 使用 LRU 算法。(相关视图 v$librarycache)
(1) 共享 sql 区: 存储 sql 语句的执行计划和分析树,下次运行相同的语句时,可以
直接执行语句,从而避免再次分析 。(语句是否共享和 cursor_sharing 的设置
有关)
Cursoring_sharing http://www.dba-
oracle.com/t_cursor_sharing_cached_cursors.htm
http://www.oracle.com/technology/oramag/oracle/06-jan/o16asktom.html
(2) 共享 plsql 区: 共享最近执行的 plsql 语句,包括分析和编译的程序单元(存储
过程,函数,包和触发器)

3. 数据字典缓存区(dat dictionary cache ),依赖于 shared_pool_size, 存储数据字典信息


提高响应时间。(相关视图 v$rowcache)

二.Buffer cache

从数据文件中读取的数据先缓存到 data buffer 中,如果下一次要读取相同数据的时候可以


直接从 data buffer 中提取,减少物理读,遵循 LRU 算法。

Buffer cache 大小的设置:


1. db_cache_size : 默认 cache 的大小,不能设置为 0,从数据文件中读取的数据默认放这
个池。
2. db_keep_cache_size : 保留池的大小,如果一个表很小而有经常查询,可以将这个表
keep 到保留池
3. db_recycle_cache_size: 回收池的大小,如果一个大对象基本不会被重用,可以放到这个

这三个池相互独立。

buffer cache 中 buffer 的大小,默认是 db_block_size, 9i 中可以为用户表空间设置不同的块大


小,前提是设置 db_nk_cache_size(n=2-32,n 的大小与平台有关,有的平台 n 不能为 32),
不同块大小的 buffer cache 也是相互独立。

Buffer cache 的大小可以通过 alter system 修改在线改。

三. Log_buffer :
用户对数据库所有修改先存在到 log_buffer 中,然后由 lgwr 进程将 log buffer 中的数据写入
日志文件。保证数据的一致性。

由 log_buffer 参数控制大小,可以再线改。

四.Large pool (可选池)

1. 共享服务器下,uga 优先从 large pool 分配


2. rman 备份也会使用 large pool ,前提是当 backup_slave_io=n ( 这个参数我在 10g 中没找
到,不知道被什么参数替代),backup_tape_io_slaves=true,并且 large pool 能够分配足够
的内存,否则将会在 alert.log 中记录一条错误信息,而且不使用 io_slaves 做备份和恢复。

参数 large_pool_size,可以通过 alter system 在线改。

五.Java pool (可选)

如果安装并且使用 java,就要设置 java_pool,大小由 java_pool_size 确定,9i 中默认值 24m。

PGA

PGA 包含服务器进程和后台进程的数据信息和控制信息的内存区域, pga 在进程创建是创


建,销毁是销毁。

独占模式下 pga 的结构:


Sort area, session information, cursor state, stack space

进程结构 :

1. 用户进程: 当客户端向数据库请求连接时创建,用户进程不与数据库服务器直接通信。
2. 服务器进程: 当用户和数据库建立连接后,服务器进程启动,独占模式下,一个服务器
只能为一个用户进程服务。共享模式下,一个服务器进程可以为多个用户进程服务。
3. 后台进程 :
(1) dbwn (必须) :负责将数据库缓存区中的数据写如数据文件。触发条件
1. Increment checkpoint and normal checkpoint
2. The number of dirty buffers reaches a threshold value (threshold value 是多少呢???)
3. A process scan a specified number of blocks when scaning for free buffer but not
found.(specified number 指多少???)
4. Timeout cursor . (多长写一次???)
5. A ping request in RAC enviorment (不知道 ping request 啥意思)
6. Tablespace offline (exclude immediate)
7. Modify Tablespace readonly
8. Drop or truncate a table
9. Alter tablespace tablespace_name begin backup;

(2) lgwr (必须) :负责将 log buffer 中的内容写到 logfile ,触发条件:


1. commit
2. 1/3 full
3. 1 m
4. 3 seconds
5. dbwn writes

(3) smon(必须) 作用:


1. 实例恢复。(1)前滚 (2)打开数据库 (3)回滚未提交事务
2. 合并空闲空间 (这个好象是数据字典管理里面才有的吧????)
3. 释放临时表空间

(4)pmon(必须)作用:
清理失败的进程 。(1)回滚事务(2)释放锁 (3)释放资源 (4)重启死亡的调
度器。

(5) ckpt (必须) 作用:


1.触发 dbwn
2.修改数据头的检查点信息
3.修改控制文件的检查点信息
分类:
1. 完全检查点(alter system checkpoint 和 正常 shutdown)
2. 增量检查点

检查点的事件:将内存中的数据块写入磁盘

(6)arch (非必须但是非常重要) 作用:


Arch 进程在归档模式下才存在,当日志切换(包括手工)发生的时候, arch 服务将
当前的在线日志归档,并切换到下一个日志组,非归档模式下不存在这个进程。

数据库的逻辑结构:

1. 数据库由表空间组成
2. 表空间由段组成
3. 段由区组成
4. 区由连续的块组成
5. 块是 io 的最小单位

Dml 语句的处理过程

1. 查找要修改的数据,如果在 buffer cache 中不存在则从数据文件读取


2. 服务器进程给需要修改的行加锁,同时通过 rollback segment 或者 undo 提供读一
致性,和回滚事务
3. 将数据块修改成新值。

参考资料:sg ,oracle 9i&10g 编程艺术

Oracle Universal Installer : 用来安装,升级或者删除软件


Oracle database configuration assistant : 用来创建删除或者修改数据库的属性
Password file utility :口令文件创建工具
Sqlplus : 访问数据库的工具
Oracle Enterprise Manager : 具有图形用户界面的工具,用来管理,监控和调整一个或者多
个数据库

Oracle 的认证模式 :os 认证和口令文件认证

Os 认证只是对本地连接而言。

Os 认证 :1.用户必须属于ora_dba组,windows下必须SQLNET.AUTHENTICATION_SERVICES=
(NTS)。

口令文件认证:
关于参数 remote_login_passwordfile
(1) none :不使用口令文件认证
(2) exclusive : 只允许一个实例使用口令文件,同时存储 sysdba 和 sysoper 的密码
(3) shared: 多个实例可以共用一个口令文件,同时只存储 sys 的密码,口令文件不能被
修改。

Orapwd 工具可以创建口令文件,参数 unix 下是放在 dbs 下,windows 是放在 database 下,


参数 file= 口令文件所在的路径 , entries 最多存储几个具有 sysdba 或者 sysoper 的用户,
password 是 sysdba 或者 sysoper 的密码。

1. 参数文件 : oracle nomount 的过程中必须读取参数文件并从中获取实例启动的一些信


息。
(1) 文本格式的 pfile ,windows 下一般位于 database 下,取名 initsid.ora,可以用文本编
辑器直接修改,修改后的参数在系统下次启动时生效。
(2) 二进制格式的 spfile: 由 oracle 服务器维护,可以查看但是绝对不能用手工修改 (可
能导致系统启不来 ),要通过 alter system 的方式修改,存放位置于 pfile 类似,参数
scope 可以取三个值,memory,spfile,both.
Both 是默认值,即参数的修改既对当前实例也对 spfile 生效
Spfile 有些启动参数没法通过 both,可以设置为 scope=spfile,下次启动后生效
Memory 参数的修改只对当前实例有效
(3)通过 pfile 创建 spfile
Create spfile from pfile=’实际位置’
(4) 通过 spfile 创建 pfile
Create pfile=’实际位置‘ from spfile ;
(5) show parameter spfile 查看是否为 spfile 启动
2. 使用 OMF 管理文件
Db_create_file_dest 设置数据文件的默认位置
Db_create_online_log_dest_n :设置控制文件和日志文件的默认位置

以前没用过 omf 来个简单的例子 :


SQL> alter system set db_create_file_dest='G:\oracle\product\10.2.0\oradata';

系统已更改。

SQL> create tablespace test;


表空间已创建。

SQL> select name from v$datafile where ts#=(select ts# from v$tablespace where
name='TEST');

NAME
--------------------------------------------------------------------------------
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\O1_MF_TEST_3GNPQHH
W_.DBF

SQL> alter system reset db_create_file_dest scope=spfile sid='*'; //将参数变为原值

系统已更改。
SQL> show parameter db_create_file_dest;

NAME TYPE VALUE


------------------------------------ ----------- ------------------------------
db_create_file_dest string G:\oracle\product\10.2.0\orada
ta
SQL> startup force;
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter db_create_file_dest;

NAME TYPE VALUE


------------------------------------ ----------- -----------------------------
db_create_file_dest string

3.Oracle 的启动过程
( 1 ) nomount : a. 读取参数文件 (spfilesid.ora->spfile.ora->initsid.ora, 或者手工指定 pfile
的位置)
b. 分配 sga
c. 启动后台进程
d. 打开 alertsid.log 和跟踪文件
必须在 nomount 状态下做的操作
A. 创建数据库
B. 重建控制文件

(2) mount : 通过参数文件中的 control_files 读取控制文件,同时获取日志文件和数据文


件的位置信息(不检查存在性)
必须在 mount 状态下做的操作
a. 移动数据文件和日志文件 (这里指 alter database rename 的方式)
b. 启动和关闭归档
c. 启动闪回
d. Recover database ;

(3) open : 打开数据文件和日志文件, open 之前可能要执行实例恢复( smon 完成),


open 之前先前滚将数据库恢复到当机时刻,然后打开数据库, open 之后可能要做回
滚。
介质恢复和实例恢复:

介质恢复: Oracle 启动过程中会判断是否要做介质恢复 ( 利用归档,备份或者是


redo),oracle 比较控制文件的 scn 和数据头的 scn 如果不一致则要进行介质恢复。分 2
种情况,如果控制文件的 scn 小于数据头的 scn,则说明控制文件比数据文件旧 ,这
时的要加 using backup controlfile 做恢复。如果控制文件的 scn 大于数据文件的 scn,则
直接 recover database。

实例恢复: oracle 启动过程如果发现 v$datafile 中的 last_change#为空则要求进行实例恢


复,实例恢复只使用在线日志,更直接的说只使用 active 和 current 状态的在线日志,
实例恢复的起点是 low rba。

启动的语法
Startup [force],[restrict],[mount] ,[pfile] ,[nomount],[recover]

1. 不带参数的 startup 就是直接启动到 open 状态


2. startup force =shutdown abort +startup
3. startup restrict 只允许有 restricted session 的用户才能登陆 mount,启动到 mount 状

4. pfile 手工指定启动参数文件
5. nomount 启动到 nomount 状态
6. recover 启动过程进行介质恢复 (这参数还没用过)


受限模式下的数据库

1. 原来是以 restrict 模式打开数据库的,只有具有 restricted session 权限的用户才能登


陆。
2. Open 后执行, alter system enable restricted session ; 对于已经登陆的用户不受影响,
以后 登陆 的用 户就 要具 有 restricted session 权 限才 能登 陆。 (alter system disable
restricted session)取消受限模式。

只读打开数据库

1. 允许用户查询
2. 如果是使用本地管理的临时表空间则可以做磁盘排序操作
3. 只读模式允许对数据文件进行 offline 和 online ,同时可以对离线的表空间或者数
据文件做恢复,以及一些不产生 redo 的操作

第三个以前没搞过做个 test
1. 对离线的数据文件做恢复
SQL> alter database datafile 4 offline drop;

数据库已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open read only;

数据库已更改。

SQL> alter database datafile 4 online;


alter database datafile 4 online
*
第 1 行出现错误:
ORA-01113: 文件 4 需要介质恢复
ORA-01110: 数 据 文 件 4:
'G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'

SQL> recover datafile 4;


完成介质恢复。
SQL> alter database datafile 4 online;

数据库已更改。

2. 对离线的数据表空间做恢复

SQL> alter tablespace users offline immediate;

表空间已更改。

SQL> shutdown immediate


数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open read only;

数据库已更改。

SQL> recover tablespace users;


完成介质恢复。

SQL> shutdown immediate


数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> alter tablespace users online; //这里能直接 online 说明刚才的 recover 起作用了

表空间已更改。

3. Read only 模式下能对数据文件做 online 和 offline


SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open read only;

数据库已更改。

SQL> alter database datafile 4 offline;

数据库已更改。

SQL> alter database datafile 4 online;

数据库已更改。

4. Read only open 不做实例恢复的测试

SQL> shutdown immediate


数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open read only;

数据库已更改。

SQL> startup force mount


ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> select last_change# from v$datafile;

LAST_CHANGE#
------------
1146688
1146688
1146688
1146688

SQL> alter database open read only;

数据库已更改。

SQL> startup force


ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> startup force mount
ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> select nvl(last_change#,0) from v$datafile;

NVL(LAST_CHANGE#,0)
-------------------
0
0
0
0
棉花糖 ONE(372368042) 21:50:39
很明显,第一个不用做实例恢复,所以 alter database open read only 就直接打开了
棉花糖 ONE(372368042) 21:52:07
SQL> select nvl(last_change#,0) from v$datafile;

NVL(LAST_CHANGE#,0)
-------------------
0
0
0
0

SQL> alter database open read only;


alter database open read only
*
第 1 行出现错误:
ORA-16005: 数据库需要恢复

SQL> alter database open;

数据库已更改。

第二个必须进行实例恢复,所以没法 read only 打开

(*)v$datafile 中的 last_change#是无穷大应该是针对非只读模式打开的

SQL> startup mount


ORACLE 例程已经启动。

Total System Global Area 167772160 bytes


Fixed Size 1247876 bytes
Variable Size 75498876 bytes
Database Buffers 83886080 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> alter database open read only;

数据库已更改。

SQL> select checkpoint_change#,last_change# from v$datafile;

CHECKPOINT_CHANGE# LAST_CHANGE#
------------------ ------------
1167342 1167342
1167342 1167342
1167342 1167342
1167342 1167342

只读模式下运行写其它文件,如控制文件,altert.log,trace,operation system audit trails;


数据库的关闭:

Shutdown mode A I T N
Allow new connection no no no no
Wait until current sessions end no no no yes
Wait until current transactions end no no yes yes
Force a checkpoint and close files no yes yes yes

Shutdown 数据库的用户必须具有 sysoper 权限或者 sysdba 权限

正常 shutdown(not abort)

执行一个完全 checkpoint,将数据头的 scn 同步到数据库的结束 scn,将 buffer cache 中的内容


写入数据文件,回滚未提交的事务,释放资源,下次启动无须做实例恢复。

非正常 down 机: (shutdown abort ,instance failure 或者 startup force )

不执行完全 checkpoint,buffer cache 中的数据不会写入数据文件,即全部丢失,不会回滚未


提交的事务,下次启动的时候使用 redo 做实例恢复,恢复到实例失败的那个时刻的状态,
然后打开数据库,利用 undo 回滚未提交的事务,同时释放资源。

通过监控诊断文件来管理实例:

1. alertsid.log 按时间的顺序记录了数据库的错误信息,如坏块, ora-600 , ora-


3113,数据库的启动信息,日志切换信息,表空间创建和删除信息等,位置也
是由参数 background_dump_dest 决定。
2. 后 台 跟 踪 文 件 : 由 后 台 进 程 产 生 , 文 件 存 放 位 置 由 初 始 参 数
background_dump_dest 决定,命名方式,sid_processname_pid.trc
3. user_trace_file : 用户跟踪文件包含了 sql 语句的统计信息,以及用户的错误信
息,存放在 user_dump_dest 目录下,大小有 max_dump_file_size 决定,默认是
10m,命名方式 sid_ora_pid.trc.
开启用户 trace 的方法,设置会话级别的 sql_trace 为 true ,设置 instance 级别
的 sql_trace 为 true,dbms_system.set_sql_trace_in_session 设置会话级别。

数据字典视图 :
1. 当创建数据库的时候,oracle 创建对象的结构信息并存放在数据文件中
分类: 1.数据字典 2.动态性能视图

2.数据字典: 是一系列的只读表或者视图,主要用来描述数据库和数据库对象
主要分为 2 类:
1.
基表: 存储了数据库的结构信息,是数据库创建时第一个创建的对象,通过 sql.bsq 创建,
只有 oracle 服务器才能写这些表,用户很少直接访问这些表,不要直接对基表执行 dml
操作,除了 aul$.
2.
数据字典视图: 根据基表来创建的视图,简化基表的信息,由 catalog.sql 创建

3.数据字典的内容
a. 数据库中所有模式对象的定义 (包括表,视图,索引,聚簇,同义词,序列,存储过程 ,
函数,包,触发器等。
b.模式对象所分配的空间,以及已使用的空间
c.列的默认值
d.完整性约束
e.oracle 的用户名
f.用户被授予的权限和角色
g.审记信息,如用户能修改或者访问模式对象

3.数据字典的使用 :
1.oracle 服务器通过数据字典查找用户,模式对象以及存储结构的信息
2.当一个 ddl 发生是 oracle 服务器自动修改数据字典
3.User 和 dba 可以通过数据字典查找一些数据库的相关信息

4.Oracle 如何使用数据字典
数据字典中的基表只能 oracle 服务器对它进行修改。在执行数据库操作, oracle 通过读取
数据字典来确认模式对象是否存在,以及用户是否有权限访问,当数据库的结构发生变
化时,oracle 服务器将更新数据字典。

5.用户和数据库管理员如何使用数据字典

对于所有的数据库用户来说,数据字典视图被做为字典来使用,有些视图所有用户都能
使用,有些视图只有数据库管理员才能使用。

数据字典视图分类:
1. dba- 数据库中的所有对象
2. all- 用户能访问的所有对象
3. user- 用户所拥有的所有对象

数据字典视图是静态视图主要回答如下问题:
1. 对象是否已经创建
2. 对象的拥有者是谁
3. 用户具有哪些权限
4. 对象具有哪些限制

动态性能视图:记录了当前数据库的行为
1.当数据库发生变化的时候就会被更新
2.信息来自内存或者控制文件
3.Dba 使用动态性能视图监控和调整数据库
4.动态视图的拥有者是 sys
5.动态视图不能执行 dml

动态性能视图用来回答
1. 对象是否可用,对象是否在线
2. 对象是否打开
3. 是否拥有锁
4. 会话是不是活跃的

查询数据字典和动态性能视图

可以通过查询数据字典和动态性能视图来获取信息
1. 通过 dictionary 查询可用的视图
2. 使用使用 describe 和 select 来获得可用的列,以及列的内容
3. 列的注释能够得知这个列在这个视图中的含义。

Dict 是 dictionary 的同义词

General view :

Dictionary ,dict_columns

Schema objects:

dba_indexes,dba_tables,dba_constraints,dba_tab_columns
space allocation:

dba_segments ,dba_extents

database structure :

dba_tablespaces ,dba_data_files

控制文件是一个二进制文件,描述了物理数据库的当前状态
1. 丢失控制文件,需要恢复数据库 (感觉不完全对,正常 shutdown 删除控制文件可以直
接重建就行了)
2. Mount 的时候被读取
3. 只能与一个数据库对应,即某个或者某组控制文件只能被一个数据库使用
4. 建议采用 multiplex
5. 保证数据库的完整性
6. 初始化大小在创建数据库是确定

控制文件是启动和操作数据库过程中所必须的二进制文件,控制文件只与一个数据库相关 ,
数据库在启动过程中,必须读取控制文件,确认数据库是处于 valid 的状态,控制文件在数
据库被使用的时候更新,因为在数据库打开的时候,控制文件必须可写,控制文件的信息
由数据库服务器修改,dba 或者用户不能直接编辑控制文件。如果由于某种原因导致控制文
件不可用,那么数据库将不能正常工作,如果所有控制文件丢失,那么下次启动数据库的
时候必须做恢复或者重建,数据库必须保证至少有一个控制文件,最多可以达到 8 个。

控制文件的大小:

控制文件的大小受 maxlogfiles,maxdatafiles,maxlogmembers,maxinstances,maxloghistory 的影
响,这些参数如果达到峰值,那么控制文件会自动扩展。

控制文件的内容:

1. 数据库名和 dbid
2. 数据库的创建时间
3. 表空间的名字
4. 数据文件和日志文件的名字和位置
5. 当前日志文件的序列号
6. 检查点信息
7. undo 的信息
8. 归档日志文件的信息
9. rman 的备份信息

控制文件的内容分为可重用和不可重用:

可重用部分如 rman 备份数据文件和日志文件的信息,这些部分只能被 rman 重用

对控制文件做多功:

通过修改 spfile
1. 修改 spfile (alter system set control_files=(’’,’ ‘,’ ‘,’’) scope=spfile; )
2. 正常关掉数据库(not abort)
3. cp 控制文件到新位置
4. startup

通过修改 initsid.ora

1. shutdown normal
2. 修改 initsid.ora 中的 control_files
3. cp 控制文件到新位置
4. startup

控制文件的备份:
当数据库的物理结构发生变化,应该立即对控制文件做个备份。
1. Alter database backup controlfile to ‘filename’;
2. Alter database backup controlfile to trace as ‘filename’ ; //生成重建控制文件的脚本

OMF 管理控制文件(如果创建数据库的时候不指定 control_files,默认使用 OMF)

1. 取消参数 control_files //注释掉这个参数


2. 设置参数 db_create_online_log_dest_n
3. 控制文件名由系统产生,并在 alertsid.log 中显示

从控制文件中获取的信息:

V$controlfile :列出控制文件的名字和状态信息
V$parameter :从参数文件中获取控制文件的相关信息
V$controlfile_record_section :列出控制文件中个组成部分的信息
Show parameter control_files :列出控制文件的名字,位置,和状态
从控制文件中获取信息的一些动态视图
1. v$backup
2. v$datafile
3. v$logfile
4. v$database
5. v$log
6. v$tempfile
7. v$archive
8. v$archived_log
9. v$loghist
10. v$tablespace

REDO : redo 记录了数据的所有改变,为介质失败和系统失败提供恢复。


1. Redo 是按组来划分的
2. Oracle database 至少需要 2 个组(循环使用)
3. 每个组至少要一个 log 成员(oracle 建议使用多个日志成员做 multiplex),一个日志组的
成员是互为镜象,完全相同的,为了安全建立每个日志组至少 2 个成员,并放在不同
的磁盘上。

日志提供了事务的一致性,每个事务的改变同步到日志文件为了反正介质失败或者 system
故障(除了 direct loads, direct reads with nologging option ),这些包括未提交的事务,回滚
段信息,段和对象的语句。 Redo 用于恢复已经提交了但还没写入数据文件的数据,只有
redo 才用于实例恢复。

数据库管理员可以为一个日志组维护多个 copy,以防止单点故障导致数据库的信息丢失

Online Log group


1.一系列相同的日志的几个就做一个日志组。
2.相同日志组中的成员具有相同的序列号和大小,当 oracle 开始写一个日志组的时候就赋
予这个日志组一个序列号,当前日志的序列号记录在控制文件和数据头中

创建初始化日志组:
初始化日志组的个数和成员在数据库创建的时候创建。
1. 日志的个数受到 create database 中的 maxlogfiles 的限制,maxlogfiles 指日志组的最多个
数。
2. Maxlogfiles 的最大值受限于 os
3. Maxlogmembers 限制了日志组最多的日志成员,这个参数的最大值受限制于 os

(*)对以上的这部分内容有怀疑,没试过 9i 不知道,10g 是会自动扩展日志

Redo logs 的工作原理:

a.Redo 是循环使用的,a->b->c-a
b.当日志满的时候,lgwr 将移到下个日志组。
1.这个就称做日志切换
2.引起检查点(非完全检查点)
3. 检查点信息会被写入控制文件

c.oracle 将数据库的所有改变顺序的写入 log buffer,lgwr 再将 log buffer 中的内容写入日志文


件,lgwr 将 log buffer 中的内容写入日志文件发生在如下情况

1. 提交
2. 1/3 满
3. 达到 1m
4. Dbwr 将数据缓冲区的内容写入数据文件之前触发 lgwr 写日志

日志的序列号当下次被使用的时候将被付成新值。

日志切换:
Lgwr 顺序的写日志文件,当当前的日志满的时候, lgwr 开始往下一个日志组写,这个行为
称为日志切换。

Checkpoint (这里指日志切换引起的):
当检查点发生的,并将日志相关的 data buffer 的内容写入数据文件,要写的缓冲区数目受
到参数 fast_start_mttr_target 的影响 。

后台进程 ckpt,更新数据头和控制文件,来反映 checkpoint 已经完成。

Checkpoint 发生的条件:

1. 日志切换
2. shutdown immediate,transactional, normal
3. fast_start_mttr_target 影响检查点的频率
4. dba 手工执行 alter system checkpoint;
5. when alter tablespace [offline normal ,offline temporary | read only | begin backup ]

设置 log_checkpoints_to_alert 为 true,就会把检查点的信息记录到 alertsid.log 中,默认值为


false。

强制日志切换和强制检查点

1. 日志切换和检查点都会有系统自动触发
2. 管理员可以执行
Alter system switch logfile ; //手工切换日志
Alter system checkpoint; //手工触发检查点

Checkpoint can be force 通过使用 fast_start_mttr_target


Fast_start_mttr_target 是 fast_start_io_target 和 log_checkpoint_time 的 简 化 版 , 如 果
fast_start_mttr_target 设置为 600,那么实例恢复的时间将不会超过 600s,oracle 会调整
其 它 参 数 来 满 足 这 个 要 求 。 如 果 设 置 了 fast_start_mttr_target 那 么 将 不 能 设 置
fast_start_io_target 和 log_checkpoint_timeout, fast_start_io_target 和
log_checkpoint_timeout 以及 log_checkpoint_interval 再 9i 中被 fast_start_mttr_target 替代。

日志组的管理:

1. 添加日志组

Alter database add logfile [group n ] ‘filename ‘;

2. 添加日志组成员
Alter database add logfile member ‘filename’ to group [n];

3. 删除日志组
Alter database drop logfile group [n];
限制:
a. 必须保证至少 2 个日志组
b. Active 和 current 的不能删
c. 日志组删除后,os 上的文件没被删除要手动删除
4. 删除日志组成员

Alter database drop logfile member ‘filename ‘;


限制:
a. 不能删除最后一个成员
b. 在线日志的成员不能删除
c. 归档模式下,如果该成员还没归档,则不能删除
d. 日志组成员删除后 os 上的文件没有被删除,必须自己删除

5. 清空日志

Alter database clear [unarchived ] logfile [filename | group n] ; //等价于 drop 再 add
限制:
可以清空日志,不管归档是否非归档,如果归档没完成就要加 unarchived, 这使得这个
日志没法用来恢复。

6. 重命名或者重新给 log 分配位置


到 mount 状态下,然后 alter database rename file ;

日志的配置:

1. 日志组的个数 : 至少要 2 个日志组,如果 alert.log 出现 checkpoint not completed 或者


group have not beed archived ,就要增加日志组或者加大日志的大小
Oracle 建议为每个日志组配置 2 个或者 2 个以上的成员,只能临时设置一个日志组只有
一个日志成员

2。日志的位置 :不同的日志成员要放在不同的磁盘上,只要保证一个日志成员可用,那么
数据库就不会 shutdown ,将 online 日志和 arch 日志放在不同的磁盘上,减少 lgwr 和
arch 的争用。

3. Redo 和 数据文件不要放在一个磁盘,避免 dbwn 和 lgwr 的争用,同时避免因磁盘损坏


而导致日志文件和数据文件同时丢失,导致介质失败

4. 日志大小的确定:
日志文件最小 50k,最大值受到 os 的限制,不同日志组的成员可以有不同的大小,但
是 oracle 建议所有日志组的大小设置成一样。(同一日志组的成员一定是一样大的,互
为镜象),不同大小的日志组,一般发生在要改变日志大小的时候,添加几个临时的日
志组做过度,切换日志,然后删除原来的。

5. 影响日志配置的因素:
a. 日志切换和检查点的频率
b. 日志项的总数
c. 存储设备的可用空间,例如磁带的大小

Omf 来管理日志文件的位置:

Db_create_online_log_dest_n : 设置日志存放的位置

1. 添加日志,alter database add logfile;


2. 删除日志,alter database drop logfile group n;
3. Archived log 不能使用 omf,而要设置参数 log_archive_dest_n
Test :
SQL> alter system set
db_create_online_log_dest_1='G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL';

系统已更改。
SQL> alter database add logfile;

数据库已更改。

SQL> alter database drop logfile group 4;

数据库已更改。

日志的状态(v$log statue)
1. Current :当前在使用的日志
2. Active 还要用于实例恢复的日志,可能还没归档
3. Inactive,没用的日志,这类日志组可以删除,必须保证至少 2 个日志组,可能还没归档
4. Unused ,新创建的日志组
5. Clearing ,指那日志在 clear 过程中显示的,clear 后变成 unused;

v$logfile(status) :

invalidate 指示日志不可用
stale 指示日志未满
deleted 指示文件不存在
blank 指示文件在使用。

归档日志文件

1.Filled online can be archived .


1. 能用于备份,归档日志和在线日志做恢复,保证所有 commit 的事务都不丢失
2. 能够在数据库 open 的时候备份归档日志,

2.用户手工切换日志或者 archive log current;

数据库默认是非归档

数据库的归档模式:
1. noarchivelog :在线日志允许被覆盖,当日志切换的时候。 Lgwr 不会覆盖 checkpoint 没
有完全的日志组.
2. archivelog : 日志写满后,必须归档到其它位置。
自动归档和手工归档(由 log_archive_start 参数决定) ,oracle 建议使用自动归档, 10g
中已经取消了 log_archive_start 这参数.
Select archiver from v$instance; 查看是否开启自动归档
(1) 归档由 arch 进程完成,或者手工完成
(2) 当在线日志成功完成归档后,控制文件中记录了归档日志的序列号,起始 scn 和终止
scn,归档日志文件的名称。
(3) 归档日志可以有多个 copies
(4) 归档日志由 dba 管理
(5) 日志文件在 checkpoint 完成和归档完成之前不能被重用

Oracle 数据库至少有一个表空间 system(10g 至少要有 system 和 sysaux),oracle 建议,用户


数据,数据字典,undo segment,索引,临时表空间各分配一个表空间。减少相同数据文件
中模式对象和数据字典对象的争用。

数据库的结构:
数据库的体系结构分为物理结构和逻辑结构。
1. 物理结构包括,控制文件,数据文件,日志文件。
2. 逻辑结构包括表空间(tablespace),段(segment),分区(extent),块(block)

表空间: 数据库中的数据都存放在表空间中。
1. 数据库逻辑上分成多个表空间
2. 一个表空间一个时刻只属于一个数据库
3. 一个表空间可以由多个数据文件组成
4. 一个表空间由 0 个或者多个段组成
5. 数据库在打开状态下,可以将表空间 online
6. 除了 system 和 undo 表空间外(system ,undotbs1,temporary tablespace 都不能离线),其
余的表空间可以 offline
7. 表空间可以在只读和读写之间切换

数据文件:
1. 一个表空间可以有多个数据文件
2. 一个数据文件只属于一个表空间
3. 当 oracle 服务器在表空间创建一个数据文件时,分配所有的空间
4. 数据库管理员可以在表空间创建后修改数据文件的大小,同时设置数据文件动态增长 ,
当表空间的对象增加时。

段(segment)
1. 一个段只能属于一个表空间,常规表就是一个段,还有临时段,回滚段,分区表的每
个分区都是一个 segment。
2. 一个表空间可以有多个段
3. 一个段不能跨表空间,但是可以跨表空间的多个数据文件
4. 一个段有一个或者多个区组成

分区(extent)
1. 段的分配单位是分区
2. 一个或者多个分区组成一个段
a. 一个段至少要有一个区
b. 随着段的增长,分区也增加
c. Dba 能够手工为一个段分配分区
3. 分区是有连续的块组成
4. 一个分区不能跨数据文件

块(block)
1. 块是 oracle 中数据存储的最小单元
2. 块是 oracle 中 io 的最小单元(读,写)
3. 块是由一个或者多个 os 块组成
4. 标准的数据块是由参数 db_block_size 确定
5. 块的大小最好是 os 块的整数倍,避免不必要的物理 io
6. 数据块的最大值依赖于 os

System 表空间和非 system 表空间


一 system 表空间
1. 数据库创建时创建
2. 数据库所必须的
3. 存储数据字典
4. 包含 system undo 回滚段
5. 最好不包含用户数据

二 non- system tablespace


1. 使得数据库的管理更加灵活
2. 分为 undo,temporary,user data ,index
3. 包含静态数据和动态数据
4. 为了数据单独备份的需要
5. 控制用户对象的所有空间

Create tablespace 的语法


Create tablespace name
[datafile close]
[minimum extent interger [k|m]]
[blocksize]
[logging | nologging]
[default storage]
[online | offline]
[permanent | temporary]

Name : 表空间名称
Datafile :组成该表空间的所有数据文件
Minimum extent integer 确保每个使用的分区大小都是 integer 的整数倍
Blocksize 指定表空间的块大小,如果非默认块,则要创建相应的缓冲区
Logging 强制写日志
Nologging 对于一般的 dml 和 ddl 也是写日志,对于 direct path 的方式则不写日志
Default 表空间数据对象的所有默认存储参数
Online 创建后是否在线
Offline 创建后立即离线
Permanent 创建持久表空间
Temporary :用于存放临时对象,用于排序
Datafile_clause:=file_name
[size interger [k|m] [reuse]| [reuse] ][auto_extend]
File_name 数据文件名, size 数据文件大小, reuse 允许重用已经存在的文件, auto_extend
是否允许自动扩展。

表空间的管理方式:当创建表空间时区的管理方式可以选择使用字典管理或者是位图管理,
创建表空间时可以选择区的管理方式,以后就不能改表空间的管理方式,如果 system 是本
地管理不允许创建字典管理的表空间。
1.本地管理的表空间
分区的管理通过维护数据文件中的位图来实现,一个位图可以是一个块或者是多个块,当
区被分配或者能够被重新使用的时候, oracle 服务器就通过修改位图的值,显示数据块的
新状态

在 创 建 表 空 间 时 使 用 extent management local , 本 地 管 理 表 空 间 不 能 设 置 default


storage,minimum extent 和 temporary 子句, autoallocate 表空间使用 system 管理不能设置分
区的大小,使用默认值,uniform 设置分区的大小为固定值,默认为 1m。

a.对于持久表空间,在创建非 system 表空间时,可以使用 extent management local


b.对于临时表空间,可以使用 extent management local

本地管理表空间的优点:
A .避免了空间分配时的递归调用
b.减少字典表的争用
c.临时表空间自动捕获邻近的空闲空间,避免了合并空闲空间
d.区大小的管理可以是由 system 管理(autoallocate)或者 uniform
e.空间分配不产生 undo,因为没有修改字典表 ,除了 quota 操作

2.字典管理表空间
Oracle 通过数据字典表来管理区,当一个区被分配或者回收的时候就修改相应的数据字典
表。
1. 区的分配和回收由字典表管理
2. 表空间中的每个段都有不同的存储参数
3. 合并空闲空间

字典管理表空间,可以定制存储参数,管理更加灵活但是效率低

修改存储参数
Alter tablespace name minimum extent 2m;
Alter tablespace name default storage ( );

Undo Tablespace
1. 存储 undo 回滚段
2. 不能存储其他对象
3. 区要是本地管理
4. 只能使用 datafile 和 extent management 选项

临时表空间
1. 用于排序
2. 不能存储永久对象
3. 建议使用本地管理

临时数据文件和数据文件的区别
1. 永远是 nologging
2. 不能设置成只读
3. 不能重命名
4. 不能用 alter database 创建临时文件
5. 只读数据库也需要临时文件
6. 介质恢复不需要恢复临时文件
7. backup controlfile 不包括临时文件的信息
8. create controlfile 不包括临时文件

为了优化性能将临时表空间的 uniform 设置成 sort_area_size 的整数倍

默认临时表空间:

如果创建数据库是每有创建默认临时表空间,而且没有为用户指定任何临时表空间,那么
用户将使用 system 做为默认的临时表空间,alertsid.log 里将会给出警告。为数据库创建默认
的临时表空间避免使用 system 作为用户的默认表空间。

数据库创建后,可以使用 alter database default temporary tablespace name;将临时表空间改成


数据库的默认临时表空间,如果没有为用户专门指定临时表空间,那么将使用默认临时表
空间将作为用户的默认临时表空间。可以使用 alter database default temporary tablespace name
修改数据库的默认临时表空间,修改后用户将使用新的默认临时表空间作为用户的默认临
时表空间。

限制:
1. 没有指定新的默认临时表空间之前不能删除原来的默认临时表空间
2. 不能 offline
3. 不能修改成 permanent.

修改表空间的状态

1. Offline
a. offline 后,表空间的数据不可访问
b. 不能将 systsm,含有活动回滚段的 undo
c. 模式的临时表

什么时候要将表空间 offline
a. 将数据库的某部分不成用,而保持其它部分可用
b. 做离线表空间的备份
c. 在数据库打开的时候恢复表空间或者数据文件
d. 在数据库打开的时候移动数据文件

当数据表空间处于 offline 状态时,这个表空间的所有对象将不能使用,如果引用了这个对


象,就会得到错误信息。表中间从 offline 到 online 这个事件记录在数据字典和控制文件中,
当数据库关闭时将不对这个表空间做检查,下次启动时也不检查

Alter tablespace offline [normal | temporary | immediate | for recover ]

Normal 是默认的离线方式,发生 checkpoint ,对于正在执行的 dml 不处理 , 将 buffer cache


中的所有内容都写入数据文件,下次 online 的时候将不要做介质恢复

Temporary : 执行 checkpoint,对于正在执行的 dml 不处理,下次 online 的时候有可能要做介


质恢复。

Immediate : 不发生 checkpoint,下次 online 的时候必须做介质恢复。

For recover : 将表空间离线为了做表空间的时间点恢复

2. Read only

表空间置于只读状态,以防止对表空间进行写操作, read only 的表空间仍然可以 drop 表,


可以将数据文件放到 cd-rom 或者 worm 介质中, read only 的表空间只需做一次备份 ,read
only 状态下可以移动数据文件。

Read only 的过程:

将一个含有活动事务的表空间改成 read only 时,不允许新的事务产生,对于原来的事务,


只有当事务完成时(要么提交,要么回滚) , alter tablespace …read only 完成,表空间被置
于只读模式,同时 read only 一个表空间将会对表空间的所有文件做 checkpoint。

表空间位于只读模式下,可以对表或者索引执行 drop 操作,因为这些操作改变的只是数据


字典,而不修改物理文件,对于本地管理的表空间,被删除的段转成了临时段,避免修改
位图。

3. Drop tablespace name [including contents ] [and datafiles ] [cascade contraints]

Including contents 是删除表空间的所有段


And datafiles 删除表空间同时删除物理文件 (默认是不删除物理文件的)
Cascade constraints 删除所有对引用了这个表空间的表的约束

注意事项:
a. 如果不包含 including contents,那么段没被删除,当包含很多对象的时候 including
contents 将产生很多的 undo。
b. 表空间被删除后,数据将不再存在
c. 当表空间被删除后,控制文件中和这个表空间相关的内容也被删除,如果不指定
and datafiles,那么物理文件将不会被删除,必须手工删除
d. 只读表空间也能被 drop
e. 建议删除表空间之前将表空间离线,避免其它事务访问表空间。

4. Resize 表空间

(1) 加大表空间的 2 中方法


1. 添加数据文件
Alter tablespace name add datafile ‘ file_location ‘ size n ;
2. 手工或者自动改变数据文件的大小
a. 手工修改数据文件的大小
Alter database datafile ‘filename’ resize 新的大小;
b. 自动修改数据文件的大小,使用 auto_extend 子句

Auto_extend :
Autoextend on : enable 自动扩展
Autoextend off : disable 自动扩展
Maxsize : 限制数据文件的最大值
Unlimited : 对数据文件的扩展不加约束,受磁盘大小的约束
Next : 下次扩展的大小
5. 移动数据文件:
(1) alter tablespace 的方法
a. 将表空间离线 (如果有可能先 read only 再离线)
b. 将文件拷贝到目标位置
c. Alter tablespace name rename datafile ‘old’ to ‘new’
d. Online 表空间
e. 删除旧的数据文件

(2) alter database rename file ‘old’ to ‘new’;


a.shutdown
b.用 os 工具移动到新位置
c. alter database rename file ‘old’ to ‘new’;
d. open 数据库

rename 只是修改控制文件
5. 使用 omf
设置参数 db_create_file_dest ,omf 的文件默认大小 100m,自动增长,同时不受限制
创建表空间语法
Create tablespace name datafile size ‘’ ;不用指定表空间的名称
删除表空间的时候会自动删除 os 文件

设置 db_create_online_log_dest_n 存放日志文件和控制文件,避免 3 者放在一个位置。

6. 相关视图
Tablespace 信息
V$tablespace ,dba_tablespaces
数据文件信息
V$datafile,dba_data_files
临时文件信息
V$tempfile,dba_temp_files

数据库的逻辑结构: 表空间,段,区,块

段是数据库中占用空间的对象,使用数据文件中的空间。
1.段的类型 :
Table segment: 表段存储表的数据,不包括分区表和聚簇表,一个常规表只能存储在一个表
空间

Table partition : 对于分区表的每个分区都属于一个段,每个分区都是独立的,只有企业版


才支持分区

Cluster :和表类似,每个聚簇也是一个数据段,聚簇中的行存储是基于 key 值的,一个聚簇


可以有一个或者多个表,这些表属于一个段,同时有相同的特性,聚簇中的行可以通过索
引或者 hash 算法访问

Index : 每个常规索引都属于一个索引段,如果一个表有 3 个索引,那么它们将使用 3 个索


引段。

索引组织表: 表按索引结构存储,取数据时不访问表,只需要访问索引树

分区索引: 分区索引可以跨表空间,但是每个分区的索引对应一个段不能跨越表空间,使用
分区索引为了分散索引 io。

Undo segment: 当用户要对数据库的数据或者索引做修改时,修改之前的数据存放在 undo


段中,为了提供读一致性和撤消操作

Temporary segment : 当用户执行 create index,order by,select distinct,select group by 这些语


句时,首先尝试在内存中排序,如果排序需要的空间大于可用的内存空间,那么这些中间
值将写入磁盘。临时段用来存储这些中间值。

LOB segment : 一个表的一个字段或者多个字段,用来存储 lob 类型数据,如果这个列的数


据太大,则 oracle 将这些单独的列存放在 lob 段中

Nested table : 一个表的某个字段由用户定义的表组成的,内表又叫 nested table,将存储在单


独的段中

Bootstrap segment :
Bootstrap segment 又叫做 cache segment ,由创建数据库时执行的 sql.bsq 脚本创建,这些段
用来在数据库打开的时候初始化字典缓存, bootstrap segment 不能被查询和修改,不需要
dba 维护。

2.存储参数:存储参数可以在段一级定义来控制区的分配。
a. 段一级定义的存储参数将覆盖表空间一级的存储参数,除了 minimun extent 和 uniform
size 。
b.不在段级上设置存储参数将使用表空间级设置的存储参数。
C.如果表空间级别上也没有设置存储参数,将使用 system 默认的存储参数。
D.如果存储参数发生变化,只对未分配的区有效
E.有些参数不能在表空间级别上设置,只能在段级别上设置
F.minimum extent 只能在表空间级别设置,所有分区都使用表空间定义的值

3.区的分配与回收

a.区的分配
1. 当创建一个段时
2. 段扩展时
3. 段改变时
B.区的回收
1.当段 drop
2.当段 alter
3.当段 truncate

当表空间创建时,表空间中的数据文件包含文件头,是第一个块或者是前几个块。当创建一
个段时从表空间中分配空闲分区,连续的使用过的分区叫做已用分区,当分区被释放时空
间重新放到空闲分区上。

4。数据块
a.物理 io 的最小单元
b.创建表空间时设置
c.一个或者多个 os 块
d.db_block_size 是默认块大小

块的结构:
1. 块头: 块头包含数据块的地址,表目录,行目录, transaction slot(当事务改变块中的行
时使用),block header grows from the top down
2. 数据空间: row data inserted into block from buttom up
3. 可用空间,可用空间位于数据块的中间部分,这样允许块头和数据空间的扩展,update
和 delete 将会造成块内空闲空间的碎片, oracle 服务器会在必要的时候合并块内的空闲
空间。

控制块空间使用的参数: (可以控制表和索引)
Initrans 和 maxtrans :创建索引块和数据块时,初始分配的 transaction slot 和 max transaction
slots,inintrans 对于表来说默认是 1,对于索引来说默认是 2,transaction slot 存储事务信息,
一个事务只能使用一个 slot,即使它可以更新多行。
Initrans 的说明,对于表 initrans 默认是 1 ,索引默认是 2 ,保证最小级别的并发,假设
initrans 为 3,那么只少能有 3 个事务同时修改一个块,如果有空闲空间,那么能创建更多
的 slot,达到更大的并发。
Initrans 可以动态修改,但是只对新的块有效,如果想对以前的块有效,那么要 move 表,
重整表。
Maxtrans 最大值是 255,不管是对索引还是对表而言,限制了块级别并发的最大值,如果
没有足够的空闲空间,那么这个值将受到限制。

Pctfree: 保留多少空间用来以后的更新,默认 10%,如果可用的空间 10%,那么将放在空闲


列表中,如果可用的空间<=pctfree,则从空闲列表中移走

Pctused : 如果已经使用的空间<pctused 时候,重新将块添加到空闲列表中,默认是 40%。

Freelist 是用来保存一些可以用来插入新数据的块的列表,一个段创建时默认只使用一过
freelists,可以通过 freelists 来定义可以使用空闲列表的最大个数。

数据块的管理:

1. ASSM : 管理段中空闲空间的方式。
a. 通过位图来捕获已使用空间和空闲空间,而不是通过 freelist
b. 减轻管理
c. 更好的利用空间
d. 提高了 insert 操作的并发性能 ,减少了 buffer busy waits 的发生
e. 不能使用 lob 段,10g 中没这限制。
f. 已经取消的参数 pctused, freelists,freelist groups
g.创建表空间时加上 segment space management auto

2. Mssm,手工设置参数 pctused,pctfree,freelist ,9i 以前的版本中只能使用这种方式

数据字典

dba_tablespaces
dba_data_files
dba_segments
dba_extents
dba_free_space

dba_segments 获取一个段的分区数和块数
dba_extents 获取给定段的分区
dba_free_space 查询表空间的空闲空间


1. undo 管理的 2 种方式
9i 以后 aum (auto undo tablespace management)
9i 以前 segment
Oracle 推荐使用 auto undo 管理而并非使用回滚段的方式管理
a. automatic undo management : oracle 自动管理 undo 段的创建,分配和优化
b. 手动管理 undo,必须自己创建回滚段,分配回滚段以及优化回滚段, 9i 以前唯一的
方式

2.Undo 段
当修改数据时,被修改前的数据被存放到 undo segment 中,直到数据被改变为止。
Undo segment 的头部存放了事务表,用来记录该 undo 段上的事务信息,一个事务只能使
用一个 undo 段,一个 undo 段可以被多个事务使用

3.Undo 的作用
1.Rollback transaction
当一个事务要改变一行时,将旧的数据写到 undo segment 中,如果用户要回滚事务,把
undo segment 中的内容重新写回行
2.Transaction recovery
当要做实例恢复时,要回滚未提交的事务来完成实例恢复,撤消段的改变也是会记录到
redo 中,所以能够做事务恢复
3.Read consistent
当事务做更改时,其它用户不能查看未提交的数据,同时不能看到 select 开始后提交的数
据,为了提供读一致性,从撤消段中读取旧的数据

4.读一致性
Oracle 保证在某个时刻看到的数据是一致的,不管数据是否被改变
当 oracle 服务器开始执行查询语句时,记录当前的 scn,不处理 scn 之前未提交的数据,行
的数据被改变,但没有被提交,当查询开始的时候 oracle 通过 undo segment 构建一个一
致性视图。

读一致性总是为 sql 语句提供的,你可以为一个只读事务请求一个读一致性, set transaction


read only ,或者你可以请求为 dml 语句提供读一致性,通过执行 set transaction isolation
level serialiable,这样 oracle 就能在事务开始时提供读一致性,seriable 对性能有影响。

5.Undo segment 的类型


a. system undo segment, 创建 system 表空间时创建,只有当 system 表空间的对象发生变化
时才能使用 system undo segment。
B. non-system undo segment ,一个数据库可以有多个表空间,至少要有 1 个非 system 撤消
段,
1.私有:在参数文件中列出,由 instance 启动是 online ,也能通过 alter rollback segment 的
方式 online。
2.Public: 公共回滚段组成数据库中的 undo segment pool,一般在 rac 和 ops 中用。
3.Deffered undo segment :当 offline 表空间时创建,用来再下次 online 表空间时回滚事务,
当没用时会自动被删除,由 oracle 服务器维护,不需要手工维护

6.Automatic undo tablespace 的概念


1.Undo data 由 undo tablespace 管理
2.为每个实例创建一个 undo tablespace ,分配充足的空间
3.Oracle 自动管理 undo tablespace 中的 undo data
4.Undo 回滚段的命名方式 : _SYSSMUn$ (_SYSSMU1$,_SYSSMU2$)

7.undo tablespace 的配置


1.Undo_management 设置为 auto
2.Undo_tablespace 设置 undo 表空间的名称,一个数据库至少有一个 undo,但是一个时
刻只能使用一个 undo
3 .如果数据库只有一个 undo tablespace 可以不设置参数 undo_tablespace,oracle 服务器自
动选择 undo_tablespace.

8.automatic undo tablespace 的参数


Undo_management 可以设置为 auto 和 manual,但是不能动态修改
Undo_tablespace 指 定 一 个 undo 表 空 间 , 可 以 通 过 alter system set
undo_tablespace=’undo_name’ 修改 undo

9.可以在数据库创建的时候创建 undo tablespace 也可以用 create undo tablespace 的方式创


建,一个数据库可以有多个 undo tablespace ,但是只能有一个是 active 的,如果创建数
据库的时候设置 undo_management 为 auto ,但是创建数据库的时候没创建 undo,那么
系统将创建一个为 sys_undotbs 的 undo tablespace,文件名为 dbu1<sid>.dbf,windows 下
位于 database 下,linux 和 unix 下位于 dbs 下,autoextend 设置为 auto

10.Undo 的切换
a. undo 可以切换
b.一个实例在一个时刻只能使用一个 undo
c.一个数据库可以有多个 undo
d.可以用 alter system 在 undo tablespaces 之间动态切换 undo

11.删除 undo tablespace


a. 用 drop tablespace 命令删除
b.只能删除当前不被任何实例使用的 undo tablespace
c.为了删除一个 active 的 undo ,首先切换日志,等到事务完成后删除
d.如果原来的 undo tablespace 有活动事务,那么切换到新的 undo 后,原来的 undo 中的回
滚段显示的是 pending offling
查询语句如下:
Select a.name,b.status from v$rollname a,v$rollstat b where a.name in (select segment_name
from dba_segments where tablespace_name =’OLD_UNDO’ ) and a.usn=b.usn;
如果是 pending offline 那还不能删除
如果 undo 无法提供读一致性视图将出现 ora-1555

参数 undo_suppress_errors 如果设置为 true 那么手工执行回滚段设置的命令将不会出现错误。

Undo_retention: 决定提供读一致性的时间,默认为 900,保留 undo 数据允许更长时间的查


询有助于缓解 ora-1555,需要更多的空间,参数可以动态设置,以秒为单位
(*)即使设置了 undo_retention,如果 undo tablespace 太小,保留 undo data 的时间就不会
那么长

常用视图
V$undostat :每一行保留了间隔为 10 分钟的 undo 统计信息,最近的行一般时间间隔小于 10
分钟。
Undo tablespace 大小的设定
Undotablespace =ur*ups*dbs+dbs*24
Ur =undo_retention
Ups=undo blocks per second 每秒产生的 undo 块数
Dbs=db_block_size

Select sum(undoblks)/ (sum(end_time-begin_time)*86400) from v$undostat;

数据字典视图 :
Dba_rollback_segs
动态性能视图
V$rollstat
V$rollname
V$undostat
V$session
V$transaction

select segment_name,tablespace_name,owner,status from dba_rollback_segs;


owner 中的 sys 指 sys 拥有的,public 指 non-system

查询 undo 回滚段被使用的统计信息
select n.name,s.extents,s.rssize,s.hwmsize,s.xacts,s.status from
v$rollname n,v$rollstat s where n.usn=s.usn;

查询当前正在执行事务的用户,以及所使用的回滚段,块数等信息
select s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk
from v$session s,v$transaction t where
s.saddr=t.ses_addr

表的分类
1. 常规表(堆表)
2. 分区表
3. 索引组织表
4. 聚簇表

常规表,存储数据最常见的表,数据库管理员不能控制表中数据的分布
分区表,分区表增加了应用的可扩展性,由如下特点
a. 一个表可以有一个或者多个分区,每个分区中的数据是经过分区的,如范围分区,散
列分区,列表分区,组合分区
b. 分区表中的每个分区都是一个段,可以放在不同的表空间。
c. 分区一般用于大表,多个进程可以同时查询和操作

Rowid
a. rowid 的格式
(1)扩展 rowid 需要 10 个字节,同时用 18 个字符显示,组成
1. 数据库的对象 id ,例如创建数据库对象时创建,在数据库中是唯一的
2. 相关文件号,表空间内是唯一的
3. 数据文件内块的位置
4. 块内行的位置

对象号 32 位,相关文件号 10 位,数据块号 22 位,行号 16 位 ,一共是 80 位,10 个字节

扩展 rowid 以 16 字节的形式显示(经过 64 位加密模式),其中 6 位表示对象 id,3 位表示相


关文件号,6 位表示块号,3 位表示行号。

Rowid 和对象号,文件号,块号和行号之间的转换,dbms_rowid 包

Select dbms_rowid.rowid_OBJECT(rowid) as object_id,


dbms_rowid.ROWID_RELATIVE_FNO(rowid) as
rfno,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) as
b_id,dbms_rowid.ROWID_ROW_NUMBER(rowid) as rno
from scott.dept

(2)受限 rowid
Oracle 8 以前使用的是受限 rowid,rowid 占的是 6 个字节不包含 object number,限制是一个
数据库最多只能有 1022 个数据文件, oracle 8 以后改成的限制是一个表空间最多只能有
1022 个文件。
(*)oracle 8 以后仍然使用受限 rowid,非分区表的非分区索引仍然占用 6 个字节。
因为非分区表中索引项都在相同的段中。

使用 rowid 来定位行
1. 一个段只能存在于一个表空间中,所以通过 data object number 很快能找出行所在
的表空间,相关文件号可以很容易在表空间中找出数据文件,块号可以查出行所
在的块,行号用来定位行目录项
所以 rowid 可以定位数据库中的任何行

行的结构
a. 行头: 存储列的数目,行迁移信息,行锁的状态
b. 行数据:对于行中的每一列,总数存储列的长度和它的值,如果列少于 250 字节,那
么将用 1 个字节存放列的长度,如果多于 250 字节则用 3 个字节存放列的长度,列值
存放在列长度字节后面

创建表:
1. 将表中的数据分布在不同的表空间
2. 使用本地管理的表空间来避免碎片

如果在自己的模式下创建表,用户必须具有 create table 的系统权限,如果想要在其它模


式下创建表则必须具有 create any table 的系统权限。

创建临时表:

临时表只能是本 session 可见,一种是 session 存在,一种是事务存在


a. on commit delete rows 这个表示行只对事务内有效
b. on commit preserve rows 这个表示行对会话内有效

临时表的特点:
a. 使用 create global temporary table 创建
b. Table 保留的时间是基于事务或者是会话的
c. 数据操作不会产生 dml 锁
d. Dml 不会产生 redo
e. 可以在临时表上创建索引,视图和触发器

非分区表的重整:
Alter table tablename move ;
非分区表可以 move 而无须 exp 和 imp ,另外 move 过程中存储参数不变
1. 可以 move 一个表从一个表空间到另一个表空间
2. 重新组织表,消除行迁移

Move 表后要重建索引 ,因为 move 将会导致索引失效

Truncate table :
a. 删除所有的行,同时释放空间
b. 相关的索引也被 truncate
c. 隐士提交,因为是 ddl
d. 不产生 undo
e. 不会触发 delete 触发器
f. 如果存在参照完整性则无法 truncate,要先把外键禁用掉

Truncate table name {[drop | reuse ] storage}


默认是 drop

删除一个表, drop table user.tablename [cascade constraints ] 删除一个表,如果带上 cascade


constraints 则连相关的约束也被删除

表被删除后,表所使用的分区被释放,如果它们是连续的,那么可以手工合并分区或者自
动合并分区

删除一个列
a. alter table schema.table drop column column_name cascade constraints checkpoint 1000;
b. 删除行中列的长度和数据,释放空间
c. 删除一个大表中的列需要相当长的时间

Oracle 8i 以前不允许删除列

使用 checkpoint 选项在删除列时
删除一个表需要花很多的时间,同时产生很多的 undo 数据,当删除一个很大的表的列时,
使用 checkpoint 减少 undo space 的使用,如果是 checkpoint 1000 ,则删除 1000 行执行一
次 checkpoint ,在操作完成之前表的状态都是 invalid,如果在完成之前 instance 崩溃,那
么下次重启动后,表的状态还是 invalid,通过执行如下的语句继续完成删除操作,
Alter table schema.table drop columns continue; 如果表是 valid 的执行以上的语句将会产生错
误。

使用 unused 选项
Alter table schema.table set unused column column_name cascade constraints
Alter table schema.table drop unused columns checkpoint n; 删除 unused 的列
Alter table schema.table drop columns continue checkpoint n; 继续删除

将列设置成 unused 不会花费很多的时间,因为数据没有被删除,所以不回收空间,列被标


志为 unused 后可以等到系统空闲的时候执行删除操作,设置成 unused 的列已经不再是表
的一部分,query 和 dest 都不会查到该列的信息,同时可以添加一个与 unused 列相同名称
的列。

相关数据字典
Dba_unused_col_tabs
Dba_partial_drop_tabs

获取表的相关信息
Dba_tables 和 dba_objects

十一

索引的分类:

索引的逻辑划分是从应用来划分的,索引的物理划分是从索引的存储分式来划分的。
所有的索引都是 b-tree 结构

逻辑上划分 :
1. 单列索引和复合索引,复合索引最多可以有 32 个列
2. 唯一索引和非唯一索引,唯一索引中一个索引键只能指向一行。
3.域索引只支持单列,用在 text,spatial 中,可以在 scalar ,object,lob 数据类型上创建域索
引。
4.基于函数的索引,基于函数的索引是在函数或者表达式上创建索引,基于函数的索引可
以是 b-tree 或者是位图索引,基于函数的索引是将函数的值存储在索引中。
5.分区索引和非分区索引,可以对一个大表创建分区索引,一个分区索引可以存放在不同
的段中,分区索引一般创建在分区表中,提高扩展性和可管理性,可以分一个分区创建分
区索引。

索引的结构: 索引的最高层是 root,根上存储了下一层的指针,下一层叫做分支,分支也包


含了指向下一层的指针,最低层是叶,包含了指向行的指针,叶子上还包含了指向相邻的
叶子节点,便于查找升序和降序的数据,每个节点都包含了索引键的值。

叶子节点的格式:
1. 项头,存储了列的个数和锁的信息
2. 索引列的长度和索引列的值
3. 行 id,包含了索引列的值

非分区表中 b-tree 索引的特征


1. 键值可以重复
2. 索引项中不包含键值为空的行,where 子句中使用 null 将导致全表扫描
3. 受限 rowid 指向表中的行,因为一个表只有一个段

Dml 对索引的影响
在一个表上执行 dml 的时候,oracle 自动维护表上的索引
1. 对表进行 insert,插入数据后会插入相同的索引项
2. 对于 delete ,索引项只是逻辑的被删除,索引所占用的空间可以被重用,参考 tom 的
oracle 9i&10g 编程艺术 483 页,
3. Update 首先是个逻辑的删除,然后再插入索引项,pctfree 除了在索引创建时有影响,
其它时候都没影响,块会被重用。

位图索引相对于 b-tree 索引的优势


1. 当索引列的基数比较低,即唯一值比较少
2. 用多个 or
3.索引列为只读,或者更新的很少

位图索引的结构:
位图索引也是二叉树结构,但是叶子节点存储的是位图,而不是 rowid,如果位图上的位被
置 1,说明相应的 rowid 上有这个值。
1. 项头,包含列的个数和锁的信息
2. 索引值的长度和索引值,成对出现
3. 起始 rowid (块号。行号。文件号)
4. 终止 rowid
5. 位图段包含了一系列的位,如果被置位,那么相应的行包含键值,否则不包含键值

位图索引使用受限制 rowid

当位图索引的 key 值被修改时锁住的是整个位图段,因为锁是发生在位图段,所以包含这


个键值的行都被锁住,直到事务结束。

位图索引和 b-tree 索引的比较


位图索引 b-tree 索引
适合低基度的列 适合高基度的列
修改键值的代价很大 修改键值的代价很大
对于 or 的查询高效 对于 or 的查询不高效
一般用于 olap 一般用于 oltp

1.
创建一个正常的 b-tree 索引
Create index hr.employee_last_name_index on hr.employee(last_name)
Pctfree 30
Storage(initial 200k next 200k pctincrease 0 maxextents 50)
Tablespace indx;

Syntax :
Unique : 是否创建唯一索引,默认是非唯一索引
Schema: 表或索引的拥有者
Index : 索引的名称
table : 表的名称
column :在什么列上创建索引
asc /desc :说明创建索引的模式,是升序还是降序
tablespace : 索引存放的表空间
pctfree : 索引的保留空间,只在创建时有效
initrans : 每个块预分配的事务项默认为 2 (表默认为 1)
maxtrans : 一个块的事务项的最大值, 默认为 255
storage : 定义区的分配方式
logging : 创建索引时和以后的操作都记录日志(默认选项)
nologging : 创建索引时不写日志,以及以后的某些操作不记录日志(direct)
nosort: 如果用来创建索引的字段不是升序排列的,那么不能用这个选项。
注意事项:
a. 如果表空间级别设置了 minimum extent ,那么索引的 next 要达到 minimum 的整数

b. 如果表空间级别设置了 logging,创建索引时的 nologging 将会被忽略
c. 索引不能指定 pctused,因为索引块只有完全为空时才能放入 freelist
d. 如果字段的值不是升序排序的,那么 nosort 将不能用,如果表上有 dml 语句,使
用 nosort 创建索引将报错
e. 可以使用已经存在的索引来创建新的索引,这个发生在新的索引键,对应于存在
索引的前导项。

1. 索引加快查询,但是减慢 dml
2. 将索引放在单独的表空间,不要和 undo tablespace ,temporary tablespace 以及表数据放
一个表空间
3. 给大表创建索引的时候可以使用 nologging,避免产生大量日志
4. 如果索引的项相对于行的大小来说,小很多,那么一个行就能存放很多项,这时候最
好把索引的 initrans 设置的比表的 initrans 大些

Index 和 pctfree
索引的 pctfree 只对创建索引时有效。

创建位图索引:
参数 create_bitmap_area_size 决定创建位图索引时所能使用的内存空间

位图索引语句:

Create bitmap index [schema.]index


On [schema.]table (column [asc|desc][,column asc|desc])
[tablespace tablespace ]
[pctfree interger]
[initrans integer]
[maxtrans integer]
[storage-clause]
[logging | nologging]
[nosort]

中括号为可选,模式是 asc ,位图索引不能是唯一的

Create_bitmap_area_size
初始化参数 create_bitmap_area_size 决定了可以用来存储位图段的内存空间,默认为 8m,
这个值越大创建索引越快,如果基度很小,那么这个值可以设置小点,如果基度较大,可
以设置相对大掉,来优化性能。

修改索引的存储参数:
Alter index index_name storage( )

分配和回收索引空间

Alter index index_name allocate extent( size interger[k] datafile)


Alter index index_name deallocate unused;

重建索引:
1. move a index 到不同的表空间
2. 移除删除的项,释放空间
3. 将一个反向键索引修改成正常的 b-tree 索引

Alter index index_name rebuild tablespace index_tablespace

重建索引的特性:
1. 使用已经存在的索引做为数据源
2. 新的索引创建后,旧的索引被删除,在重建过程中,必须有充足的空间来满足旧的索
引和新的索引,在各自的表空间。
3. 新的索引不包含被删除的项,所以空间能得到更充分的利用
4. 在新的索引创建完成之前,仍然使用旧的索引

需要重建索引的情况:
1. move 之后
2. 原来的索引中包含了太多的删除项
3. 需要将已经存在的索引转成反向键索引
4. 表或者索引被 move 到别的表空间
5. 不能将正常的索引转成位图索引,reverse 和 noreverse 对位图索引无效

Alter index index_name rebuild; 过程中不允许 dml

索引的创建和重建都是很耗时的操作,特别对于大表, oracle 8i 以前创建和重建索引都会


加表锁,防止 dml 操作,oracle 8i 提供了在线重建索引的方法,但是不提倡在索引创建期
间使用 dml,rebuild online 加的是 dml,只是不能执行 ddl,可以执行 dml

关于在线重建索引
1. 重建索引的限制
a. 临时表上的索引不能重建
b. 不能重新整个分区表的索引,只能重建某个分区的索引
c. 不能回收未使用的空间
d. 不能修改 pctfree

Coalescing index
合并索引和 rebuild 索引都能解决索引碎片
Alter index index_name coalesce;
Ocp 教材中的例子,原来每个索引块都只有 50%被使用,coalese 后,一个块满了,另一个
块是空闲的。

检查索引的基度:
1. analyze index ind_name validate structure ;
a. analyze 可以检测索引块是否有坏块,但是不验证索引所对应的数据块是否存在坏块
2. 通过 index_stats 查看索引的相关信息
select blocks,lf_rows,pct_used,distinct_keys,del_lf_rows from index_stats;

如果 del_if_rows/lf_rows 大于 0.3 可以考虑重建索引

删除索引的情况
1. 这个索引不再被应用使用可以删除
2. 大量数据装载之前,大量数据装载之前
a. 装载之前,删除索引提高效率
b. 装载之后,删除索引提高空间利用
3. 索引被标志为 invalid
4. 索引坏块
5. 索引是按时间分区,删除旧历史数据的索引

对于约束有用的索引是不能被删除的,只能先禁用约束或者删除用户

确定不使用的索引:

1.9i 开始,索引是否被使用的统计信息,可以从 v$object_usage 中获取,如果索引从未被使


用过,那么可以删除索引,首先必须打开 monitoring usage 开关, alter index index_name
monitoring usage; 每次打开 monitoring usage 开关的时候, v$object_uage 表中的信息都会被
重置。

V$object_usage 中的列:
Index_name :索引名称
Table_name :表名称
Monitoring : 是否被监控
Used: 在监控开始会是否被使用过
Start_monitoring : 监控的起始时间
End_monitoring :监控的终止时间

索引相关的视图 :
Dba_indexes :获取索引的相关信息
Dba_ind_columns: 被索引的列的相关信息
Dba_ind_expresses :与函数索引相关的信息
V$object_usage :索引是否被使用的相关信息

十二

保证完整性约束的方法:
1. 应用程序
2. 触发器
3. 申明完整性约束

触发器,触发器是 plsql 过程,当某个事件如,insert or update table 表时发生,触发器可以


被 enable 或者 disable ,enable 是指事件发生时就执行触发器, disable 是指事件发生时也不
执行触发器。只有当完整性约束无法满足复杂的商业逻辑时才考虑使用触发器。

完整性约束:
对于实现商业规则,完整性约束提供了更好的解决方案。
a. 提供了更好的性能
b. 更容易实现
c. 更集中的规则
d. 更容易管理(可以 enable or disable)
e. 可以从数据字典中获取信息

完整性约束的类型:
a. not null 列不允许为空,默认情况下列是允许为空
b. unique 键值不允许重复,可以有多个 null
c. primary key=unique +not null
d. check 约束,可以在一个列或者多个列上创建 check 约束
e. dba 必须认真的考虑 unique 和 primary key 和 foreign key,这些影响数据库的高可用性和
可接受的性能。

约束的状态:

Enable ,对新加入的数据进行验证。
Disable 不对新加入的数据进行验证

Disable novalidate : 既不对原来的数据,也不对新插入或者修改的数据做验证


Disable validate : 约束上的索引被删除后约束将会被禁用,不能对带有这个约束的表进行插
入删除和修改。
Enable novalidate : 对原来的数据不做检查 ,只检查新插入的数据,或者新修改的数据
Enable validate : 既对新数据检查又对旧数据进行检查

当约束转为 enable validate 时,表将被锁住,这时候所有的 dml 将被禁止,建议先将 disable


转成 enable novalidate,然后再转成 enable validate

状态之间的转换规则 :
Enable 不特别说明即 enable validate ,除非使用了 novalidate 选项
Disable 默认就是 disable novalidate,除非指定了 validate 选项
当 unique 和 primary key 从 disable 转成 enable,同时这个字段上不存在索引,自动创建唯一
索引,当 unique 和 primary key 从 enable 转成 disable 时自动删除唯一索引。
当任何约束从 novalidate 到 validate 时,任何数据都会被检查

当从 enable novalidate 到 enable validate 时,不会阻塞读,写和其它的 ddl

约束的检查:

Nodeferred check :非延迟约束,在 dml 语句执行的时候就验证,如果验证失败,则回滚


Deferred check :延迟性约束,只有提交的时候才验证,如果验证失败则回滚

Initially immediate 指立即验证


Initially defferred 指事务结束的时候验证

改变约束的模式

a. set constraint immediate [deffered | default] 在事务结束或者,重新类似语句后原来的


constraint 失效
b. alter session set constraint={immediate | deffered | default } 设置只对当前会话有效

oracle 对 unique 和 primary key 约束的处理

下面的索引可用,是指约束的列,是索引的前导列,则这个索引可用

primary key 和 unique 强制使用索引,你能控制索引位置和索引的类型,当使用这些约束的


时候。
a. 如果约束被 disable,那么索引就没必要了
b. 如果约束的列,是一个已经存在索引的前导列,那么不管是唯一还是非唯一,都使用
该索引
Example :
SQL> create table test(id int,name varchar2(10));

表已创建。

SQL> create index ind_test on test(id);

索引已创建。

SQL> alter table test add constraint con_test_id primary key(id) ;

表已更改。
SQL> select constraint_name,index_name from user_constraints where table_name='TEST';

CONSTRAINT_NAME INDEX_NAME
------------------------------ ------------------------------
CON_TEST_ID IND_TEST

c. 如果约束的列不是一个索引的前导列,那么将创建与约束同名的索引
1. 如果是 deferrable 约束,那么将创建非唯一索引
2. 如果是 non-deferrable 约束,将创建个和约束同名的索引
Example :
默认的约束类型是 immediate
SQL> create table test(id int,name varchar2(20));

表已创建。
SQL> create index ind_test on test(name,id);

索引已创建。

SQL> alter table test add constraint con_test primary key(id);

表已更改。

SQL> select constraint_name,index_name from user_constraints where table_name='TEST';

CONSTRAINT_NAME INDEX_NAME
------------------------------ ------------------------------
CON_TEST CON_TEST

SQL> select index_type,index_name, UNIQUENESS from user_indexes where


table_name='TEST';

INDEX_TYPE INDEX_NAME UNIQUENES


--------------------------- ------------------------------ ---------
NORMAL CON_TEST UNIQUE
NORMAL IND_TEST NONUNIQUE

Example 2 :

SQL> create table t(id int,name varchar2(10));

表已创建。

SQL> alter table t add constraint con_t primary key(id) deferrable;


表已更改。

SQL> select a.index_name,constraint_name,uniqueness from user_indexes a,user_constraints


2 b where a.table_name=b.table_name and a.table_name='T'
3 ;

INDEX_NAME CONSTRAINT_NAME UNIQUENES


------------------------------ ------------------------------ ---------
CON_T CON_T NONUNIQUE

d. 如果索引可用且约束是 non-deferrable 那么将使用该索引,如果约束可用,那么索引是


非唯一,那么使用该索引。

如果原来存在可用的非唯一索引,那么约束的索引一定会用这个索引。(可用是指,约束的
字段必须是索引的前导列)

外键约束 :

维护含有外键约束的表要考虑如下几种情况:
a. 对父表执行 ddl
(1) 删除父表时要先删除外键约束,然后才能删除表,或者直接执行
Drop table table cascade constraints;
(2) 当 truncate 父表时要先 disable 或者 drop 外键
(3) 在删除包含父表的表空间时,要先删除外键
Drop tablespace tablespace including contents cascade constraints;
(4) 如果没有 delete cascade,那么不能在父表中删除子表中包含的值,相似的 update 的也
和这类似,但外键字段上没有创建索引,那么 oracle 锁住子表,防止修改保证完整性,
如果在外键表的字段上加了索引那锁住的是索引项。如果要同时修改 2 个表,请在外键
字段上加索引。

B.如果往子表中插入一行,或者修改外键列, oracle 查看主表中用于维护完整性约束的索


引,如果发现主表所在的表空间离线,那么 dml 操作失败。如果在子表上执行的 dml 是删除
行,或者 update 的是非外键列,即使主表所在的表空间离线,也能操作成功。

C. oracle 9i 以后,当修改或者删除主键时,则不在需要子表上加表锁,还是会加表锁的,
只是一获取后就会释放,如过修改或者删除多行主键,那么每修改完一行或者,删除完一
行就会释放锁。

在创建表时定义约束:
约束可以在表创建时定义,也可以在表创建后修改,使用 constraint_clause 在 create table 或
者 alter table 的时候,定义约束。(1)要有创建约束的权限 (2)创建参照完整性约束,主
表和父表在一个模式下,或者对其他模式表下的列具有 references 权限
创建约束的注意事项:
1. 创建主键约束和唯一约束的索引和表的数据不放在一个表空间,使用 using index
子句,也可以在创建约束之前在别的表空间创建好索引。
Example:
SQL> alter table test add constraint con_test unique(id) using index tablespace users;
表已更改。
SQL> select index_name,table_name,tablespace_name from user_indexes where
table_name='TEST';

INDEX_NAME TABLE_NAME TABLESPACE_NAME


------------------------------ ------------------------------ ------------------------------
CON_TEST TEST USERS
2. 如果频繁的装载大量数据,可以先禁用约束,然后再启用约束,如果创建唯一约
束和创建主键约束时,创建的是唯一索引,那么禁用约束后那么唯一索引将被删
除。在如下情况下创建主键约束和唯一约束使用非唯一索引更适合,约束是
deferrable,或者索引是在约束创建或者 enable 之前创建。
3. 如果表包含自引用的外键
a. 在装载完成后启用或者定义约束
b. 定义一个延迟性约束 //这种方法更好

启用约束:(可以通过 enable validate 和 enable novalidate 的方式启用约束)


Enable novalidate : 对于主键约束和唯一约束的索引必须是非唯一的, enable novalidate 不加
表锁, enable novalidate 的方式比 enable validate 的方式快多了,因为不检查已经存在的
数据,只对新插入的数据或者新修改的数据做验证,如果一张表频繁的执行 dml,那么
这种方式是很适合的。

Alter table schema.table enable novalidate constraint constraint_name using index index_clause;

Enable validate : 检查表中已经存在的数据是否违反约束,默认的约束模式。


a. 表被锁住,对表的修改也被阻止,直到表中已存在的数据验证完成
b. 如果该列不存在索引 ,oracle 将创建一个索引,如果创建的约束是 deferrable 模式的,
则创建的是非唯一索引

当验证完成后不会加表锁,数据库中不会引入非法的数据,
如下好处:

a. 所有的约束同时启用
b. 约束内部是并行的
c. 允许在表上执行并发操作
Note :
1. Validate 是默认选项
2.如果表的数据存在违反约束的数据,那么语句将被回滚,同时约束仍然是禁用的
3.使用 exception 子句

使用 exceptions 表

1. 使用 utlexcptl.sql 脚本创建 exceptions 表


2. Alter table table_name enable constraint constraint_name
Exceptions into exceptions;
3.select rowid,a.* from table a where rowid in (select row_id from exceptions) 定位
4.Update 修改不何法的数据,改成合法的,不违反约束的
5.Commit;
6. truncate table exceptions;
7. Alter table table_name enable constraint constraint_name
Exceptions into exceptions;

约束相关的视图:
Dba_constraints
Dba_cons_columns

十三

1. default profile
oracle 在创建数据库时自动创建一个叫 default 的 profile, 如果用户没有显示授予使用哪
个 profile, 那么用户将使用 default profile ,default 的初始值一般都是不受限制的,用户
可以修改 default 的属性,这样的修改对所有使用 default profile 的用户都生效。

2. profile 的使用
a. 限制用户执行一些很耗费资源的操作
b. 保证用户的会话空闲了很长一段时间,自动从数据库中退出
c. 对相似的用户使用组资源限制
d. 很容易授予用户资源
e. 在大型,复杂的多用户系统中管理资源
f. 控制密码的使用
3. profile 的特征
a. profile 的分配不修改当前会话
b. profile 只能分配给用户,而不能是角色或者其他 profile
c. 当创建用户的时候不授予任何 profile,那么用户会默认授予 profile

4.密码的管理
a.锁住用户: 当用户在指定次数内,输入的都是无效的密码,则自动将用户锁住
b.口令的生命周期,超过那日期就要强迫用户修改口令
c.口令历史, 保证新的口令不是重用一个的某个密码
d.口令的复杂性验证

5.
a.设置一个 profile 来限制口令设置,在创建或修改用户的时候,将 profile 指定给用户
b.fail_login_attempts :最多的失败登陆次数
password_lock_time : 经过这个天数后,自动解锁,或者管理员手工解锁

note:如果是通过 alter user 来 lock 的,则这个帐户不会自动解锁

c.password_life_time :超过这个日期则口令过期
password_reuse_time: 经过这个天数后可重用这个口令
password_reuse_max: 口令能够被重用的最多次数

d .password_verify_fuction 自定义的口令验证函数
使用 utlpwdmg.sql 创建 verify_function 函数

E. 修改 profile
Alter profile profile_name limit name 大小;

f. 创建 profile
create profile profile_name limit
name max_value
删除 profile
a. drop profile name;
删除 profile
b. drop profile name cascade ;
删除 profile,同时从用户手工 revoke 原来的资源分配(oracle 自动将 default 的 profile 授予
给用户,当前被付给用户的也被删除)

注意事项:

Drop profile 不能删除 default 的


Drop profile 对当前会话无效
资源管理:
Resource_limit 的设置
1. 通过参数文件设置为 true
2. 通过 alter system 设置

资源设置相关参数:
Cpu_per_session 一个会话所能使用的 cpu,单位是百分之一秒
Session_per_user 一个用户所允许的最大并发会话
Connect_time 连接的最长时间,以分为单位
Idle_time :允许的最多的空闲时间,以分为单位
Logical_reads_per_session : 一个会话允许的读取块数(logical 和 physical reads)
Private_sga : private space in the sga ,以字节为单位

1. 可以在会话级别,或者调用级别,或者二者同时设置,会话级别现在的是一个连接。
当在 session 级别超出
a. 出现 ora-02391
b. Oracle 服务器 disconnect user

Idle_time,只考虑服务器进程,不考虑应用,idle_time 都长期的查询和其它操作没影响
Logical_reads_per_session : 从磁盘或者内存的总读取数,避免 io 不紧张的语句占用大量的
内存空间

Private sga 只有在共享服务器中设置才有效,可以是(k)或(m)为单位

Cpu_time_per_call 一次调用所能使用的 cpu 时间


Logical_reads_per_call :和 session 的类似,但不是对一个连接的,只是对一次调用

相关数据字典
Select username,password,account_status from dba_users;

Select * from dba_profiles where resource_type=’pasword or kernel ‘ and profile=’ ‘;

十四

用户的认证模式:
1. 数据字典
2. 网络
3. os 认证

创建用户时的一些 option
Default tablespace: 用户默认的表空间
Temporary tablespace : 用户默认的临时表空间
Account locking :创建用户的是时候是否锁住用户, lock 可以有管理员手动加,数据库也能
使 account lock。
Resource limits ,限制 cpu,io 以及一个用户所能开的最大 session 数
Role privilege : 间接的给用户授予权限
Direct privilege: 授予用户对数据库的执行权限

模式: 模式是一系列和用户相关的对象(如 table,view,procedure,package)的集体。当用户创建


的时候,相应的模式就被创建,模式名称和用户名一致,用户只与相同名字的模式相关联 ,
因此用户和模式一般可以互换。

创建用户清单:
1. 哪个表空间用来存放用户对象
2. 每个表空间的限额
3. 授予用户默认的表空间和临时表空间
4. 创建用户
5. 给用户授权和角色

Example :
Create user username
Identified by password
Default tablespace tablespace
Temporary tablespace temporary_tablespace
Quota n[m] on tablespace
Password expire ; //强制创建完用户后让用户修改密码

修改表空间的 quotas 在表空间上

Alter user username quota n[m] on tablespace_name;

Quota 0 授予给用户后,用来在那表空间的对象仍然存在,只是不分配任何新的空间。

Drop user username : 只有当用户不包含任何对象时才行


Drop user username cascade : 在删除用户之前,先删除用户所拥有的模式对象,如果模式包
含任何模式对象,那么就要这么删除用户。
当前已经连接上 oracle 服务器的用户将无法被删除

相关数据字典
Dba_users : select username, DEFAULT_TABLESPACE from dba_users;
Dba_ts_quotas : 用 户 所 具 有 的 表 空 间 限 额 , 如 果 对 表 空 间 的 限 额 是 unlimited , 那 么
max_bytes 和 max_blocks 是-1 。

十五

权限定义: 允许用户执行某种类型的 sql 语句或者访问其它用户对象。包含如下,连接数据库,


创建表,对其它用户的表执行 select,执行其它用户所拥有的存储过程等。

System 权限: 允许用户执行某种特殊的数据库操作,例如,创建数据库是系统权限


对象权限:允许用户对模式对象(如表,视图,索引,触发器,存储过程,函数或包)执行
某种特殊的操作。

dba 可以控制的权限:
1. 为用户提供某种操作的权限
2. 授予或者夺回对系统的操作权限
3. 直接给用户或者角色授权
4. 给所有用户授权 (grant privilege to public)

权限的授予和回收通过 grant 和 revoke

权限的分类:
1. 能够进行系统范围的操作,如 create session,create tablespace
2. 能够对用户拥有的模式进行管理,如 create table
3. 权限能够对其它模式拥有的对象进行管理,如 create any table

系统权限:
Index create any index
Alter any index
Drop any index
Table create table
Create any table
Alter any table
Drop any table
Select any table
Update any table
Delete any table
Session create session
Alter session
Restricted session
Tablespace create tablespace
Alter tablespace
Drop tablespace
Unlimited tablespace

Note:
a. 不存在 create index 的权限
b. Create table,create procedure,create cluster 包含了相应的 drop 权限
c. Unlimited tablespace 不能授给一个角色
d. Truncate 其它用户的表,要有 drop any table 的权限

Grant 语法:
Grant { system_privilege | role } to {user|role|public} [with admin option]

Public 给所有用户授权
With admin option 允许被授权用户将此权限授予其它用户

Sysdba 和 sysoper
Sysoper 具 有 的 权 限 , startup,shutdown ,alter database open | mount, alter database backup
controlfile to , alter database ,alter database archivelog
Sysdba 具 有 的 权 限 , sysoper privilege with admin option, create database ,alter database
begin/end backup, restricted session , recover database until (包含 sysoper 的权限)

Sysoper 和 sysdba 权限的用户可以通过查 v$pwfile_users 得到,密码有口令文件管理

关于参数
O7_DICTIONARY_ACCESSIBILITY

如果这参数为 true,那么具有 select any table 的权限不仅具有访问其它用户表的权限,而且


可以访问 sys 的对象。
如果这参数设置为 false ,那么 select any table 的权限只能访问其它模式拥有的对象,而不
能访问 sys 的对象

回收权限
Revoke {system_privilege| role } from { user|role|public }
1. 不能 revoke 系统权限不会级连 revoke
2. revoke 系统权限可能对其它的依赖对象产生影响,如果用户被授予 select any table 的权
限,那么改用户就具有了 create any procedure 和 create any view 的权限,如果 select any
table 的系统权限被 revoke,那么视图和存储过程将 invalidate。
将设 a 给 b 授予某个权限并且具有 with admin option 的权限,然后 b 给 c 授予了相同的权限
这时候从 b 中 revoke 权限,c 的权限不会被 revoke。

对象权限,具有对某个对象执行某种操作的权限。
Grant [object_privilege|all] on object to [user|role|public] with grant option

Example :
A is granted select object privilege on employee with grant option
A grant select on employee to b
Later,the select privilege is revoke from a, then this revoke is cascade on b

相关数据字典
Dba_sys_privs : list system privileges to user or role
Session_privs : list the privileges that are currently available to user
Dba_tab_privs : list all grants on all objects in the database
Dba_col_privs : list all object columns granted in the database

审计: 监测用户的数据库用户的行为
作用:
a. 调查数据库的可以行为
b. 获取数据库特殊行为的信息

确定对什么进行审计:
1. 基于用户,语句或者模式对象
2. 语句的执行
3. 语句的执行是否成功

管理审计的跟踪记录
1. 监测跟踪记录的增长

审计默认情况下是关闭的。参数 audit_trail

Audit_trail 具有 3 个值
1. Db :enable auding and directs all audit records to database audit trails (sys.aul$)
2. Os : enable auding and directs all audit records to os audit traits
3. None 这个是缺省的,缺省不打开审计

具体步骤:
1. 打开审计(参数 audit_trail 不能是 none),可以记录到 database 或者是 os,audit 和 noaudit
可以任何时刻使用,如果在参数文件中设置了 audit_trail,那么操作记录都会记录到 audit
trail 中
2. 定制审计操作 ,可以是基于用户,对象或者权限,你可以设置 audit 记录,每次执行
这语句,或者一个会话只记录一次。
3. 执行语句,当用户执行 plsql 和 sql 语句时,服务器进程检查 audit 选项,确定操作是否
要记录 audit 记录中,plsql 程序单元中,对内部的 sql 语句单独审计。
4. 生成审计数据,审计数据的生成和往 audit trail 中插入数据是独立的,因此,一个用户
即使回滚了事务, audit trail 记录仍然是完整的。 Audit 记录是在查询阶段生成的,如果
发生语法错误,那么将不会生成相应的 audit trail
5. 查看审计信息,通过检查 audit trail 的数据字典视图查看审计生成的信息,或者通过 os 工
具查看操作系统的 audit trail。这些信息用来确定可以行为和监控数据库操作。

Audit options
审计语句: 审计语句,而不是语句操作的的模式对象,如 audit table
审计权限: 审计 system privilege. 如 audit create any trigger
审计模式对象: 只对特定的模式对象进行审计,模式对象的审计使用所有用户。
Audit select on schema.table .
还有一些特有选项
Whenever successful /whenever not successful
By session / by access

更精确的审计

Dbms_fga 可以更精确的定制审计

Disable audit
使用 noaudit 语句
Note: noaudit 语句只是反转先前的 audit ,比如先 audit statement A enable audit for a specific
user,a second (statement B) enables auditing for all uses ,then noaudit 语句 disable auditing for
all users reverses statement B,but leave statement A in effect and continue to audit the user that
statement A specified .

数据字典

Data dictionary view description


All_def_audit_opts default audit options
Dba_stmt_audit_opts statement auditing options
Dba_priv_audit_opts privilege auditing options
Dba_obj_audit_opts schema object auditing options
Dba_audit_trail all audit trail exists
Dba_audit_exists records for audit exists/not exists
Dba_audit_object records concerning schema objects
Dba_audit_session all connect and disconnect entries
Dba_audit_statement statement auditing records
十六

Oracle 通过角色进行简单的用户权限管理

角色是一系列权限的集合(这些权限可以是其它用户授予的权限,或者其它角色)

角色特点:
a. 角色的 grant 和 revoke 同系统权限的 grant 和 revoke 使用相同的命令
b. 角色可以被授予给其它用户或者角色,然而角色不能被授予自身
c. 能包含系统权限和对象权限
d. 被授予用户的角色可以被 enable 或者 disable
e. 可以给角色设置密码
f. 角色名不能和用户名或者其它角色名重复
g. 任何用户都不能拥有角色。不属于任何模式
h. 数据字典中的相关描述

角色的好处:
1. 方便管理
不用将相同的权限集合授予不同的用户,可以直接将那些权限授予角色,再将角色授予用

2.动态权限管理
如果一个角色中的权限被修改,那么所有被授予此角色的用户所拥有的权限也被修改

3.选择权限的可用性
角色可以 enable 和 disable,导致权限 on 和 off。

4.可以通过 os 授权

5.提高性能
By disabling roles,there are fewer privileges to verify during statement execution. Using roles
reduces the number of grants stored in the data dictionary.

创建角色:

Create role role_name [not identified | identified]


{by password | externally | globally | using package }

Role_name 角色名
Not identified : enable 角色的时候不需要密码
Indentified : enble 角色的时候需要输入密码
By password: 设置密码
Externally : 在 enable 的时候使用外部服务认证(如 os,第三方工具)
Grobally : enable role 通过 set role 和 login 时,对角色的认证通过 enterprise directory

预定义的角色:
Role name description
Conncet,resource,dba 这些角色是为了向后兼容而保留的
Exp_full_database export the database
Imp_full_database import the database
Delete_catalog_role delete privileges on data dictionary tables
Execute_catalog_role execute privilege on data dictionary packages
Select_catalog_role select privilege on data dictionary tables

修改角色

Alter role role_name identified by password;


Alter role role_name not identified by ;

将角色授给用户
Grant role to user;
Grant role to user with admin option;

设置用户的默认角色:

Alter user username default role rolename ,…;


Alter user username default role all;
Alter user username default role all except role_name;
Alter user username default role none;

Username:被授予角色的用户名
Role :将要设置成 default role 的角色
All : 将用户所具有的所有角色都设置成默认角色
Except:排除在外的
None:使所有角色都不成为默认角色

一个用户可以被授予很多角色,默认角色是这些角色的子集,默认角色在用户登陆的时候
自动 enable,如果用户的所有角色都没有密码,那么角色在用户登陆的时候自动 enable

不能使用 Default role 的情况


1. 角色没被授予给用户
2. role 不是直接授予,而是间接授予
3. role 是由 external service 管理的
enable and disable roles
当一个角色被 enable,那么用户能使用角色中的权限,如果角色被 disable ,那么用户
将不能使用句色中的权限,角色的 enable 是对 session 而言的,下一个会话,用户的
active 角色将是默认角色

Set role 和 dbms_session.set_role 都能 enable 角色

可以通过设置默认角色的方式使角色在用户登陆的时候自动 enable , 不能在存储过程


中 enable 角色
Example :
Set role role_name;
Set role role_name identified by password ;
Set role all except role_name;

夺回角色:
Revoke role_name from [ user | public ]
Role_name :要 revoke 的角色名
User:要 revoke 角色的用户名
Public: 从所有用户手中 revoke

删除角色:

Drop role role_name;


Note : 当角色被删除时,oracle 将从所有用户手中 revoke 角色,同时从数据库中删除角
色。必须具有 with admin option 和 drop any role 的权限

相关数据字典:
Role view description
Dba_roles all roles that exists in the database
Dba_role_privs role granted to users and roles
Role_role_privs roles that are granted to roles
Dba_sys_privs system privileges granted to users
Role_sys_privs system privileges granted to roles
Role_tab_privs object privileges granted to roles
Session_roles roles that the user currently has enable

You might also like