Oracle-数据字典

做系统维护很多的时候,毕竟是后来者,不知道这数据是视图还是表还是同义词甚至是DBLINK过来的,还有看这些定义,有必要了解数据字典。就收集整理了。

数据字典是数据库中所有对象及其关系的信息集合。 可能包含的信息,例如:  数据库设计资料、储存的SQL程序 、用户权限、用户统计、数据库的过程中的信息、数据库增长统计、 数据库性能统计等。数据字典则是系统中各类数据描述的集合,是进行详细的数据收集和数据分析所获得的主要成果。 通常包括数据项、数据结构、数据流、数据存储和处理过程五个部分。每个数据库都提供了各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema里表现的,sqlserver则是在sys这个系统schema里来展示的。

数据字典存储了Oracle数据库对象的元数据信息。数据字典保存在system表空间中,由Oracle自行维护。数据字典主要分为内部RDBMS表、数据字典表、动态性能视图和数据字典视图。数据库启动时,动态创建x$,在x$基础上创建gv$,在gv$基础上创建v$,即x$表–>GV$(视图)—>v$(视图)

内部RDBMS表

以“x$”开头命名的表,内部RDBM S表是Oracle数据库的核心,加密命名,只允许sysdba用户访问。用于跟踪内部数据库信息,维持数据库运行。表例:x$kvit,x$bh,x$ksmsp,x$ksppi和x$ksppcv等等

数据字典表

以“$”结尾命名的表,用于存储表、索引、约束以及其他数据库结构的信息。
创建数据库时通过脚本sql.bsq来创建,脚本所在位置:$oracle_home/rdbms/admin/sql.bsq。表例:tab$,obj$,ts$

动态性能视图

以“gv$”或“v$”开头命名的表,记录了DB运行时信息和统计数据,大部分动态性能视图被实时更新以反映DB当前状态,亦由数据库创建时建立,只有sysdba可以访问。有些视图如:v$fixed_view_definition 用来记录其他视图的创建方式。如:

  1. select view_definition from v$fixed_view_definition where view_name=’V$PARAMETER’;

gv$就是Global v$,以x$表为基础创建,是为了满足OPS环境(多个实例)的需要面产生的,可以返回多个实例的信息。v$是以gv$为基础创建,只返回当前实例的信息。定义语句都带有:where inst_id =USERENV('Instance'),gv$和v$之后,oracle建立了gv_$和v_$视图,又为这些视图建立了公用同义词。由脚本catalog.sql实现的,脚本所在位置 :$oracle_home/rdbms/admin/catalog.sql
可以看出建立顺序:
v$(视图)–>v_$(视图)–>v$(公用同义词)
gv$(视图)–>gv_$(视图)–>gv$(公用同义词)
通过v_$和gv_$,oracle把v$视图和gv$视图和普通用户隔离开来。(oracle允许v_$视图权限可以授权给其他用户,但不允许任何对于v$视图的直接授权。)
所以,在非Sys用户下,我们访问的都是同义词,而不是v$视图或gv$视图。
oracle访问数据顺序:view–>同义词。表例:v$parameter
v$access该视图显示数据库中锁定的数据库对象以及访问这些对象的会话对象(session对象)。
v$session该视图列出当前会话的详细信息。
v$active_instance该视图主要描述当前数据库下的活动的实例的信息。依然可以使用select语句来观察该信息。
v$context该视图列出当前会话的属性信息。比如命名空间、属性值等

动态视图追踪

— 动态视图追踪v$session

  1. select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME=’V$SESSION’;
  2. select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME=’V_$SESSION’;
  3. select TEXT from dba_views where VIEW_NAME=’V_$SESSION’;
  4. select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=’V$SESSION’;
  5. select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME=’GV$SESSION’;

— 可以得知过程 v$session -> v_$session -> gv$session -> x$ksuse s和x$ksle

数据字典视图

数据字典视图是在x$表和数据字典表之上建立的视图。创建数据库时由脚本catalog.sql创建。脚本所在位置 :$oracle_home/rdbms/admin/catalog.sql

按前缀不同,作用范围的分为三类:

以user开头的数据字典: 包含当前用户所拥有的相关对象信息。

–能够查到对象的所有者是当前用户的所有对象
–查询用户表
select table_name from user_tables;

–查询该用户索引
select index_name from user_indexes;

