Chinaunix

标题: oracle 9i 如何监视某个Schema,在某段时间内的执行的SQL? [打印本页]

作者: TOADLover    时间: 2010-05-31 14:21
标题: oracle 9i 如何监视某个Schema,在某段时间内的执行的SQL?
本帖最后由 TOADLover 于 2010-06-02 08:25 编辑 假设Schema的名字是Zhang,如何监控这个Schema在过去一天里执行了哪些SQL? ---Sorry,数据库的版本是10g. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
作者: wq_1228    时间: 2010-05-31 14:21
回复  wq_1228


    如果升级到10g,所有的dml语句都可以监视,发生的SQL也可以被记录

---怎么做?
TOADLover 发表于 2010-06-02 08:21



    以下面的例子说明一下设置吧
测试表
CREATE TABLE SAMPLE_TABLE
(
        ID                             NUMBER(10,0) NOT NULL,
        NAME                           VARCHAR2(250)
)

设置
  BEGIN
        DBMS_FGA.ADD_POLICY(
                OBJECT_NAME => 'SAMPLE_TABLE',
                POLICY_NAME => 'CHECK_DANGER',
                AUDIT_COLUMN => 'NAME',
                AUDIT_CONDITION => 'NAME = ''ADMIN'' ',  
                STATEMENT_TYPES => 'INSERT,UPDATE,DELETE'
        );
END;

SQL操作
TRUNCATE TABLE SAMPLE_TABLE;
INSERT INTO SAMPLE_TABLE (ID, NAME) VALUES (1,'SCOTT');
INSERT INTO SAMPLE_TABLE (ID, NAME) VALUES (2,'TIGER');
--  Check
INSERT INTO SAMPLE_TABLE (ID, NAME) VALUES (3,'ADMIN');
INSERT INTO SAMPLE_TABLE (ID, NAME) VALUES (4,'ADMINISTRATOR');

UPDATE SAMPLE_TABLE SET ID=10 WHERE NAME='ADMINISTRATOR';

-- ↓ ※※※ Not Check ※※※ ↓
UPDATE SAMPLE_TABLE SET ID=11 WHERE ID=3;
--  Check
UPDATE SAMPLE_TABLE SET NAME='GUEST' WHERE NAME='ADMIN';
--  Check
UPDATE SAMPLE_TABLE SET NAME='ADMIN' WHERE NAME='SCOTT';
UPDATE SAMPLE_TABLE SET NAME='SCOTT' WHERE NAME='GUEST';

--  Check
DELETE FROM SAMPLE_TABLE WHERE NAME='ADMIN';

查看结果

SELECT DB_USER || ':' || SQL_TEXT FGA_LOG  FROM DBA_FGA_AUDIT_TRAIL
WHERE TIMESTAMP >= SYSDATE - INTERVAL '1' MINUTE;

/* 结果 */
FGA_LOG                                                                        
--------------------------------------------------------------------------------
TEST:INSERT INTO SAMPLE_TABLE (ID, NAME) VALUES (3,'ADMIN')                     
TEST:UPDATE SAMPLE_TABLE SET NAME='GUEST' WHERE NAME='ADMIN'                    
TEST:UPDATE SAMPLE_TABLE SET NAME='ADMIN' WHERE NAME='SCOTT'                    
TESTELETE FROM SAMPLE_TABLE WHERE NAME='ADMIN'
作者: TOADLover    时间: 2010-05-31 14:29
路过的朋友们,谁知道?
在日志中应该可以查到,怎么查?
作者: TOADLover    时间: 2010-05-31 14:48
啊,怎么没有兄弟们做过?
作者: TOADLover    时间: 2010-05-31 14:50
数据库正在NOARCHIVELOG方式下使用。
作者: TOADLover    时间: 2010-05-31 15:04
查询该用户在过去一天内进行的DML操作,不包括Select。
作者: TOADLover    时间: 2010-05-31 15:11
本帖最后由 TOADLover 于 2010-05-31 15:12 编辑

怎么没人回?
大家都没涉及过,如果你的一个用户不小心在Delete数据时,使用了错误的where子句,怎么办?

--------
LogMiner需要数据字典来完全地翻译重做日志文件内容,并将内部对象标识符和数据类型转换为对象名和外部数据格式。如果不能使用数据字典,LogMiner将会返回以十六进制格式标识的数据和以内部对象ID表示的对象信息。
有三种选择来获得一个供LogMiner使用的数据字典:

