STL_UTILITYTEXT
捕获在数据库上运行的非 SELECT SQL 命令的文本。
查询 STL_UTILITYTEXT 视图以捕获在系统上运行的 SQL 语句的下列子集:
-
ABORT、BEGIN、COMMIT、END、ROLLBACK
-
ANALYZE
-
CALL
-
CANCEL
-
COMMENT
-
CREATE、ALTER、DROP DATABASE
-
CREATE、ALTER、DROP USER
-
EXPLAIN
-
GRANT、REVOKE
-
LOCK
-
RESET
-
SET
-
SHOW
-
TRUNCATE
另请参阅 STL_DDLTEXT、STL_QUERYTEXT 和 SVL_STATEMENTTEXT。
使用 STARTTIME 和 ENDTIME 列了解在某个给定时间段内记录了哪些语句。SQL 文本的长数据块已分为 200 个字符长的行;SEQUENCE 列标识了属于一个语句的文本片段。
STL_UTILITYTEXT 对所有用户可见。超级用户可以查看所有行;普通用户只能查看其自己的数据。有关更多信息,请参阅 系统表和视图中的数据可见性。
此表中的部分或全部数据也可以在 SYS 监控视图 SYS_QUERY_HISTORY 中找到。SYS 监控视图中的数据经过格式化处理,便于使用和理解。我们建议您使用 SYS 监控视图进行查询。
表列
列名称 | 数据类型 | 描述 |
---|---|---|
userid | integer | 生成该条目的用户 ID。 |
xid | bigint | 事务 ID。 |
pid | integer | 与查询语句关联的进程 ID。 |
label | character(320) | 用于运行查询的文件的名称或使用 SET QUERY_GROUP 命令定义的标签。如果查询并非基于文件或未设置 QUERY_GROUP 参数,则此字段为空。 |
starttime | 时间戳 | 查询开始的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358 。 |
endtime | 时间戳 | 查询完成的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358 。 |
sequence | integer | 当一个语句包含 200 多个字符时,将为该语句记录额外的行。序列 0 是第一行,1 是第二行,依此类推。 |
text | character(200) | SQL 文本,以 200 个字符递增。此字段可能包含反斜杠 (\\ ) 和换行符 (\n ) 等特殊字符。 |
示例查询
以下查询返回 2012 年 1 月 26 日运行的“utility”命令的文本。在这种情况下,运行的是一些 SET 命令和一个 SHOW ALL 命令:
select starttime, sequence, rtrim(text) from stl_utilitytext where starttime like '2012-01-26%' order by starttime, sequence; starttime | sequence | rtrim ---------------------------+-----+---------------------------------- 2012-01-26 13:05:52.529235 | 0 | show all; 2012-01-26 13:20:31.660255 | 0 | SET query_group to '' 2012-01-26 13:20:54.956131 | 0 | SET query_group to 'soldunsold.sql' ...
重新构造存储的 SQL
要重新构造存储在 STL_UTILITYTEXT 的 text
列中的 SQL,请运行 SELECT 语句,以从 text
列中的一个或多个部分创建 SQL。在运行重新构造的 SQL 之前,将任何 (\n
) 特殊字符替换为新行。以下 SELECT 语句的结果是 query_statement
字段中重新构造的 SQL 的行。
SELECT LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END) WITHIN GROUP (ORDER BY sequence) as query_statement FROM stl_utilitytext GROUP BY xid order by xid;
例如,以下查询将 query_group 设置为零的字符串。查询本身超过 200 个字符,并存储在 STL_UTILITYTEXT 中的几个部分内。
set query_group to '00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000';
在此示例中,查询存储在 STL_UTILITYTEXT 的 text
列的 2 个部分(行)中。
select query, sequence, text from stl_utilitytext where query=pg_last_query_id() order by query desc, sequence limit 10;
starttime | sequence | text ----------------------------+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2019-07-23 22:55:34.926198 | 0 | set query_group to '00000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000 2019-07-23 22:55:34.926198 | 1 | 000000';
要重新构造存储在 STL_UTILITYTEXT 中的 SQL,请运行以下 SQL。
select LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END, '') within group (order by sequence) AS query_statement from stl_utilitytext where query=pg_last_query_id();
要在客户端中使用生成的重新构造的 SQL,需将任何 (\n
) 特殊字符替换为新行。
query_statement ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- set query_group to '00000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000';