1. 首页 > 文章分类 > 生活百态

数据字典实例(MySQL的数据字典)

Oracle的数据字典

首先,Oracle的字典表和视图基本上可以分为三个层次。

1.1 X$表

这一部分表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。

这部分表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。

如果显示授权你会收到如下错误: SQL grant select on x$ksppi to eygle;

grant select on x$ksppi to eygle

*

ERROR at line 1:

ORA-02030: can only select from fixed tables/views

1.2 GV$和V$视图

从Oracle8开始,GV$视图开始被引入,其含义为Global V$.

除了一些特例以外,每个V$视图都有一个对应的GV$视图存在。

GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图基于GV$视图,增加了INST_ID列判断后建立,只包含当前连接实例信息。

注意,每个V$视图都包含类似语句:

where inst_id= USERENV('Instance')

用于限制返回当前实例信息。

我们从GV$FIXED_TABLE和V$FIXED_TABLE开始

SQL select view_definition from v_$fixed_view_definition

where view_name='V$FIXED_TABLE';

VIEW_DEFINITION

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

select NAME, OBJECT_ID, TYPE, TABLE_NUM from GV$FIXED_TABLE

where inst_id= USERENV('Instance')

这镇镇里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。

SQL select view_definition from v_$fixed_view_definition

where view_name='GV$FIXED_TABLE';

VIEW_DEFINITION

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

select inst_id,kqftanam, kqftaobj,'TABLE', indx from x$kqfta

union all

select inst_id,kqfvinam, kqfviobj,'VIEW', 65537 from x$kqfvi

union all

select inst_id,kqfdtnam, kqfdtobj,'TABLE', 65537 from x$kqfdt

这样我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。

1.3 GV_$,V_$视图和V$,GV$同义词

这些视图是通过catalog.ql创建。

当catalog.sql运行时:稿明

create or replace view v_$fixed_table as select* from v$fixed_table;

create or replace public synonym v$fixed_table for v_$fixed_table;

create or replace view gv_$fixed_table as select* from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

我们注意到,第一个视图V_$和GV_$首先被创建,v_$和gv_$两御敬粗个视图。

然后基于V_$视图的同义词被创建。

所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。

而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)。而v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口,仔细理解Oracle的数据字典机制,有助于深入了解和学习Oracle数据库知识。

1.4再进一步

1.4.1 X$表

关于X$表,其创建信息我们也可以从数据字典中一窥究竟。

首先我们考察bootstrap$表,该表中记录了数据库启动的基本及驱动信息。 SQL select* from bootstrap$;

LINE# OBJ# SQL_TEXT

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

-1-1 8.0.0.0.0

0 0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE( INITIAL 112K NEXT 1024K

MINEXTENTS 1 M

8 8 CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,

"SEGBLOCK#" NUMBER)

9 9 CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10

INITRANS 2 MAXT

14 14 CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT

NULL,"TYPE#" NUMBE

5 5 CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#"

NUMBER NOT NULL

6 6 CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS

2 MAXTRANS 255

7 7 CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS

