问题描述
在SAP的数据库优化中,当尝试收集一个数据表的数据时,遇到如下错误:
SQL> exec dbms_stats.gather_table_stats('SAPSR','QIN'); BEGIN dbms_stats.gather_table_stats('SAPSR3','TRFCQIN'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 13159 ORA-06512: at "SYS.DBMS_STATS", line 13179 ORA-06512: at line 1复制
专家解答
这个提示告诉我们,这个表的统计计息被锁定,不允许更新,这是Oracle 10g的一个新特性,允许我们锁定某些对象的统计信息:
PROCEDURE LOCK_TABLE_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN TABNAME VARCHAR2 IN STATTYPE VARCHAR2 IN DEFAULT PROCEDURE LOCK_PARTITION_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN TABNAME VARCHAR2 IN PARTNAME VARCHAR2 IN PROCEDURE LOCK_SCHEMA_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN STATTYPE VARCHAR2 IN DEFAULT复制
当然可以找到相应的解锁过程:
PROCEDURE UNLOCK_PARTITION_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN TABNAME VARCHAR2 IN PARTNAME VARCHAR2 IN PROCEDURE UNLOCK_SCHEMA_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN STATTYPE VARCHAR2 IN DEFAULT PROCEDURE UNLOCK_TABLE_STATS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- OWNNAME VARCHAR2 IN TABNAME VARCHAR2 IN STATTYPE VARCHAR2 IN DEFAULT复制
这些锁定信息可以通过DBA的字典表查看:
SQL> desc dba_tab_statistics Name Null? Type ----------------------------------------- -------- ---------------------------- OWNER VARCHAR2(30) TABLE_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30) PARTITION_POSITION NUMBER SUBPARTITION_NAME VARCHAR2(30) SUBPARTITION_POSITION NUMBER OBJECT_TYPE VARCHAR2(12) NUM_ROWS NUMBER BLOCKS NUMBER EMPTY_BLOCKS NUMBER AVG_SPACE NUMBER CHAIN_CNT NUMBER AVG_ROW_LEN NUMBER AVG_SPACE_FREELIST_BLOCKS NUMBER NUM_FREELIST_BLOCKS NUMBER AVG_CACHED_BLOCKS NUMBER AVG_CACHE_HIT_RATIO NUMBER SAMPLE_SIZE NUMBER LAST_ANALYZED DATE GLOBAL_STATS VARCHAR2(3) USER_STATS VARCHAR2(3) STATTYPE_LOCKED VARCHAR2(5) STALE_STATS VARCHAR2(3)确认一下SAP锁定了哪些信息:复制
SQL> select owner,table_name,num_rows,blocks,avg_space,last_analyzed,stattype_locked 2 from dba_tab_statistics where STATTYPE_LOCKED is not null and rownum <200; OWNER TABLE_NAME NUM_ROWS BLOCKS AVG_SPACE LAST_ANALYZED STATT --------------- ------------------------------ ---------- ---------- ---------- --------------- ----- SYS AQ_EVENT_TABLE ALL SYS AQ_SRVNTFN_TABLE ALL SYSTEM DEF$_AQCALL ALL SYSTEM DEF$_AQERROR ALL SYS SCHEDULER$_JOBQTAB ALL SYS SCHEDULER$_EVENT_QTAB ALL SYS KUPC$DATAPUMP_QUETAB ALL SYS AQ$_MEM_MC ALL SYS ALERT_QT ALL SYS SYS$SERVICE_METRICS_TAB ALL SAPSR3 DDXTF 3579 151 0 26-JUN-08 ALL SAPSR3 DDXTT 467 244 0 26-JUN-08 ALL SAPSR3 ARFCRSTATE 3390 200 0 26-JUN-08 ALL SAPSR3 ARFCSDATA 419227 120000 0 26-JUN-08 ALL SAPSR3 ARFCSSTATE 331849 30000 0 26-JUN-08 ALL SAPSR3 QREFTID 330878 4000 0 26-JUN-08 ALL SAPSR3 TRBAT 80 20 0 26-JUN-08 ALL SAPSR3 SXMSCLUP 1296545 114389 0 26-JUN-08 ALL SAPSR3 SXMSCLUP2 1296545 114389 0 26-JUN-08 ALL SAPSR3 SXMSCLUR 1296948 180456 0 26-JUN-08 ALL SAPSR3 SXMSCLUR2 1296948 180456 0 26-JUN-08 ALL SAPSR3 SXMSPERRO2 1600 28 0 26-JUN-08 ALL SAPSR3 SXMSPERROR 1600 28 0 26-JUN-08 ALL SAPSR3 SXMSPVERS 1296545 17745 0 26-JUN-08 ALL SAPSR3 SXMSPVERS2 1296545 17745 0 26-JUN-08 ALL SAPSR3 TATAF 2952 103 0 26-JUN-08 ALL SAPSR3 TBTCO 5078 244 0 22-JUN-08 ALL SAPSR3 TRFCQDATA 71165 30000 0 26-JUN-08 ALL SAPSR3 TRFCQIN 20994 1000 0 26-JUN-08 ALL SAPSR3 TRFCQOUT 331796 13000 0 26-JUN-08 ALL SAPSR3 TRFCQSTATE 29575 2000 0 26-JUN-08 ALL SAPSR3 TRBAT2 79 43 0 26-JUN-08 ALL SAPSR3 SXMSPEMAS 435530 11369 0 26-JUN-08 ALL SAPSR3 SXMSPEMAS2 435530 11369 0 26-JUN-08 ALL SAPSR3 SXMSPMAST 435530 20041 0 26-JUN-08 ALL SAPSR3 SXMSPMAST2 435530 20041 0 26-JUN-08 ALL 36 rows selected.复制
可以通过简单的测试了解整个功能:
SQL> select stattype_locked 2 from USER_TAB_STATISTICS where table_name='EYGLE'; STATT ----- SQL> exec dbms_stats.lock_table_stats('EYGLE','EYGLE'); PL/SQL procedure successfully completed. SQL> select stattype_locked from USER_TAB_STATISTICS where table_name='EYGLE'; STATT ----- ALL SQL> exec dbms_stats.gather_table_stats('EYGLE','EYGLE'); BEGIN dbms_stats.gather_table_stats(user,'a'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 13056 ORA-06512: at "SYS.DBMS_STATS", line 13076 ORA-06512: at line 1 SQL> exec dbms_stats.unlock_table_stats('EYGLE','EYGLE'); PL/SQL procedure successfully completed. SQL> exec dbms_stats.gather_table_stats('EYGLE','EYGLE'); PL/SQL procedure successfully completed. SQL> select stattype_locked from USER_TAB_STATISTICS where table_name='EYGLE'; STATT -----复制
而在Oracle10g中,这个锁定可能和imp/impdp时制定rows=n的选项有关:
Symptoms --------- Either of the following two error messages are signaled: 1. ORA-38029: object statistics are locked 2. ORA-20005: object statistics are locked (stattype = ALL) Cause --------- Possible Cause 1: DBMS_STATS.LOCK_[SCHEMA|TABLE]_STATS has been used to lock statistics on the table. Possible Cause 2: Using import (imp) or data pump import (impdp) to import a table without data results in the table's statistics being locked in 10gR2. Possible Cause 3: After an IMPORT is finished for which ROWS=N, the statistics for all tables imported will be locked. Part Number B14233-04 Database Readme 10g Release 2 (10.2) (39.5 Original Export/Import) Possible Cause 4: If the table is a queue table then the statistics are intended to be empty and locked so that dynamic sampling will be used due to the table's volatility. During an upgrade to 10gR2 statistics on queue tables are deleted and then locked. In 10gR2 when a queue table is created statistics are locked while still empty. Solution --------- If the table is a queue table then the statistics should remain empty and locked so that dynamic sampling is used due to the volatility of queue tables. If the table is not a queue table, unlock the statistics using DBMS_STATS.UNLOCK_[SCHEMA|TABLE]_STATS or gather statistics on the table using DBMS_STATS.GATHER_[SCHEMA|TABLE|INDEX]_STATS and the force=>true parameter. To prevent import (imp) from locking the table's statistics when importing a table without therows (rows=n), use statistics=none. To prevent data pump import (impdp) from locking the table's statistics when importing a table without the rows (content=metadata_only), use exclude=(table_statistics,index_statistics).复制
以下是几个网友遇到问题的参考链接:
http://space.itpub.net/9252210/viewspace-607376
http://space.itpub.net/9252210/viewspace-607297
http://yangtingkun.itpub.net/post/468/489433
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle DataGuard高可用性解决方案详解
孙莹
589次阅读
2025-03-26 23:27:33
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
542次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
456次阅读
2025-04-18 14:18:38
Oracle SQL 执行计划分析与优化指南
Digital Observer
442次阅读
2025-04-01 11:08:44
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
439次阅读
2025-04-08 09:12:48
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
437次阅读
2025-04-22 00:20:37
墨天轮个人数说知识点合集
JiekeXu
436次阅读
2025-04-01 15:56:03
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
412次阅读
2025-04-22 00:13:51
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
402次阅读
2025-04-20 10:07:02
Oracle 19c RAC更换IP实战,运维必看!
szrsu
391次阅读
2025-04-08 23:57:08