Skip to main content

Oracle数据字典相关信息查询命令

· 9 min read
Network Engineer & Information Security Engineer & PMP & CISP & Senior Project Manager

一、什么是Oracle数据字典

数据字典(Data Dictionary)是Oracle元数据(Metadata)的存储地点,汇集了数据库对象及数据库运行时需要的基础信息。Oracle RDBMS使用数据字典记录和管理对象信息和安全信息,用户可以通过数据字典获取数据库相关信息,从而进行数据库管理、优化和维护工作。

二、数据字典的内容

数据字典包括以下内容:

所有数据库Schema对象的定义(表、视图、索引、聚簇、同义词、序列、过程、函数、包、触发器等); Oracle用户名称、角色、权限等信息; 完整性约束信息; 数据库的空间分配和使用情况; 字段缺省值; 审计信息; 其他数据库信息。

Oracle字典包括四个层次:内部RDBMS表(X)、基础数据字典表、数据字典视图和动态性能视图( V )

(1)X$表

X$表是Oracle数据库的核心部分,用于跟踪内部数据库信息,维持数据库正常运行,在数据库启动时由Oracle应用程序动态创建,不允许SYSDBA之外的用户直接访问。X$表是加密命名的且不作文档说明。Oracle通过X$建立起其他大量视图,供用户查询管理数据库之用。

(2)数据字典表、数据字典视图

数据字典表(Data Dictionary Table)用以存储表、索引、约束以及其他数据库结构的信息,

表名都用$结尾(如tab$、obj$、ts$等),在创建数据库的时候通过运行sql.bsq($ORACLE_HOME/RDBMS/admin目录下)脚本来创建。

数据字典表的用户都是sys,存在在system这个表空间里,Oracle对这些数据字典都分别建立了数据字典视图,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX,dictionary视图记录了所有的数据字典视图的名称。

user_类视图:描述了当前用户schema下的对象; all_类视图:描述了当前用户有权限访问到的所有对象的信息; dba_类视图:包括了所有数据库对象的信息; 通常USER_类视图不包含Owner字段,查询返回当前用户的对象信息。

eg:

SQL> select username from all_users; //查询所有用户
SQL> select username from dba_users; //查询dba用户
SQL> select table_name from user_tables; //查询当前用户的表
SQL> select table_name from all_tables; //查询所有用户的表
SQL> select table_name from dba_tables; //查询包括系统表
SQL> select owner,constraint_name,constraint_type,table_name from user_constraints;
SQL> select owner,constraint_name,constraint_type,table_name from all_ constraints;
SQL> select owner,constraint_name,constraint_type,table_name from dba_ constraints ;

(3)动态性能视图

动态性能(V$)视图(Dynamic Performance View)记录了数据库运行时的信息和统计数据。

创建X$表之后,Oracle创建了GV$和V$视图,在GV$和V$之后,Oracle建立了GV_$和V_$视图,随后为这些视图建立了公共同义词。这些工作都是通过catalog.sql脚本实现的。通过V_$视图,Oracle把V$视图和普通用户隔离,V_$视图的权限可以授予其他用户,而Oracle不允许任何对于V$视图的直接授权。Oracle提供了一些特殊视图用以记录其他视图创建方式,如v$fixed_view_defition,可以查看视图的定义。

eg:

SQL> select view_definition from v\$fixed_view_definition where view_name ='V$NLS_PARAMETERS';

三、数据字典应用示例

(1)查询表的信息

查询DBA_TABLES视图可以获取所有表的信息,包括表名、表空间、拥有者等等。例如,以下查询语句可以获取所有表的表名和表空间:

SQL> SELECT table_name, tablespace_name FROM dba_tables;

(2)查询索引的信息

查询DBA_INDEXES视图可以获取所有索引的信息,包括索引名、所属表、索引类型等等。例如,以下查询语句可以获取所有索引的信息:

SQL> SELECT index_name, table_name, index_type FROM dba_indexes;

(3)查询用户的信息

查询DBA_USERS视图可以获取所有用户的信息,包括用户名、默认表空间、临时表空间等等。例如,以下查询语句可以获取所有用户的用户名和默认表空间:

SQL> SELECT username, default_tablespace FROM dba_users;

(4)查询表空间的信息

查询DBA_TABLESPACES视图可以获取所有表空间的信息,包括表空间名、块大小、状态等等。例如,以下查询语句可以获取所有表空间的表空间名和状态:

SQL> SELECT tablespace_name, status FROM dba_tablespaces;

(5)查询数据文件的信息

查询DBA_DATA_FILES视图可以获取所有数据文件的信息,包括数据文件名、表空间名、文件大小等等。例如,以下查询语句可以获取所有数据文件的数据文件名和文件大小:

SQL> SELECT file_name, bytes FROM dba_data_files;

(6) 查询数据库的性能数据

查询DBA_HIST_SNAPSHOT视图可以获取数据库的历史性能数据,包括CPU利用率、内存利用率、I/O等等。例如,以下查询语句可以获取数据库的CPU利用率和内存利用率:

SQL> SELECT begin_interval_time, end_interval_time, cpu_usage, memory_usage
FROM dba_hist_sysmetric_summary
WHERE metric_name IN ('CPU Usage Per Sec', 'Memory Usage Per Sec')
ORDER BY begin_interval_time;

四、常用数据字典相关查询命令汇总

-- 1、用户
-- 查询当前用户的缺省表空间
select USERNAME,default_tablespace from USER_USERS;

-- 查询当前用户的角色
select * from USER_ROLE_PRIVS;

-- 查看当前用户的系统权限和表级权限
select * from USER_SYS_PRIVS;
select * from USER_TAB_PRIVS;

-- 2、表
-- 查看用户下所有的表
select * from USER_TABLES;

-- 查看名称包含log字符的表
select object_name,OBJECT_ID from USER_OBJECTS where *instr*(OBJECT_NAME,'LOG')>0;

-- 查看某表的创建时间
select object_name,created from USER_OBJECTS where OBJECT_NAME=*upper*('employees');

-- 查看某表的大小
select *sum*(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=*upper*('employees');

-- 查看放在ORACLE的内存区里的表
select table_name,cache from user_tables where *instr*(cache,'Y')>0;

-- 3、索引
-- 查看索引个数和类别
select index_name,index_type,table_name from user_indexes order by table_name;

-- 查看索引被索引的字段
select * from user_ind_columns where index_name=*upper*('&index_name');

-- 查看索引大小
select *sum*(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=*upper*('&index_name');

-- 4、序列号
-- 查看序列号,last_number是当前值
select * from user_sequences;

-- 5、视图
-- 查看视图的名称
select view_name from user_views;

-- 查看创建视图的select语句
set view_name,text_length from user_views;
set long 2000;
select text from user_views where view_name=*upper*('EMP_DETAILS_VIEW');

-- 6、同义词
-- 查看同义词的名称
select * from user_synonyms;

-- 7、约束条件
-- 查看某表的约束条件
select constraint_name, constraint_type,search_condition, r_constraint_name
from user_constraints where table_name = *upper*('employees');

select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = *upper*('&table_owner') and c.table_name = *upper*('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;

-- 8、存储函数和过程
-- 查看函数和过程的状态
select object_name,status from user_objects where object_type='FUNCTION';
select object_name,status from user_objects where object_type='PROCEDURE';

-- 查看函数和过程的源代码
select text from all_source where owner=*user* and name=*upper*('&plsql_name');

参考:

1.Oracle系列之二:Oracle数据字典_oracle 数据库字典-CSDN博客