● 将数据字典信息提取到一个平面文件中。
● 将数据字典提取到重做日志文件中。
● 从当前的数据库中使用联机数据字典。
作者: sunfire999    时间: 2010-05-31 15:15
审计功能
作者: ilsyx    时间: 2010-05-31 15:16
本帖最后由 ilsyx 于 2010-05-31 15:18 编辑

回复 5# TOADLover


    你下面也已经提到了 用logmnr. 挖日志来查看数据库已经发生过的dml操作。
跟踪某个schema查看这个schema执行的语句,目前我不知道数据库能跟踪到这么精细。不过数据库可以跟踪记录某个session。将这个session所在期间做的dml操作记录到trace文件。
作者: TOADLover    时间: 2010-05-31 15:39
回复 7# sunfire999


    怎么使用这个审计功能?
作者: TOADLover    时间: 2010-05-31 15:40
回复 8# ilsyx


    不过数据库可以跟踪记录某个session。将这个session所在期间做的dml操作记录到trace文件。
--- 这个也挺好的,怎么实现?
作者: TOADLover    时间: 2010-05-31 16:05
DBMS_LOGMNR 这个东东需要重启数据库,不好。

--- 还有没有其他方法?
作者: gachoyi    时间: 2010-05-31 16:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: renxiao2003    时间: 2010-05-31 16:12
分好高啊,好想拿啊。哈哈。
作者: renxiao2003    时间: 2010-05-31 16:19
本帖最后由 renxiao2003 于 2010-05-31 16:21 编辑

10G:http://oracle.chinaitlab.com/exploiture/790766.html
http://www.oracle.com/global/cn/ ... sep/o54talking.html
看看能不能把这个移植到9I上。
作者: boyli    时间: 2010-05-31 16:27
分给我吧
AUDIT SELECT TABLE, UPDATE TABLE
    BY hr, oe;
作者: ilsyx    时间: 2010-06-01 09:43
回复 10# TOADLover


    网上例子挺多的 给你一个参考链接
http://www.360doc.com/content/07/0511/08/7362_493453.shtml
作者: wq_1228    时间: 2010-06-01 21:39
从9i企业版开始,oracle提供了监视的功能,叫做FGA,可以定义监视规则,对特定的表进行特定操作时,oracle会自动记录到系统表中,作为内部监察使用。但是9i提供的机能有限,只能对select操作监视,并且SQL文监视不到。如果升级到10g,所有的dml语句都可以监视,发生的SQL也可以被记录
作者: TOADLover    时间: 2010-06-02 08:19
本帖最后由 TOADLover 于 2010-06-02 08:26 编辑

数据库版本是:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
作者: TOADLover    时间: 2010-06-02 08:21
回复 17# wq_1228


    如果升级到10g,所有的dml语句都可以监视,发生的SQL也可以被记录

---怎么做?
作者: TOADLover    时间: 2010-06-02 10:34
从9i企业版开始,oracle提供了监视的功能,叫做FGA,可以定义监视规则,对特定的表进行特定操作时,oracle会 ...
wq_1228 发表于 2010-06-01 21:39



    如果升级到10g,所有的dml语句都可以监视,发生的SQL也可以被记录.

--- 能不能追踪到,发起这些sql的对应的机器的IP地址?
作者: wq_1228    时间: 2010-06-02 21:02
如果升级到10g,所有的dml语句都可以监视,发生的SQL也可以被记录.

--- 能不能追踪到,发起这 ...
TOADLover 发表于 2010-06-02 10:34



    能够取得发起SQL的机器名,具体项目,参照一下DBA_FGA_AUDIT_TRAIL的字段吧

http://download.oracle.com/docs/ ... /statviews_3115.htm

〉〉USERHOST VARCHAR2(12   Client host machine name

在局域网中,各个client的hostname和IP都能识别的话,估计能记录下来。

不看实际结果,不太好下结论。
作者: wq_1228    时间: 2010-06-02 21:05
数据库版本是:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
TOADLover 发表于 2010-06-02 08:19



版本没有问题,能设置,
但是10g中,FGA还有些不成熟的地方,在正常的运用中,对性能有一些影响,另外需要定期处理一下
DBA_FGA_AUDIT_TRAIL
中产生的监察记录。
作者: dream_land    时间: 2010-06-03 12:45
这问题还不算解决吗?
作者: boyli    时间: 2010-06-06 17:11
我都告诉你啦
居然还没搞懂
审计不到ip地址的,主机名这个有问题,因为不同网段可能有同名主机
一般如果需要记录ip地址,需要创建登陆触发器




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2