第一篇: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.xiexiebang.com.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.xiexiebang.com】
【转自
第四篇: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;