–查询该用户视图
select view_name from user_views;

— 查看序列号
select last_number from user_sequences where sequence_name = '';

— 查同义词
select * from user_synonyms;

— 查约束条件
select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = '';

— 查看触发器
select * from user_triggers where trigger_name = '';

— 查看函数
select name,TEXT from USER_SOURCE where type = 'FUNCTION' where name = '';

— 存储过程
select text from user_source where type='PROCEDURE' and name = '';
–查询该用户数据库对象,对象包括表、视图、存储过程、触发器、包、索引、序列、JAVA文件等。
select object_name from user_objects;

–主要描述当前用户的信息,主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。
select * from user_users;

— 查看表空间
select * from user_tablespaces;

— 查看package
select distinct name,TEXT from USER_SOURCE where type = 'PACKAGE';

— 查看工作
— job job的唯一标识,自动生成的
— broken 是否处于运行状态,N;运行;Y:停止
— what 存储过程名称
— next_date 初次执行时间
— interval 执行周期
select job,broken,what,interval,t.* from user_jobs t;

以all开头的数据字典: 包含当前用户有权限访问的所有对象的信息。

–能够查到所有当前用户有权限访问的对象
–查询某一用户下的所有表
select table_name from all_tables;

–查询某一用户下的所有表、过程、函数等信息。
select owner , object_name ,object_type from all_objects;

— 查看资源
select text from all_source where owner='' and name = '';

以dba开头的数据字典: 包含数据库所有相关对象的信息。

–只能是有dba权限的用户查询,能查到数据库中所有对象
select table_name from dba_tables; -- (sys system)
各数据字典表数量可以从v$fixed_table中查询

— 查看dblink
select owner,object_name from dba_objects where object_type='DATABASE LINK';
select * from dba_db_links where owner = '';

— 查看package
select * from DBA_objects where object_type='PACKAGE' AND owner='';

— 查看角色
select * from dba_roles;

— 查看数据字典
Select * from dict; -- or dictionary

— 查看版本
select * from v$version;

— 查看表结构
desc 表名

查看数据的DDL语句

当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看定义。

dbms_metadata包中的get_ddl函数定义

FUNCTION get_ddl (
object_type IN VARCHAR2, ---需要返回原数据的DDL语句的对象类型
name IN VARCHAR2, --- 对象名称
schema IN VARCHAR2 DEFAULT NULL, ---对象所在的Schema,默认为当前用户所在所Schema
version IN VARCHAR2 DEFAULT 'COMPATIBLE', ---对象原数据的版本
model IN VARCHAR2 DEFAULT 'ORACLE',--原数据的类型默认为Oracle
transform IN VARCHAR2 DEFAULT 'DDL'  - XSL-T transform. to be applied.
) RETURN CLOB;

— 利用dbms_metadata.get_ddl包函数查看ddl语句
select dbms_metadata.get_ddl('SYNONYM','同义词名') from dual;
select dbms_metadata.get_ddl('VIEW','视图名') from dual;
select dbms_metadata.get_ddl('PACKAGE','包名') from dual;
select dbms_metadata.get_ddl('PROCEDURE','存储过程名') from dual;
select dbms_metadata.get_ddl('TABLE','表名') from dual;
select dbms_metadata.get_ddl('FUNCTION','函数名') from dual;

— 查看其他用户索引的SQL
select dbms_metadata.get_ddl('INDEX','索引名','SCOTT’) from dual;

— 查看创建主键的SQL
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','约束名') FROM DUAL;

— 查看创建外键的SQL
SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT','外键约束名') FROM DUAL;

其他使用方式

1、得到一个用户下的所有表,索引,存储过程,函数的ddl
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name) FROM USER_OBJECTS u where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE','FUNCTION');

2、得到所有表空间的ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;

3、得到所有创建用户的ddl
SELECT DBMS_METADATA.GET_DDL('USER',U.username) FROM DBA_USERS U;

4、去除storage等多余参数
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);

错误解决方法

提示错误:ORA-19206: Invalid value for query or REF CURSOR parameter

解决办法:运行 $ORACLE_HOME/rdbms/admin/catmeta.sql
提示错误:ORA-39212: installation error: XSL stylesheets not loaded correctly

解决办法

  • 以sys用户进入 sqlplus / as sysdba
  • exec dbms_metadata_util.load_stylesheets

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 24 = ?