第一篇:oracle知識小結
Tnsnames.ora: listener_rac=(Description=(ADDRESS=(protocol=TCP)(HOST=
Pl/sql: Oracle參數查詢命令show parameter的一個小技巧,可以使用模糊查詢,比如我想查詢包含db_的參數,那么我就可以用: SQL> show parameter db_;
NAME
TYPE
VALUE
----------------------------------------------
db_16k_cache_size
big integer 0
db_2k_cache_size
big integer 0
db_32k_cache_size
big integer 0
db_4k_cache_size
big integer 0
db_8k_cache_size
big integer 0
db_block_buffers
integer
0
db_block_checking
string
FALSE
db_block_checksum
string
TRUE
db_block_size
integer
8192
db_cache_advice
string
ON
db_cache_size
big integer 0
Oracle 中的Userenv()
1.USEREVN()USERENV(OPTION)
返回當前的會話信息.OPTION='ISDBA'若當前是DBA角色,則為TRUE,否則FALSE.OPTION='LANGUAGE'返回數據庫的字符集.OPTION='SESSIONID'為當前會話標識符.OPTION='ENTRYID'返回可審計的會話標識符.OPTION='LANG'返回會話語言名稱的ISO簡記.OPTION='INSTANCE'返回當前的實例.OPTION='terminal'返回當前計算機名
SELECT USERENV('LANGUAGE')FROM DUAL;
返回當前用戶環境的信息,opt可以是: ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE 1.ISDBA 查看當前用戶是否是DBA如果是則返回true SQL> select userenv('isdba')from dual;USEREN------FALSE 2.SESSION 返回會話標志
SQL> select userenv('sessionid')from dual;USERENV('SESSIONID')--------------------152 4.ENTRYID 返回會話人口標志
SQL> select userenv('entryid')from dual;USERENV('ENTRYID')------------------0 5.INSTANCE 返回當前INSTANCE的標志 SQL> select userenv('instance')from dual;USERENV('INSTANCE')-------------------1 6.LANGUAGE 返回當前環境變量
SQL> select userenv('language')from dual;USERENV('LANGUAGE')---------------------SIMPLIFIED CHINESE_CHINA.ZHS16GBK 7.LANG 返回當前環境的語言的縮寫
SQL> select userenv('lang')from dual;USERENV('LANG')---------------------ZHS 8.TERMINAL 返回用戶的終端或機器的標志 SQL> select userenv('terminal')from dual;USERENV('TERMINA----------------GAO 9.VSIZE(X)返回X的大小(字節)數
SQL> select vsize(user),user from dual;VSIZE(USER)USER-----------------------------------------6 SYSTEM 2.sys_context
select
SYS_CONTEXT('USERENV','TERMINAL')terminal,SYS_CONTEXT('USERENV','LANGUAGE')language,SYS_CONTEXT('USERENV','SESSIONID')sessionid,SYS_CONTEXT('USERENV','INSTANCE')instance,SYS_CONTEXT('USERENV','ENTRYID')entryid,SYS_CONTEXT('USERENV','ISDBA')isdba,SYS_CONTEXT('USERENV','NLS_TERRITORY')nls_territory,SYS_CONTEXT('USERENV','NLS_CURRENCY')nls_currency,SYS_CONTEXT('USERENV','NLS_CALENDAR')nls_calendar,SYS_CONTEXT('USERENV','NLS_DATE_FORMAT')nls_date_format,SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE')nls_date_language,SYS_CONTEXT('USERENV','NLS_SORT')nls_sort,SYS_CONTEXT('USERENV','CURRENT_USER')current_user,SYS_CONTEXT('USERENV','CURRENT_USERID')current_userid,SYS_CONTEXT('USERENV','SESSION_USER')session_user,SYS_CONTEXT('USERENV','SESSION_USERID')session_userid,SYS_CONTEXT('USERENV','PROXY_USER')proxy_user,SYS_CONTEXT('USERENV','PROXY_USERID')proxy_userid,SYS_CONTEXT('USERENV','DB_DOMAIN')db_domain,SYS_CONTEXT('USERENV','DB_NAME')db_name,SYS_CONTEXT('USERENV','HOST')host,SYS_CONTEXT('USERENV','OS_USER')os_user,SYS_CONTEXT('USERENV','EXTERNAL_NAME')external_name,SYS_CONTEXT('USERENV','IP_ADDRESS')ip_address,SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')network_protocol,SYS_CONTEXT('USERENV','BG_JOB_ID')bg_job_id,SYS_CONTEXT('USERENV','FG_JOB_ID')fg_job_id,SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')authentication_type,SYS_CONTEXT('USERENV','AUTHENTICATION_DATA')authentication_data
from dual;
oracle中以dba_、user_、v$_、all_、session_、index_開頭的常用表和視圖 dba_開頭
dba_users 數據庫用戶信息 dba_segments 表段信息 dba_extents 數據區信息
dba_objects 數據庫對象信息
dba_tablespaces 數據庫表空間信息 dba_data_files 數據文件設置信息 dba_temp_files 臨時數據文件信息 dba_rollback_segs 回滾段信息 dba_ts_quotas 用戶表空間配額信息 dba_free_space 數據庫空閑空間信息 dba_profiles 數據庫用戶資源限制信息 dba_sys_privs 用戶的系統權限信息 dba_tab_privs 用戶具有的對象權限信息 dba_col_privs 用戶具有的列對象權限信息 dba_role_privs 用戶具有的角色信息 dba_audit_trail 審計跟蹤記錄信息 dba_stmt_audit_opts 審計設置信息 dba_audit_object 對象審計結果信息 dba_audit_session 會話審計結果信息 dba_indexes 用戶模式的索引信息
user_開頭
user_objects 用戶對象信息
user_source 數據庫用戶的所有資源對象信息 user_segments 用戶的表段信息 user_tables 用戶的表對象信息 user_tab_columns 用戶的表列信息 關于這個還涉及到兩個常用的例子如下:
1、oracle中查詢某個字段屬于哪個表
Sql代碼
select table_name,owner from dba_tab_columns t where t.COLUMN_NAME like upper('%username%');select table_name,owner from dba_tab_columns t where t.COLUMN_NAME like upper('%username%');
2、oracle中查詢某個表的列數
Sql代碼
select count(*)from user_tab_columns where table_name= upper('sys_operate');select count(*)from user_tab_columns where table_name= upper('sys_operate');注:這兩個例子都用到了upper這個函數,是因為在這里表名得大寫,否則查出的結果不是正確的
user_constraints 用戶的對象約束信息 user_sys_privs 當前用戶的系統權限信息 user_tab_privs 當前用戶的對象權限信息 user_col_privs 當前用戶的表列權限信息 user_role_privs 當前用戶的角色權限信息 user_indexes 用戶的索引信息
user_ind_columns 用戶的索引對應的表列信息 user_cons_columns 用戶的約束對應的表列信息 user_clusters 用戶的所有簇信息
user_clu_columns 用戶的簇所包含的內容信息 user_cluster_hash_expressions 散列簇的信息
v$開頭
v$database 數據庫信息 v$datafile 數據文件信息 v$controlfile 控制文件信息 v$logfile 重做日志信息 v$instance 數據庫實例信息 v$log 日志組信息
v$loghist 日志歷史信息 v$sga 數據庫SGA信息
v$parameter 初始化參數信息 v$process 數據庫服務器進程信息 v$bgprocess 數據庫后臺進程信息
v$controlfile_record_section 控制文件記載的各部分信息 v$thread 線程信息
v$datafile_header 數據文件頭所記載的信息 v$archived_log 歸檔日志信息
v$archive_dest 歸檔日志的設置信息
v$logmnr_contents 歸檔日志分析的DML DDL結果信息 v$logmnr_dictionary 日志分析的字典文件信息 v$logmnr_logs 日志分析的日志列表信息 v$tablespace 表空間信息 v$tempfile 臨時文件信息
v$filestat 數據文件的I/O統計信息 v$undostat Undo數據信息 v$rollname 在線回滾段信息 v$session 會話信息 v$transaction 事務信息 v$rollstat 回滾段統計信息 v$pwfile_users 特權用戶信息
v$sqlarea 當前查詢過的sql語句訪問過的資源及相關的信息 v$sql 與v$sqlarea基本相同的相關信息 v$sysstat 數據庫系統狀態信息
all_開頭
all_users 數據庫所有用戶的信息 all_objects 數據庫所有的對象的信息
all_def_audit_opts 所有默認的審計設置信息 all_tables 所有的表對象信息
all_indexes 所有的數據庫對象索引的信息 session_開頭
session_roles 會話的角色信息 session_privs 會話的權限信息
index_開頭
index_stats 索引的設置和存儲信息
偽表
dual 系統偽列表信息
oracle最重要的9個動態性能視圖
v$session + v$session_wait(在10g里功能被整合,湊合算1個吧.)v$process v$sql v$sqltext v$bh(更寧愿是x$bh)v$lock v$latch_children v$sysstat v$system_event 按組分的幾組重要的性能視圖
1.System 的 over view v$sysstat , v$system_event , v$parameter 2.某個session 的當前情況
v$process , v$session , v$session_wait ,v$session_event , v$sesstat 3.SQL 的情況
v$sql , v$sqlarea , v$SQL_PLAN , V$SQL_PLAN_STATISTICS, v$sqltext_with_newlines 3.Latch / lock /ENQUEUE v$latch , v$latch_children , v$latch_holder , v$lock ,V$ENQUEUE_STAT ,V$ENQUEUE_LOCK 4.IO 方面的
v$segstat , v$filestat , v$tempstat ,v$datafile , v$tempfile 5.shared pool / Library cache v$Librarycache , v$rowcache , x$ksmsp 6.幾個advice也不錯
v$db_cache_advice , v$PGA_TARGET_ADVICE, v$SHARED_POOL_ADVICE V$SESSION
在本視圖中,每一個連接到數據庫實例中的session都擁有一條記錄。包括用戶session及后臺進程如DBWR,LGWR,arcchiver等等。A、V$SESSION中的常用
V$SESSION是基礎信息視圖,用于找尋用戶SID或SADDR。不過,它也有一些列會動態的變化,可用于檢查用戶。如例:
SQL_HASH_VALUE,SQL_ADDRESS:這兩列用于鑒別默認被session執行的SQL語句。如果為null或0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUE和PREV_ADDRESS兩列用來鑒別被session執行的上一條語句。B、STATUS:這列用來判斷session狀態是:
l
Achtive:正執行SQL語句(waiting for/using a resource)l
Inactive:等待操作(即等待需要執行的SQL語句)l
Killed:被標注為刪除 C、Session信息
l
SID:SESSION標識,常用于連接其它列
l
SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個SESSION結束,另一個SESSION開始并使用了同一個SID)。
l
AUDSID:審查session ID唯一性,確認它通常也用于當尋找并行查詢模式 l
USERNAME:當前session在oracle中的用戶名。D、Client信息
數據庫session被一個運行在數據庫服務器上或從中間服務器甚至桌面通過SQL*Net連接到數據庫的客戶端進程啟動,下列各列提供這個客戶端的信息 l
OSUSER:客戶端操作系統用戶名 l
MACHINE:客戶端執行的機器 l
TERMINAL:客戶端運行的終端 l
PROCESS:客戶端進程的ID l
PROGRAM:客戶端執行的客戶端程序
要顯示用戶所連接PC的 TERMINAL、OSUSER,需在該PC的ORACLE.INI或Windows中設置關鍵字TERMINAL,USERNAME。E、V$SESSION中的連接列
Column
View
Joined Column(s)
SID
V$SESSION_WAIT V$SESSTAT V$LOCK V$SESSION_EVENT V$OPEN_CURSOR
SID(SQL_HASH_VALUE, SQL_ADDRESS)
V$SQLTEXT, V$SQLAREA, V$SQL
(HASH_VALUE, ADDRESS)(PREV_HASH_VALUE, PREV_SQL_ADDRESS)
V$SQLTEXT, V$SQLAREA, V$SQL
(HASH_VALUE, ADDRESS)
TADDR
V$TRANSACTION
ADDR
PADDR
ADDR 示例:
1.查找你的session信息
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS FROM V$SESSION WHERE audsid = userenv('SESSIONID');2.當machine已知的情況下查找session SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL FROM V$SESSION WHERE terminal = 'pts/tl'AND machine = 'rgmdbs1';3.查找當前被某個指定session正在運行的sql語句。假設sessionID為100 select sql_text from v$sqltext
where(hash_value,sql_address)in
(select decode(sql_hash_value,0,prev_hash_value,sql_hash_value),decode(sql_hash_value,0,prev_sql_addr,sql_address)
from v$session
V$PROCESS
where paddr =(select addr from v$process where spid='操作系統進程id'));尋找被指定session執行的SQL語句是一個公共需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以查看session在做些什么。
--
1、start with + connect by-->一般用于構成樹查詢--eg: SELECT * FROM district WHERE del_flag = 0 AND(district_level_code IN(SELECT DISTINCT domain_key FROM domain_district_level)OR district_level_code IS NULL)START WITH district_id IN(SELECT district_id--根節點開始的位置 FROM district WHERE parent_district_id IS NULL OR parent_district_id = 0)CONNECT BY PRIOR district_id = parent_district_id ORDER BY LEVEL, district_no;--
2、connect by 用于構成循環
select LEVEL FROM dual CONNECT BY LEVEL<=10;SELECT ROWNUM FROM dual CONNECT BY ROWNUM <=10;SELECT LEVEL FROM dual CONNECT BY 1=1;--會得到無窮數列.SELECT ROWNUM FROM dual CONNECT BY 1=1;--會得到無窮數列.rownum與 level 一致,都是以connect by 后的數字范圍為準。select level from dual connect by level< 10;select rownum from dual connect by rownum< 10;都能取到9 select level from dual connect by level<= 10;select rownum from dual connect by rownum< =10;都能取到10 1、查詢當前session中的操作系統進程號spid
select a.PROGRAM,a.MACHINE,a.sid,a.SERIAL#,a.USERNAME,a.STATE,b.TERMINAL,b.SPID as ospid from v$session a ,v$process b where a.PADDR=b.ADDR;
2、殺掉某個session
a)db級別: alter system kill session 'sid ,serial ';b)os級別: unix kill-9 spid; windows :orakill sid thread eg orakill csltest 9323
v$session 和v$process 應該是一一對應的,一個session 在OS 這邊就是一個 process,如果正常的話,v$session 應該和v$process 是一一對應的,但是我遇到很多系統運行一段時間后發現v$session 里面的記錄比v$process 里面多很多,這就由于無效的session 產生的,比如有一個生產系統這2個數據字典視圖的記錄數分別為
SQL> select count(*)from v$session;COUNT(*)----------140 SQL> select count(*)from v$process;COUNT(*)----------67 bash-2.03$ ps-ef | grep oracle | wc-l 69 在OS 下查看oracle 總的process 數與v$process 查不多,為什么會有這種差別呢?也就是v$session 和v$process 的差別 是如何造成的,v$session 肯定有很多無效的session 如何判斷這些無效的session 呢
我的環境里面沒看到你說的情況,你看看
select sid,username, status from v$session where paddr not in(select addr from v$process);數據庫沒有配置 MTS SQL> show parameter mts SQL> select count(*)from v$session where paddr not in(select addr from v$process);
COUNT(*)----------45 也就是說有45個session 是沒有對應的process 的
問題弄清楚了,程序是使用C寫的訪問數據庫的程序,在程序中使用OCI 連接操作數據庫,如果正常shutdown 程序的話,是有disconnect 的處理的,這樣對數據庫的disconnect 是正常的
但是維護人員并沒有按照正常的方法來關閉應用程序,直接使用kill-9 kill 了應用程序,相當于異常關閉的應用程序,所以造成在kill 父process 的時候,對數據庫的連接process 也異常中斷,但是session 卻沒有disconnect 也就是說session 還存在,盡管process 沒有了,造成死連接,oracle 的pmon 也無法判斷這個session 是否已經沒有用了
可以用什么方法可以查處這寫無效的session 呢
關于v$session
1、dict_columns中comments有值的一般是數據字典的字段而不是性能視圖的
2、判別session 的狀態可知道某進程是否死掉,但要結合時間看logon_time sql>;select status,logon_time from v$session;如果狀態是inactive,怎樣殺掉呢 select sid,serial# from v$session;alter system kill session(a,b);a,b填上上面得到的sid,serial#值 以下語句可以證明v$session是個視圖
select view_definition from v$fixed_view_definition where view_name='V$SESSION';select * from v$fixed_table where name='V$SESSION';select owner, object_type, status from dba_objects where object_name='V$SESSION';從OEM中觀察確實v$session是public 同義詞.我確實讀過一篇文章在講以下流程, 數據庫建立時 1.創建x$等表
2.create view v$xxxx as select * from x$xxxx 3.create view v_$xxxx as select * from v$xxxx 4.create public synonym v$xxxx for v_$xxxxx 如果是dba的話, 使用select * from v$xxxx;該對象將是視圖 而非dba的, 使用select * from v$xxxx;該對象將是同義詞 「原廠委托制造」OEM(Original Equipment Manufacturer)
OEM ORACLE 企業管理器簡稱OEM
(Oracle Enterprise Manager)ORACLE的DBA的主要操作工具
Oracle instr函數: INSTR
(源字符串, 目標字符串, 起始位置, 匹配序號)
在Oracle/PLSQL中,instr函數返回要截取的字符串在源字符串中的位置。只檢索一次,就是說從字符的開始
到字符的結尾就結束。
語法如下:
instr(string1, string2 [, start_position [, nth_appearance ] ])
參數分析:
string1
源字符串,要在此字符串中查找。
string2
要在string1中查找的字符串.start_position
代表string1 的哪個位置開始查找。此參數可選,如果省略默認為1.字符串索引從1開始。如果此參數為正,從左到右開始檢索,如果此參數為負,從右到左檢索,返回要查找的字符串在源字符串中的開始索引。
nth_appearance
代表要查找第幾次出現的string2.此參數可選,如果省略,默認為 1.如果為負數系統會報錯。
注意:
如果String2在String1中沒有找到,instr函數返回0.示例:
SELECT instr('syranmo','s')FROM dual;--返回 1
SELECT instr('syranmo','ra')FROM dual;--返回 3 SELECT instr('syran mo','a',1,2)FROM dual;--返回 0
(根據條件,由于a只出現一次,第四個參數2,就是說第2次出現a的位置,顯然第2次是沒有再出現了,所以結果返回0。注意空格也算一個字符!)
SELECT instr('syranmo','an',-1,1)FROM dual;--返回 4
(就算是由右到左數,索引的位置還是要看‘an’的左邊第一個字母的位置,所以這里返回4)
SELECT instr('abc','d')FROM dual;--返回 0
注:也可利用此函數來檢查String1中是否包含String2,如果返回0表示不包含,否則表示包含。
substr functions
In oracle/PLSQL, the substr functions allows you to extract a substring from a string.The syntax for the substr function is:
substr(string, start_position, [ length ])
說明:
string is the source string.start_position is the position for extraction.The first position in the string is always 1.length is optional.It is the number of characters to extract.If this parameter is omitted, substr will return the entire string.For example:
substr('This is a test', 6, 2)would return 'is'
substr('This is a test', 6)would return 'is a test'
substr('TechOnTheNet', 1, 4)would return 'Tech'
substr('TechOnTheNet',-3, 3)would return 'Net'
substr('TechOnTheNet',-6, 3)would return 'The'
substr('TechOnTheNet',-8, 2)would return 'On'
第二篇:ORACLE審計小結
1、什么是審計
審計(Audit)用于監視用戶所執行的數據庫操作,并且Oracle會將審計跟蹤結果存放到OS文件(默認位置為$ORACLE_BASE/admin /$ORACLE_SID/adump/)或數據庫(存儲在system表空間中的SYS.AUD$表中,可通過視圖dba_audit_trail查 看)中。默認情況下審計是沒有開啟的。
不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄:用管理員權限連接Instance;啟動數據庫;關閉數據庫。
2、和審計相關的兩個主要參數
Audit_sys_operations:
默認為false,當設置為true時,所有sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會被記錄,audit trail不會寫在aud$表中,這個很好理解,如果數據庫還未啟動aud$不可用,那么像conn /as sysdba這樣的連接信息,只能記錄在其它地方。如果是windows平臺,audti trail會記錄在windows的事件管理中,如果是linux/unix平臺則會記錄在audit_file_dest參數指定的文件中。
Audit_trail:
None:是默認值,不做審計;
DB:將audit trail 記錄在數據庫的審計相關表中,如aud$,審計的結果只有連接信息;
DB,Extended:這樣審計結果里面除了連接信息還包含了當時執行的具體語句; OS:將audit trail 記錄在操作系統文件中,文件名由audit_file_dest參數指定;
XML:10g里新增的。
注:這兩個參數是static參數,需要重新啟動數據庫才能生效。
3、審計級別
當開啟審計功能后,可在三個級別對數據庫進行審計:Statement(語句)、Privilege(權限)、object(對象)。
Statement:
按語句來審計,比如audit table 會審計數據庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy用戶所有的數據庫連接。
Privilege:
按權限來審計,當用戶使用了該權限則被審計,如執行grant select any table to a,當執行了audit select any table語句后,當用戶a 訪問了用戶b的表時(如select * from b.t)會用到select any table權限,故會被審計。注意用戶是自己表的所有者,所以用戶訪問自己的表不會被審計。
Object:
按對象審計,只審計on關鍵字指定對象的相關操作,如aduit alter,delete,drop,insert on cmy.t by scott;這里會對cmy用戶的t表進行審計,但同時使用了by子句,所以只會對scott用戶發起的操作進行審計。注意Oracle沒有提供對schema中所有 對象的審計功能,只能一個一個對象審計,對于后面創建的對象,Oracle則提供on default子句來實現自動審計,比如執行audit drop on default by access;后,對于隨后創建的對象的drop操作都會審計。但這個default會對之后創建的所有數據庫對象有效,似乎沒辦法指定只對某個用戶創建的對象有效,想比 trigger可以對schema的DDL進行“審計”,這個功能稍顯不足。
4、審計的一些其他選項
by access / by session:
by access 每一個被審計的操作都會生成一條audit trail。
by session 一個會話里面同類型的操作只會生成一條audit trail,默認為by session。
whenever [not] successful:
whenever successful 操作成功(dba_audit_trail中returncode字段為0)才審計, whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。
5、和審計相關的視圖
dba_audit_trail:保存所有的audit trail,實際上它只是一個基于aud$的視圖。其它的視圖 dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail 的一個子集。
dba_stmt_audit_opts:可以用來查看statement審計級別的audit options,即數據庫設置過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts視圖功能與之類似
all_def_audit_opts:用來查看數據庫用on default子句設置了哪些默認對象審計。
6、取消審計
將對應審計語句的audit改為noaudit即可,如audit session whenever successful對應的取消審計語句為noaudit session whenever successful;7、10g中的審計告知一切
Oracle 數據庫 10g 審計以一種非常詳細的級別捕獲用戶行為,它可以消除手動的、基于觸發器的審計。
假定用戶 Joe 具有更新那張表的權限,并按如下所示的方式更新了表中的一行數據:
update SCOTT.EMP set salary = 12000 where empno = 123456;您如何在數據庫中跟蹤這種行為呢?在 Oracle 9i 數據庫及其較低版本中,審計只能捕獲“誰”執行此操作,而不能捕獲執行了“什么”內容。例如,它讓您知道 Joe 更新了 SCOTT 所有的表EMP,但它不會顯示他更新了該表中員工號為 123456 的薪水列。它不會顯示更改前的薪水列的值 — 要捕獲如此詳細的更改,您將不得不編寫您自己的觸發器來捕獲更改前的值,或使用 LogMiner 將它們從存檔日志中檢索出來。
細粒度審計(FGA),是在 Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的數據,但是它們只能用于 select 語句,而不能用于 DML,如 update、insert 和delete 語句。因此,對于 Oracle 數據庫 10g 之前的版本,使用觸發器雖然對于以行級跟蹤用戶初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。
8、實例講解
8.1、激活審計
SQL> conn /as sysdba SQL> show parameter audit NAME TYPE VALUE----------------------------------------------audit_file_dest string /u01/app/oracle/admin/ORCL/adump audit_sys_operations boolean FALSE audit_syslog_level string audit_trail string NONE
SQL> alter system set audit_sys_operations=TRUE scope=spfile;--審計管理用戶(以sysdba/sysoper角色登陸)SQL> alter system set audit_trail=db,extended scope=spfile;SQL> startup force;SQL> show parameter audit NAME TYPE VALUE----------------------------------------------audit_file_dest string /u01/app/oracle/admin/ORCL/adump audit_sys_operations boolean TRUE audit_syslog_level string audit_trail string DB, EXTENDED
8.2、開始審計
SQL> conn /as sysdba SQL> audit all on t_test;SQL> conn u_test SQL> select * from t_test;SQL> insert into u_test.t_test(c2,c5)values('test1','2');SQL> commit;SQL> delete from u_test.t_test;SQL> commit;SQL> conn /as sysdba SQL> col DEST_NAME format a30 col OS_USERNAME format a15 col USERNAME format a15 col USERHOST format a15 col TERMINAL format a15 col OBJ_NAME format a30 col SQL_TEXT format a60 SQL> select OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;
sql> audit select table by u_test by access;如果在命令后面添加by user則只對user的操作進行審計,如果省去by用戶,則對系統中所有的用戶進行審計(不包含sys用戶).例:
AUDIT DELETE ANY TABLE;--審計刪除表的操作
AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL;--只審計刪除失敗的情況
AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL;--只審計刪除成功的情況 AUDIT DELETE,UPDATE,INSERT ON user.table by test;--審計test用戶對表user.table的delete,update,insert操作
8.3、撤銷審計
SQL> noaudit all on t_test;
9、審計語句
多層環境下的審計:appserve-應用服務器,jackson-client AUDIT SELECT TABLE BY appserve ON BEHALF OF jackson;審計連接或斷開連接: AUDIT SESSION;AUDIT SESSION BY jeff, lori;--指定用戶
審計權限(使用該權限才能執行的操作):
AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;AUDIT DELETE ANY TABLE;AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT SUCCESSFUL;
對象審計:
AUDIT DELETE ON jeff.emp;AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;
取消審計:
NOAUDIT session;NOAUDIT session BY jeff, lori;NOAUDIT DELETE ANY TABLE;NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;NOAUDIT ALL;--取消所有statement審計
NOAUDIT ALL PRIVILEGES;--取消所有權限審計 NOAUDIT ALL ON DEFAULT;--取消所有對象審計
10、清除審計信息
DELETE FROM SYS.AUD$;DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、審計視圖
STMT_AUDIT_OPTION_MAP--審計選項類型代碼 AUDIT_ACTIONS--action代碼
ALL_DEF_AUDIT_OPTS--對象創建時默認的對象審計選項 DBA_STMT_AUDIT_OPTS--當前數據庫系統審計選項 DBA_PRIV_AUDIT_OPTS--權限審計選項 DBA_OBJ_AUDIT_OPTS USER_OBJ_AUDIT_OPTS--對象審計選項 DBA_AUDIT_TRAIL USER_AUDIT_TRAIL--審計記錄 DBA_AUDIT_OBJECT USER_AUDIT_OBJECT--審計對象列表 DBA_AUDIT_SESSION USER_AUDIT_SESSION--session審計 DBA_AUDIT_STATEMENT USER_AUDIT_STATEMENT--語句審計
DBA_AUDIT_EXISTS--使用BY AUDIT NOT EXISTS選項的審計 DBA_AUDIT_POLICIES--審計POLICIES DBA_COMMON_AUDIT_TRAIL--標準審計+精細審計
12、將審計結果表從system表空間里移動到別的表空間上
實際上sys.aud$表上包含了兩個lob字段,并不是簡單的move table就可以。下面是具體的過程: alter table sys.aud$ move tablespace users;alter table sys.aud$ move lob(sqlbind)store as(tablespace USERS);alter table sys.aud$ move lob(SQLTEXT)store as(tablespace USERS);alter index sys.I_AUD1 rebuild tablespace users;
--End--
第三篇:Oracle JOB 用法小結
Oracle JOB 用法小結時間:2004-10-20 08:00來源:中國網管聯盟 作者:BitsCN整理 點擊:24528次
一、設置初始化參數 job_queue_processes
sql> alter system set job_queue_processes=n;(n>0)
job_queue_processes最大值為1000
查看job queue 后臺進程
sql>select name,description from v$bgprocess;
二,dbms_job package 用法介紹
包含以下子過程:
Broken()過程。
change()過程。
Interval()過程。
Isubmit()過程。
Next_Date()過程。
Remove()過程。
Run()過程。
Submit()過程。
User_Export()過程。
What()過程。
1、Broken()過程更新一個已提交的工作的狀態,典型地是用來把一個已破工作標記為未破工作。
這個過程有三個參數:job、broken與next_date。
PROCEDURE Broken(job
IN binary_integer,Broken
IN boolean,next_date IN date :=SYSDATE)
job參數是工作號,它在問題中唯一標識工作。
broken參數指示此工作是否將標記為破——TRUE說明此工作將標記為破,而FLASE說明此工作將標記為未破。網管聯盟www.tmdps.cn.com
創建測試表
SQL> create table TEST(a date);
表已創建。
創建一個自定義過程
SQL> create or replace procedure MYPROC as
begin
insert into TEST values(sysdate);
end;
/
過程已創建。
創建JOB
SQL> variable job1 number;
SQL>
SQL> begin
dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');即一分鐘運行test過程一次end;
/
PL/SQL 過程已成功完成。
運行JOB
SQL> begin
dbms_job.run(:job1);
end;
/
PL/SQL 過程已成功完成。
SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss')時間 from TEST;
時間
-------------------
--每天1440分鐘,2001/01/07 23:51:21 2001/01/07 23:52:22 2001/01/07 23:53:24
刪除JOB SQL> begin 2 dbms_job.remove(:job1);3 end;4 / 網管網bitsCN.com
PL/SQL 過程已成功完成。www.tmdps.cn】
【轉自
第四篇:Oracle Apps DBA工作小結
Oracle Apps DBA工作小結
開始Oracle Apps DBA的工作到現在差不多有2周了,為了清理思路作個小的總結。
日常需要做的工作包括:
1。Oracle Apps的克隆,復制,因為有各個省份的生產環境,測試環境,開發環境,所以克隆,復制的需求量很大,這是個熟能生巧的事情,同時也是個比較無聊的工作,沒什么技術含量。
2。Oracle Apps的troubleshooting,通過對Oracle Forms做trace,再加上反應不算快速的Metalink支持,基本上也可以應付。但是看見旁邊的同事疲于應付各種求助,感覺上也有些煩躁。
3。數據庫的備份,使用HP OpenView Storage Data Protector+RMAN,以前沒有用過omni,但是仍然屬于熟能生巧的事情,而且有HP工程師作技術支持,也不是什么問題。目前需要做的是備份策略還沒有完全測試過,這是這周的主要工作。
4。編寫文檔,文檔的模版比較正規,但是內容仍然需要改善,各個省份的文檔都是Ctl+C, Ctl+V,然后全局替換的產物。
5。SQL Tuning,一般是對于客戶化開發功能的SQL調優,目前我對于應用還很不熟悉,所以這部分工作還沒有開始。
需要接觸的技術:
HP主機 + Oracle數據庫 + Oracle Apps 11i + HP OpenView Storage Data Protector
工作之外需要進一步學習IT管理。
PS;本文檔由北大青鳥廣安門收集自互聯網,僅作分享之用。
第五篇:課題_ORACLE編譯失效對象小結
ORACLE編譯失效對象小結
在日常數據庫維護過程中,我們會發現數據庫中一些對象(包Package、存儲過程Procedure、函數Function、視圖View、同義詞.....)會失效,呈現無效狀態(INVALID)。有時候需要定期檢查數據庫中存在哪些失效對象,對于存在異常的對象需要重新編譯,有些自動失效的對象,一般會在下次調用的時候,會被重新編譯,所以這些不需要人工干預。那么為什么對象突然會失效呢?又如何快速、高效的編譯失效對象呢?哪些失效的對象不需要我們去重新編譯呢?
數據庫對象失效原因
數據庫對象失效的原因很多,下面大致歸納了一些常見的原因(有些漏掉的,希望大家補充): 1: 當被引用對象的結構變更時,都會使得相關的依賴對象轉變為INVALID狀態。
數據庫中的對象(存儲過程,函數,包,視圖,觸發器),它們往往需要直接或者間接的引用其它對象,對象的依賴包括直接和間接二種,其中直接依賴是指存儲對象直接依賴于被引用對象,而間接依賴是指對象間接依賴于被引用對象
要查看被引用的對象,可以通過下面SQL查看
select * from dba_dependencies where name='&objectname';
select * from all_dependencies where name='&objectname';
select * from user_dependencies where name='&objectname';舉個簡單例子,視圖V_TEST引用了表TEST,TEST表修改了表結構時,會導致視圖V_TEST變為無效對象。
SQL> CREATE TABLE TEST(ID NUMBER(10));
Table created.SQL> CREATE VIEW V_TEST AS SELECT * FROM TEST;
View created.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST VALID
--修改表結構,增加一個字段NAME后,視圖V_TEST變為無效
SQL> ALTER TABLE TEST ADD NAME VARCHAR(12);
Table altered.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST INVALID
--查詢視圖V_TEST后,數據庫會重新編譯視圖
SQL> SELECT * FROM V_TEST;
no rows selected
SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
-----------------------------------
V_TEST VALID
其實不管視圖,像存儲過程,函數、包等,如果代碼本身沒有什么錯誤,只是引用的對象發生了變化。也會失效。但并不影響調用,因為ORACLE在調用時會自動重新編譯的,如果其它對象變化后導致編譯有錯誤。這時調用時重新編譯后也是錯誤并處于失效狀態,所以調用會出錯。2:發布SQL腳本時(包、存儲過程、函數等),沒有充分測試,編譯時出錯,這時對象變為無效。3: 數據庫升級、遷移時,出現大量無效對象(本質原因,個人臆測歸結為原因1)。
4: 諸如此類各種情況:例如,Oracle 會自動維護分區索引,對于全局索引,如果在對分區表操作時,沒有指定update index,則會導致全局索引失效,需要重建。
編譯失效對象的方法統計失效的對象:
select owner, object_type, status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type
查看具體失效對象
col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;