oracle系統表、數據字典介紹與日常問題診斷

oracle系統表、數據字典介紹與日常問題診斷

數據字典是由唯讀的table和view組成的,產生於
$oracle_home dbmsadmincatalog.sql。裡面
儲存Oracle資料庫的參數設定資訊、基礎table資
訊及所有物件資訊,主要如下:
邏輯性、物理性資料庫架構
定義物件&紀錄物件空間的配置
限制(constraints)
使用者(users)
角色(role)
權限(privileges)
稽核(Auditing)

Oracle主要層次:
DBA :表內包含所有物件
ALL:只有目前使用者有權限的物件
USER: 表內只有目前使用者自己的物件
V$ :系統表(動態效能表)

數據字典相關資訊存在於dictionary(dict)、
dict_columns 裡面
在OTN的Oracle9i Database Reference裡面有
所有的數據字典的明細資料。

select * from dict where table_name like '%SOUR%';
select * from dictionary where table_name like '%SOUR%';
select * from dict_columns;

資料庫相關:V$PARAMETER、V$INSTANCE、V$LOGFILE、
V$CONTROLFILE、V$DATAFILE、V$NLS_PARAMETERS
、V$TABLESPACE、DBA_TABLESPACES、
DBA_DATA_FILES、DBA_FREE_SPACE、DBA_FREE_SPACE_COALESCED

物件相關:DBA_TABLES、DBA_INDEXES、DBA_OBJECTS、
DBA_TAB_COLUMNS、DBA_CONSTRAINTS、 DBA_CONS_COLUMNS、
DBA_SEGMENTS、DBA_EXTENTS、DBA_DB_LINKS、
DBA_DEPENDENCIES、DBA_USERS、DBA_TS_QUOTAS

權限、角色相關: DBA_ROLES、DBA_ROLE_PRIVS、
DBA_SYS_PRIVS、DBA_TAB_PRIVS、DBA_TAB_PRIVS

 DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图
-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表。
-- ALL_TABLES意为某一用户拥有的或可以访问的所有的关系表。
-- USER_TABLES意为某一用户所拥有的所有的关系表。
-- 当某一用户本身就为数据库DBA时,DBA_TABLES与ALL_TABLES等价。
-- DBA_TABLES >= ALL_TABLES >= USER_TABLES
-- 需要注意的是在ORACLE数据库中大小写是敏感的,而此三表中数据默认都是大写的,所以在进行查询的时候注意小写的数据可能会造成数据无法查到。

SELECT * FROM dba_views WHERE view_name LIKE 'DBA%';
SELECT * FROM dba_views WHERE view_name LIKE 'ALL%';
SELECT * FROM dba_views WHERE view_name LIKE 'USER%';
SELECT * FROM dba_views WHERE view_name LIKE 'V_$%'; -- 针对某个实例的视图
SELECT * FROM dba_views WHERE view_name LIKE 'GV_$%'; -- 全局视图,针对多个实例环境
SELECT * FROM dba_views WHERE view_name LIKE 'SESSION%';
SELECT * FROM dba_views WHERE view_name LIKE 'INDEX%';

SELECT count(1) FROM dba_tables;
SELECT count(1) FROM all_tables;
SELECT count(1) FROM user_tables;

-- V$/GV$开头的绝大部分都是V_$/GV_$表的别名
SELECT * FROM dba_synonyms WHERE synonym_name LIKE 'V$%';
SELECT * FROM dba_synonyms WHERE synonym_name LIKE 'GV$%';

-- X$没有对应的X_$
SELECT * FROM dba_synonyms WHERE synonym_name LIKE 'X$%';

