如何查询oracle数据库的操作记录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查询oracle数据库的操作记录?相关的知识,希望对你有一定的参考价值。

首先,向你介绍一个动态视图:v$sql
该视图展示最近一段时间所有执行过的sql语句:
select * from v$sql
即可。
如果报错找不到v$sql,一般是权限问题,换sysdba就肯定能查到。
但要注意的是“隐式sql”,很多sql语句是调用执行的,(比如,存储过程中对dbms包的调用,再如执行create 语句所触发的对系统表空间、数据字典的修改等等。),这些语句同样会展现在v$sql中。
还有其它与sql历史记录相关的v$视图,详情可以参考Oracle官方文档《Oracle® Reference》,直接给你个10.2的文档链接,够方便了吧:
http://www.oracle.com/pls/db102/homepage?remark=tahiti
参考技术A 方法1:使用LogMiner工具
优点:可以完全挖掘日志内容,找出所有执行过的SQL语句
缺点:
1. 如果没有启用归档日志,则只能对联机日志进行挖掘
2. 需要掌握LogMiner的用法

访法2:查看HIST视图
优点:简单,只要使用普通的select语句查询
缺点:Oracle保留约1周的历史,所以要查太早的就不可能了
-- 找出哪个数据库用户用什么程序在最近三天执行过delete或truncate table的操作

举例如下:
SELECT c.username,
a.program,
b.sql_text,
b.command_type,
a.sample_time
FROM dba_hist_active_sess_history a
JOIN dba_hist_sqltext b
ON a.sql_id = b.sql_id
JOIN dba_users c
ON a.user_id = c.user_id
WHERE a.sample_time BETWEEN SYSDATE - 3 AND SYSDATE
AND b.command_type IN (7, 85)
ORDER BY a.sample_time DESC;
参考技术B 查询视图:v$sqlarea,它是oracle中专门存储操作的视图,可以通过它查询历史操作。
授权某用户,查看动态性能视图的权限(如v$latch,v$lock,v$sqlarea,v$sql,v$sysstat)
grant select any dictionary to xxx;
如通过以下查询语句就可以得知那个用户进行了删除操作。
select t.SQL_TEXT, t.FIRST_LOAD_TIME
from v$sqlarea t
where t.SQL_TEXT like 'delete%' and t.FIRST_LOAD_TIME like '2013-03-30%'
order by t.FIRST_LOAD_TIME desc
参考技术C

用sys用户以dba身份登录。

然后,查看视图:V_$SQL,如下参考:


select *
  from V_$SQL t
 WHERE t.SERVICE = 'orcl'
   and t.PARSING_SCHEMA_NAME = 'BHOA'
   AND T.SQL_TEXT LIKE 'update %'
 order by t.LAST_ACTIVE_TIME


可直接查出当前update的那条sql语句。从语句中可看出对什么表进行了什么操作。

参考技术D select count(stuId) from stuInfo;

count 函数;
一般是主键:stuId;学生编号
stuInfo: 学生信息表

如何在oracle中查询每个表的记录条数

参考技术A

1、先查询本库的所有表,测试sql,select * from user_tables t where table_name like 'TEST%';可以看到有多张表;

2、查询一共有几张数据表,

select count(*) from user_tables t where table_name like 'TEST%'; 

3、编写脚本,查询TEST开头表,每个表的记录数,

declare

  v_sql varchar2(200);

  v_cnt number(10);

begin

  for v_tab in (select table_name from user_tables t where table_name like 'TEST%') loop

    v_sql := 'select count(*) from '|| v_tab.table_name;

    execute immediate v_sql into v_cnt;

    dbms_output.put_line(v_tab.table_name||':'||v_cnt);

  end loop;

end;

4、执行该sql,在输出窗口,可以看到每个表的输出结果,

TEST_A:4

TEST_CERTNO:6

TEST_CLASS:4

TEST_COL_1:20

TEST_COL_2:100

TEST_CONNECT:4

TEST_DATE:0

TEST_DATE_1:199

TEST_DATE_2:99

TEST_JOB:6

TEST_LOCK:2

TEST_LOG:999

TEST_MID:328

TEST_SALESSTATISTICS:9999

TEST_STUDENT:6

TEST_SUBSTR:4

TEST_UPDATE:3

TEST_UP_A:6

TEST_UP_B:3

TEST_UP_LIKE:6

以上是关于如何查询oracle数据库的操作记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何查询oracle数据库的操作记录?

如何查询Oracle数据库的操作日志

如何在oracle数据库中的表里批量插入记录

oracle 如何查询过去某个时间点的记录(应用于某个时间点的误操作,回滚到之前的操作)

oracle中如何只查询一条复合条件的记录,即查到一条记录就返回

oracle中如何只查询一条复合条件的记录,即查到一条记录就返回