oracle数据字典 1.概念 数据字典是oracle数据库用来存储数据库结构信息的地方。 数据字典是用来描述数据库数据的组织方式的,由表和视图组成。 数据字典基表是在任何 Oracle 数据库中创建的第一批对象。 所有数据库的数据字典表和视图都存储在SYSTEM表空间中。 由于当数据库打开时,SYSTEM 表空间始终处于联机状态 ,所以当数据库打开时,数据字典总是可用的。 Oracle数据库的SYS用户,拥有数据字典中的所有基表和用户可访问视图。 数据字典基表中的数据,对于Oracle 数据库发挥正常功能是必要的。 因此,只应当由数据库写入或更改数据字典信息。 无论何时,任何数据库用户都不应改变SYS模式中的表行或模式对象,因为这种行为可能会危及数据完整性。 安全管理员必须严格控制这个最重要的帐户。 修改或操作数据字典表中的数据,可能会永久性地对数据库操作造成负面影响。 在数据库运行期间,数据库读取数据字典,以确定存在模式对象,且用户对它们具有适当的访问权限。 Oracle 数据库也会不断地更新数据字典,以反映对数据库结构、审计、授权、和数据等所做的更改。 系统提供的DICTIONARY视图包含所有数据字典视图的名称和简短说明。 select * from dictionary order by table_name; --2553
2.分类 数据字典视图分为3类: 2.1 user_*(当前用户所拥有对象的有关信息) 包括用户所创建的模式对象的元数据,只显示与该用户相关的行, 除隐含的OWNER列外,与其他视图具有相同的列。 select count(1) from dictionary where table_name like ‘USER_%‘; --375
2.2 all_*(当前用户可访问对象的信息) 包括用户本身拥有的模式对象之外,还包括该用户通过公共或显式授予的特权及角色所能访问的模式对象信息。 select count(1) from dictionary where table_name like ‘ALL_%‘; --356
2.3 dba_*(数据库中所有对象的信息) 具有DBA_前缀的视图显示在整个数据库中的所有相关信息。DBA_ 视图仅用于管理员。 select count(1) from dictionary where table_name like ‘DBA_%‘; --705
查询数据字典数据时使用大写字母。可用upperlower函数转换。 一下以user_*实例举例(如没有user_*,则依次以all_*、dba_*举例)。
3.类别 3.1 表、视图 user_tables 关系表 user_tab_cols 列 user_tab_columns 表列 user_tab_comments 表的注释 user_col_comments 表和视图的列的注释 user_updatable_columns 表和视图中的列是否可以被DML user_views 视图
3.2 约束 user_constraints 表的约束 user_cons_columns 表的约束的列
3.3 索引 user_indexes 索引 user_ind_columns 索引列 user_ind_expressions 索引的函数索引表达式 user_ind_statistics 索引统计信息
3.4 子程序、触发器 user_procedures 子程序名(包括过程、函数、包) user_arguments 子程序参数(包括过程、函数、包) user_triggers 触发器 user_trigger_cols 触发器的列 user_dependencies 对象间的依赖
3.5 源代码和编译错误 user_source 包,包体,函数,过程,对象类型,对象类型体的源代码 user_errors 视图和包,包体,函数,过程的编译错误
3.6 数据库对象 user_sequences 序列 user_synonyms 替代名(同义词) user_jobs 数据库任务 user_db_links 数据库连接 all_directories 目录 user_libraries 库(字典)
3.7 集合、LOB、对象类型和对象表 user_coll_types 集合类型 user_lobs LOB user_types 对象类型 user_type_attrs 对象类型的属性 user_type_methods 对象类型的方法 user_object_tables 对象表 user_method_params 对象类型方法的参数 user_method_results 对象类型方法的返回值
3.8 分区和子分区 user_part_tables 已分区表 user_tab_partitions 表的分区 user_tab_subpartitions 表的子分区 user_part_indexes 已分区索引 user_ind_partitions 索引分区 user_ind_subpartitions 索引子分区 user_part_lobs 表中的LOB数据分区 user_lob_partitions LOB分区 user_lob_subpartitions LOB子分区 user_part_key_columns 已分区对象的分区关键字列 user_subpart_key_columns 使用组合范围/散列法分区的表的子分区关键字列 user_part_col_statistics 表分区统计和其他信息 user_subpart_col_statistics 表子分区的列统计 user_part_histograms 表的分区的直方图 user_subpart_histograms 表的子分区的直方图
3.9 权限和授权 user_sys_privs 用户系统权限 user_tab_privs 授予作为拥有者、授权者、权限受让者对象的权限 user_tab_privs_made 授予当前用户对象的权限 all_tab_privs_recd 授予作为权限受让者的用户对象的权限 user_col_privs 授予作为拥有者、授权者、或受让者的用户的可授访问表或视图列的权限 user_col_privs_made 授予当前用户表或视图列的权限 user_col_privs_recd 授予作为权限受让者用户表或视图列权限
3.10 统计和审计 user_tab_col_statistics 表列的统计 user_tab_histograms 表和视图的直方图 audit_actions 审计跟踪类型码的说明
oracle动态性能视图 1.定义 在Oracle数据库的操作过程中,它会维护一组记录当前数据库活动的虚拟表(视图),这些视图称为动态性能视图。 动态性能视图在数据库处于打开状态和使用过程中会不断更新。 动态性能视图以V$作为前缀。 动态性能视图包含以下信息: 系统和会话参数; 内存使用和分配; 文件状态(包括RMAN备份文件); 工作和任务的进度; SQL运行; 统计和度量。
2.动态性能视图用途: Oracle 企业管理器使用这些视图,来获取有关数据库的信息。 管理员可以使用这些视图,用于性能监控和调试。 https://localhost:1158/em
3.动态性能视图分类 动态性能视图不能被数据库管理员更改或删除,只能执行查询操作。 针对于单实例数据库和数据库集群,动态性能视图分为两类: 3.1 V$ 用于单实例数据库 select count(1) from dictionary where table_name like ‘V$%‘; --600
3.2 GV$ 用于数据库集群 在 Oracle 应用集群 (Oracle RAC)中,查询GV$ 视图会从所有合适的数据库实例中检索其 V$ 视图信息。 对几乎所有的 V$ 视图,都存在一个相应的GV$ 视图。 select count(1) from dictionary where table_name like ‘GV$%‘; --478
使用数据库配置助手 (DBCA) 创建数据库时, Oracle 会自动创建数据字典。 Oracle 数据库将自动运行catalog.sql 脚本,其中包含用于动态性能视图的视图和公共同义词的定义。 E:appAdministratorproduct11.2.0dbhome_1RDBMSADMINcatalog.sql
4.动态性能视图的存储 动态性能视图基于从数据库内存结构生成的虚拟表。因此,他们不是存储在数据库中的常规表。 由于数据是动态更新的,所以不能保证视图的读一致性。 因为动态性能视图并不是真正的表,其数据取决于数据库和实例的状态。 例如,当数据库已启动但未装入时,可以查询 v$instance和 v$bgprocess。 但是,直到数据库已装入时,才能查询v$datafile。
4.1 数据库服务的启动 startup nomount --加载参数文件 alter database mount alter database open
startup mount dbname --加载控制文件 alter database open
startup open dbname --加载数据文件
startup 4.2 数据库服务的关闭 shutdown immediate
5.举例 5.1 v$version 查询数据库版本信息 select * from v$version;
5.2 v$sgainfo 查询sga中的相关信息 select * from v$sgainfo
5.3 v$parameter 查询初始化参数相关信息 select * from v$parameter
5.4 v$statname统计名(及分类) select distinct class from v$statname class取值解释: 1 代表事例活动 select * from v$statname where class="1"; 2 代表redo buffer活动 select * from v$statname where class="2"; 4 代表锁 select * from v$statname where class="4"; 8 代表数据缓冲活动 select * from v$statname where class="8"; --16 代表os活动 select * from v$statname where class="16"; 32 代表并行活动 select * from v$statname where class="32"; 33 32+1 select * from v$statname where class="33"; 40 32+8 select * from v$statname where class="40"; 64 代表表访问 select * from v$statname where class="64"; 72 64+8 select * from v$statname where class="72"; 128 代表调试信息 select * from v$statname where class="128"; 192 128+64 select * from v$statname where class="192"; select * from v$sesstat where statistic#=6 and value>0;
5.5 v$instance 这个v$视图显示当前实例的状态。 select * from v$instance; 系统总的运行时间: select (sysdate - startup_time)*24*60*60 as seconds from v$instance;
5.6 v$datafile 数据文件 视图包含有关数据文件的信息。 select * from v$datafile v$tempfile 临时文件 select * from v$tempfile; v$filestat 数据文件统计信息 select * from v$filestat; v$tempstat 临时文件统计信息 select * from v$tempstat; v$segstat 段统计信息 select * from v$segstat where obj#=(select object_id from dba_objects where object_name=‘EMP‘ and owner=‘SCOTT‘);
5.7 v$fixed_table 动态性能表信息 select * from v$fixed_table where type=‘TABLE‘; 动态性能视图信息 select * from v$fixed_table where type=‘VIEW‘;
5.8 执行计划相关视图 v$sql_plan,v$sql_plan_statistics,v$sqltext_with_newlines
5.11 v$session和v$session_wait v$session视图记录了当前连接的session的信息, 包括:用户名、连接主机、session正在执行的sql的sql_address、sql_hash_value等信息。 select * from v$session where program=‘plsqldev.exe‘ and username=‘SYS‘ v$session_wait视图记录当前连接session正在等待的资源信息 select * from v$session_wait
5.12 v$sesstat 和 v$sysstat v$sesstat视图记录session的统计信息,包括session的逻辑数据读取、物理数据读取、排序操作等。 v$sysstat视图记录记录的是整个数据库系统的统计信息。 select * from v$sesstat where statistic#=6 and value>0; select * from v$sysstat where statistic#=6 and value>0;
5.13 v$session_event 和 v$system_event v$session_event视图记录了当前连接session的等待事件。 v$system_event视图记录整个数据库系统自启动以来的等待事件汇总。 select * from v$session_event select * from v$system_event 事件名称 select * from v$event_name select * from v$event_name where name=‘db file scattered read‘; 当前session的累计等待: select * from v$session_event where sid =(select sid from v$mystat where rownum<2) v$session_wait是正在等待,当session结束后,等待事件被记入v$session_event 。
5.14 v$process oracle相关进程 select * from v$process 进程解释: ARC0 archive:--归档操作 作用:发生日志切换时把写满的联机日志文件拷贝到归档目录中。 LGWR写日志写到需要覆盖重写的时候,触发ARCH进程去转移日志文件,复制出去形成归档日志文件,以免日志丢失。 触发条件:日志切换时被LGWR唤醒。 设置:通过参数LOG_ARCHIVE_MAX_PROCESSES设置oracle的ARCH个数。
CKPT checkpoint:--检查点事件 作用:维护数据库一致性状态。 检测点时刻保持数据文件与SGA中的内容一致,这需要和DBW0、LGWR 一起工作。 DBWR写入脏数据,同时触发LGWR进程。 CKPT更新控制文件中的检查点记录。 通过设置FAST START MTTR TARGET参数调整来控制CKPT的触发时间。 触发条件:日志切换(log switch)会触发检查点。
D000 --共享服务器调度器(Dnnn) DBRM DBW0 database write--数据写入 作用:把SGA中被修改的数据同步到磁盘文件中,保证Buffer Cache中有足够的空闲数据块数量。 如果LGWR出现故障,DBWR不会听从CKPT命令罢工, 因为Oracle在将数据缓存区数据写到磁盘前,会先进行日志缓冲区写进日志文件的操作, 并耐心的等待其先完成,才会去完成这个内存刷到磁盘的动作。 触发条件: 1、检查点CKPT 2、一个服务进程在设定的时间内没有找到空闲块 3、每三秒自动唤醒一次。 设置:DB_WRITER_PROCESS用来定义DBWn进程数量。 (commit命令只是把记录修改写入日志文件,不是把修改后的数据写入数据文件) DIA0 DIAG --可诊断性守护(Diagnosabilitydaemon,DIAG)进程 DIAG 只能用于RAC 环境中。它负责监视实例的总体“健康情况”,并捕获处理实例失败时所需的信息。 GENO
CJQ0 job queue coordinator:--作业队列协调器(CJQ0) CJQ0 在作业队列表中看到需要运行的作业时,会启动Jnnn 进程。 J000 --作业队列进程 作业队列进程监视一个作业表,这个作业表告诉它何时需要刷新系统中的各个快照。
LGWR log write:--日志文件写入 作用:把log buffer中的日志内容写入联机的日志文件中,释放log用户buffer空间。 触发条件: 1、用户发出commit命令,把redo log buffer中的记录写入日志文件,写入一条提交的记录 2、三秒定时唤醒。 3、日志缓冲区log buffer超过1/3,或日志数量超过1M。 4、DBWR进程触发:DBWn视图将脏数据块写入磁盘先检测他的相关redo记录是否写入联机日志文件, 如果没有就通知LGWR进程。在oracle中称为提前写机制,redo记录先于数据记录被写入磁盘 5、联机日志文件切换也将触发LGWR。
MMAN memory manager--自动内存管理 作用:MMAN 进程用于协调共享内存中各组件(默认缓冲区池、共享池、Java 池和大池)的大小设置和大小调整。 每分钟都检查AWR性能信息,并根据这些信息来决定SGA组件最佳分布。 设置:STATISTICS_LEVEL统计级别 SGA_TARGET:SGA总大小
MMNL manageability monitor light--轻量级的MMON MMNL进程会根据调度从SGA 将统计结果刷新输出至数据库表。
MMON manageability monitor--AWR主要的进程 作用:1、收集AWR必须的统计数据,把统计数据写入磁盘。 2、生成server--generated报警 每小时把shared pool中的统计信息写入磁盘,或者shared pool占用超过15%。
PMON process monitor--维护用户进程 进程监控器 作用:1、发现用户进程异常终止,并进行清理。释放占用资源。(清理异常终止用户使用的锁) 2、向监听程序动态的注册实例。 触发条件:定时被唤醒,其他进程也会主动唤醒它。 PSP0 Q000 QMNC RECO Distributed Database Recovery -- 用于分布式数据库的恢复 某个应用跨越多个数据库,需要都提交成功,事务才会成功,否则全部回滚。 S000 --共享服务器(Snnn)进程 SMCO SMON system monitor--实例维护进程 系统监控器 作用:1、负责实例恢复,前滚(Roll Forward)恢复到实例关闭的状态,使用最后一次检查点后的日志进程重做。 这时包括提交和未提交的事务。打开数据库,进行回滚(Roll Back):回滚未提交的事务。 2、负责清理临时段,以释放空间 触发条件:定期被唤醒或者被其他事务主动唤醒。 VKRM VKTM W000
LCKn 仅适用于RAC数据库,最多可有10个进程(LCK0,LCK1,...,LCK9),用于实例间的封锁。 RVWR --恢复写入器(Recovery Writer) 负责维护闪回恢复区中块的“前”映像,要与FLASHBACKDATABASE 命令一起使用。 CTWR --修改跟踪进程(Change Tracking Process) 作用:跟踪数据块的变化,把数据块地址记录到 change_tracking file文件中。 RMAN的增量备份将使用这个文件来确定那些数据块发生了变化,并进行备份。
5.15 v$sql 和v$sqltext SQL执行信息 select * from v$sql where parsing_schema_name=‘SCOTT‘ and sql_text like ‘%emp%‘; select * from v$sqlarea where sql_id=‘ab5j0f528hk26‘
5.17 v$lock 锁等待信息 select * from v$lock; select * from v$enqueue_stat; select * from v$enqueue_lock;
5.18 v$latch_children 闩竞争信息 select * from v$latch; select * from v$latch_children;
5.19 v$bh buffer信息 select * from v$bh where file#=4 and block#= (select header_block from dba_segments where owner=‘SCOTT‘ and segment_name=‘EMP‘);
6.oracle性能检测sql语句 6.1. 监控事例的等待 select event,sum(decode(wait_time,1)) prev,1,0)) curr,count(*) tot from v$session_wait group by event order by 4; 注解:order by 4 指按第4列进行排序, session在数据库中当前正在等待什么,每一个连接到实例的session都对应一条记录。
6.2 回滚段的争用情况 select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn = b.usn;
6.3 监控表空间的 I/O 比例 select df.tablespace_name name,df.file_name,f.phyrds pyr,f.phyblkrd pbr,f.phywrts pyw,f.phyblkwrt pbw from v$filestat f,dba_data_files df where f.file# = df.file_id order by df.tablespace_name;
6.4 监控文件系统的 I/O 比例 select substr(a.file#,2) "#",substr(a.name,30) "Name",a.status,a.bytes,b.phyrds,b.phywrts from v$datafile a,v$filestat b where a.file# = b.file#;
6.5 监控 SGA 的命中率 select a.value + b.value "logical_reads",c.value "phys_reads",round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO" from v$sysstat a,v$sysstat b,v$sysstat c where a.statistic# = 38 and b.statistic# = 39 and c.statistic# = 40;
6.6 监控 SGA 中字典缓冲区的命中率 select parameter,Getmisses,getmisses/(gets+getmisses)*100 "miss ratio",(1-getmisses/(gets+getmisses))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by parameter,getmisses;
6.7 监控 SGA 中共享缓存区的命中率,应该小于1% select sum(pins) "Total Pins",sum(reloads) "Total Reloads",sum(reloads)/sum(pins) *100 libcache from v$librarycache;
6.8 显示所有数据库对象的类别和大小 select count(name) num_instances,type,sum(source_size) source_size,sum(parsed_size) parsed_size,sum(code_size) code_size,sum(error_size) error_size, sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required from dba_object_size group by type order by 2;
6.9 监控 SGA 中重做日志缓存区的命中率,应该小于1% SELECT name,misses,immediate_gets,immediate_misses,Decode(gets,misses/gets*100) ratio1, Decode(immediate_gets+immediate_misses,immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch WHERE name IN (‘redo allocation‘,‘redo copy‘);
6.10 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size SELECT name,value FROM v$sysstat WHERE name IN (‘sorts (memory)‘,‘sorts (disk)‘);
6.11 监控当前数据库谁在运行什么SQL语句 SELECT osuser,username,sql_text from v$session a,v$sqltext b where a.sql_address =b.address order by address,piece;
6.12 监控 MTS select busy/(busy+idle) "shared servers busy" from v$dispatcher; 此值大于0.5时,参数需加大
6.13 找ORACLE字符集(也可以用来查看日期格式) select * from sys.props$ where name=‘NLS_CHARACTERSET‘;
6.14 在某个用户下找所有的索引 select user_indexes.table_name,user_indexes.index_name,uniqueness,column_name from user_ind_columns,user_indexes where user_ind_columns.index_name = user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type,user_indexes.table_name,column_position;
6.15 表、索引的存储情况检查 select segment_name,sum(bytes),count(*) ext_cnt from dba_extents where owner=‘SCOTT‘ and segment_type=‘TABLE‘ group by owner,segment_name;
select segment_name,count(*) ext_cnt from dba_extents where owner=‘SCOTT‘ and segment_type=‘INDEX‘ group by segment_name;
6.16. 碎片程度 select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name having count(tablespace_name)>10;
select * from (select tablespace_name,block_id,bytes,blocks,‘free space‘ segment_name from dba_free_space where tablespace_name=‘USERS‘ union all select tablespace_name,segment_name from dba_extents where tablespace_name=‘USERS‘) order by block_id
7.oracle性能查证sql语句 --1、耗时长sql查证:-- select * from (select sql_text,round(elapsed_time/1000000,2), round(elapsed_time/1000000/executions,2) perelapsed_time,executions from (select * from v$sql order by elapsed_time desc) where rownum<26) order by perelapsed_time desc;
--2、占用cpu时间长的sql查证:-- select * from (select sql_text,round(cpu_time/1000000, round(cpu_time/1000000/executions,2) percpu_time,executions from (select * from v$sql order by cpu_time desc) where rownum<26) order by percpu_time desc;
--3、磁盘读数据量大sql查证:-- select sql_text,disk_reads,executions from (select * from v$sqlarea order by disk_reads desc) where rownum<26;
--4、获取超时sql-- select username,sid,opname,round(sofar*100 / totalwork,0) progress,time_remaining,sql_text from v$session_longops,v$sql where sql_address = address and sql_hash_value = hash_value order by start_time;
--5、查看表空间大小和使用情况all-- 查看表空间使用情况的SQL语句: select a.tablespace_name "表空间名",total 表空间大小,free 表空间剩余大小, (total-free) 表空间使用大小,round((total-free)/total,4)*100 "使用率 %", (select file_name from dba_data_files where tablespace_name=a.tablespace_name and rownum<2) "文件名" from (select tablespace_name,sum(bytes) free from dba_free_space group by tablespace_name) a, (select tablespace_name,sum(bytes) total from dba_data_files group by tablespace_name) b where a.tablespace_name=b.tablespace_name --创建表空间及数据文件 create tablespace iests datafile ‘C:ORACLEPRODUCT10.2.0ORADATAORACLEIES_1.DBF‘ size 200m reuse autoextend on next 50m; --给表空间添加数据文件 alter tablespace iests add datafile ‘C:ORACLEPRODUCT10.2.0ORADATAORACLEIES_2.DBF‘ size 200m reuse autoextend on next 50m; --扩展已有数据文件的大小 alter database datafile ‘C:ORACLEPRODUCT10.2.0ORADATAORACLESYSTEM01.DBF‘ resize 600M;
--6、查看临时表空间情况-- SELECT d.status "Status",d.tablespace_name "Name",d.contents "Type",d.extent_management "Extent Management", TO_CHAR(NVL(a.bytes / 1024 / 1024,0),‘99,999,990.900‘) "Size (M)", NVL(t.bytes,0)/1024/1024 ||‘/‘||NVL(a.bytes/1024/1024,0) "Used (M)", TO_CHAR(NVL(t.bytes / a.bytes * 100,‘990.00‘) "Used %" FROM sys.dba_tablespaces d,sum(bytes) bytes from dba_temp_files group by tablespace_name) a,sum(bytes_cached) bytes from v$temp_extent_pool group by tablespace_name) t WHERE d.tablespace_name = a.tablespace_name(+) AND d.tablespace_name = t.tablespace_name(+) AND d.extent_management like ‘LOCAL‘ AND d.contents like ‘TEMPORARY‘;
--7、查证外键没有建索引的情况-- select table_name,constraint_name, cname1 || nvl2(cname2,‘,‘||cname2,null) || nvl2(cname3,‘||cname3,null) || nvl2(cname4,‘||cname4,null) || nvl2(cname5,‘||cname5,null) || nvl2(cname6,‘||cname6,null) || nvl2(cname7,‘||cname7,null) || nvl2(cname8,‘||cname8,null) columns from ( select b.table_name, b.constraint_name, max(decode( position,column_name,null )) cname1, max(decode( position,2,null )) cname2,3,null )) cname3,4,null )) cname4,5,null )) cname5,6,null )) cname6,7,null )) cname7,8,null )) cname8, count(*) col_cnt from (select substr(table_name,30) table_name, substr(constraint_name,30) constraint_name, substr(column_name,30) column_name, position from user_cons_columns ) a, user_constraints b where a.constraint_name = b.constraint_name and b.constraint_type = ‘R‘ group by b.table_name,b.constraint_name ) cons where col_cnt > ALL ( select count(*) from user_ind_columns i where i.table_name = cons.table_name and i.column_name in (cname1,cname2,cname3,cname4, cname5,cname6,cname7,cname8 ) and i.column_position <= cons.col_cnt group by i.index_name ) order by table_name;
--8、检查被锁的对象-- select l.object_id,l.session_id,l.oracle_username,l.locked_mode,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.object_id;
--9. 查看锁等待 select l.object_id,o.object_name,t.serial# from v$locked_object l,dba_objects o,v$session t where l.object_id=o.object_id and l.session_id=t.sid;
alter system kill session ‘session_id,t.serial#‘;alter system kill session ‘138,403‘;
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|