-- 比较常用的DBA开头的视图有
select * from dba_users; --数据库用户信息
select * from dba_roles; --角色信息
select * from dba_segments; --表段信息
select * from dba_extents; --数据区信息
select * from dba_objects; --数据库对象信息
select * from dba_lobs; --lob数据信息
select * from dba_tablespaces; --数据库表空间信息
select * from dba_data_files; --数据文件设置信息
select * from dba_temp_files; --临时数据文件信息
select * from dba_rollback_segs; --回滚段信息
select * from dba_ts_quotas; --用户表空间配额信息
select * from dba_free_space; --数据库空闲空间信息
select * from dba_profiles; --数据库用户资源限制信息
select * from dba_sys_privs; --用户的系统权限信息
select * from dba_tab_privs; --用户具有的对象权限信息
select * from dba_col_privs; --用户具有的列对象权限信息
select * from dba_role_privs; --用户具有的角色信息
select * from dba_audit_trail; --审计跟踪记录信息
select * from dba_stmt_audit_opts; --审计设置信息
select * from dba_audit_object; --对象审计结果信息
select * from dba_audit_session; --会话审计结果信息
select * from dba_indexes; --用户模式的索引信息

-- 比较常用的ALL开头的视图有
select * from all_users; --数据库所有用户的信息
select * from all_objects; --数据库所有的对象的信息
select * from all_def_audit_opts; --所有默认的审计设置信息
select * from all_tables; --所有的表对象信息
select * from all_indexes; --所有的数据库对象索引的信息
select * from all_tab_comments; --查询所有用户的表,视图等
select * from all_col_comments; --查询所有用户的表的列名和注释.
select * from all_tab_columns; --查询所有用户的表的列名等信息(详细但是没有备注)

-- 比较常用的ALL开头的视图有
select * from user_objects; --用户对象信息
select * from user_source; --数据库用户的所有资源对象信息
select * from user_segments; --用户的表段信息
select * from user_tables; --用户的表对象信息
select * from user_tab_columns; --用户的表列信息
select * from user_constraints; --用户的对象约束信息
select * from user_sys_privs; --当前用户的系统权限信息
select * from user_tab_privs; --当前用户的对象权限信息
select * from user_col_privs; --当前用户的表列权限信息
select * from user_col_comments; -- 查询本用户的表的列名和注释
select * from user_role_privs; --当前用户的角色权限信息
select * from user_indexes; --用户的索引信息
select * from user_ind_columns; --用户的索引对应的表列信息
select * from user_cons_columns; --用户的约束对应的表列信息
select * from user_clusters; --用户的所有簇信息
select * from user_clu_columns; --用户的簇所包含的内容信息
select * from user_cluster_hash_expressions; --散列簇的信息

-- 比较常用的V$开头的别名有
select * from v$database; --数据库信息
select * from v$datafile; --数据文件信息
select * from v$controlfile; --控制文件信息
select * from v$logfile; --重做日志信息
select * from v$instance; --数据库实例信息
select * from v$log; --日志组信息
select * from v$loghist; --日志历史信息
select * from v$sga; --数据库SGA信息
select * from v$parameter; --初始化参数信息
select * from v$process; --数据库服务器进程信息
select * from v$bgprocess; --数据库后台进程信息
select * from v$controlfile_record_section; --控制文件记载的各部分信息
select * from v$thread; --线程信息
select * from v$datafile_header; --数据文件头所记载的信息
select * from v$archived_log; --归档日志信息
select * from v$archive_dest; --归档日志的设置信息
select * from v$logmnr_contents; --归档日志分析的DML DDL结果信息
select * from v$logmnr_dictionary; --日志分析的字典文件信息
select * from v$logmnr_logs; --日志分析的日志列表信息
select * from v$tablespace; --表空间信息
select * from v$tempfile; --临时文件信息
select * from v$filestat; --数据文件的I/O统计信息
select * from v$undostat; --Undo数据信息
select * from v$rollname; --在线回滚段信息
select * from v$session; --会话信息
select * from v$transaction; --事务信息
select * from v$rollstat; --回滚段统计信息
select * from v$pwfile_users; --特权用户信息
select * from v$sqlarea; --当前查询过的sql语句访问过的资源及相关的信息
select * from v$sql; --与v$sqlarea基本相同的相关信息
select * from v$sysstat; --数据库系统状态信息

