在数据库日常使用及运维过程中,我们可能经常有获取完整的sql执行文本的需求,但大部分视图的相关字段存在精度限制,一旦sql语句过长,就无法完整展现。如v$sessions视图的SQL_TEXT字段,精度1000;v$sql_history视图的TOP_SQL_TEXT字段,精度1000。
本文记录获取完整的sql文本的几种方式:
1. 系统函数sf_get_session_sql(sess_id)
dm中提供了一个系统函数,用于获取session上当前sql文本信息,入参为session id,即v$sessions视图的SESS_ID字段的值,以大字段格式返回完整的sql文本信息。
常见用法如下:
select sf_get_session_sql(sess_id) as full_sql,* from v$sessions where state = 'ACTIVE';
存在如下限制:
a. 只能获取会话上当前sql的信息,历史sql信息无法获取;
2. v$sqltext视图
dm提供v$sqltext视图,用于显示缓冲区中的sql语句信息,也可以通过该视图获取完整的sql语句。
需要注意的是,v$sqltext视图中sql语句是分段展示的,dm8中该视图sql_text字段精度为7168,而老版本的dm7中sql_text字段精度为1000。当存储的sql语句超过sql_text精度时(计算字节数lengthb,而非字符数length),会分多段存储,即在v$sqltext视图中生成多条记录,用sql_id字段来区分是否属于同一条语句,用sql_nth字段来区分各段之前的前后关系。
常见用法如下:
-- 使用sql_id获取完整的sql语句
select
listagg(sql_text,'') within group (order by sql_nth) as sql_text
from v$sqltext
where sql_id=xxx;
-- 根据sql文本匹配sql语句
select sql_id,listagg(sql_text,'') within group (order by sql_nth) as sql_text
from v$sqltext where sql_id in (
select distinct sql_id from v$sqltext where sql_text like '%XXXX%'
)
group by sql_id;
存在如下限制:
a. 能存储的sql信息受sql缓冲区大小限制;
3. sqllog
dm中允许用户开启sql日志,记录数据库中执行过的所有sql语句信息(或按要求配置记录符合条件的sql信息),具体开启sqllog的方法可以参考别的文章。
存在如下限制:
a. 会占用额外的服务器存储,所能记录的sql数取决于服务器磁盘空间;
b. 可能由于换行、sess_id记录格式不同于v$sessions等因素导致查找指定sql比较麻烦;
文章
阅读量
获赞