【问题标题】:Oracle - sql_text truncated to 20 characters for CREATE/ALTER/GRANT statements?Oracle - CREATE/ALTER/GRANT 语句的 sql_text 被截断为 20 个字符?
【发布时间】:2015-02-21 18:56:42
【问题描述】:

我似乎遇到了一个奇怪的问题,即 Oracle 没有为查询存储/返回完整的 SQL 文本。当我注意到所有CREATE TABLE ____ AS 查询的sql_text 值都被截断为20 个字符时,我正在通过将v$session 连接到v$sqltext 来监控当前活动的查询。

例如:

SQL> SELECT sql_text, LENGTH(sql_text), sql_fulltext, LENGTH(sql_fulltext) FROM v$sql WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT) SQL_FULLTEXT                        LENGTH(SQL_FULLTEXT)
----------------------------------- ---------------- ----------------------------------- --------------------
create table schema.                              20 create table schema.                                  20

1 row selected.


SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema.                              20

1 row selected.

SQL> SELECT sql_text, LENGTH(sql_text) FROM v$sqltext_with_newlines WHERE sql_id = 'sql_id_here';

SQL_TEXT                            LENGTH(SQL_TEXT)
----------------------------------- ----------------
create table schema.                              20

1 row selected.

我认为这可能是一个孤立的事件,所以我检查了 所有 CREATE TABLE v$sqltext 中的条目:

SELECT sql_id, COUNT(*) AS entries, SUM(LENGTH(sql_text)) AS query_len
FROM v$sqltext
WHERE sql_id IN (
    SELECT sql_id
    FROM v$sqltext
    WHERE piece = 0
      AND UPPER(sql_text) LIKE 'CREATE TABLE%'
)
GROUP BY sql_id
ORDER BY 1, 2, 3

在超过 250 多个 sql_id 条目中,所有条目都有 entries = 1query_len = 20

但是,如果我在查询完成后检查dba_audit_trail(假设我事先知道正在创建什么表),那么完整的 sql_text 就会出现在那里。

发生了什么事,我该如何解决这个问题,所以v$sqltext 包含CREATE TABLE ___ AS 语句的完整查询?


编辑:经过仔细检查,似乎所有GRANTCREATEALTER 查询在v$sqltext 中都被截断为20 个字符。所有其他查询都包含其全文。我正在开放赏金,希望能查明真相。

【问题讨论】:

  • 您是否尝试过执行类似select sql_text from v$sqltext where sql_id = '...' 的操作来查看,该视图究竟包含哪些sql_id 的内容?只是为了排除以前查询中的所有可能错误。如果这个视图真的只包含查询的一部分,我想这是一个错误。
  • @Dmitry - 我做到了。我检查了来自v$sqltextsql_textsql_fulltext 以及来自v$sqltext_with_newlinessql_text。这似乎只是 CTAS 查询的问题,其他一切似乎都很好。
  • @Mr.Llama 我很确定这是一个孤立的问题。我跑了select a.*,length(a.sql_text) From v$sqltext a where upper(sql_text) like '%CREATE TABLE%';,得到的长度最多为 64 个字符。与ALTERGRANT 相同。我在 11gR2 上。
  • 我想知道是否有一些安全限制导致了这种情况。我不想看到alter user me identified by "myNewPassword"; 之类的声明出现在V$SQL 中。
  • 对照 12.1.0.2 检查,长度也达到 64 个字符。

标签: oracle oracle11g


【解决方案1】:

这看起来像是 11.2.0.4 的一个已知问题。如果您有权访问 My Oracle Support,请查看错误 19634213;和错误 18431964、20308798 和可能的 18245071(不公开)。我显然无法详细说明或复制他们所说的话。根据 nop77svk 的评论,它可能已在 12c 中修复,但也可能是特定于平台的。

如果这导致了问题,您需要向 Oracle 提出服务请求,以验证您是否遇到了同样的问题并确定是否有可用的补丁。

【讨论】:

  • 你一针见血。错误 19634213 正是我们正在处理的问题。到目前为止,除了升级到 Oracle 12(这不是我们的选择)之外,似乎没有其他解决方法。希望他们能在不久的将来推出解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2017-09-05
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多