前言
项目上出现了一个奇怪错误,导致用户无法正常操作系统。反映到数据上,就是一个表的字段(数字类型)平白无故的变成了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语句 在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看...
OracleSqlConvert4MysqlSqlTool.java这个源码工具,根据描述,应该是实现了自动读取Oracle SQL语句,分析其结构,并根据MySQL的语法规则进行转换,然后将转换后的SQL语句保存到指定的目标文件中。这个工具简化了手动...
批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个场景中,我们可以利用批处理文件来简化Oracle数据库的操作,如删除用户、创建用户、创建...
其中`v$session`包含了所有活动会话的信息,而`v$sqlarea`则存储了最近执行过的SQL语句的元数据。通过`a.sql_address = b.address`这个条件,可以将两者关联起来,进而得到每个会话正在执行的具体SQL语句。 2. **按...
在Oracle数据库管理中,了解SQL语句的执行性能和频率对于系统优化至关重要。本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来...
Oracle批处理是数据库操作中提高效率的重要手段,尤其是在C#编程环境下,利用Oracle的数据驱动进行批处理,可以显著提升大量SQL语句执行的速度。本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次...
本文将深入探讨Oracle中SQL语句执行效率的查找与解决方法,特别关注于如何识别和优化那些导致性能瓶颈的查询。 ### Oracle SQL执行效率:查找与解决 #### 一、资源消耗分析 在Oracle中,SQL语句执行效率低下通常...
在压缩包子文件的文件名"ms转sql语句.exe"中,我们可以推测这可能是一个用于将SQL Server语句转换为Oracle兼容格式的可执行程序。这样的工具通常会提供用户友好的界面,让用户导入SQL Server的数据库元数据,然后...
### 动态执行SQL语句在Oracle中的应用 #### 标题解读 “存储过程中怎么动态执行SQL语句”这一标题表明文章将介绍如何在Oracle数据库的存储过程中编写能够动态执行的SQL语句。动态SQL是指在运行时才能确定其具体内容...
本文档主要介绍了与SQL调整有关的内容,涉及多个方面:SQL语句执行的过程、ORACLE优化器、表之间的关联、如何得到SQL执行计划、如何分析执行计划等内容。通过从浅入深的方式了解SQL优化的过程,使大家逐步步入SQL...
Oracle数据库SQL语句跟踪器,通常被称为SQL Monitor,是一种强大的工具,用于监控和分析数据库中的SQL语句执行情况。在Oracle环境中,理解SQL语句的行为是优化数据库性能的关键。SQL Monitor提供实时视图,帮助DBA...
这篇博客可能是探讨如何在实际运行中获取`PreparedStatement`最终执行的SQL语句,这对于调试和分析数据库操作非常有帮助。 在Java中,`PreparedStatement`对象通常会接收参数占位符(如`?`),然后在执行前填充具体...
在IT领域,尤其是在数据库管理和系统自动化操作中,利用Linux下的Crontab实现Oracle SQL的定时自动执行是一项极为实用且高效的技术。本文将深入探讨如何在Linux环境下设置Crontab来定期执行Oracle SQL脚本,这一过程...
在Oracle数据库管理中,解锁资源和查询已执行的SQL语句是常见的操作需求,尤其是在处理数据库性能问题或恢复被锁定的用户时。根据给定的文件信息,我们可以深入探讨几个关键的知识点,包括如何解锁Oracle中的资源、...
Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE数据库服务器的v$sqlarea视图抓取出从点击开始按钮到点击结束按钮期间执行过的SQL语句。执行...
在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本
通过配置数据库连接信息和要执行的sql语句,可实现定时执行多个sql语句。 所要执行的语句只能是写死的,可支持sqlserver mysql oracle。 配置说明: config/sys.properties 中指定数据库类型及连接信息,执行间隔...
在执行完SQL语句之后,如果该语句将会被再次执行,那么其执行计划可能会被保存到数据高速缓存中,以便下次可以直接使用,省略语法、语义和权限检查的步骤,进一步提高效率。 以上整个流程涵盖了SQL语句从客户端提交...
在Oracle环境中,LR脚本可以用于执行SQL语句,分析响应时间、事务速率等关键性能指标。 "直连Oracle执行SQL进行压测"意味着测试者直接与数据库交互,不通过中间层如应用程序服务器,这能更准确地反映出数据库本身的...