仓酷云

标题: MYSQL编程:ORA-01502 state unusable毛病成因息争... [打印本页]

作者: 莫相离    时间: 2015-1-16 22:43
标题: MYSQL编程:ORA-01502 state unusable毛病成因息争...
与其他数据库相比,MySQL易学易用。毛病|办理
接到开辟职员和营业职员的关照,说一个上岸页面不克不及用了,报错:

2005-01-3113:59:02,721[com.aspire.common.dao.OamUserDAO]--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
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者: 第二个灵魂    时间: 2015-1-26 20:14
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
作者: 简单生活    时间: 2015-2-4 20:28
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
作者: 因胸联盟    时间: 2015-2-4 20:30
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
作者: 不帅    时间: 2015-2-10 07:11
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
作者: 飘灵儿    时间: 2015-3-1 01:35
分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。
作者: admin    时间: 2015-3-10 11:40
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
作者: 飘飘悠悠    时间: 2015-3-17 06:35
比如日志传送、比如集群。。。
作者: 小女巫    时间: 2015-3-24 00:10
原来公司用过MYSQL自己也只是建个表写个SQL




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2