如何查询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,如下参考:
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中查询每个表的记录条数
参考技术A1、先查询本库的所有表,测试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 如何查询过去某个时间点的记录(应用于某个时间点的误操作,回滚到之前的操作)