-- 比较常用的SESSION开头的视图有
select * from session_roles; --会话的角色信息
select * from session_privs; --会话的权限信息

-- 比较常用的INDEX开头的视图有
select * from index_stats; --索引的设置和存储信息

-- 伪表,参考oracle 中 dual 详解:http://blog.csdn.net/ozhouhui/article/details/7935196
select * from dual; --系统伪列表信息
select sysdate from dual; --可将Sysdate视为一个其结果为当前日期和时间的函数,在任何可以使用Oracle函数的地方都可以使用Sysdate。也可以将它视为每个表的一个隐藏的列或伪列。
select current_date from dual; --报告会话的时区中的系统日期。注:可以设置自己的时区,以区别于数据库的时区。
select SYSTIMESTAMP from dual; --报告TIMESTAMP数据类型格式的系统日期。

-- 系统权限
-- GRANTEE 接受该权限的用户名
-- OWNER 对象的拥有者
-- GRANTOR 赋予权限的用户
SELECT * FROM dba_sys_privs WHERE grantee = 'SYS';
SELECT * FROM dba_sys_privs WHERE grantee = 'CONNECT';
SELECT * FROM dba_sys_privs WHERE grantee = 'RESOURCE';

-- 角色权限
-- 查看某个用户有哪些角色
select * from dba_role_privs where grantee='SYS';
-- 查看某个角色被赋予了哪些用户
SELECT * FROM dba_role_privs WHERE granted_role = 'DBA';

-- 对象权限
SELECT * FROM dba_tab_privs;

-- 授予某个用户某些角色
GRANT connect,resource TO 'USER';
GRANT dba to 'USER'; --给普通用户授予dba角色时,要重新连接才能生效
REVOKE dba to 'USER';
-- 直接授予某个用户某些权限
GRANT CREATE VIEW TO 'USER';

-- 查看某个系统用户是否有SYSDBA或者SYSOPER权限
-- oracle:DBA,SYSDBA,SYSOPER三者的区别:http://blog.chinaunix.net/uid-22457844-id-3045741.html
select * from V$PWFILE_USERS;

Oracle DBA数据库日常维护--Oracle警告日志文件监控

Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况:

1-数据库的启动、关闭,启动时的非缺省参数;

2-数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因;

3-对数据库进行的某些操作,如创建或删除表空间、增加数据文件;

4-数据库发生的错误,如表空间不够、出现坏块、数据库内部错误(ORA-600) ;

DBA应该定期检查日志文件,根据日志中发现的问题及时进行处理。

问题处理:

1-启动参数不对检查初始化参数文件;

2-因为检查点操作或归档操作没有完成造成重做日志不能切换如果经常发生这样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率;

3-有人未经授权删除了表空间检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限;

4-出现坏块检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个对象进行重建;

5-表空间不够增加数据文件到相应的表空间;

6-出现ORA-600根据日志文件的内容查看相应的TRC文件,如果是Oracle的bug,要及时打上相应的补丁。

 

Oracle DBA数据库日常维护--数据库表空间使用情况监控(字典管理表空间)

数据库运行了一段时间后,由于不断的在表空间上创建和删除对象,会在表空间上产生大量的碎片,DBA应该及时了解表空间的碎片和可用空间情况,以决定是否要对碎片进行整理或为表空间增加数据文件。
 

以下为引用的内容:

select tablespace_name, 
             count(*) chunks , 
             max(bytes/1024/1024) max_chunk 
       from  dba_free_space 
             group by tablespace_name;

上面的SQL列出了数据库中每个表空间的空闲块情况,如下所示: 以下为引用的内容:

 

