`
jsltool
  • 浏览: 23391 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

Oracle自动保存所有执行过的sql语句

 
阅读更多

前言

  项目上出现了一个奇怪错误,导致用户无法正常操作系统。反映到数据上,就是一个表的字段(数字类型)平白无故的变成了null,我们查找了整个系统所有的涉及到的增删改查代码,以及存储等,均未能发现原因,最终决定查看数据库中执行的所有SQL,逐条检查。

实施方案1

  首先是用v$sql视图查询,但是这个结果集里的数据不能保证长时间的存在,而且无法随数据库迁移到新的服务器上。

select t.SQL_TEXT--varchar类型的sql(超过1000字符的sql语句会显示不下)
      ,t.SQL_FULLTEXT--clob类型的sql(完整的sql语句)
      ,to_char(t.LAST_ACTIVE_TIME,'yyyy-mm-dd hh24:mi:ss')--sql的执行时间
from v$sql t
where t.PARSING_SCHEMA_NAME='SCOTT'--大写用户名
  and trunc(t.LAST_ACTIVE_TIME)=trunc(sysdate)--今天执行的sql
--按时间倒叙输出
order by 3 desc;
    p.s.相关知识点(自己查): 

     v$sql、v$sqlarea和v$sqltext的区别

     视图里的数据能保留多久

实施方案2

   定时将数据库执行过的sql保存到单独的一个表里(当然这个表要定期清理)。考虑到这个表的数据量较大,所以单独开一个表空间:

create tablespace sqlarea--表空间名字叫sqlarea
datafile '/opt/oracle/oradata/sqlarea.dbf'--数据库文件路径
size 128m--文件初始大小
autoextend on--设置文件自增长
next 64m--每次增加64MB
maxsize 20480m--最大不超过20GB
extent management local;
 
--不限制用户对表空间的操作
grant create session,create table,unlimited tablespace to SCOTT;
   表空间准备好之后,就可以建表了
create table sqltextlog(
       sql_text varchar2(1000),--文本类型的sql
       sql_fulltext clob,--clob类型的sql
       action varchar2(64),--执行sql的来源
       last_active_time date--执行时间
)
--指定所使用的表空间,不写的话会跑到默认表空间,刚刚我们新建的表空间就白费了
tablespace sqlarea;
  现在就可以往表中插入数据了,为了能够让数据库自动向表中插入数据,我们把插入过程封装成存储过程,存储的名称就叫PRO_SQLTextLog
create or replace procedure PRO_SQLTextLog is--保存sql到指定的表
time_ date;--时间变量,表示表中最后一次插入数据的时间
begin
  --给时间变量赋值,空表的时候,默认用当天的零点
  select nvl(max(last_active_time),trunc(sysdate))
  into time_
  from sqltextlog;
  --开始插入,插入的数据范围从上次插入时间到现在
  insert into sqltextlog(sql_text,sql_fulltext,action,last_active_time)
  select sql_text,sql_fulltext,action,last_active_time
  from v$sql t
  where t.PARSING_SCHEMA_NAME='SCOTT'
    and t.LAST_ACTIVE_TIME>time_
    and t.LAST_ACTIVE_TIME<sysdate;
  --别忘了提交
  commit;
end PRO_SQLTextLog; 
  这里需要注意的一点,就是v$sql的访问权限,需要执行下面的SQL来解决
 grant select any dictionary to SCOTT;
  现在有了存储过程,下一步就是让Oracle每个10分钟执行一遍这个存储。
variable jobid number;--jobid要用作输出
begin
  --第1个参数,用作结果的输出
  --第2个参数,是要执行的存储,注意是字符串类型,而且最后有个英文的分号
  --第3个参数,Job开始的时间,要是想明天0点开始,就改成trunc(sysdate)+1
  --第4个参数,是下次运行的时间,相当于是时间间隔,注意是字符串类型的
  sys.dbms_job.submit(:jobid,'PRO_SQLTextLog;',sysdate,'sysdate+10/1440');
  commit;
end;
/
  上面的sql要在sqlplus下执行,或者是PL/SQL Developer的Command Window里。注意最后不是英文分号结束,而是一个斜杠。

  至此,Oracle自动将SQL保存到指定的数据库表的功能完成,所有执行过的SQL语句都会出现在sqltextlog里
select * from sqltextlog l order by l.last_active_time desc;
  job的执行情况可以通过执行下面的sql查看
select job
      ,last_date
      ,next_date
      ,failures
      ,broken
from user_jobs;
   p.s.相关知识点:

     建表空间

     建表时指定表空间

     建存储过程

     JOB定时作业
  • 大小: 22.3 KB
分享到:
评论

相关推荐

    oracle 查看当前会话执行的sql语句

    ### Oracle 查看当前会话执行的SQL语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...

    Oracle Sql语句转换成Mysql Sql语句

    OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...

    oracle监听执行sql语句

    其中`v$session`包含了所有活动会话的信息,而`v$sqlarea`则存储了最近执行过的SQL语句的元数据。通过`a.sql_address = b.address`这个条件,可以将两者关联起来,进而得到每个会话正在执行的具体SQL语句。 2. **按...

    oracle查看执行最慢与查询次数最多的sql语句

    在Oracle数据库管理中,了解SQL语句的执行性能和频率对于系统优化至关重要。本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来...

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    Oracle批处理是数据库操作中提高效率的重要手段,尤其是在C#编程环境下,利用Oracle的数据驱动进行批处理,可以显著提升大量SQL语句执行的速度。本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次...

    Oracle中SQL语句执行效率的查找与解决

    本文将深入探讨Oracle中SQL语句执行效率的查找与解决方法,特别关注于如何识别和优化那些导致性能瓶颈的查询。 ### Oracle SQL执行效率:查找与解决 #### 一、资源消耗分析 在Oracle中,SQL语句执行效率低下通常...

    存储过程中怎么动态执行sql语句

    ### 动态执行SQL语句在Oracle中的应用 #### 标题解读 “存储过程中怎么动态执行SQL语句”这一标题表明文章将介绍如何在Oracle数据库的存储过程中编写能够动态执行的SQL语句。动态SQL是指在运行时才能确定其具体内容...

    sqlserver自动生成sql语句工具sqlserver转oracle

    在压缩包子文件的文件名"ms转sql语句.exe"中,我们可以推测这可能是一个用于将SQL Server语句转换为Oracle兼容格式的可执行程序。这样的工具通常会提供用户友好的界面,让用户导入SQL Server的数据库元数据,然后...

    如何获得PreparedStatement最终执行的sql语句

    这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有帮助。 在Java中,`PreparedStatement`对象通常会接收参数占位符(如`?`),然后在执行前填充具体...

    Linux下定时自动执行Oracle_SQL

    在IT领域,尤其是在数据库管理和系统自动化操作中,利用Linux下的Crontab实现Oracle SQL的定时自动执行是一项极为实用且高效的技术。本文将深入探讨如何在Linux环境下设置Crontab来定期执行Oracle SQL脚本,这一过程...

    oracle解锁及查已执行SQL语句

    在Oracle数据库管理中,解锁资源和查询已执行的SQL语句是常见的操作需求,尤其是在处理数据库性能问题或恢复被锁定的用户时。根据给定的文件信息,我们可以深入探讨几个关键的知识点,包括如何解锁Oracle中的资源、...

    oracle-查找硬解析问题SQL语句

    在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本

    java定时执行sql语句

    通过配置数据库连接信息和要执行的sql语句,可实现定时执行多个sql语句。 所要执行的语句只能是写死的,可支持sqlserver mysql oracle。 配置说明: config/sys.properties 中指定数据库类型及连接信息,执行间隔...

    oracle sql语句执行流程解析

    在执行完SQL语句之后,如果该语句将会被再次执行,那么其执行计划可能会被保存到数据高速缓存中,以便下次可以直接使用,省略语法、语义和权限检查的步骤,进一步提高效率。 以上整个流程涵盖了SQL语句从客户端提交...

    压测Oracle的SQL语句的性能情况

    在Oracle环境中,LR脚本可以用于执行SQL语句,分析响应时间、事务速率等关键性能指标。 "直连Oracle执行SQL进行压测"意味着测试者直接与数据库交互,不通过中间层如应用程序服务器,这能更准确地反映出数据库本身的...

    [自己开发]一款非常好用的抓取Oracle数据库SQL语句的工具

    Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE数据库服务器的v$sqlarea视图抓取出从点击开始按钮到点击结束按钮期间执行过的SQL语句。执行...

    在存储过程中执行字符串中存有的sql语句

    oracle在存储过程中执行字符串中存有的sql语句

Global site tag (gtag.js) - Google Analytics