如何看Oracle数据库的⽤户登录的记录档案
如何看数据库的⽤户登录的记录档案
1 audit
⽤审记来记录⽤户的操作信息
2 trigger
⽤系统触发器来记录⽤户登录
3 logmnr
从log⽂件中挖出⽤户登录信息
推荐使⽤第3种,不占⽤系统资源,⽽且很⽅便。
===============================
Oracle 中记录⽤户登录信息
我们可以使⽤ Oracle Audit 函数来记录⽤户登录信息,但是如果开放了 Audit 函数将会使Oracle 性能下降,甚⾄导致 Oracle 崩溃。那我们如何才能记录⽤户登录信息呢?其实我们可以通过建⽴触发器的⽅式来实现。⽅法如下:
1. ⽤ sys ⽤户登录 Oracle
2. 创建记录⽤户登录信息的表
CREATE TABLE LOG$INFORMATION
(
ID NUMBER(10),
USERNAME VARCHAR2(30),
LOGINTIME DATE,
TERMINAL VARCHAR2(50),
IPADRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
PROGRAM VARCHAR2(64),
SID NUMBER,
SERIAL# NUMBER,
AUSID NUMBER
)
/
3. 创建⼀个 Sequence,作为登录信息的主键
CREATE SEQUENCE LOGIN_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
cache 20
/
4. 创建触发器,记录⽤户登录信息
CREATE OR REPLACE TRIGGER LOGIN_RECORD_TR
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
SELECT * FROM v$session
WHERE audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
FETCH cSession INTO mtSession;
IF cSession%FOUND AND SYS_CONTEXT ('USERENV','IP_ADDRESS') IS NOT NULL THEN
INSERT INTO log$information(
id,
username,
logintime,
terminal,
ipadress,
osuser,
machine,
program,
sid,
serial#,
ausid
) VALUES(
val,
USER,
SYSDATE,
mtSession.Terminal,
SYS_CONTEXT ('USERENV','IP_ADDRESS'),
mtSession.Osuser,
mtSession.Machine,
mtSession.Program,
mtSession.Sid,
mtSession.Serial#,
userenv('SESSIONID')
);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
RAISE;
如何连接oracle数据库END;
/
5. 将 SYS.LOG$INFORMATION 授权给需要查看登录记录的⽤户
Grant select on SYS.LOG$INFORMATION to XXX
/
=======================================
审计⽤户登录和登出
记录每个⽤户每次登录数据库和退出数据库的⽇期和事件。设置步骤如下:
1. 设置系统审计相关的参数
2. 重新启动数据库
3.以SYSTEM帐号登录数据库执⾏下列语句,设置CONNECT审计并检查是否设置成功: SQL> connect system/password
SQL> audit connect
SQL> col user_name format a11
SQL> col audit_option format a14
SQL> select user_name, audit_option, success, failure
from sys.dba_stmt_audit_opts;
USER_NAME AUDIT_OPTION SUCCESS FAILURE
----------- -------------- ---------- ----------
CREATE SESSION BY ACCESS BY ACCESS
4.查询 AUD$表就可以查看到审计结果了
SQL> col userid format a8
SQL> select sessionid, to_char(timestamp#,'DD-MON-YY:HH24:MI:SS') login,
userid, to_char(logoff$time,'DD-MON-YY:HH24:MI:SS') logoff
from sys.aud$ where userid='SCOTT';
SESSIONID LOGIN USERID LOGOFF
---------- ------------------ -------- ------------------
132 22-FEB-00:13:55:06 SCOTT 22-FEB-00:14:04:05
注意:不同的版本的ORACLE数据库AUD$字典会有所不同,实际情况请参照你当前版本的数据库的AUD$表。
1.4.11 审计SYS⽤户的操作(ORACLE 9i Release 2)
在ORACLE 9.2之前,SYS帐户是系统中的⼀个唯⼀不受审计的帐户。在ORACLE 9I Release 2和以后的版本中,通过⼀些设置就可以对SYS帐号进⾏审计。
在ORACLE 9.2以后的版本中,可以通过设置AUDIT_SYS_OPERATIONS可以实现对具有SYS/SYSDBA/SYSOPER权限的⽤户的审计。
1.4.12 使⽤WINDOWS 事件管理器来记录审计信息
和UNIX系统不同,WINDOWS的审计结果不是存储在操作系统⽂件中,⽽是直接存储在WINDOWS 事件⽇志中。本节介绍如何配置数据库审计,并⽤事件管理器来查看审计记录。
在WINDOWS下设置数据库审计,需要按照如下的步骤:
1、配置审计
⾸先要确认WINDOWS的事件⽇志(EVENTLOG)服务是否启动。可以通过“控制⾯板/管理⼯具/服务”⼯具来查看。
然后通过修改ORACLE的参数(参数修改⽅法参见前⾯的关于ORACLE参数⽂件的描述)AUDIT_TRAIL:
AUDIT_TRAIL=0S
在WINDFOWS平台下要注意的是:
不管AUDIT_TRAIL设置为什么值,有部分ORACLE的操作会记录在事件⽇志中
在WINDOWS下不⽀持AUDIT_FILE_DEST参数,如果设置了该参数,数据库会报错
LRM-00101: UNKNOWN PARAMETER NAME 'AUDIT_FILE_DEST'
ORA-01078: FAILURE IN PROCESSING SYSTEM PARAMETERS
在使⽤审计前,要确保事件⽇志有⾜够⼤的空间来存储审计信息
2、检查是否安装好AUDIT相关的对象
最简单的检查⽅法是看看AUD$是否存在。如果AUDIT相关对象安装不正确,可以通过%ORACLE_HOME%\rdbms\admin\cataudit.sql 脚本来安装AUDIT相关对象。如果要删除审计,可以执⾏%ORACLE_HOME%\rdbms\admin\catnoaud.sql。
3、配置审计
在配置审计之前,⾸先要说明的是,审计是⼀种会带来额外开销的操作。因此在可能的情况下,尽量减少审计操作。另外,如果打开审计操作,那么对⼀些数据库事件的审计是缺省的,这些审计事件包括:
实例关闭
通过SYSOPER和SYSDBA连接数据库
在WINDOWS下配置审计的步骤和在UNIX下配置审计类似,这⾥就不再描述了。审计信息会⾃动写⼊WINDOWS的事件⽇志种,通过事件管理器可以查看⽇志。
=====================================如何使⽤Logmnr⽅法分析数据库⽇志
本⽂⽤举例的形式来讲解使⽤Logmnr⽅法分析数据库⽇志。
⼀、安装LogMiner⼯具
(以下两个脚本以SYSDBA⾝份运⾏)
@$ORACLE_HOME\rdbms\admin\dbmslm.sql;
@ $ORACLE_HOME\rdbms\admin\dbmslmd.sql;
第⼀个脚本⽤来创建DBMS_LOGMNR包,该包⽤来分析⽇志⽂件。
第⼆个脚本⽤来创建DBMS_LOGMNR_D包,该包⽤来创建数据字典⽂件。
⼆、使⽤LogMiner⼯具
下⾯将详细介绍如何使⽤LogMiner⼯具。
1、创建数据字典⽂件(data-dictionary)
(1)⾸先在a初始化参数⽂件中,指定数据字典⽂件的位置,也就是添加⼀个参数UTL_FILE_DIR,该参数值为服务器中放置数据字典⽂件的⽬录。
如:UTL_FILE_DIR = ($ORACLE_HOME\logs) ,重新启动数据库,使新加的参数⽣效。
(2)创建数据字典⽂件:
SQL> connect /as sysdba
SQL> execute dbms_logmnr_d.build(dictionary_filename =>
'a',dictionary_location => 'G:\oracle\logs');
PL/SQL procedure successfully completed
2、创建要分析的⽇志⽂件列表:
(1)创建分析列表,即所要分析的⽇志:
SQL> execute dbms_logmnr.add_logfile(LogFileName =>
'G:\ORACLE\ORADATA\ORADBSP\REDO04.LOG',Options => w);
PL/SQL procedure successfully completeds
(2)添加分析⽇志⽂件(⼀次添加1个为宜):
SQL>
execute dbms_logmnr.add_logfile(LogFileName =>
'G:\ORACLE\ORADATA\ORADBSP\REDO05.LOG',
Options => dbms_logmnr.ADDFILE);
PL/SQL procedure successfully completed
3、使⽤logMiner进⾏⽇志分析:
(1)⽆限制条件,即⽤数据字典⽂件对要分析的⽇志⽂件所有内容做分析:
SQL> execute dbms_logmnr.start_logmnr
(DictFileName => 'G:\oracle\a');
PL/SQL procedure successfully completed
(2)带限制条件:
可以⽤scn号或时间做限制条件,也可组合使⽤--分析⽇志列表中时间从07.02.28从10:00到15:00的内容。
SQL> execute dbms_logmnr.start_logmnr
(startTime => to_date('20070228100000','yyyy-mm-dd hh24:mi:ss'),
endTime => to_date('20070228150000','yyyy-mm-dd hh24:mi:ss'),
DictFileName => 'G:\oracle\a');
PL/SQL procedure successfully completed
dbms_logmnr.start_logmnr函数的原型为:
PROCEDURE start_logmnr(
startScn INNUMBER default 0 ,
endScnINNUMBER default 0,
startTimeINDATE default '',
endTime INDATE default '',
DictFileNameINVARCHAR2 default '',
Options INBINARY_INTEGER default 0 );
4、分析后释放内存:
SQL> execute d_logmnr;
PL/SQL procedure successfully completed
5、其它:
(1)删除⽇志分析⽂件:
exec dbms_logmnr.add_logfile
('G:\ORACLE\ORADATA\ORADBSP\REDO04.LOG',
vefile);
三、查看LogMiner⼯具分析结果
SQL> select * from dict t where t.table_name like '%LOGMNR%';
--看所有与logmnr相关的视图
TABLE_NAME COMMENTS
-
----------------------------- ---------------------------
GV$LOGMNR_CALLBACK Synonym for GV_$LOGMNR_CALLBACK
GV$LOGMNR_CONTENTS Synonym for GV_$LOGMNR_CONTENTS
GV$LOGMNR_DICTIONARY Synonym for GV_$LOGMNR_DICTIONARY
GV$LOGMNR_LOGFILESynonym for GV_$LOGMNR_LOGFILE
GV$LOGMNR_LOGSSynonym for GV_$LOGMNR_LOGS
GV$LOGMNR_PARAMETERS Synonym for GV_$LOGMNR_PARAMETERS
GV$LOGMNR_PROCESSSynonym for GV_$LOGMNR_PROCESS
GV$LOGMNR_REGIONSynonym for GV_$LOGMNR_REGION
GV$LOGMNR_SESSIONSynonym for GV_$LOGMNR_SESSION
GV$LOGMNR_STATS Synonym for GV_$LOGMNR_STATS
GV$LOGMNR_TRANSACTIONSynonym for GV_$LOGMNR_TRANSACTION
V$LOGMNR_CALLBACKSynonym for V_$LOGMNR_CALLBACK
V$LOGMNR_CONTENTSSynonym for V_$LOGMNR_CONTENTS
V$LOGMNR_DICTIONARYSynonym for V_$LOGMNR_DICTIONARY
V$LOGMNR_LOGFILESynonym for V_$LOGMNR_LOGFILE
V$LOGMNR_LOGS Synonym for V_$LOGMNR_LOGS
V$LOGMNR_PARAMETERSSynonym for V_$LOGMNR_PARAMETERS
V$LOGMNR_PROCESSSynonym for V_$LOGMNR_PROCESS
V$LOGMNR_REGION Synonym for V_$LOGMNR_REGION
V$LOGMNR_SESSIONSynonym for V_$LOGMNR_SESSION
TABLE_NAME COMMENTS
-
----------------------------- ------------------------
V$LOGMNR_STATSSynonym for V_$LOGMNR_STATS
V$LOGMNR_TRANSACTION Synonym for V_$LOGMNR_TRANSACTION
GV$LOGMNR_LOGS 是分析⽇志列表视图:
分析结果在GV$LOGMNR_CONTENTS 视图中,可按以下语句查询:
select scn,timestamp,log_id,seg_owner,seg_type,
table_space,data_blk#,data_obj#,data_objd#,
session#,serial#,username,session_info,
sql_redo,sql_undo from logmnr3 t
where t.sql_redo like 'create%';
如果不能正常查询GV$LOGMNR_CONTENTS视图,并报以下错误,ORA-01306: 在从 v$logmnr_contents 中选择之前必须调⽤dbms_logmnr.start_logmnr() 。可采⽤如下⽅法:
create table logmnr3 as select * from GV$LOGMNR_CONTENTS;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论