TABLESPACE_NAME       CHUNKS    MAX_CHUNK 
-------------------- ---------- ---------- 
INDX                   1        57.9921875 
RBS                    3        490.992188 
RMAN_TS                1         16.515625 
SYSTEM                 1        207.296875 
TEMP                   20       70.8046875 
TOOLS                  1        11.8359375 
USERS                  67       71.3671875
 
    其中,CHUNKS列表示表空间中有多少可用的空闲块(每个空闲块是由一些连续的Oracle数据块组成),如果这样的空闲块过多,比如平均到每个数据文件上超过了100个,那么该表空间的碎片状况就比较严重了,可以尝试用以下的SQL命令进行表空间相邻碎片的接合:

alter tablespace 表空间名 coalesce;  然后再执行查看表空间碎片的SQL语句,看表空间的碎片有没有减少。如果没有效果,并且表空间的碎片已经严重影响到了数据库的运行,则考虑对该表空间进行重建。

MAX_CHUNK列的结果是表空间上最大的可用块大小,如果该表空间上的对象所需分配的空间(NEXT值)大于可用块的大小的话,就会提示ORA-1652、ORA-1653、ORA-1654的错误信息,DBA应该及时对表空间的空间进行扩充,以避免这些错误发生。

对表空间的扩充对表空间的数据文件大小进行扩展,或向表空间增加数据文件.
 
料庫的連接情況
DBA要定時對資料庫的連接情況進行檢查,看與資料庫建立的會話數目是不是正常,如果建立了過多的連接,會消耗資料庫的資源。同時,對一些“掛死”(killed)的連接,可能會需要DBA手工進行清理。以下的SQL語句列出目前資料庫建立的會話情況:
select sid,serial#,username,program,machine,statusfrom v$session;
SID: 會話(session)的ID號;
SERIAL#: 會話的序列號,和SID一起用來唯一標識一個會話;

USERNAME: 建立該會話的用戶名;
PROGRAM :這個會話是用什麼工具連接到資料庫的;
STATUS :目前這個會話的狀態,ACTIVE表示會話正在
執行某些任務,INACTIVE表示目前會話沒有執行任何
操作,KILLED表示已斷開但是還沒被ORACLE清除。
如果DBA要手工斷開某個會話,則執行:
alter system kill session 'SID,SERIAL#';
注意,如果USERNAME列為空,有可能是Oracle的後
台進程,不要對這些會話進行任何操作。

資料庫定時作業的檢查

檢查資料庫定時作業的完成情況
 如果資料庫使用了Oracle的JOB來完成一些定時作業
,要對這些JOB的運行情況進行檢查:
  select job,log_user,last_date,what,failures
  from dba_jobs;
 如果FAILURES列是一個大於0的數的話,說明JOB
運行失敗,要進一步的檢查,執行 what 裡面子句會出
現正確的失敗原因。

資料庫壞塊的處理

