莫相离 发表于 2015-1-16 22:43:46

MYSQL编程:ORA-01502 state unusable毛病成因息争...

与其他数据库相比,MySQL易学易用。毛病|办理
接到开辟职员和营业职员的关照,说一个上岸页面不克不及用了,报错:

2005-01-3113:59:02,721--214:select毛病
java.sql.SQLException:ORA-01502state

这个毛病是因为索引生效酿成的,重修索引后,成绩就办理了。

为了弄分明索引为何会生效,和怎样办理,我们做个测试:

起首我们创立一个一般的测试表(非分区表):
SQL>createtablet(anumber);

Tablecreated.

SQL>selecttablespace_namefromuser_segmentswheresegment_name=T;

TABLESPACE_NAME
------------------------------
DATA_DYNAMIC

SQL>

然后,我们创立一个一般索引

SQL>createindexidxtont(a);

Indexcreated.

SQL>insertintotvalues(10);

1rowcreated.

SQL>setlinesize200
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;

INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEVALID

SQL>

摹拟索引是生效的情形:
SQL>altertabletmovetablespacetools
2/

Tablealtered.

SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;

INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE

SQL>
我们看到,当利用相似altertablexxxxxxmovetablespacexxxxxxx命令后,索引就会生效。

固然,作为测试,也能够间接利用alterindexidxtunusable;命令使索引生效,比方:
SQL>alterindexidxtunusable;

Indexaltered.

SQL>

在这类情形下,我们向表中拔出数据看看是甚么情形:
SQL>insertintotvalues(11);
insertintotvalues(11)
*
ERRORatline1:
ORA-01502:indexMISC.IDXTorpartitionofsuchindexisinunusablestate


SQL>
我们看到,这时候就呈现了罕见的“ORA-01502:indexXXXXXXXXorpartitionofsuchindexisinunusablestate”毛病。

反省一下索引形态,我们会注重到索引已是“UNUSABLE”了。
SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;

INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE

SQL>

关于一般表中的分歧索引(非独一索引),我们有两种办法办理这个成绩。
办法一:设置skip_unusable_indexes=true;
SQL>altersessionsetskip_unusable_indexes=true;

Sessionaltered.

SQL>insertintotvalues(11);

1rowcreated.

SQL>commit;

Commitcomplete.

SQL>select*fromt;

A
----------
1
2
3
4
5
10
11

7rowsselected.

SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;

INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEUNUSABLE

SQL>
如今我们看到,这个索引的形态固然仍是“UNUSABLE”可是,经由过程设置“altersessionsetskip_unusable_indexes=true;”,
我们已能够会见这个表了,可是请注重,这类情形下,这个索引是不成用的,也就是说优化器在思索是不是要利用索引时是不思索这个以是的。

办法2:经由过程罕见以是完全办理这个成绩
起首,先设置“skip_unusable_indexes=false”,也就是不跳不对效索引
SQL>altersessionsetskip_unusable_indexes=false;

Sessionaltered.

SQL>

然后重修这个生效的索引
SQL>alterindexidxtrebuild;

Indexaltered.

SQL>selectindex_name,index_type,tablespace_name,table_type,statusfromuser_indexeswhereindex_name=IDXT;

INDEX_NAMEINDEX_TYPETABLESPACE_NAMETABLE_TYPESTATUS
----------------------------------------------------------------------------------------------------------
IDXTNORMALDATA_DYNAMICTABLEVALID

SQL>
我们看到重修索引后,索引的形态就一般了。

如今拔出数据,看看是一般:
SQL>insertintotvalues(12);

1rowcreated.

SQL>commit;

Commitcomplete.

SQL>
看来,重修索引才是办理这类成绩的完全的办法。








人力成本上的节省,MySQL的用户Spacemonkey实验室的首席执行官MitchPirtle如此表示:“维护MySQL使得你不需要一个年薪15万美元的DBA。

山那边是海 发表于 2015-1-19 21:47:47

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

第二个灵魂 发表于 2015-1-26 20:14:46

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

简单生活 发表于 2015-2-4 20:28:09

个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。

因胸联盟 发表于 2015-2-4 20:30:28

但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。

不帅 发表于 2015-2-10 07:11:59

不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?

飘灵儿 发表于 2015-3-1 01:35:34

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

admin 发表于 2015-3-10 11:40:38

再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。

飘飘悠悠 发表于 2015-3-17 06:35:30

比如日志传送、比如集群。。。

小女巫 发表于 2015-3-24 00:10:18

原来公司用过MYSQL自己也只是建个表写个SQL
页: [1]
查看完整版本: MYSQL编程:ORA-01502 state unusable毛病成因息争...