仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 560|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL编程:ORA-01502 state unusable毛病成因息争...

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:43:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 13:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表