當Oracle資料庫出現壞塊時,Oracle會在警告日誌文件
(alert_SID.log)中記錄壞塊的資訊:
ORA-01578: ORACLE data block corrupted (file # 7, block # )
ORA-01110: data file : ‘D:oracleoradatamuchnbusers01.dbf'
其中,file代表壞塊所在數據文件的絕對文件號,
block代表壞塊是數據文件上的第幾個數據塊
出現這種情況時,應該首先檢查是否是硬體及作業系統
上的故障導致Oracle資料庫出現壞塊。在排除了資料庫
以外的原因後,再對發生壞塊的資料庫對象進行處理。

1.確定發生壞塊的資料庫對象
 SELECT tablespace_name,segment_type,
  owner,segment_name,file_id,block_id
  FROM dba_extents
 WHERE file_id =
 AND between block_id AND block_id+blocks-1

2.決定修復方法
 如果發生壞塊的對象是一個索引,那麼可以直接把
索引DROP掉後,再根據表裏的記錄進行重建;
 如果發生壞塊的表的記錄可以根據其它表的記錄產
生的話,那麼可以直接把這個表DROP掉後重建;
 如果有資料庫的備份,則恢復資料庫的方法來進行修復;
 如果表裏的記錄沒有其它辦法恢復,那麼壞塊上的記錄就丟失了,只能把表中其它數據塊上的記錄取出來,然後對這個表進行重建。
3.用Oracle提供的DBMS_REPAIR包標記出壞塊
  exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');

4.使用Create table as select命令將表中其它塊上的記錄保存到另一張表上
  create table corrupt_table_bak
  as select * from corrupt_table;

5.用DROP TABLE命令刪除有壞塊的表
  drop table corrupt_table;

6.用alter table rename命令恢復原來的表
  alter table corrupt_table_bak
  rename to corrupt_table;

7.如果表上存在索引,則要重建表上的索引
alter index corrupt_index rebuild ;

找出誰lock哪個table
SELECT a.username,a.sid,a.type,a.lmode,a.request,a.objname1,a.objname2,b.sql_text FROM (SELECT sn.sql_address,sn.sql_hash_value,sn.username, m.sid,
DECODE(m.type,'TM','TM-DML enqueue' ,'TX','TX-Transaction enqueue' ,'UL','User supplied') type,
DECODE(m.lmode, 0, 'None' , 1, 'Null(NULL)' , 2, 'Row Share(SS)' , 3, 'Row Excl.(SX)' , 4, 'Share(S)' , 5, 'S/Row Excl.(SSX)' , 6, 'Exclusive(X)' , lmode, ltrim(to_char(lmode,'990'))) lmode,
DECODE(m.request, 0, 'None' , 1, 'Null(NULL)' , 2, 'Row Share(SS)' , 3, 'Row Excl.(SX)' ,4, 'Share(S)' , 5, 'S/Row Excl.(SSX)' , 6, 'Exclusive(X)' , request, ltrim(to_char(request,'990'))) request,
obj1.owner||'.'||obj1.object_name objname1, obj2.owner||'.'||obj2.object_name objname2
FROM v$session sn, V$lock m, dba_objects obj1, dba_objects obj2
WHERE sn.sid = m.sid AND m.id1 = obj1.object_id (+) AND m.id2 = obj2.object_id (+) AND m.lmode != 4 ) a, v$sqlarea b
WHERE a.sql_address = b.address(+) and a.sql_hash_value = b.hash_value(+) and username is not null
ORDER BY 1

如何看process分配的記憶體
SELECT PID,SPID
USERNAME,PROGRAM,PGA_USED_MEM,PGA_ALLOC_MEM,PGA_FREEABLE_MEM,
PGA_MAX_MEM
FROM V$PROCESS
WHERE USERNAME='username'

如何看tablespace的使用狀況
select tablespace_name, sum(DATA_FILE_SIZE_MB) allocated_size_mb, sum(used_size_mb) used_size_mb
from (select tablespace_name, sum(bytes/1024/1024) DATA_FILE_SIZE_MB, 0 used_size_mb
from dba_data_files
group by tablespace_name
union all
select tablespace_name, 0 DATA_FILE_SIZE_MB, sum(bytes/1024/1024) used_size_mb
from dba_extents
group by tablespace_name)
group by tablespace_name;

找出誰在使用 temporary 表空間
SELECT b.tablespace, b.extents, a.sid, a.serial#,
a.username, a.osuser, a.status
FROM v$session a,v$sort_usage b
WHERE a.saddr = b.session_addr
ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks;

找出物件使用了多少空間
select a.owner,a.segment_name ,a.segment_type,a.tablespace_name ,a.extents,a.max_extents ,a.extents/a.max_extents ratio,bytes/(1024*1024) mega
from dba_segments a
where owner not in ('SYSTEM','SYS')
order by ratio DESC

 

信用生活
原文地址:https://www.cnblogs.com/scwbky/p/9576827.html