255 STORAGE(

这部分信息,在数据库启动时最先被加载,跟踪数据库的启动过程,我们发现数据库启动的第一个动作就是: create table bootstrap$( line# number not null, obj# number not null,

sql_text varchar2(4000) not null) storage(initial 50K objno 56 extents

(file 1 block 377))

这部分代码是写在Oracle应用程序中的,在内存中创建了bootstrap$以后,Oracle就可以从file 1,block 377上读取其他信息,创建重要的数据库对象。从而根据这一部分信息启动数据库,这就实现了数据库的引导,类似于操作系统的初始化。

X$表由此建立。这一部分表可以从v$fixed_table中查到: SQL select count(*) from v$fixed_table where name like'X$%';

COUNT(*)

----------

394

共有394个X$对象被记录。

1.4.2 GV$和V$视图

X$表建立以后,基于X$表的GV$和V$视图得以创建。

这部分视图我们也可以通过查询V$FIXED_TABLE得到。 SQL select count(*) from v$fixed_table where name like'GV$%';

COUNT(*)

----------

259

这一部分共259个对象。 SQL select count(*) from v$fixed_table where name like'V$%';

COUNT(*)

----------

259

同样是259个对象。

v$fixed_table共记录了394+ 259+ 259共 912个对象。

我们通过V$PARAMETER视图来追踪一下数据库的架构: SQL select view_definition from v$fixed_view_definition a where

a.VIEW_NAME='V$PARAMETER';

VIEW_DEFINITION

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

select NUM, NAME, TYPE, VALUE, ISDEFAULT, ISSES_MODIFIABLE,

ISSYS_MODIFIA

BLE, I*ODIFIED, ISADJUSTED, DESCRIPTION, UPDATE_COMMENT from

GV$PARAMETER wh

ere inst_id= USERENV('Instance')

我们看到V$PARAMETER是由GV$PARAMETER创建的。 SQL select view_definition from v$fixed_view_definition a where

a.VIEW_NAME='GV$PARAMETER';

VIEW_DEFINITION

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

select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf, decode

数据字典实例(MySQL的数据字典)(图1)

(bitand(kspp

iflg/256,1),1,'TRUE','FALSE'), decode(bitand(ksppiflg/65536,3),1,

'IMMEDIATE',2,

'DEFERRED', 3,'IMMEDIATE','FALSE'), decode(bit and(ksppstvf,7),

1,'MODIFIED',4,'SYSTEM_MOD','FALSE'), decode(bitand(ksppstvf,2

,2,'TRUE','FALSE'), ksppdesc, ksppstcmnt from x$ksppi x, x$ksppcv

y where(x.indx= y.indx) and((translate(ksppinm,'_','#') not

like'#%') or(ksppstdf='FALSE'))

在这里我们看到GV$PARAMETER来源于x$ksppi,x$ksppcv两个X$表。 x$ksppi,x$ksppcv基本上包含所有数据库可调整参数,v$parameter展现的是不包含"_"开头的参数。以"_"开头的参数我们通常称为隐含参数,一般不建议修改,但很多因为功能强大经常使用而广为人知。

数据字典的内容和作用

数据字典中有芹皮四种类型的条目:数据流,数据存储,数据项和加工。

数据字典中包括数据定义,但除了它之外,还包含其它一些信息:

一般信绝丛息,包括名字,别名和描述;

数据定义,包括数据类型,数据长度和结构组成;

数据的使并首樱用特点,包含数据的取值范围,使用频率和使用方式;

数据的控制信息,包括数据来源,用户,使用它的程序和改变权。

作用:数据字典和数据流图共同构成系统的逻辑模型。没有流图数据字典难以发挥作用。没有数据字典,数据流图就不严格。

你了解了吗?

数据字典的分类

数据字典在需求分析阶段被建立。

数据字典是一个预留空间,一个数据库,这是用来储存信息数据库本身。

数据字典可能包含的信息,例如:

数据库设计资料

储存的SQL程序

用户权限

用户统计

数据库的过程中的信息

数据库增长统计

数据库性能统计

数据字典则是系统中各类数据描述的**,是进行详细的数据收集和数据分析所获得的主要成果。

数据字典通常包括数据项\数据结构\数据流\数据存储和处理过程五个正昌部分。

其中数据项是数据的最小组成单位若干个数据项可以组成一个数据结构数据字典通过对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。

数据字典是关于数据的信息的**,也就是对数据流图中包含的所有元素的定义的**.

数据字典还有另一种含义,是在数据库设计时用到的一种工具,用来描述数据库中基本表的设计,主要包括字段名、数据类型、主键、外键等描述表的属性的内容。

以Oracle数据库字典为例:数据字典分为数据字典表和数据字典视图

Oracle数据库字典通常是在创建和安装数据库时被创建的,Oracle数据字典是Oracle数据库系统工作的基础,没有数据字典的支持,Oracle数据库系统就不能进行任何工作。数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。

数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据。为了方便的区别这些表,这些表的名字都是用$结尾,这些表属于SYS用户。

数据字典表由$ORACLE_HOME/rdbms/admin/sql.bsq脚本创建,这个脚本里举晌扒又调用了其他的脚本来创建这些数据字典表。在那些创建脚本里有基表的创建SQL。

Oracle对数据字典表的说明:

These underlying tables store information about the database. Only Oracle Database should write to and read these tables. Users rarely access the base tables directly because they are normalized and most data is stored in a cryptic format.

这些数据字典表,只有Oracle能够进行读写。

SYS用户下的这些数据字典表,存放在system表空间下面,表名都用$结尾,为了便于用户对数据字典表的查询, Oracle对这些数据字典都分别建立了用户视图,这样即容易记住,还隐藏了数据字典表表之间的关系,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX。

数据字典视图分2类:静态数据字典(静态性能视图)和动态数据字典(动态性能视图)。

静态数据字典中的视图分为三类,它们分别由三个前缀构成:user_*、 all_*、 dba_*。

user_*:该视图存储了关于当前用户所拥有的对象的信息。(即所有在该用户模式下的对象)

all_*:该试图存储了当前用户能够访问的对象的信息,而不是当前用户拥有的对象。(与user_*相比,all_*并不需要拥有该对象,只需要具有访问该对象的权限即可)

dba_*:该视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)

这些视图由SYS用户创建的,所以使用需要加上SYS,为了方便, Oracle为每个数据字典表的视图头建立了同名字的公共同义词(public synonyms).这样简单的处理就省去了写sys.的麻烦。

除了静态数据字典中三类视图,其他的字典视图中主谨侍要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。这些视图会不断的进行更新,从而提供了关于内存和磁盘的运行情况,所以我们只能对其进行只读访问而不能修改它们。

Throughout its operation, Oracle Database maintains a set of virtual tables that record current database activity. These views are calleddynamic performance views because they are continuously updated while a database is open and in use. The views, also sometimes calledV$ views。

V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。

动态性能表用于记录当前数据库的活动,只存于数据库运行期间,实际的信息都取自内存和控制文件。 DBA可以使用动态视图来监视和调节数据。

什么是数据字典

下文以oracle数据库为例对数据字典进行解释:

数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的。比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息。

Oracle中的数据字典有静态和动态之分。静态数据字典主要是在用户访问数据字典时不会发生改变的,但动态数据字典是依赖数明改据库运行的性能的,反映数据型型库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。以下分别就这两类数据字典来论述。

1.静态数据字典

激租判这类数据字典主要是由表和视图组成,应该注意的是,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,它们分别由三个前缀够成:user_*、 all_*、 dba_*。

user_*

该视图存储了关于当前用户所拥有的对象的信息。(即所有在该用户模式下的对象)

all_*

该试图存储了当前用户能够访问的对象的信息。(与user_*相比,all_*并不需要拥有该对象,只需要具有访问该对象的权限即可)

dba_*

该视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)

