Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

1

主题
1#
发表于 2013-5-16 15:37:22 | 查看: 4852| 回复: 16
Oracle 在没有手动删除统计信息情况下会丢失?
   Oracle version:11.2.0.3
   OS:AIX
   有几张表在分析并固定之后,过几天统计信息就丢失了,请大师帮忙分析下!
2#
发表于 2013-5-16 15:38:30
是否 分区表, 有否ddl

回复 只看该作者 道具 举报

3#
发表于 2013-5-16 18:09:19
刘大,是分区表,有做DDL操作,什么样的DDL操作会导致统计信息丢失呢?

回复 只看该作者 道具 举报

4#
发表于 2013-5-16 22:38:14
split、exchange partition 等 等都会的

回复 只看该作者 道具 举报

5#
发表于 2013-5-16 22:38:19
split、exchange partition 等 等都会的

回复 只看该作者 道具 举报

6#
发表于 2013-5-17 08:45:26
刘大,经过测试,貌似这些(split、exchange partition)都不会引起统计信息丢失。

回复 只看该作者 道具 举报

7#
发表于 2013-5-17 14:30:33
SPLIT不会?


SQL> CREATE TABLE MacleanV
  2   nologging
  3        partition by range(object_id)
  4        (partition p1 values less than (99999) tablespace users,
  5        partition p2 values less than (maxvalue) tablespace users)
  6     as select * from dba_objects where rownum=0;  

Table created.

SQL> insert into macleanV select * from dba_objects;

89127 rows created.

SQL>  commit;

Commit complete.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> select num_rows,blocks from dba_tables where table_name='MACLEANV';

  NUM_ROWS     BLOCKS
---------- ----------
     89127       2014

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME
--------------------------------------------------------------------------------
  NUM_ROWS     BLOCKS
---------- ----------
P1
     89127       2014

P2
         0          0


SQL> exec dbms_stats.lock_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');
BEGIN dbms_stats.gather_table_stats('SYS','MACLEANV'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 32913
ORA-06512: at line 1


SQL> alter table macleanv split partition p1 at (20001) into (partition p1,partition p3);

Table altered.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME
--------------------------------------------------------------------------------
  NUM_ROWS     BLOCKS
---------- ----------
P1


P2
         0          0

P3


回复 只看该作者 道具 举报

8#
发表于 2013-5-17 14:33:55
exchange partition 不会?



SQL> exec dbms_stats.unlock_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.


  1* select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'
SQL> /

PARTITION_NAME         NUM_ROWS     BLOCKS
-------------------- ---------- ----------
P1                        19440        315
P2                            0          0
P3                        69687       1202




SQL> create table macleanv_exchange tablespace users as select * from macleanv where 0=1;

Table created.


SQL> alter table macleanv  exchange partition p1 with table macleanv_exchange;

Table altered.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME         NUM_ROWS     BLOCKS
-------------------- ---------- ----------
P1
P2                            0          0
P3                        69687       1202

回复 只看该作者 道具 举报

9#
发表于 2013-5-17 14:34:00
exchange partition 不会?



SQL> exec dbms_stats.unlock_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.


  1* select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV'
SQL> /

PARTITION_NAME         NUM_ROWS     BLOCKS
-------------------- ---------- ----------
P1                        19440        315
P2                            0          0
P3                        69687       1202




SQL> create table macleanv_exchange tablespace users as select * from macleanv where 0=1;

Table created.


SQL> alter table macleanv  exchange partition p1 with table macleanv_exchange;

Table altered.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME         NUM_ROWS     BLOCKS
-------------------- ---------- ----------
P1
P2                            0          0
P3                        69687       1202

回复 只看该作者 道具 举报

10#
发表于 2013-5-17 14:34:15
Sun 发表于 2013-5-17 08:45
刘大,经过测试,貌似这些(split、exchange partition)都不会引起统计信息丢失。

为什么要轻易下结论呢?

回复 只看该作者 道具 举报

11#
发表于 2013-5-17 15:25:51
可能表达的有点问题,按照你的操作,表上信息依然存在,现环境这些信息也是消失的
split表
SQL> CREATE TABLE MacleanV
  2  nologging
  3       partition by range(object_id)
  4       (partition p1 values less than (99999) tablespace users,
  5       partition p2 values less than (maxvalue) tablespace users)
  6    as select * from dba_objects where rownum=0;  

Table created.

SQL> insert into macleanV select * from dba_objects;

50669 rows created.

SQL> commit;

Commit complete.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> select num_rows,blocks from dba_tables where table_name='MACLEANV';

  NUM_ROWS     BLOCKS
---------- ----------
     50669        748

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME                   NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
P1                                  50669        748
P2                                      0          0

SQL> exec dbms_stats.lock_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> alter table macleanv split partition p1 at (20001) into (partition p1,partition p3);

Table altered.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME                   NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
P1
P2                                      0          0
P3

SQL>  select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME                   NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
P1
P2                                      0          0
P3

SQL>  select num_rows,blocks from dba_tables where table_name='MACLEANV';    --表上信息依然存在,现环境这些信息也是消失的

  NUM_ROWS     BLOCKS
---------- ----------
     50669        748
     

回复 只看该作者 道具 举报

12#
发表于 2013-5-17 15:26:07
exchange 表
SQL> exec dbms_stats.unlock_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats('SYS','MACLEANV');

PL/SQL procedure successfully completed.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME                   NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
P1                                  19554        275
P2                                      0          0
P3                                  31115        452

SQL> create table macleanv_exchange tablespace users as select * from macleanv where 0=1;

Table created.

SQL> alter table macleanv  exchange partition p1 with table macleanv_exchange;

Table altered.

SQL> select partition_name,num_rows,blocks from dba_tab_partitions where table_name='MACLEANV';

PARTITION_NAME                   NUM_ROWS     BLOCKS
------------------------------ ---------- ----------
P1
P2                                      0          0
P3                                  31115        452

SQL> select num_rows,blocks from dba_tables where table_name='MACLEANV';  --表上信息依然存在,现环境这些信息也是消失的

  NUM_ROWS     BLOCKS
---------- ----------
     50669        727

回复 只看该作者 道具 举报

13#
发表于 2013-5-17 15:27:03
现在就是奇怪这类情况是怎么发生的?请刘大解答下~

回复 只看该作者 道具 举报

14#
发表于 2013-5-17 15:30:49
你至少先把做过什么 ddl 拉出来吧?

回复 只看该作者 道具 举报

15#
发表于 2013-5-17 15:40:58
主要是现在找不到当时做了什么操作,因为是隔几天就丢失几个分区表的统计信息,我查了procedure相关此表等信息,都找不出来。

回复 只看该作者 道具 举报

16#
发表于 2013-5-17 15:45:05
logminer +  ash  95%概率可以查出来

回复 只看该作者 道具 举报

17#
发表于 2013-5-17 15:48:54
嗯 ,因为之前差一点出故障,已布了程序自动去收集了,我想想办法找出来吧,奇怪的是dbms_tab_stats_history里面也是空的,所以因为不是人为删除的

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-28 11:55 , Processed in 0.049870 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569