oracle如何追踪,oracle数据追踪

如何使用CREATE SESSION命令追踪Oracle数据库登陆

1 audit

古雷港网站建设公司创新互联建站,古雷港网站设计制作,有大型网站制作公司丰富经验。已为古雷港上1000+提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的古雷港做网站的公司定做!

用审记来记录用户的操作信息

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(

login_seq.nextval,

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;

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的事件日志种,通过事件管理器可以查看日志。

如何利用JDBC启动Oracle 自动追踪

1.下载Debug版本jar包

首先要下载一个Debug版本的JDBC jar包,Debug版本的jar包命名形式为jdbcX_g.jar

2.启动Logging模式

第一种方式:设置运行环境变量 java -Doracle.jdbc.Trace=true ...(elipse中run-run configurations-arguments一栏)

第二种方式:在程序中控制(建议采用这种方式)

1

2

3

4

5

6

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"]+", "");

ObjectName pattern = new ObjectName("com.a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"oracle/a.jdbc:type=diagnosability,name=" + loader);

ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];

mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));

System.out.println("LoggingEnabled = " + mbs.getAttribute(diag, "LoggingEnabled"));

如果用的是Oracle 10g,直接执行:

1

2

3

/**oracle 10g 启动方法*/

oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging

oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging

3.配置log文件

jdbc使用的是 java.util.logging包中的Logger对象打印log。

1

2

3

4

5

6

/**配置a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"log文件/a*/

Handler fh = new FileHandler("./oracle_jdbc_log.log");

fh.setLevel(Level.ALL);

fh.setFormatter(new SimpleFormatter());

Logger.getLogger("").addHandler(fh);

Logger.getLogger("").setLevel(Level.ALL);

完成的Demo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

import javax.management.Attribute;

import javax.management.AttributeNotFoundException;

import javax.management.InstanceNotFoundException;

import javax.management.InvalidAttributeValueException;

import javax.management.MBeanException;

import javax.management.MBeanServer;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import javax.management.ReflectionException;

public void run() throws SQLException {

DriverManager.registerDriver(new OracleDriver());

//需在加载OracleDriver之后开启log

enableOracleLogging();

Connection conn = null;

Statement stmt = null;

ResultSet rset = null;

try {

conn = getConnection();

System.out.println("Connection retrieved..");

stmt = conn.createStatement();

rset = stmt.executeQuery("select empno from emp");

while (rset.next()) {

System.out.println(rset.getInt(1));

}

} catch (SQLException sqle) {

sqle.printStackTrace();

} finally {

if (rset != null) {

rset.close();

}

if (stmt != null) {

stmt.close();

}

if (conn != null) {

conn.close();

}

}

}

public static void enableOracleLogging() {

try {

/** 配置a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"log文件/a */

Handler fh = new FileHandler("./oracle_jdbc_log.log");

fh.setLevel(Level.ALL);

fh.setFormatter(new SimpleFormatter());

Logger.getLogger("").addHandler(fh);

Logger.getLogger("").setLevel(Level.ALL);

/** oracle a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBmhRYnHTkmh7-myFhPA7W0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW0dnWbznWcYrjD3rHDzPHnYPs" target="_blank" class="baidu-highlight"11g/a 启动方法 */

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

String loader = Thread.currentThread().getContextClassLoader().toString().replaceAll("[,=:\"]+", "");

ObjectName pattern = new ObjectName("com.oracle.jdbc:type=diagnosability,name=" + loader);

ObjectName diag = ((ObjectName[]) (mbs.queryNames(pattern, null).toArray(new ObjectName[0])))[0];

mbs.setAttribute(diag, new Attribute("LoggingEnabled", true));

System.out.println("LoggingEnabled = " + mbs.getAttribute(diag, "LoggingEnabled"));

/** oracle 10g 启动方法 */

// oracle.jdbc.driver.OracleLog.setTrace(true); // enable logging

// oracle.jdbc.driver.OracleLog.setTrace(false); // disable logging

} catch (Exception e) {

e.printStackTrace();

}

}

Oracle 数据库如何跟踪SQL语句

没用,只想从后台数据库看对这个数据库执行的sql问题补充:unika_ly12 写道 那你直接查询 v$sqltext 和 v$session 好了 首先,你要以dba身份登陆数据库。 第二,为某个用户开启sql跟踪。那个用户就是你要跟踪的、正在执行sql语句的那个用户。命令如下: execute dbms_system.set_sql_trace_in_session(sid,serial#,true) 其中参数的意义是,sid-会话id,serial#-序列号,这两个参数可以从v$session中得到。 第三,上面的命令执行成功之后数据库就自动对该用户所发出的所有sql语句进行跟踪,并把结果写在用户跟踪文件里。用户跟踪文件存放在数据库服务器上,路径请参考init.ora文件中的udump参数值。文件名为ora_sid_xxxx.trc(for unix)或者oraxxxxx.trc(for NT),其中xxxx文件系统进程编号,这个编号可以从v$process和v$session两个表通过关联的方式查询得到。当然你也可以简单的查看一下哪个trc文件的日期最新,哪个文件就是你要的结果了。 首先,你要以dba身份登陆数据库。 第二,为某个用户开启sql跟踪。那个用户就是你要跟踪的、正在执行sql语句的那个用户。命令如下: execute dbms_system.set_sql_trace_in_session(sid,serial#,true) 其中参数的意义是,sid-会话id,serial#-序列号,这两个参数可以从v$session中得到。 第三,上面的命令执行成功之后数据库就自动对该用户所发出的所有sql语句进行跟踪,并把结果写在用户跟踪文件里。用户跟踪文件存放在数据库服务器上,路径请参考init.ora文件中的udump参数值。文件名为ora_sid_xxxx.trc(for unix)或者oraxxxxx.trc(for NT),其中xxxx文件系统进程编号,这个编号可以从v$process和v$session两个表通过关联的方式查询得到。当然你也可以简单的查看一下哪个trc文件的日期最新,哪个文件就是你要的结果了。

如何查找ORACLE中的跟踪文件

用toad 的工具可以进行跟踪。查找toad的路径 右键属性 查找相应文件夹 然后 找寻同级目录下的 sql_monitor 这个工具就可以对 Oracle运行数据进行跟踪。


网站名称:oracle如何追踪,oracle数据追踪
网站路径:http://azwzsj.com/article/dscshpj.html