从上面的描述可以看出,三者之间存储的数据肯定会有重叠,其实它们除了访问范围的不同以外(因为权限不一样,所以访问对象的范围不一样),其他均具有一致性。具体来说,由于数据字典视图是由SYS(系统用户)所拥有的,所以在却省情况下,只有SYS和拥有DBA系统权限的用户可以看到所有的视图。没有DBA权限的用户只能看到user_*和all_*视。如果没有被授予相关的SELECT权限的话,他们是不能看到 dba_*视图的。

由于三者具有相似性,下面以user_为例介绍几个常用的静态视图:

user_users视图

主要描述当前用户的信息,主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。例如执行下列命令即可返回这些信息。

select* from user_users

user_tables视图

主要描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等。通过此视图可以清楚了解当前用户可以操作的表有哪些。执行命令为:select* from user_tables

user_objects视图

主要描述当前用户拥有的所有对象的信息,对象包括表、视图、存储过程、触发器、包、索引、序列等。该视图比user_tables视图更加全面。例如,需要获取一个名为“package1”的对象类型和其状态的信息,可以执行下面命令:

select object_type,status

from user_objects

where object_name=upper(‘package1’);

这里需注意upper的使用,数据字典里的所有对象均为大写形式,而PL/SQL里不是大小写敏感的,所以在实际操作中一定要注意大小写匹配。

user_tab_privs视图

该视图主要是存储当前用户下对所有表的权限信息。比如,为了了解当前用户对table1的权限信息,可以执行如下命令:

select* from user_tab_privs where table_name=upper('table1')

了解了当前用户对该表的权限之后就可以清楚的知道,哪些操作可以执行,哪些操作不能执行。

前面的视图均为user_开头的,其实all_开头的也完全是一样的,只是列出来的信息是当前用户可以访问的对象而不是当前用户拥有的对象。对于dba_开头的需要管理员权限,其他用法也完全一样,这里就不再赘述了。

2.动态数据字典

Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于当数据库运行的时候它们会不断进行更新,所以称它们为动态数据字典(或者是动态性能视图)。这些视图提供了关于内存和磁盘的运行情况,所以我们只能对其进行只读访问而不能修改它们。

Oracle中这些动态性能视图都是以v$开头的视图,比如v$access。下面就几个主要的动态性能视图进行介绍。

v$access

该视图显示数据库中锁定的数据库对象以及访问这些对象的会话对象(session对象)。

运行如下命令:

select* from v$access

结果如下:(因记录较多,故这里只是节选了部分记录)

SID

OWNER OBJECT TYPE

27 DKH V$ACCESS CURSOR

27 PUBLIC V$ACCESS SYNONYM

27 SYS DBMS_APPLICATION_INFO PACKAGE

27 SYS GV$ACCESS VIEW

v$session

该视图列出当前会话的详细信息。由于该视图字段较多,这里就不列详细字段,为了解详细信息,可以直接在sql*plus命令行下键入:desc v$session即可。

v$active_instance

该视图主要描述当前数据库下的活动的实例的信息。依然可以使用select语句来观察该信息。

v$context

该视图列出当前会话的属性信息。比如命名空间、属性值等。

3.小结

以上是Oracle的数据字典方面的基本内容,还有很多有用视图因为篇幅原因这里不能一一讲解,希望大家在平时使用中多留心。总之,运用好数据字典技术,可以让数据库开发人员能够更好的了解数据库的全貌,这样对于数据库优化、管理等有极大的帮助。

关于数据字典实例到此分享完毕,希望能帮助到您。

本文来源于互联网,不代表趣虎号立场,转载联系作者并注明出处:https://www.quhuhao.com/wzfl/65927.html

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:9:30-18:30,节假日休息