数据字典
1. 数据字典概述
-
数据字典的内容与作用
数据字典是数据库重要组成部分,是在数据库创建过程中创建的,保存了数据库系统信息以及数据库中所有的对象信息,是数据库系统运行的基础。
Oracle 数据库的数据字典由一系列表和视图构成,这些表和视图对于所有的用户,包括 DBA,都是只读的。只有 Oracle 系统才可以对数据字典进行管理与维护。在 Oracle 数据库中,所有数据字典表和视图都属于 SYS 模式,存储于 SYSTEM 表空间中。
Oracle 数据字典保存数据库本身的系统信息及所有数据库对象信息,包括:
- 各种数据库对象的定义信息,包括表、视图、索引、同义词、序列、存储过程、函数、包、触发器及其他各种对象;
- 数据库存储空间分配信息,如为某个数据库对象分配了多少空间,已经使用了多少空间等;
- 数据库的安全信息,包括用户、权限、角色、完整性等;
- 数据库运行时的性能和统计信息;
- 其他数据库本身的基本信息。
数据字典除了用于 Oracle 进行系统管理外,对于 DBA 以及普通数据库用户都有着非常重要的作用。数据字典的主要用途包括:
- Oracle 通过访问数据字典获取用户、模式对象、数据库对象定义与存储等信息,以判断用户权限合法性、模式对象存在性及存储空间的可用性等;
- 使用 DDL 语句修改数据库对象后,Oracle 将在数据字典中记录所做的修改;
- 任何数据库用户都可以从数据字典只读视图中获取各种数据库对象信息;
- DBA 可以从数据字典动态性能视图中获取数据库的运行状态,作为进行性能调整的依据。
-
数据字典的管理与维护
数据字典主要是由 Oracle 数据库服务器使用的,服务器通过访问数据字典基表获取用户、数据库对象、存储结构等信息,并利用这些信息进行数据库的管理与维护。只有 Oracle 系统可以对数据字典进行管理与维护。在 Oracle 数据库运行过程中,如果数据库结构发生变化,Oracle 数据库服务器会及时地修改相应的数据字典以记录这些变化。
当数据库中执行下列各种 SQL 语句操作时,Oracle 数据库服务器会修改数据字典信息。
- DDL 语句。如增加或减少表空间、增加或减少用户。
- DCL 语句。如授予用户权限、回收用户权限。
- DML 语句。某些 DML 语句,如引起表的存储空间扩展的插入、修改语句,Oracle 会将磁盘上存储空间的变化信息记录到数据字典中。
包括数据库管理员(DBA)在内的任何用户都不能直接使用 DML 语句修改数据字典中的内容。所有用户和管理员(DBA)只能通过访问数据字典视图来得到数据库的相关信息。一些数据字典视图可以被所有用户访问,而另一些只能被数据库管理员访问。
2. 数据字典的结构
数据字典主要包括数据字典表和数据字典视图两种。根据数据字典对象的虚实性不同,分为静态的数据字典和动态数据字典两种,其中,静态数据字典在用户访问数据字典时不会发生改变,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。
-
静态数据字典表
静态数据字典表是在数据库创建过程中自动运行 sql.bsq(
%Oracle_HOME%\RDBMS\ADMIN\sql.bsq
)脚本创建的,由 SYS 用户所拥有,表中信息都是经过加密处理的。数据字典中的所有信息实际上都是存储在静态数据字典表中的。静态数据字典表的命名中通常包含$
符号。只有 Oracle 才能读 / 写这些静态数据字典表。例如,静态数据字典表tab$
。 -
静态数据字典视图
由于静态数据字典表对于用户而言是不可访问的,因此,通过对静态数据字典表进行解密和处理,创建了一系列用户可读的静态数据字典视图。在数据库创建过程中,通过自动运行 catalog.sql(
%Oracle_HOME%\RDBMS\ADMIN\catalog.sql
)脚本创建静态数据字典视图及其公共同义词,并进行授权。例如,静态数据字典视图 USER_TABLES。 -
动态数据字典表
动态数据字典表是在数据库实例运行过程中由 Oracle 动态创建和维护的一系列“虚表”,在实例关闭时被释放。动态数据字典表中记录与数据库运行的性能相关的统计信息,因此又称为动态性能表。通常,动态性能表的命名以
X$
开头。动态性能表由 SYS 用户所拥有。例如,动态性能表X$KSPPI
。 -
动态数据字典视图
在动态性能表上创建的视图称为动态数据字典视图,又称动态性能视图。所有动态性能视图命名都以 V\( 开头,Oracle 自动为这些视图创建了以 V\) 开头命名的公共同义词,因此动态性能视图又称为
V$ 视图
。例如,动态性能视图V$DATAFILE
。通过查询表 dictionary,可以获得全部可以访问的数据字典表或视图的名称和解释;通过查询表 dict_columns,可以获得全部可以访问的数据字典表或视图中字段名称和解释。例如:
SQL> SELECT * FROM dictionary; SQL> SELECT * FROM dict_columns WHERE TABLE_NAME='USER_TABLES';
3. 数据字典的使用
-
静态数据字典表的使用
静态数据字典表只能由 Oracle 进行维护,用户不能对这些表进行直接操作。当用户执行 DDL 操作时,Oracle 系统自动对相应的静态数据字典表进行操作。例如,当执行 CREATE TABLE、ALTER TABLE 和 DROP TABLE 操作时,系统会自动对 TAB$ 表进行 INSERT、UPDATE 和 DELETE 操作。
-
静态数据字典视图的使用
通常,用户通过对静态数据字典视图的查询可以获取所需要的所有数据库信息。
Oracle 静态数据字典视图可以分为 3 类,各类视图具有独特的前缀,其表示形式和含义如表所描述。
静态数据字典视图分类及其含义
名称前缀 含义 USER_ 包含当前数据库用户所拥有的所有的模式对象的信息 ALL_ 包含当前数据库用户可以访问的所有的模式对象的信息 DBA_ 包含所有数据库对象信息,只有具有 DBA 角色的用户才能够访问这些视图 例如,查询当前用户所拥有的表的信息、可以访问的表的信息及当前数据库所有表的信息,可以分别执行下列语句:
SQL> SELECT * FROM USER_TABLES; SQL> SELECT * FROM ALL_TABLES; SQL> SELECT * FROM SYS.DBA_TABLES;
注意:以 USER_、ALL_开头的数据字典视图都具有与其同名公共同义词,用户可以直接访问,而以 DBA_开头的数据字典视图归 SYS 用户所有,没有与其对应的同名公共同义词,因此非 SYS 用户访问时,需在 DBA_视图名前加 SYS 前缀。
-
动态性能表的使用
动态性能表是数据库实例启动后动态创建的表,用于存放数据库运行过程中的性能相关的信息。动态性能表都属于 SYS 用户,Oracle 使用这些表生成动态性能视图。
可以通过下列语句查询当前数据库中所有的动态性能表和动态性能视图:
SQL> SELECT NAME FROM V_$FIXED_TABLE;
-
动态性能视图的使用
动态性能视图是 SYS 用户所拥有的,在默认状况下,只有 SYS 用户和拥有 DBA 角色的用户可以访问。与静态数据字典表和视图不同,在数据库启动的不同阶段只能访问不同的动态性能视图。
当数据库启动到 NOMOUNT 状态时,Oracle 数据库打开初始化参数文件,分配 SGA 并启动后台进程,因此只能访问从 SGA 中获得信息的动态性能视图,如
V$PARAMETER
、V$SGA
、V$SESSION
、V$PROCESSE
、V$INSTANCE
、V$VERSION
、V$OPTION
等。当数据库启动到 MOUNT 状态时,Oracle 打开控制文件,因此不仅能访问从 SGA 中获得信息的动态性能视图,还可以访问从控制文件中获得信息的动态性能视图,如
V$LOG
、V$LOGFILE
、V$DATAFILE
、V$CONTROLFILE
、V$DATABASE
、V$THREAD
、V$DATAFILE_HEADER
等。当数据库完全启动后,可以访问
V_$fixed_table
表中所有的动态性能视图。例如,利用动态性能视图查询当前数据库参数设置信息、数据文件信息。
SQL> SELECT * FROM V$PARAMETER; SQL> SELECT * FROM DATAFILE;