﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-BaoYaEr-文章分类-数据库DateBase</title><link>http://www.blogjava.net/baoyaer/category/17559.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Sat, 16 Jan 2010 10:00:42 GMT</lastBuildDate><pubDate>Sat, 16 Jan 2010 10:00:42 GMT</pubDate><ttl>60</ttl><item><title>数据库导出表，导入表  利器</title><link>http://www.blogjava.net/baoyaer/articles/309363.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 13 Jan 2010 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/309363.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/309363.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/309363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/309363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/309363.html</trackback:ping><description><![CDATA[导出表利器：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #ff00ff">exp</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">user</span><span style="color: #808080">/</span><span style="color: #000000">password</span><span style="color: #008000">@servername</span><span style="color: #000000">&nbsp;indexes</span><span style="color: #808080">=</span><span style="color: #000000">n&nbsp;grants</span><span style="color: #808080">=</span><span style="color: #000000">n&nbsp;buffer</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">500000000</span><span style="color: #000000">&nbsp;direct</span><span style="color: #808080">=</span><span style="color: #000000">y<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">file</span><span style="color: #808080">=</span><span style="color: #000000">vresolve.dmp&nbsp;tables</span><span style="color: #808080">=</span><span style="color: #000000">(wepp_domain_resolve_table);</span></div>
<br />
<br />
<br />
导入表利器：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">imp&nbsp;</span><span style="color: #ff00ff">user</span><span style="color: #808080">/</span><span style="color: #000000">password</span><span style="color: #008000">@servername</span><span style="color: #000000">&nbsp;ignore</span><span style="color: #808080">=</span><span style="color: #000000">y&nbsp;buffer</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">500000000</span><span style="color: #000000">&nbsp;fromuser</span><span style="color: #808080">=</span><span style="color: #000000">epp_formigrate<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">file</span><span style="color: #808080">=</span><span style="color: #000000">vresolve.dmp&nbsp;tables</span><span style="color: #808080">=</span><span style="color: #000000">(wepp_domain_resolve_table)</span></div>
<br />
<br />
<br />
将结果写入新表利器
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;domain_filter_table&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;v.DOMAIN_NAME&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;epp_domain_unresolve&nbsp;t,epp_ent_all_idxlog_view&nbsp;v&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;t.associate_serial</span><span style="color: #808080">=</span><span style="color: #000000">v.ASSOCIATE_ENT_SERIAL</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/309363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2010-01-13 21:54 <a href="http://www.blogjava.net/baoyaer/articles/309363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 表解锁</title><link>http://www.blogjava.net/baoyaer/articles/307654.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 29 Dec 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/307654.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/307654.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/307654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/307654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/307654.html</trackback:ping><description><![CDATA[1.关联查询<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">OBJECT_ID</span><span style="color: #000000">,SESSION_ID,SERIAL#,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ORACLE_USERNAME,OS_USER_NAME,S.PROCESS&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;V$LOCKED_OBJECT&nbsp;A,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />V$SESSION&nbsp;S&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;A.SESSION_ID</span><span style="color: #808080">=</span><span style="color: #000000">S.SID</span></div>
<br />
2.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;system&nbsp;</span><span style="color: #0000ff">kill</span><span style="color: #000000">&nbsp;session&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">sid,serial#</span><span style="color: #ff0000">'</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/307654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-12-29 16:52 <a href="http://www.blogjava.net/baoyaer/articles/307654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle奇怪的查询问题</title><link>http://www.blogjava.net/baoyaer/articles/290889.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 12 Aug 2009 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/290889.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/290889.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/290889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/290889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/290889.html</trackback:ping><description><![CDATA[<p>今天在使用oracle过程中遇到一个奇怪的问题<br />
相同的查询语句,一种采用绑定参数方式查询，一种采用写死的sql语句执行，执行结果不一致<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;t.</span><span style="color: #808080">*</span><span style="color: #000000">,&nbsp;c.CP_NAME&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;CP_NAME<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;row_.</span><span style="color: #808080">*</span><span style="color: #000000">,&nbsp;rownum&nbsp;rownum_<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;sp_biz_code_order&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;order_id)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;</span><span style="color: #0000ff">with</span><span style="color: #000000">&nbsp;PARENT_ID&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000; font-weight: bold">0</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connect&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;PRIOR&nbsp;ORDER_ID&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;PARENT_ID)&nbsp;row_<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum&nbsp;</span><span style="color: #808080">&lt;=</span><span style="color: #000000">&nbsp;:</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;rownum_&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">:</span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">)&nbsp;t,<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp_biz_contentprovider&nbsp;c<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;t.CPID&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;c.CP_ID(</span><span style="color: #808080">+</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;rownum_</span></div>
<br />
当将：1 和：2处的参数写死后（80：100）执行得到的结果和绑定参数下查询的结果完全不一致<br />
查看执行计划发现两者的执行计划有很多不一样的地方<br />
<br />
问题解决方式较为简单<br />
将ibatis的内联参数改为外联参数即可，问题的根源待咨询oracle后再做解答
<img src ="http://www.blogjava.net/baoyaer/aggbug/290889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-08-12 20:32 <a href="http://www.blogjava.net/baoyaer/articles/290889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看执行过的sql  oracle</title><link>http://www.blogjava.net/baoyaer/articles/290878.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 12 Aug 2009 11:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/290878.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/290878.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/290878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/290878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/290878.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;osuser,&nbsp;username,&nbsp;sql_text&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;v$session&nbsp;a,&nbsp;v$sqlarea&nbsp;b&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;a.sql_address&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">b.address&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;address</span></div>
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;address,piece,sql_text&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;v$session,v$sqltext&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;address</span><span style="color: #808080">=</span><span style="color: #000000">sql_address&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;machine</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">machinename</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">order</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;address,piece;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/290878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-08-12 19:07 <a href="http://www.blogjava.net/baoyaer/articles/290878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle字符集理解：</title><link>http://www.blogjava.net/baoyaer/articles/237364.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 29 Oct 2008 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/237364.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/237364.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/237364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/237364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/237364.html</trackback:ping><description><![CDATA[<h2>oracle字符集理解<span class="category"> - [<a href="http://kimva.blogbus.com/c1466697/">Oracle</a>]</span></h2>
<div class="postBody">
<p class="cc-lisence" style="line-height: 180%"><a href="http://creativecommons.org/licenses/by/3.0/deed.zh" target="_blank">版权声明</a>：转载时请以超链接形式标明文章原始出处和作者信息及<a href="http://bangzhuzhongxin.blogbus.com/logs/11205960.html" target="_blank">本声明</a><br />
<a href="http://kimva.blogbus.com/logs/8219967.html">http://kimva.blogbus.com/logs/8219967.html</a><br />
<br />
</p>
<div align="left">
<div>
<div>oracle字符集理解： </div>
<div>一．引言
<p>&nbsp;&nbsp;&nbsp; ORACLE数据库字符集，即Oracle全球化支持(Globalization Support)，或即国家语言支持（NLS）其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持，ORACLE为用户提供自己熟悉的数据库母语环境，诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集，其中oracle8i支持48种语言、76个国家地域、229种字符集，而oracle9i则支持57种语言、88个国家地域、235种字符集。由于oracle字符集种类多，且在存储、检索、迁移oracle数据时多个环节与字符集的设置密切相关，因此在实际的应用中，数据库开发和管理人员经常会遇到有关oracle字符集方面的问题。本文通过以下几个方面阐述，对oracle字符集做简要分析 </p>
<p>二．字符集基本知识 </p>
<p>2.1字符集<br />
&nbsp;&nbsp;&nbsp; 实质就是按照一定的字符编码方案，对一组特定的符号，分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。<br />
&nbsp;&nbsp;&nbsp; Oracle的字符集命名遵循以下命名规则:<br />
&nbsp;&nbsp;&nbsp; &lt;Language&gt;&lt;bit size&gt;&lt;encoding&gt;<br />
&nbsp;&nbsp;&nbsp; 即:&nbsp; &lt;语言&gt;&lt;比特位数&gt;&lt;编码&gt;<br />
&nbsp;&nbsp;&nbsp; 比如: ZHS16GBK表示采用GBK编码格式、16位（两个字节）简体中文字符集 </p>
<p>2.2字符编码方案<br />
2.2.1 单字节编码<br />
&nbsp;&nbsp;&nbsp; （1）单字节7位字符集，可以定义128个字符，最常用的字符集为US7ASCII<br />
&nbsp;&nbsp;&nbsp; （2）单字节8位字符集，可以定义256个字符，适合于欧洲大部分国家<br />
&nbsp;&nbsp;&nbsp; 例如：WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)<br />
2.2.2 多字节编码<br />
&nbsp;&nbsp;&nbsp; （1）变长多字节编码<br />
&nbsp;&nbsp;&nbsp;&nbsp;某些字符用一个字节表示，其它字符用两个或多个字符表示，变长多字节编码常用于对亚洲语言的支持，&nbsp;&nbsp; 例如日语、汉语、印地语等<br />
&nbsp;&nbsp;&nbsp; 例如：AL32UTF8（其中AL代表ALL,指适用于所有语言）、zhs16cgb231280<br />
&nbsp;&nbsp;&nbsp; （2）定长多字节编码<br />
&nbsp;&nbsp;&nbsp; 每一个字符都使用固定长度字节的编码方案，目前oracle唯一支持的定长多字节编码是AF16UTF16，也是仅用于国家字符集<br />
2.2.3 unicode编码<br />
&nbsp;&nbsp;&nbsp; Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案，也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式，是一种定长多字节编码，用2个字节表示一个unicode字符，AF16UTF16是UTF-16编码字符集。<br />
&nbsp;&nbsp;&nbsp; UTF-8是unicode的8位编码方式，是一种变长多字节编码，这种编码可以用1、2、3个字节表示一个unicode字符，AL32UTF8，UTF8、UTFE是UTF-8编码字符集 </p>
<p>2.3 字符集超级<br />
&nbsp;&nbsp;&nbsp; 当一种字符集（字符集A）的编码数值包含所有另一种字符集（字符集B）的编码数值，并且两种字符集相同编码数值代表相同的字符时，则字符集A是字符集B的超级，或称字符集B是字符集A的子集。<br />
&nbsp;&nbsp;&nbsp; Oracle8i和oracle9i官方文档资料中备有子集-超级对照表（subset-superset pairs），例如：WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式，因此有许多字符集是US7ASCII的超集，例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。 </p>
<p>2.4 数据库字符集（oracle服务器端字符集）<br />
&nbsp;&nbsp;&nbsp; 数据库字符集在创建数据库时指定，在创建后通常不能更改。在创建数据库时，可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。<br />
2.4.1字符集<br />
&nbsp;&nbsp;&nbsp; (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)用来标示诸如表名、列名以及PL/SQL变量等<br />
&nbsp;&nbsp;&nbsp; (3)用来存储SQL和PL/SQL程序单元等<br />
2.4.2国家字符集：<br />
&nbsp;&nbsp;&nbsp; (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据<br />
&nbsp;&nbsp;&nbsp; (2)国家字符集实质上是为oracle选择的附加字符集，主要作用是为了增强oracle的字符处理能力，因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持，而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义，只能在unicode编码中的AF16UTF16和UTF8中选择，默认值是AF16UTF16<br />
2.4.3查询字符集参数<br />
&nbsp;&nbsp;&nbsp; 可以查询以下数据字典或视图查看字符集设置情况<br />
&nbsp;&nbsp;&nbsp; nls_database_parameters、props$、v$nls_parameters<br />
&nbsp;&nbsp;&nbsp; 查询结果中NLS_CHARACTERSET表示字符集，NLS_NCHAR_CHARACTERSET表示国家字符集<br />
2.4.4修改数据库字符集<br />
&nbsp;&nbsp;&nbsp; 按照上文所说，数据库字符集在创建后原则上不能更改。如果需要修改字符集，通常需要导出数据库数据，重建数据库，再导入数据库数据的方式来转换，或通过ALTER DATABASE CHARACTER SET语句修改字符集，但创建数据库后修改字符集是有限制的，只有新的字符集是当前字符集的超集时才能修改数据库字符集，例如UTF8是US7ASCII的超集，修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。正确的修改方法如下:<br />
　　$sqlplus /nolog<br />
　　SQL&gt;conn / as sysdba;<br />
　　若此时数据库服务器已启动，则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器，然后执行以下命令:<br />
　　SQL&gt;STARTUP MOUNT;<br />
　　SQL&gt;ALTER SYSTEM ENABLE RESTRICTED SESSION;<br />
　　SQL&gt;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;<br />
　　SQL&gt;ALTER SYSTEM SET AQ_TM_PROCESSES=0;<br />
　　SQL&gt;ALTER DATABASE OPEN;<br />
　　SQL&gt;ALTER DATABASE CHARACTER SET ZHS16GBK;<br />
　　SQL&gt;ALTER DATABASE national CHARACTER SET ZHS16GBK;<br />
　　SQL&gt;SHUTDOWN IMMEDIATE;<br />
　　SQL&gt;STARTUP </p>
<p>2.5 客户端字符集（NLS_LANG参数）<br />
2.5.1客户端字符集含义<br />
&nbsp;&nbsp;&nbsp; 客户端字符集定义了客户端字符数据的编码方式，任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用，例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。<br />
2.5.2 NLS_LANG参数格式<br />
&nbsp;&nbsp;&nbsp; NLS_LANG=&lt;language&gt;_&lt;territory&gt;.&lt;client character set&gt; <br />
&nbsp;&nbsp;&nbsp; Language:显示oracle消息,校验，日期命名<br />
&nbsp;&nbsp;&nbsp; Territory：指定默认日期、数字、货币等格式<br />
&nbsp;&nbsp;&nbsp; Client character set：指定客户端将使用的字符集<br />
&nbsp;&nbsp;&nbsp; 例如：NLS_LANG=AMERICAN_AMERICA.US7ASCII&nbsp; <br />
&nbsp;&nbsp;&nbsp; AMERICAN是语言，AMERICA是地区，US7ASCII是客户端字符集<br />
2.5.3客户端字符集设置方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1)UNIX环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $NLS_LANG=&#8220;simplified chinese&#8221;_china.zhs16gbk<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $export NLS_LANG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑oracle用户的profile文件<br />
&nbsp;&nbsp;&nbsp; 2)Windows环境<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编辑注册表<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0<br />
2.5.4 NLS参数查询<br />
&nbsp;&nbsp;&nbsp; Oracle提供若干NLS参数定制数据库和用户机以适应本地格式，例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等，可以通过查询以下数据字典或v$视图查看。<br />
&nbsp;&nbsp;&nbsp; NLS_DATABASE_PARAMETERS--显示数据库当前NLS参数取值，包括数据库字符集取值<br />
&nbsp;&nbsp;&nbsp; NLS_SESSION_PARAMETERS--显示由NLS_LANG 设置的参数，或经过alter session 改变后的参数值（不包括由NLS_LANG 设置的客户端字符集）<br />
&nbsp;&nbsp;&nbsp; NLS_INSTANCE_PARAMETE--显示由参数文件init&lt;SID&gt;.ora 定义的参数V$NLS_PARAMETERS--显示数据库当前NLS参数取值<br />
2.5.5修改NLS参数<br />
&nbsp;&nbsp;&nbsp; 使用下列方法可以修改NLS参数<br />
&nbsp;&nbsp;&nbsp; （1）修改实例启动时使用的初始化参数文件<br />
&nbsp;&nbsp;&nbsp; （2）修改环境变量NLS_LANG<br />
&nbsp;&nbsp;&nbsp; （3）使用ALTER SESSION语句，在oracle会话中修改<br />
&nbsp;&nbsp;&nbsp; （4）使用某些SQL函数<br />
&nbsp;&nbsp;&nbsp; NLS作用优先级别：Sql function&gt;alter session&gt;环境变量或注册表&gt;参数文件&gt;数据库默认参数 </p>
<p>三．导入/导出与字符集转换 </p>
<p>3.1 EXP/IMP<br />
&nbsp;&nbsp;&nbsp; Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中，由于使用exp/imp进行数据迁移时，数据从源数据库到目标数据库的过程中有四个环节涉及到字符集，如果这四个环节的字符集不一致，将会发生字符集转换。 </p>
<p>EXP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p align="center"><img alt="" src="http://www.csdb.cn/upload/112.bmp" border="0" /> </p>
<p>IMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p align="center"><img alt="" src="http://www.csdb.cn/upload/113.bmp" border="0" /> </p>
<p>&nbsp;&nbsp;&nbsp; 四个字符集是<br />
&nbsp;&nbsp; （1）源数据库字符集 <br />
&nbsp;&nbsp; （2）Export过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （3）Import过程中用户会话字符集（通过NLS_LANG设定）<br />
&nbsp;&nbsp; （4）目标数据库字符集 </p>
<p>3.2导出的转换过程<br />
&nbsp;&nbsp;&nbsp; 在Export过程中，如果源数据库字符集与Export用户会话字符集不一致，会发生字符集转换，并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。<br />
例:如果源数据库使用ZHS16GBK，而Export用户会话字符集使用US7ASCII，由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集，这个转换过程中，中文字符在US7ASCII中不能够找到对等的字符，所以所有中文字符都会丢失而变成&#8220;?? &#8221;形式，这样转换后生成的Dmp文件已经发生了数据丢失。<br />
因此如果想正确导出源数据库数据，则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集<br />
3.2.1 修改dmp文件字符集<br />
　　上文说过，dmp文件的第2第3字节记录了字符集信息，因此直接修改dmp文件的第2第3字节的内容就可以&#8216;骗&#8217;过oracle的检查。这样做理论上也仅是从子集到超集可以修改，但很多情况下在没有子集和超集关系的情况下也可以修改，我们常用的一些字符集，如US7ASCII，WE8ISO8859P1，ZHS16CGB231280，ZHS16GBK基本都可以改。因为改的只是dmp文件，所以影响不大。<br />
　　具体的修改方法比较多，最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK，可以用以下SQL查出该种字符集对应的16进制代码:<br />
　　SQL&gt; select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;<br />
　　0354<br />
　　然后将dmp文件的2、3字节修改为0354即可。<br />
　　如果dmp文件很大，用ue无法打开，就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好，缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研究一下程序代码 </p>
<p>3.3导入的转换过程<br />
&nbsp;&nbsp;&nbsp; （1）确定导出数据库字符集环境<br />
&nbsp;&nbsp;&nbsp; 通过读取导出文件头，可以获得导出文件的字符集设置<br />
&nbsp;&nbsp;&nbsp; （2）确定导入session的字符集，即导入Session使用的NLS_LANG环境变量<br />
&nbsp;&nbsp;&nbsp; （3）IMP读取导出文件<br />
&nbsp;&nbsp;&nbsp; 读取导出文件字符集ID，和导入进程的NLS_LANG进行比较<br />
&nbsp;&nbsp;&nbsp; （4）如果导出文件字符集和导入Session字符集相同，那么在这一步骤内就不需要转换，如果不同，就需要把数据转换为导入Session使用的字符集。可以看出，导入数据到数据库过程中发生两次字符集转换<br />
&nbsp;&nbsp;&nbsp; 第一次:导入文件字符集与导入Session使用的字符集之间的转换，如果这个转换过程不能正确完成，Import向目标数据库的导入过程也就不能完成。<br />
&nbsp;&nbsp;&nbsp; 第二次:导入Session字符集与数据库字符集之间的转换。<br />
&nbsp;&nbsp;&nbsp; 然而,oracle8i的这种转换只能在单字节字符集之间进行,oracle8i导入Session不支持多字节字符集之间的转换，因此为了避免第一次转换，导入Session使用的NLS_LANG与导出文件字符集相同，第二次转换（通过SQL*Net）支持任何两种字符集。以上情况在Oracle9i中略有不同 </p>
<p>四．乱码问题 </p>
<p>&nbsp;&nbsp;&nbsp; oracle在数据存储、迁移过程中经常发生字符乱码问题，归根到底是由于字符集使用不当引起。下面以使用客户端sqlplus向数据库插入数据和导入/导出（EXP/IMP）过程为例，说明乱码产生的原因。 </p>
<p>4.1使用客户端sqlplus向数据库存储数据<br />
&nbsp;&nbsp;&nbsp; 这个过程存在3个字符集设置<br />
&nbsp;&nbsp;&nbsp; （1）客户端应用字符集<br />
&nbsp;&nbsp;&nbsp; （2）客户端NLS_LANG参数设置<br />
&nbsp;&nbsp;&nbsp; （3）服务器端数据库字符集(Character Set)设置<br />
&nbsp;&nbsp;&nbsp; 客户端应用sqlplus中能够显示什么样的字符取决于客户端操作系统语言环境(客户端应用字符集)，但在应用中录入这些字符后，这些字符能否在数据库中正常存储，还与另外两个字符集设置紧密相关，其中客户端NLS_LANG参数主要用于字符数据传输过程中的转换判断。常见的乱码大致有两种情形：<br />
&nbsp;&nbsp;&nbsp; （1）汉字变成问号&#8220;？&#8221;；<br />
当从字符集A 转换成字符集B时，如果转换字符之间不存在对应关系，NLS_LANG使用替代字符&#8220;？&#8221;替代无法映射的字符<br />
&nbsp;&nbsp;&nbsp; （2）汉字变成未知字符（虽然有些是汉字，但与原字符含义不同）<br />
转换存在对应关系，但字符集A 中的字符编码与字符集B 中的字符编码代表不同含义 </p>
<p>4.2发生乱码原因&nbsp;<br />
&nbsp;&nbsp; &nbsp;乱码产生是由于几个字符集之间转换不匹配造成，分以下几种情况：<br />
&nbsp;&nbsp;&nbsp; （注：字符集之间如果不存在子集、超集对应关系时的情况不予考虑，因为这种情况下字符集之间转换必产生乱码）&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 1）服务器端数据库字符集与客户端应用字符集相同，与客户端NLS_LANG参数设置不同<br />
&nbsp;&nbsp;&nbsp; 如果客户端NLS_LANG字符集是其它两种字符集的子集，转换过程将出现乱码。<br />
&nbsp;&nbsp;&nbsp; 解决方法：将三种字符集设置成同一字符集，或NLS_LANG字符集是其它两种字符集的超集<br />
&nbsp;&nbsp;&nbsp; 2）服务器端数据库字符集与客户端NLS_LANG参数设置相同，与客户端应用字符集不同<br />
&nbsp;&nbsp;&nbsp; 如果客户端应用字符集是其它两种字符集的超集时，转换过程将出现乱码，但对于单字节编码存储中文问题，可参看本文第5章节的分析<br />
&nbsp;&nbsp;&nbsp; 3）客户端应用字符集、客户端NLS_LANG参数设置、服务器端数据库字符集互不相同<br />
&nbsp;&nbsp; &nbsp;此种情况较为复杂，但三种字符集之间只要有不能转换的字符，则必产生乱码 </p>
<p>4.3导入/导出过程出现乱码原因<br />
&nbsp;&nbsp;&nbsp; 这个过程存在4个字符集设置，在3.1章节中已分析<br />
&nbsp;&nbsp; （1）源数据库字符集<br />
&nbsp;&nbsp; （2）EXP过程中NLS_LANG参数 <br />
&nbsp;&nbsp; （3）IMP过程中NLS_LANG参数<br />
&nbsp;&nbsp; （4）目标数据库字符集<br />
&nbsp;&nbsp;&nbsp; 出现乱码原因<br />
&nbsp;&nbsp;&nbsp; 1）当源数据库字符集不等于EXP过程中NLS_LANG参数，且源数据库字符集是EXP过程中NLS_LANG的子集，才能保证导出文件正确，其他情况则导出文件字符乱码<br />
&nbsp;&nbsp;&nbsp; 2）EXP过程中NLS_LANG字符集不等于IMP过程中NLS_LANG字符集，且EXP过程中NLS_LANG字符集是IMP过程中NLS_LANG字符集的子级, 才能保证第一次转换正常，否则第一次转换中出现乱码。<br />
&nbsp;&nbsp;&nbsp; 3）如果第一次转换正常，IMP过程中NLS_LANG字符集是目标数据库字符集的子集或相同，才能保证第二次转换正常，否则则第二次转换中出现乱码 </p>
<p>五．单字节编码存储中文问题 </p>
<p>&nbsp;&nbsp;&nbsp; 由于历史的原因，早期的oracle没有中文字符集（如oracle6、oracle7、oracle7.1）,但有的用户从那时起就使用数据库了，并用US7ASCII字符集存储了中文，或是有的用户在创建数据库时，不考虑清楚，随意选择一个默认的字符集，如WE8ISO8859P1或US7ASCII，而这两个字符集都没有汉字编码，虽然有些时候选用这种字符集好象也能正常使用，但用这种字符集存储汉字信息从原则上说就是错误的，它会给数据库的使用与维护带来一系列的麻烦。<br />
&nbsp;&nbsp;&nbsp; 正常情况下，要将汉字存入数据库，数据库字符集必须支持中文，而将数据库字符集设置为US7ASCII等单字节字符集是不合适的。US7ASCII字符集只定义了128个符号，并不支持汉字。另外，如果在SQL*PLUS中能够输入中文，操作系统缺省应该是支持中文的，但如果在NLS_LANG中的字符集设置为US7ASCII，显然也是不正确的，它没有反映客户端的实际情况。但在实际应用中汉字显示却是正确的，这主要是因为Oracle检查数据库与客户端的字符集设置是同样的，那么数据在客户与数据库之间的存取过程中将不发生任何转换，但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的。而在SELECT的过程中，Oracle同样检查发现数据库与客户端的字符集设置是相同的，所以它也将存入的内容原封不动地传送到客户端，而客户端操作系统识别出这是汉字编码所以能够正确显示。<br />
&nbsp;&nbsp;&nbsp; 在这个例子中，数据库与客户端都没有设置成中文字符集，但却能正常显示中文，从应用的角度看好象没问题。然而这里面却存在着极大的隐患，比如在应用length或substr等字符串函数时，就可能得到意外的结果。<br />
&nbsp;&nbsp;&nbsp; 对于早期使用US7ASCII字符集数据库的数据迁移到oracle8i/9i中（使用zhs16gbk），由于原始数据已经按照US7ASCII格式存储，对于这种情况，可以通过使用Oracle8i的导出工具，设置导出字符集为US7ASCII，导出后使用UltraEdit等工具打开dmp文件，修改第二、三字符，修改 0001 为0354,这样就可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中。 </p>
<p>六．结束语 </p>
<p>&nbsp;&nbsp;&nbsp; 为了避免在数据库迁移过程中由于字符集不同导致的数据损失，oracle提供了字符集扫描工具（character set scanner），通过这个工具我们可以测试在数据迁移过程中由于字符集转换可能带来的问题，然后根据测试结果，确定数据迁移过程中最佳字符集解决方案。 </p>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/237364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-10-29 13:25 <a href="http://www.blogjava.net/baoyaer/articles/237364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle JOB 的创建列子</title><link>http://www.blogjava.net/baoyaer/articles/236802.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 27 Oct 2008 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/236802.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/236802.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/236802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/236802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/236802.html</trackback:ping><description><![CDATA[<strong>创建</strong><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;variable&nbsp;job_feeid_create&nbsp;&nbsp;</span><span style="font-weight: bold; color: #000000">NUMBER</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sys.dbms_job.submit(:job_feeid_create,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">wlk_check_fee;</span><span style="color: #ff0000">'</span><span style="color: #000000">,sysdate,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(SYSDATE+1)</span><span style="color: #ff0000">'</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">commit</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">;</span></div>
在命令控制台中这样就可以建产一个作业了。sysdate表示当前作业将来执行的时间，sysdate+1表示调用频率。<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTERVAL参数值&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每天午夜12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(SYSDATE&nbsp;+&nbsp;1)</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每天早上8点30分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(SYSDATE&nbsp;+&nbsp;1)&nbsp;+&nbsp;（8*60+30）/(24*60)</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每星期二中午12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">NEXT_DAY(TRUNC(SYSDATE&nbsp;),&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #ff0000">TUESDAY</span><span style="color: #ff0000">''</span><span style="color: #ff0000">&nbsp;)&nbsp;+&nbsp;12/24</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每个月第一天的午夜12点&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(LAST_DAY(SYSDATE&nbsp;)&nbsp;+&nbsp;1)</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每个季度最后一天的晚上11点&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(ADD_MONTHS(SYSDATE&nbsp;+&nbsp;2/24,&nbsp;3&nbsp;),&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #000000">Q</span><span style="color: #ff0000">'</span><span style="color: #ff0000">&nbsp;)&nbsp;-1/24</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />每星期六和日早上6点10分&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUNC(LEAST(NEXT_DAY(SYSDATE,&nbsp;</span><span style="color: #ff0000">''</span><span style="color: #ff0000">SATURDAY"),&nbsp;NEXT_DAY(SYSDATE,&nbsp;"SUNDAY")))&nbsp;+&nbsp;（6&#215;60+10）/（24&#215;60）</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span></div>
<br />
<br />
<strong>运行</strong><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;dbms_job.run(:job_feeid_create);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">end</span><span style="color: #000000">;</span></div>
<br />
<strong>查询作业记录</strong><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;user_jobs</span></div>
<br />
<strong>具体讲解：<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>1．确保Oracle的工作模式允许启动任务队列管理器&nbsp;<br />
</em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle定时执行&#8220;Job Queue&#8221;的后台程序是SNP进程，而要启动SNP进程，首先要确保整个系统的模式是可以启动SNP进程的，这需要以&nbsp;&nbsp;&nbsp; DBA的身份去执行如下命令： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; svrmgrl&gt;; alter system enable restricted session; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或sql&gt;; alter system disenable restricted session; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用如上命令更改系统的会话方式为disenable restricted，为SNP的启动创造条件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp; 2．确保Oracle的系统已经配置了任务队列管理器的启动参数&nbsp;<br />
</em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; SNP的启动参数位于Oracle的初始化文件中，该文件放在＄ORACLE_HOME/dbs路径下，如果Oracle的SID是myora8的话，则初始化文件就是&nbsp;&nbsp; initmyora8.ora，在文件中对SNP启动参数的描述部分如下： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job_queue_process=n <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job_queue_interval=N <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一行定义SNP进程的启动个数为n。系统缺省值为0，正常定义范围为0～36，根据任务的多少，可以配置不同的数值。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒，正常范围为1～3600秒。事实上，该进程执行完当前任务后，就进入睡眠状 态，睡眠一段时间后，由系统的总控负责将其唤醒。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果该文件中没有上面两行，请按照如上配置添加。配置完成后，需要重新启动数据库，使其生效。注意：如果任务要求执行的间隔很短的 话，N的配置也要相应地小一点。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;&nbsp; 3．将任务加入到数据库的任务队列中</em>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用Oracle的dbms_job包中的存储过程，将任务加入到任务队列中：&nbsp;<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">dbms_job.submit(&nbsp;job&nbsp;out&nbsp;binary_integer,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />what　　　　　　　</span><span style="color: #808080">in</span><span style="color: #000000">　　　archar2,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />next_date　　　&nbsp;　</span><span style="color: #808080">in</span><span style="color: #000000">　　　date，&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />interval　　　　　</span><span style="color: #808080">in</span><span style="color: #000000">　　　</span><span style="font-weight: bold; color: #000000">varchar2</span><span style="color: #000000">,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />no_parse　　　　　</span><span style="color: #808080">in</span><span style="color: #000000">　　　boolean)&nbsp;</span></div>
<br />
其中： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●job：输出变量，是此任务在任务队列中的编号； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●what：执行的任务的名称及其输入参数；&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●next_date：任务执行的时间； <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●interval：任务执行的时间间隔。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面详细讨论一下dbms_job.submit中的参数interval。严格地讲，interval是指上一次执行结束到下一次开始执行的时间间隔，当interval设置为null 时，该job执行结束后，就被从队列中删除。假如我们需要该job周期性地执行，则要用&#8216;sysdate＋m&#8217;表示。&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将任务加入到任务队列之前，要确定执行任务的数据库用户，若用户是scott, 则需要确保该用户拥有执行包dbms_job的权限；若没有，需要以&nbsp;&nbsp; DBA的身份将权利授予scott用户： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; svrmgrl&gt;; grant execute on dbms_job to scott;&nbsp;<br />
<br />
<em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4．将要执行的任务写成存储过程或其他的数据库可执行的pl/sql程序段</em> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如，我们已经建立了一个存储过程，其名称为my_job，在sql/plus中以scott用户身份登录，执行如下命令： <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">sql</span><span style="color: #808080">&gt;</span><span style="color: #000000">;&nbsp;variable&nbsp;n&nbsp;</span><span style="font-weight: bold; color: #000000">number</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />sql</span><span style="color: #808080">&gt;</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">begin</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />dbms_job.submit(:n&#8216;my_job;&#8217;,sysdate,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&#8216;sysdate＋</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">360</span><span style="color: #000000">&#8217;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">commit</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">end</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #808080">/</span><span style="color: #000000">&nbsp;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统提示执行成功。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Sql</span><span style="color: #808080">&gt;</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;:n;&nbsp;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统打印此任务的编号，例如结果为300。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如上，我们创建了一个每隔4分钟执行一次的任务号为300的任务。可以通过Oracle提供的数据字典user_jobs察看该任务的执行情况：&nbsp;<br />
&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">sql</span><span style="color: #808080">&gt;</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;job,next_date,next_sec,failures,broken&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;user_jobs;&nbsp;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行结果如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job next_date next_sec failures broken <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 300 2000/10/10 11:45:15 0 N&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这表示任务号为300的任务，下一次将在2000/10/10 11:45:15执行，此任务的执行失败记录为0次。注意：当执行job出现错误时，Oracle将其记录在日志里，失败次数每次自动加1。当执行失败次数达到16时，Oracle就将该job标志为broken。此后，Oracle不再继续执行它，直到用户调用过程dbms_job.broken，重新设置为not broken，或强制调用dbms_job.run来重新执行它。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了以上我们讨论的submit存储过程之外，Oracle还提供了其他许多存储过程来操作任务。例如：dbms_job.change 、 dbms_job.what、dbms_job.interval可以用来修改提交的任务。要想删除该任务，只需运行dbms_job.remove(n)即可，其中n为任务号。 <br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/236802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-10-27 10:06 <a href="http://www.blogjava.net/baoyaer/articles/236802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 创建dblink创建语句</title><link>http://www.blogjava.net/baoyaer/articles/235853.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 22 Oct 2008 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/235853.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/235853.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/235853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/235853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/235853.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">database</span><span style="color: #000000">&nbsp;link&nbsp;XXX_LINK<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;connect&nbsp;</span><span style="color: #0000ff">to</span><span style="color: #000000">&nbsp;name&nbsp;identified&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;pwd&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(DESCRIPTION&nbsp;=&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS_LIST&nbsp;=&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS&nbsp;=&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PROTOCOL&nbsp;=&nbsp;TCP)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(HOST&nbsp;=&nbsp;XXX.XXX.XXX)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(PORT&nbsp;=&nbsp;1521))&nbsp;)&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(CONNECT_DATA&nbsp;=&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SERVICE_NAME&nbsp;=&nbsp;XXXX)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)</span><span style="color: #ff0000">'</span><span style="color: #000000">;</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/235853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-10-22 09:40 <a href="http://www.blogjava.net/baoyaer/articles/235853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql的启动解读分析</title><link>http://www.blogjava.net/baoyaer/articles/210482.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 25 Jun 2008 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/210482.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/210482.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/210482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/210482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/210482.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="postmessage_3979086">Mysql的启动其实不算复杂，我的理解就是读取配置文件，传递参数，启动。<br />
<br />
说的比较简单，其实这里是有关部署的事情，配置文件的部署需要了解，我们看看默认的my.cnf的说明：
<div class="quote">
<h5>引用:</h5>
<blockquote># You can copy this file to<br />
# /etc/my.cnf to set global options,<br />
# mysql-data-dir/my.cnf to set server-specific options (in this<br />
# installation this directory is /Data/apps/mysql/var) or<br />
# ~/.my.cnf to set user-specific options.<br />
<br />
# www.aslibra.com by hqlulu</blockquote></div>
也就是说，放在 /etc/my.cnf 是服务器的全局设置<br />
然后是启动的数据库的my.cnf，然后是用户目录的 .my.cnf 文件<br />
最后其实就是启动命令指定的参数，下面自己可以找到方法一步一步验证，我们用port的变化来说明：<br />
<br />
<strong>1 默认的一般启动形式是如下：</strong>
<div class="blockcode"><span class="headactions" onclick="copycode($('code0'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code0">/Data/apps/mysql/bin/mysqld_safe --user=mysql &amp;<br />
<br />
停止命令：<br />
<br />
mysqladmin &nbsp; -u &nbsp; root &nbsp; -pyourpassword &nbsp; &nbsp; shutdown&nbsp;&nbsp; </code></div>
如果没有 /etc/my.cnf 的情况下，默认是打开mysql安装目录的 var文件夹，读取权限配置<br />
如果没有相应的表，那就会提示出错：
<div class="quote">
<h5>引用:</h5>
<blockquote>080502 04:12:23&nbsp;&nbsp;mysqld started<br />
080502&nbsp;&nbsp;4:12:23 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist<br />
080502 04:12:23&nbsp;&nbsp;mysqld ended</blockquote></div>
可以使用bin/mysql_install_db新装一个数据库默认库<br />
如果是表的所有者不是mysql，那会提示：
<div class="quote">
<h5>引用:</h5>
<blockquote>080502 04:15:37&nbsp;&nbsp;mysqld started<br />
080502&nbsp;&nbsp;4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)<br />
080502&nbsp;&nbsp;4:15:37 [ERROR] /Data/apps/mysql/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)<br />
080502&nbsp;&nbsp;4:15:37 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)<br />
080502 04:15:37&nbsp;&nbsp;mysqld ended</blockquote></div>
启动后，看到使用的是 3306端口号<br />
<br />
<strong>2 如果复制一个配置文档到 /etc/my.cnf 并且修改port参数试试：</strong>
<div class="blockcode"><span class="headactions" onclick="copycode($('code1'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code1">[mysqld]<br />
port&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;= 3307<br />
socket&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; = /tmp/mysql.sock</code></div>
同样语句启动后，是3307端口号<br />
<br />
<strong>3 复制一个文件到 var 目录</strong>
<div class="blockcode"><span class="headactions" onclick="copycode($('code2'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code2">[mysqld]<br />
port&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;= 3308<br />
socket&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; = /tmp/mysql.sock</code></div>
同样语句启动后，是3308端口号<br />
<br />
<strong>4 复制一个my.cnf到用户mysql的根目录</strong><br />
<br />
cat /etc/passwd 知道：<br />
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash<br />
<br />
复制一个到 /var/lib/mysql/.my.cnf
<div class="blockcode"><span class="headactions" onclick="copycode($('code3'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code3">[mysqld]<br />
port&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;= 3309<br />
socket&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; = /tmp/mysql.sock</code></div>
同样语句启动后，是3308端口号，看来这个不太成立<br />
<br />
5 指定配置文件<br />
<br />
复制一个 my_setting.cnf ，修改为3340
<div class="blockcode"><span class="headactions" onclick="copycode($('code4'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code4">/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql &amp;</code></div>
注意，指定配置文件的参数应该需要在第一个位置出现，互换两个参数的位置会出错了，启动后，确实是3340<br />
<br />
<strong>6 修改启动参数</strong>
<div class="blockcode"><span class="headactions" onclick="copycode($('code5'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code5">/Data/apps/mysql/bin/mysqld_safe --defaults-file=/Data/apps/mysql/var/my_setting.cnf --user=mysql --port=3341 &amp;</code></div>
启动后是 3341端口<br />
<br />
<strong>阿权的总结：</strong><br />
<br />
1 mysql有默认的一些参数，如果没有指定，则取默认值<br />
2 mysql尝试读取 /etc/my.cnf 做默认值<br />
3 mysql尝试读取数据目录的 my.cnf ，取代相应的值<br />
4 mysql的用户目录似乎无效，不太清楚呢 <img alt="" src="http://bbs.blueidea.com/images/smilies/default/smile.gif" border="0" smilieid="1" /><br />
5 mysql启动参数可以指定配置文件位置，优先级次高<br />
6 也可以直接指定具体的参数，优先级最高<br />
<br />
<font face="Verdana" color="#535000" size="2">&nbsp;
<div><span style="color: #000000">.</span><span style="color: #808080">/</span><span style="color: #000000">mysql&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">umarduk&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">pmarduk&nbsp;cnaudit&nbsp;</span><span style="color: #808080">&lt;</span><span style="color: #000000">cnbak0902.sql&nbsp;</span></div>
<div>&nbsp;</div>
<div><span style="color: #000000"><span style="color: #000000">mysql</span><span style="color: #808080">&gt;</span><span style="color: #000000">source&nbsp;d:\aiker_db.sql</span></span></div>
</font><br />
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/210482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-25 11:52 <a href="http://www.blogjava.net/baoyaer/articles/210482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL配置文件my.cnf设置 </title><link>http://www.blogjava.net/baoyaer/articles/209466.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 20 Jun 2008 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/209466.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/209466.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/209466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/209466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/209466.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div class="bd6 fl w508 pd10 bg6 l22">&nbsp;</div>
<div id="artibody">
<div class="size14 l24 fl w530 mgt10" id="logPanel">
<div class="guanggao"></div>
<p>&nbsp;</p>
<p>　　设置建议:</p>
<p>　　对于单台运行的WEB服务器,建议加上:</p>
<p>　　skip-locking</p>
<p>　　skip-name-resolve</p>
<p>　　skip-networking</p>
<p>　　在PHP链接数据库时使用"LOCALHOST".这样MySQL 客户端库将覆盖之并尝试连接到本地套接字.(</p>
<p>　　我们可以从PHP.INI中</p>
<p>　　代码:</p>
<p>　　; Default socket name for local MySQL connects. If empty, uses the built-in</p>
<p>　　; MySQL defaults.</p>
<p>　　mysql.default_socket = /tmp/mysql.sock看出 默认情况下 UNIX 将访问/tmp/mysql.sock)</p>
<p>　　以下是部分选项解释:</p>
<p>　　my.cnf默认是不存在的.你可以在/usr/local/share/mysql/下看到:</p>
<p>　　my-huge.cnf</p>
<p>　　my-innodb-heavy-4G.cnf</p>
<p>　　my-large.cnf</p>
<p>　　my-medium.cnf</p>
<p>　　my-small.cnf</p>
<p>　　等文件.将其中合适你机器配置的文件拷贝到/etc/my.cnf或mysql data目录/my.cnf(/var/db/mysql)下或~/.my.cnf.文件内都有详细的说明</p>
<p>　　[mysqld]</p>
<p>　　port = 3306</p>
<p>　　serverid = 1</p>
<p>　　socket = /tmp/mysql.sock</p>
<p>　　skip-locking</p>
<p>　　# 避免MySQL的外部锁定，减少出错几率增强稳定性。</p>
<p>　　skip-name-resolve</p>
<p>　　禁止MySQL对外部连接进行DNS解析，使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意，如果开启该选项，则所有远程主机连接授权都要使用IP地址方式，否则MySQL将无法正常处理连接请求!</p>
<p>　　back_log = 384</p>
<p>　　指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求，该参数生效，主线程花费很短的时间检查连接并且启动一个新线程。</p>
<p>　　back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系统在一个短时间内有很多连接，则需要增大该参数的值，该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。</p>
<p>　　试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。</p>
<p>　　key_buffer_size = 256M</p>
<p>　　# key_buffer_size指定用于索引的缓冲区大小，增加它可得到更好的索引处理性能。</p>
<p>　　对于内存在4GB左右的服务器该参数可设置为256M或384M。</p>
<p>　　注意：该参数值设置的过大反而会是服务器整体效率降低!</p>
<p>　　max_allowed_packet = 4M</p>
<p>　　thread_stack = 256K</p>
<p>　　table_cache = 128K</p>
<p>　　sort_buffer_size = 6M</p>
<p>　　查询排序时所能使用的缓冲区大小。注意：该参数对应的分配内存是每连接独占!如果有100个连接，那么实际分配的总共排序缓冲区大小为100 &#215; 6 = 600MB。所以，对于内存在4GB左右的服务器推荐设置为6-8M。</p>
<p>　　read_buffer_size = 4M</p>
<p>　　读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享!</p>
<p>　　join_buffer_size = 8M</p>
<p>　　联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享!</p>
<p>　　myisam_sort_buffer_size = 64M</p>
<p>　　table_cache = 512</p>
<p>　　thread_cache_size = 64</p>
<p>　　query_cache_size = 64M</p>
<p>　　指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察：</p>
<p>　　代码:</p>
<p>　　# &gt; SHOW VARIABLES LIKE '%query_cache%';</p>
<p>　　# &gt; SHOW STATUS LIKE 'Qcache%';如果Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况;</p>
<p>　　如果Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，如果该值较小反而会影响效率，那么可以考虑不用查询缓冲;Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多。</p>
<p>　　tmp_table_size = 256M</p>
<p>　　max_connections = 768</p>
<p>　　指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示，则需要增大该参数值。</p>
<p>　　max_connect_errors = 10000000</p>
<p>　　wait_timeout = 10</p>
<p>　　指定一个请求的最大连接时间，对于4GB左右内存的服务器可以设置为5-10。</p>
<p>　　thread_concurrency = 8</p>
<p>　　该参数取值为服务器逻辑CPU数量&#215;2，在本例中，服务器有2颗物理CPU，而每颗物理CPU又支持H.T超线程，所以实际取值为4 &#215; 2 = 8</p>
<p>　　skip-networking</p>
<p>　　开启该选项可以彻底关闭MySQL的TCP/IP连接方式，如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!</p>
</div>
<br />
<br />
<br />
<br />
一、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;关于MySQL5<br />
MySQL5系列<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%95%B0%E6%8D%AE%E5%BA%93">数据库</span>是MySQL的最新版本的数据库，比较流行的发行版是mysql-5.0.18。MySQL&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;英文官方网站是<a href="http://www.mysql.com/" target="_blank">http://www.mysql.com</a><br />
<br />
二、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;获得MySQL5<br />
所有的关于MySQL数据库的程序，都可以在它的英文官方网站<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%B8%8B%E8%BD%BD">下载</span>到，但是，鉴于不不是所有人的英文都很好，所以建议大家尽量区MySQL的中文官方网站下载自己所需的程序，如果找不到，再去找英文的网站。<br />
MySQL5有<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%AE%89%E8%A3%85">安装</span>版和<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%85%8D%E5%AE%89%E8%A3%85">免安装</span>版之分，顾名思义，安装版就是需要安装以后才可以使用；免安装版的MySQL下载下来之后就可以使用，或者进行简单的设置就可以使用。<br />
MySQL5安装版下载地址：<br />
Windows版本：<a href="http://download.mysql.cn/src/2006/0218/199.html" target="_blank">http://download.mysql.cn/src/2006/0218/199.html</a><br />
<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=Linux">Linux</span>版本（源码包）：<a href="http://download.mysql.cn/src/2006/0208/62.html" target="_blank">http://download.mysql.cn/src/2006/0208/62.html</a><br />
MySQL5免安装版下载地址：<br />
Windows版本：<a href="http://download.mysql.cn/src/2006/0302/205.html" target="_blank">http://download.mysql.cn/src/2006/0302/205.html</a><br />
<br />
三、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;MySQL5安装<br />
Windows版安装手册：<a href="http://bbs.mysql.cn/thread-261-1-1.html" target="_blank">http://bbs.mysql.cn/thread-261-1-1.html</a><br />
Linux版本（源码包）安装手册：<a href="http://bbs.mysql.cn/thread-493-1-2.html" target="_blank">http://bbs.mysql.cn/thread-493-1-2.html</a><br />
<br />
MySQL有安装版本和免安装版本，免安装版本解压后的文件夹内没有安装程序，可以直接使用。<br />
Windows免安装版本使用手册：<a href="http://bbs.mysql.cn/thread-552-1-1.html" target="_blank">http://bbs.mysql.cn/thread-552-1-1.html</a><br />
<br />
四、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;备份与恢复<br />
常规备份命令是mysqldump,这里以tm数据库为例，做简单介绍，详细资料参考<br />
<a href="http://info.mysql.cn/install/2006/0410/5521.html" target="_blank">http://info.mysql.cn/install/2006/0410/5521.html</a><br />
备份：<br />
#mysqldump -u root -p tm &gt; tm_20060101.sql&nbsp;&nbsp;<br />
按提示输入密码，这就把tm数据库所有的表结构和数据备份到tm_20060101.sql了，因为要总进行备份工作，如果数据量大会占用很大空间，<br />
这是可以利用gzip压缩数据，命令如下：<br />
#mysqldump -u root -p tm | gzip &gt; tm_20060101.sql.gz<br />
还可以备份到<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%BF%9C%E7%A8%8B">远程</span>机器，用-h制定，如<br />
#mysqldump -u root -p tm &gt; tm_20060101.sql -h xxx.xxx.xxx.xxx <br />
可以直接备份到IP地址为xxx.xxx.xxx.xxx的远程计算机。<br />
系统崩溃，重建系统，或恢复数据库时，可以这样恢复数据：<br />
#mysql -u root -p tm &lt; tm_20060101.sql<br />
从压缩文件直接恢复：<br />
#gunzip &lt; tm_20060101.sql.gz | mysql -u root -p tm<br />
<br />
五、&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FAQ<br />
<br />
Q：为什么我下在的&#8220;安装程序&#8221;里面没有安装文件?<br />
A：你下载的可能是免安装版本。请给出详细的版本信息。<br />
<br />
Q：如何启动和关闭mysql?<br />
A：linux下：比如我的mysql是用源码方式安装在/usr/local/mysql<br />
自动：将/usr/local/mysql/share/mysql/mysql.server拷贝到/etc/rc.d/init.d/下，然后<br />
chkconfig --add mysql.server就可以开机就启动mysql服务了。<br />
手动：以root身份执行/usr/local/mysql/bin/mysqld_safe --user=mysql<br />
windows下：<br />
自动：<br />
用cmd方式，到mysql安装路径的bin文件夹下，执行：mysqld-nt --install<br />
手动：直接到到mysql安装路径的bin文件夹下执行net start mysql即可。<br />
如果不想让mysql在计算机启动时候就启动服务，执行：mysqld-nt --remove<br />
也可以在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services中删除对应服务并重启计算机。<br />
关闭mysql：mysqladmin -uroot -p shutdown<br />
启动mysql：<br />
mysqld-nt --install<br />
net start mysql<br />
<br />
Q：如何修改mysql的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%94%A8%E6%88%B7">用户</span>密码?<br />
A ：在这里请区分连接mysql数据库的用户密码和系统的用户密码！！<br />
<br />
mysql -uroot -p<br />
输入密码<br />
#登录mysql<br />
&gt;use mysql<br />
&gt;update user set password=password("new_pass") where user="userName";&nbsp;&nbsp;#userName换成你要修改的用户名的密码，比如root<br />
&gt;flush privileges;<br />
&gt;exit;<br />
<br />
Q：如何登录mysql?<br />
A：mysql -uroot -p回车后，输入密码，再回车即可。如果自己没有修改的话，默认密码为空。<br />
<br />
Q：mysql如何很好的变成图形化数据库呢?自身有自带的图形化工具没有?<br />
A：mysql自带一个字符的客户端，但是还有好多的像mysql_center、SQLyog、phpMyAdmin、Mysql Query Browser，Mysql Administrator、mysqlcc这样好的图形<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%AE%A1%E7%90%86">管理</span>工具。<br />
mysql_centerd在本站的下载地址：<a href="http://bbs.mysql.cn/thread-517-1-1.html" target="_blank">http://bbs.mysql.cn/thread-517-1-1.html</a><br />
SQLyog去网上搜索，很多的，SQLyog407版本不错。<br />
phpMyAdmin下载地址：<a href="http://download.mysql.cn/opencode/2006/0207/55.html" target="_blank">http://download.mysql.cn/opencode/2006/0207/55.html</a><br />
mysql.com提供的管理<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%BD%AF%E4%BB%B6">软件</span>下载地址：<a href="http://dev.mysql.com/downloads/gui-tools/5.0.html" target="_blank">http://dev.mysql.com/downloads/gui-tools/5.0.html</a><br />
其它的我就不一一提供下载地址，自己到网上搜索下载。<br />
<br />
Q:为什么用mysql&nbsp;&nbsp;-uusername -p登录mysql服务器时出现如下提示：<br />
&nbsp; &nbsp;&nbsp;&nbsp;Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server!("xxx.xxx.xxx.xxx"代表要登录的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</span>)<br />
A：这是因为你要登录的mysql服务器不允许用户username从xxx.xxx.xxx.xxx这个ip地址登录。<br />
解决办法是在服务器登录mysql，操作步骤为：<br />
mysql -uroot -p<br />
(输入密码)<br />
use mysql<br />
update user set Host="%" where User="username";<br />
flush privileges;<br />
<br />
Q：什么是phpMyAdmin？<br />
A：phpMyAdmin 是一个用<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=PHP">PHP</span>编写的，可以通过互联网控制和操作MySQL。通过phpMyAdmin可以完全对数据库进行操作，例如建立、复制/删除数据等等。<br />
有了phpMyAdmin 就可以完全不使用mysql命令,直接使用phpMyAdmin就能管理mysql的所有数据和数据库<br />
<br />
Q：如何使用phpMyAdmin？<br />
A：要使用phpMyAdmin，下载后，把它释放到web服务器的根目录下，取个名字，比如就叫phpMyAdmin，然后在浏览器的地址栏输入:<br />
<a href="http://x.x.x.x/phpMyAdmin/index.php" target="_blank">http://X.X.X.X/phpMyAdmin/index.php</a><br />
就可以了。<br />
如果是phpMyAdmin 2.8.0.2以上版本的，这样使用会报错，因为默认没有这个软件需要的配置文件config.default.php,在2.6.X版本下都有这个文件，只是口令不对。对于2.6.X版本的，可以直接用文本编辑器打开这个文件，把其中第一个$cfg中内容修改成自己的用户名及密码就可以了：<br />
$cfg['Servers'][$i]['auth_type']&nbsp; &nbsp;&nbsp;&nbsp;= 'config';&nbsp; &nbsp; // Authentication method (config, http or cookie based)?<br />
$cfg['Servers'][$i]['user']&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; = 'root';&nbsp; &nbsp;&nbsp; &nbsp;// MySQL user<br />
$cfg['Servers'][$i]['password']&nbsp; &nbsp;&nbsp; &nbsp;= '自己的密码';<br />
不设置密码的话，系统会提示：<br />
Access denied <span class="t_tag" onclick="tagshow(event)" href="tag.php?name=for">for</span> user 'root'@'localhost' (using password: NO)<br />
<br />
如果是2.8.0.2版本的，程序会提示请运行scripts/setup.php或者index.php这样的文件进行配置以生成config.inc.php文件。<br />
<br />
Q：为什么我使用mysql出现<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%B9%B1%E7%A0%81">乱码</span>？<br />
A：安装mysql5时默认的字符集是瑞典编码latin1，不支持中文。并且出现乱码的原因很多，建议到bbs.mysql.cn论坛寻找答案。发贴的话请详细说明自己的环境、安装<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%BF%87%E7%A8%8B">过程</span>及使用的信息，以便大家能快速分析你的问题。<br />
<br />
Q：如何修改字符集？<br />
A：<br />
mysql -uroot -p<br />
输入密码<br />
选择你的目标数据库<br />
mysql&gt; use dbname<br />
显示当前字符集<br />
mysql&gt; show variables like '%char%';<br />
+--------------------------+----------------------------------------+<br />
| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+--------------------------+----------------------------------------+<br />
| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br />
+--------------------------+----------------------------------------+<br />
7 rows in set (0.00 sec)<br />
最好是保持字符集统一。如果你要修改哪个字符集，用set命令，如：<br />
mysql&gt; set character_set_client gbk;<br />
Query OK, 0 rows affected (0.00 sec)<br />
<br />
mysql&gt; show variables like '%char%';<br />
+--------------------------+----------------------------------------+<br />
| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+--------------------------+----------------------------------------+<br />
| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gbk&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br />
+--------------------------+----------------------------------------+<br />
再改回来：<br />
mysql&gt; set character_set_client=gb2312;<br />
Query OK, 0 rows affected (0.00 sec)<br />
<br />
mysql&gt; show variables like '%char%';<br />
+--------------------------+----------------------------------------+<br />
| Variable_name&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;| Value&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+--------------------------+----------------------------------------+<br />
| character_set_client&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_connection | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_database&nbsp; &nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_results&nbsp; &nbsp; | gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_server&nbsp; &nbsp;&nbsp;&nbsp;| gb2312&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
| character_set_system&nbsp; &nbsp;&nbsp;&nbsp;| utf8&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
| character_sets_dir&nbsp; &nbsp;&nbsp; &nbsp; | /usr/local/mysql/share/mysql/charsets/ |<br />
+--------------------------+----------------------------------------+<br />
7 rows in set (0.00 sec)<br />
自己试试就知道了。<br />
<br />
Q：为什么我的phpmyadmin提示不能载入mysql扩展？<br />
A： 一、看下你的PHP目录和PHP\EXT下有没有php_mysql.dll这个文件。<br />
&nbsp; &nbsp;&nbsp; &nbsp;二、配制一下环境变量把php_mysql.dll所在的目录加入的PATH里。<br />
&nbsp; &nbsp;&nbsp; &nbsp;三、有的php安装程序安装好以后，在安装路径下，并没有ext文件夹（不知道为什么），最好下载个配置的php，然后，将exe文件夹拷贝到安装目录下，再进行相应的配置。<br />
&nbsp; &nbsp;&nbsp; &nbsp;四、看一下c:\winnt 或者是 c:\windows下的php.ini文件里的php_mysql.dll前面的；（分号）是否去掉了，如果没有去掉请去掉，然后，将mysql安装路径下bin文件夹下的libmysql.dll放在安装php的根目录一般为C：\php ，同时也在 C:\windows 下也放各一个，之后重新启动IIS或者是APACHE。有的时候总是刷新一页，即使去掉分号也还是不能载入mysql扩展，最后新打开一个窗口，再试。<br />
<br />
Q：为什么提示："没有发现 PHP 的扩展设置mbstring， 而当前系统好像在使用宽字符集。没有 mbstring 扩展的 phpMyAdmin 不能正确识别字符串，可能产生不可意料的结果."<br />
A：因为你没有打开mbstring在扩展，解决办法：打开php的配置文件php.ini，将<br />
extension=php_mbstring.dll前面的分号";"去掉，并改到正确的路径，一般为<br />
ext/php_mbstring.dll<br />
<br />
Q：为什么PHP连接mysql会有下面的提示？<br />
&nbsp; &nbsp;&nbsp; &nbsp; Fatal error: Call to undefined function mysql_connect() &#8230;&#8230;<br />
A：很有可能是没有载入mysql扩展，如何解决，请参考上面的方法。<br />
因为如果你的系统没有载入mysql扩展的话，phpmyadmin能给出提示，而一般的程序则不能给出。<br />
如果phpmyadmin没有给出提示，而你恰好用的apache服务器，尝试一下方法：<br />
首先是去掉;extension=php_mysql.dll前面的&#8220;;&#8221;（;为注释）<br />
第二步是将C:\php\ext中的php_mysql.dll复制到C:\WINDOWS（C:\WINNT）中即可，<br />
并重起Apache。<br />
<br />
Q：为什么我不能看孵化池资料？<br />
A：MYSQL.CN的孵化池是专门为初学者提供学习的地方，这里我就不多介绍了，详情请访问：<a href="http://bbs.mysql.cn/thread-369-1-1.html" target="_blank">http://bbs.mysql.cn/thread-369-1-1.html</a>。<br />
<br />
Q：能中文数据库名称么？<br />
A：可以，但是不推荐，用起来不方便。<br />
<br />
Q：如果我忘记了<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=root%E5%AF%86%E7%A0%81">root密码</span>，怎么办？<br />
A：<br />
在windows下：<br />
打开命令行窗口，停止mysql服务：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Net stop mysql<br />
启动mysql，一般到mysql的安装路径，找到 mysqld-nt.exe<br />
执行：mysqld-nt --skip-grant-tables<br />
另外打开一个命令行窗口，执行mysql<br />
&gt;use mysql<br />
&gt;update user set password=password("new_pass") where user="root";<br />
&gt;flush privileges;<br />
&gt;exit<br />
用Ctrl+Alt+Del，找到mysqld-nt的进程杀掉它，在重新启动mysql-nt服务，就可以用新密码登录了<br />
<br />
在linux下：<br />
如果 MySQL 正在运行，首先杀之： killall -TERM mysqld。 <br />
启动 MySQL ：bin/safe_mysqld --skip-grant-tables &amp; <br />
就可以不需要密码就进入 MySQL 了。 <br />
然后就是 <br />
&gt;use mysql<br />
&gt;update user set password=password("new_pass") where user="root";<br />
&gt;flush privileges;<br />
重新杀 MySQL ，用正常方法启动 MySQL 。<br />
<br />
Q：为什么出现如下的提示：<br />
[root@0-8-2-df-fa-ee ~]# mysql<br />
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)<br />
注：也可能是其它路径下的mysql.sock<br />
A：说明mysql服务没有启动，mysql.sock是mysql服务启动后启动生成的文件，<br />
一般先杀掉mysql服务：killall mysql<br />
然后，再根据自己的安装情况启动mysql即可。比如，安装的时候，用的是<br />
./configure --prefix=/usr/local/mysql的<br />
用下面的命令启动：<br />
/usr/local/mysql/bin/mysqld_safe --user=mysql &amp;<br />
之后再去执行/usr/local/mysql/bin/mysql -u root -p 登录进入mysql数据库<br />
还不行的话，一次执行下面的命令：<br />
sync<br />
reboot&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;；重启计算机，执行时请小心！！！<br />
<br />
Q:为什么出现下面的错误<br />
#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client<br />
<br />
A：你使用的数据库是4.1以上，用命令行连接MySQL数据库后，执行下面的命令：<br />
UPDATE mysql.user SET password=OLD_PASSWORD("your_password") WHERE Host="your_host" AND User="your_username" ;<br />
即可解决。<br />
<br />
your_password：改成你<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%BF%9E%E6%8E%A5%E6%95%B0">连接数</span>据库的密码，比如 123<br />
your_host：改成你连接数据库的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%B8%BB%E6%9C%BA">主机</span>，如果是本地的话，就是localhost<br />
your_username：改成你连接数据库的用户，比如 root<br />
<br />
Q：为什么mysql提示我：Data too long for column &#8230;&#8230;<br />
A：首先确保你的数据大小符合你的字段大小。<br />
再检查你的数据库编码，数据库的编码是否与操作数据库工具的编码一致！<br />
<br />
<br />
Q:为什么我修改wait_timeout没有生效<br />
A： 需要同时修改<br />
interactive_timeout<br />
wait_timeout<br />
才会生效（show variables;）<br />
<br />
<br />
不断添加中，如有错误，欢迎指正！<br />
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/209466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-20 15:37 <a href="http://www.blogjava.net/baoyaer/articles/209466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 8小时失效问题</title><link>http://www.blogjava.net/baoyaer/articles/209391.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 20 Jun 2008 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/209391.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/209391.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/209391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/209391.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/209391.html</trackback:ping><description><![CDATA[最近碰到了这个问题，检查后发现数据库连接池中保存的连接超时后失效了，下面是官方的解释<br />
<a title="mysql gone-away" href="http://dev.mysql.com/doc/refman/5.0/en/gone-away.html">mysql gone-away</a><br />
<p>从Mysql 5.x的某个版本之后，MySQL的自动关闭空闲连接的特性被修改了，假如一个连接空闲到超时时间(默认28000秒8小时)，再次发起的Reconnect重新连接请求不会被接受，需要重新建立新连接，这就导致了SER的重连机制不能正常工作：SER只会在需要操作数据库时去使用同一个连接接口，断开了则发起重新连接请求，而且这个问题短期内SER也不能够解决。</p>
<p>　　下文中将具体讲述处理的方法：</p>
<p>　　1.使用Mysql 4.0或4.1版本，如果没有用到Mysql 5的一些新特性比如存储过程触发器之类。</p>
<p>　　2.定时重启Mysql服务器或Ser(由于本问题可能同样会影响到其它一些需要Mysql支持的服务器程序，所以重启Mysql服务器为好，但需要检测Mysql服务器不被使用的一个时间重启比较难确定)</p>
<p>　　3.设置my.cnf，有mysqld字段内增加参数：</p>
<p>　　[mysqld]port = 3306socket = /tmp/mysql.sockwait_timeout= 500000interactive_timeout = 500000(500000秒约五六天的超时时间，可根据实际需要选择一个数据库可能空闲的最长时间稍大的时间值。)重启Mysqld应用即可，也可以在执行mysqld时加-o wait_timeout=500000参数同样效果。</p>
<p>　　在MySQL客户端show variable时应该可以看到最后一条从默认的wait_time=28000变成500000了。</p>
<p>　　(假如重启Mysqld不生效，可以重启机子)</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/209391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-20 11:29 <a href="http://www.blogjava.net/baoyaer/articles/209391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql语句优化【z】</title><link>http://www.blogjava.net/baoyaer/articles/206919.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 10 Jun 2008 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/206919.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/206919.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/206919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/206919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/206919.html</trackback:ping><description><![CDATA[<p>
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结1 选择索引</td>
        </tr>
    </tbody>
</table>
<br />
缺省情况下建立的索引是非聚集索引，但有时它并不是最佳的；合理的索引设计要建立在对各种查询的分析和预测上。一般来说</p>
<ol>
    <li>有大量重复值、且经常有范围查询（between,&nbsp;&gt;,&lt;&nbsp;，&gt;=,&lt;&nbsp;=）和order&nbsp;by、group&nbsp;by发生的列，考虑建立聚集索引；</li>
    <li>经常同时存取多列，且每列都含有重复值可考虑建立组合索引；在条件表达式中经常用到的不同值较多的列上建立检索，在不同值少的列上不要建立索引。</li>
</ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如在雇员表的&#8220;性别&#8221;列上只有&#8220;男&#8221;与&#8220;女&#8221;两个不同值，因此就无必要建立索引。如果建立索引不但不会提高查询效率，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 反而会&nbsp; 严重降低更新速度。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; 组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结2&nbsp;&nbsp; 避免使用不兼容的数据类型</td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如float和INt、char和varchar、bINary和varbINary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:<br />
SELECT&nbsp;name&nbsp;FROM&nbsp;employee&nbsp;WHERE&nbsp;salary&nbsp;＞&nbsp;60000<br />
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结3&nbsp; IS&nbsp;NULL&nbsp;与IS&nbsp;NOT&nbsp;NULL</td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不能用null作索引，任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下，只要这些列中有一列含有null，该列就会从索引中排除。也就是说如果某列存在空值，即使对该列建索引也不会提高性能。任何在WHERE子句中使用is&nbsp;null或is&nbsp;not&nbsp;null的语句优化器是不允许使用索引的。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结4&nbsp;&nbsp; IN和EXISTS</td>
        </tr>
    </tbody>
</table>
<br />
EXISTS要远比IN的效率高。里面关系到full&nbsp;table&nbsp;scan和range&nbsp;scan。几乎所有的IN操作符子查询都可以改写为使用EXISTS的子查询。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;dname,&nbsp;deptno&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;dept<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;deptno&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">IN</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />(</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;deptno&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;emp);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>改为</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;dname,&nbsp;deptno&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;dept<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">EXISTS</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />(</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;deptno&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;emp<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;dept.deptno&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;emp.deptno);</span></div>
<p><br />
因为1中对emp进行了full&nbsp;table&nbsp;scan,这是很浪费时间的操作。而且1中没有用到emp的INdex，<br />
因为没有WHERE子句。而2中的语句对emp进行的是range&nbsp;scan。<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结5&nbsp; IN、OR子句常会使用工作表，使索引失效</td>
        </tr>
    </tbody>
</table>
<br />
如果不产生大量重复值，可以考虑把子句拆开。拆开的子句中应该包含索引。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结6&nbsp; 避免或简化排序</td>
        </tr>
    </tbody>
</table>
<br />
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时，优化器就避免了排序的步骤。以下是一些影响因素：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 索引中不包括一个或几个待排序的列；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group&nbsp;by或order&nbsp;by子句中列的次序与索引的次序不一样；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;排序的列来自不同的表。<br />
<br />
为了避免不必要的排序，就要正确地增建索引，合理地合并数据库表（尽管有时可能影响表的规范化，但相对于效率的提高是值得的）。如果排序不可避免，那么应当试图简化它，如缩小排序的列的范围等。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结7&nbsp;&nbsp;消除对大型表行数据的顺序存取</td>
        </tr>
    </tbody>
</table>
<br />
在嵌套查询中，对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略，一个嵌套3层的查询，如果每层都查询1000行，那么这个查询就要查询 10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如，两个表：学生表（学号、姓名、年龄??）和选课表（学号、课程号、成绩）。如果两个表要做连接，就要在&#8220;学号&#8221;这个连接字段上建立索引。<br />
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引，但某些形式的WHERE子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;orders&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;(customer_num</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">104</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">AND</span><span style="color: #000000">&nbsp;order_num</span><span style="color: #808080">&gt;</span><span style="font-weight: bold; color: #800000">1001</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">OR</span><span style="color: #000000">&nbsp;order_num</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">1008</span></div>
<p><br />
虽然在customer_num和order_num上建有索引，但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合，所以应该改为如下语句：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;orders&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;customer_num</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">104</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">AND</span><span style="color: #000000">&nbsp;order_num</span><span style="color: #808080">&gt;</span><span style="font-weight: bold; color: #800000">1001</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">UNION</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;orders&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;order_num</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">1008</span></div>
<p>这样就能利用索引路径处理查询。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结8&nbsp; 避免相关子查询</td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个列的标签同时在主查询和WHERE子句中的查询中出现，那么很可能当主查询中的列值改变之后，子查询必须重新查询一次。查询嵌套层次越多，效率越低，因此应当尽量避免子查询。如果子查询不可避免，那么要在子查询中过滤掉尽可能多的行。<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>总结9&nbsp;&nbsp;避免困难的正规表达式</td>
        </tr>
    </tbody>
</table>
<br />
MATCHES和LIKE关键字支持通配符匹配，技术上叫正规表达式。但这种匹配特别耗费时间。例如：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;customer&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;zipcode&nbsp;</span><span style="color: #808080">LIKE</span><span style="color: #000000">&nbsp;&#8220;98_&nbsp;_&nbsp;_&#8221;</span></div>
<p><br />
即使在zipcode字段上建立了索引，在这种情况下也还是采用顺序扫描的方式。如果把语句改为<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;customer&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;zipcode&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&#8220;</span><span style="font-weight: bold; color: #800000">98000</span><span style="color: #000000">&#8221;，</span></div>
<p>在执行查询时就会利用索引来查询，显然会大大提高速度。<br />
另外，还要避免非开始的子串。例如语句：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;＊&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;customer&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;zipcode</span><span style="color: #ff0000">[</span><span style="color: #ff0000">2，3</span><span style="color: #ff0000">]</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&#8220;</span><span style="font-weight: bold; color: #800000">80</span><span style="color: #000000">&#8221;，</span></div>
<p>在WHERE子句中采用了非开始子串，因而这个语句也不会使用索引。<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>不充份的连接条件</td>
        </tr>
    </tbody>
</table>
<br />
例：表card有7896行，在card_no上有一个非聚集索引，表account有191122行，在account_no上有一个非聚集索引，试看在不同的表连接条件下，两个SQL的执行情况：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(a.amount)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;account&nbsp;a,card&nbsp;b&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;a.card_no&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;b.card_no<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>20S<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(a.amount)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;account&nbsp;a,card&nbsp;b&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;a.card_no&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;b.card_no&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;a.account_no</span><span style="color: #808080">=</span><span style="color: #000000">b.account_no<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&lt;1S<br />
分析：<br />
在第一个连接条件下，最佳查询方案是将account作外层表，card作内层表，利用card上的索引，其I/O次数可由以下公式估算为：<br />
外层表account上的22541页+（外层表account的191122行*内层表card上对应外层表第一行所要查找的3页）=595907次I/O<br />
在第二个连接条件下，最佳查询方案是将card作外层表，account作内层表，利用account上的索引，其I/O次数可由以下公式估算为：<br />
外层表card上的1944页+（外层表card的7896行*内层表account上对应外层表每一行所要查找的4页）=&nbsp;33528次I/O<br />
<br />
可见，只有充份的连接条件，真正的最佳方案才会被执行。<br />
多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表；内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。<br />
不可优化的WHERE子句<br />
例1<br />
下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">substrINg</span><span style="color: #000000">(card_no,</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">4</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">5378</span><span style="color: #ff0000">'</span></div>
<p><br />
(13秒)<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;amount</span><span style="color: #808080">/</span><span style="font-weight: bold; color: #800000">30</span><span style="color: #808080">&lt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1000</span></div>
<p><br />
（11秒）<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">convert</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #000000">char</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">),date,</span><span style="font-weight: bold; color: #800000">112</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">19991201</span><span style="color: #ff0000">'</span></div>
<p><br />
（10秒）<br />
分析：<br />
WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;card_no&nbsp;</span><span style="color: #808080">like</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">5378%</span><span style="color: #ff0000">'</span></div>
<p><br />
（&lt;&nbsp;1秒）<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;amount</span><span style="color: #808080">&lt;</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1000</span><span style="color: #808080">*</span><span style="font-weight: bold; color: #800000">30</span></div>
<p><br />
（&lt;&nbsp;1秒）<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;date</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">1999/12/01</span><span style="color: #ff0000">'</span></div>
<p><br />
（&lt;&nbsp;1秒）<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>存储过程中，采用临时表优化查询</td>
        </tr>
    </tbody>
</table>
<br />
例<br />
1．从parven表中按vendor_num的次序读数据：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;part_num，vendor_num，price&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;parven&nbsp;</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;vendor_num<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">temp</span><span style="color: #000000">&nbsp;pv_by_vn</span></div>
<p><br />
这个语句顺序读parven（50页），写一个临时表（50页），并排序。假定排序的开销为200页，总共是300页。<br />
<br />
2．把临时表和vendor表连接，把结果输出到一个临时表，并按part_num排序：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;pv_by_vn，＊&nbsp;vendor.vendor_num&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;pv_by_vn，vendor<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;pv_by_vn.vendor_num</span><span style="color: #808080">=</span><span style="color: #000000">vendor.vendor_num<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;pv_by_vn.part_num<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;TMP&nbsp;pvvn_by_pn<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">DROP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;pv_by_vn</span></div>
<p><br />
这个查询读取pv_by_vn(50页)，它通过索引存取vendor表1.5万次，但由于按vendor_num次序排列，实际上只是通过索引顺序地读 vendor表（40＋2=42页），输出的表每页约95行，共160页。写并存取这些页引发5＊160=800次的读写，索引共读写892页。<br />
3．把输出和part连接得到最后的结果：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;pvvn_by_pn.＊，part.part_desc&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;pvvn_by_pn，part<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;pvvn_by_pn.part_num</span><span style="color: #808080">=</span><span style="color: #000000">part.part_num<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">DROP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;pvvn_by_pn</span></div>
<p><br />
这样，查询顺序地读pvvn_by_pn(160页)，通过索引读part表1.5万次，由于建有索引，所以实际上进行1772次磁盘读写，优化比例为30∶1。<br />
<br />
好了，搞定。<br />
<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>常量优化：</td>
        </tr>
    </tbody>
</table>
<br />
常量的计算是在语句被优化时一次性完成，而不是在每次执行时。下面是检索月薪大于2000的的表达式：<br />
sal&nbsp;&gt;&nbsp;24000/12<br />
sal&nbsp;&gt;&nbsp;2000<br />
sal*12&nbsp;&gt;&nbsp;24000<br />
如果SQL语句包括第一种情况，优化器会简单地把它转变成第二种。<br />
优化器不会简化跨越比较符的表达式，例如第三条语句，鉴于此，应尽量写用常量跟字段比较检索的表达式，而不要将字段置于表达式当中。否则没有办法优化，比如如果sal上有索引，第一和第二就可以使用，第三就难以使用。<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>操作符优化</td>
        </tr>
    </tbody>
</table>
优化器把使用LIKE操作符和一个没有通配符的表达式组成的检索表达式转换为一个&#8220;=&#8221;操作符表达式。<br />
例如：优化器会把表达式ename&nbsp;LIKE&nbsp;'SMITH'转换为ename&nbsp;=&nbsp;'SMITH'<br />
优化器只能转换涉及到可变长数据类型的表达式，前一个例子中，如果ENAME字段的类型是CHAR(10)，&nbsp;那么优化器将不做任何转换。<br />
一般来讲LIKE比较难以优化。<br />
<br />
其中：<br />
~~&nbsp;IN&nbsp;操作符优化：<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器把使用IN比较符的检索表达式替换为等价的使用&#8220;=&#8221;和&#8220;OR&#8221;操作符的检索表达式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如，优化器会把表达式ename&nbsp;IN&nbsp;('SMITH','KING','JONES')替换为<br />
ename&nbsp;=&nbsp;'SMITH'&nbsp;OR&nbsp;ename&nbsp;=&nbsp;'KING'&nbsp;OR&nbsp;ename&nbsp;=&nbsp;'JONES&#8216;<br />
<br />
~~&nbsp;ANY和SOME&nbsp;操作符优化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器将跟随值列表的ANY和SOME检索条件用等价的同等操作符和&#8220;OR&#8221;组成的表达式替换。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如，优化器将如下所示的第一条语句用第二条语句替换：<br />
&nbsp;&nbsp;&nbsp;&nbsp;sal&nbsp;&gt;&nbsp;ANY&nbsp;(:first_sal,&nbsp;:second_sal)<br />
&nbsp;&nbsp;&nbsp;&nbsp;sal&nbsp;&gt;&nbsp;:first_sal&nbsp;OR&nbsp;sal&nbsp;&gt;&nbsp;:second_sal<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器将跟随子查询的ANY和SOME检索条件转换成由&#8220;EXISTS&#8221;和一个相应的子查询组成的检索表达式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如，优化器将如下所示的第一条语句用第二条语句替换：<br />
&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&gt;&nbsp;ANY&nbsp;(SELECT&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;job&nbsp;=&nbsp;'ANALYST')<br />
&nbsp;&nbsp;&nbsp;&nbsp;EXISTS&nbsp;(SELECT&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;job&nbsp;=&nbsp;'ANALYST'&nbsp;AND&nbsp;x&nbsp;&gt;&nbsp;sal)<br />
<br />
~~&nbsp;ALL操作符优化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器将跟随值列表的ALL操作符用等价的&#8220;=&#8221;和&#8220;AND&#8221;组成的表达式替换。例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;sal&nbsp;&gt;&nbsp;ALL&nbsp;(:first_sal,&nbsp;:second_sal)表达式会被替换为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;sal&nbsp;&gt;&nbsp;:first_sal&nbsp;AND&nbsp;sal&nbsp;&gt;&nbsp;:second_sal<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于跟随子查询的ALL表达式，优化器用ANY和另外一个合适的比较符组成的表达式替换。例如<br />
&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&gt;&nbsp;ALL&nbsp;(SELECT&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;deptno&nbsp;=&nbsp;10)&nbsp;替换为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;(x&nbsp;&lt;=&nbsp;ANY&nbsp;(SELECT&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;deptno&nbsp;=&nbsp;10))<br />
&nbsp;&nbsp;&nbsp;&nbsp;接下来优化器会把第二个表达式适用ANY表达式的转换规则转换为下面的表达式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;EXISTS&nbsp;(SELECT&nbsp;sal&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;deptno&nbsp;=&nbsp;10&nbsp;AND&nbsp;x&nbsp;&lt;=&nbsp;sal)<br />
<br />
~~&nbsp;BETWEEN&nbsp;操作符优化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器总是用&#8220;&gt;=&#8221;和&#8220;&lt;=&#8221;比较符来等价的代替BETWEEN操作符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如：优化器会把表达式sal&nbsp;BETWEEN&nbsp;2000&nbsp;AND&nbsp;3000用sal&nbsp;&gt;=&nbsp;2000&nbsp;AND&nbsp;sal&nbsp;&lt;=&nbsp;3000来代替。<br />
<br />
~~&nbsp;NOT&nbsp;操作符优化:<br />
&nbsp;&nbsp;&nbsp;&nbsp;优化器总是试图简化检索条件以消除&#8220;NOT&#8221;逻辑操作符的影响，这将涉及到&#8220;NOT&#8221;操作符的消除以及代以相应的比较运算符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如，优化器将下面的第一条语句用第二条语句代替：<br />
&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;deptno&nbsp;=&nbsp;(SELECT&nbsp;deptno&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;ename&nbsp;=&nbsp;'TAYLOR')<br />
&nbsp;&nbsp;&nbsp;&nbsp;deptno&nbsp;&lt;&gt;&nbsp;(SELECT&nbsp;deptno&nbsp;FROM&nbsp;emp&nbsp;WHERE&nbsp;ename&nbsp;=&nbsp;'TAYLOR')<br />
&nbsp;&nbsp;&nbsp;&nbsp;通常情况下一个含有NOT操作符的语句有很多不同的写法，优化器的转换原则是使&#8220;NOT&#8221;操作符后边的子句尽可能的简单，即使可能会使结果表达式包含了更多的&#8220;NOT&#8221;操作符。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如，优化器将如下所示的第一条语句用第二条语句代替：<br />
&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;(sal&nbsp;&lt;&nbsp;1000&nbsp;OR&nbsp;comm&nbsp;IS&nbsp;NULL)<br />
&nbsp;&nbsp;&nbsp;&nbsp;NOT&nbsp;sal&nbsp;&lt;&nbsp;1000&nbsp;AND&nbsp;comm&nbsp;IS&nbsp;NOT&nbsp;NULL&nbsp;sal&nbsp;&gt;=&nbsp;1000&nbsp;AND&nbsp;comm&nbsp;IS&nbsp;NOT&nbsp;NULL<br />
<br />
<br />
<table cellspacing="2" cellpadding="2" width="500" border="0">
    <tbody>
        <tr>
            <td>合理的索引设计</td>
        </tr>
    </tbody>
</table>
<br />
<br />
例：表record有620000行，试看在不同的索引下，下面几个SQL的运行情况：<br />
语句A<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;date&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">19991201</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;date&nbsp;</span><span style="color: #808080">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">19991214&#8216;&nbsp;and&nbsp;amount&nbsp;&gt;2000</span></div>
<p><br />
<br />
语句B<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">count</span><span style="color: #000000">(</span><span style="color: #808080">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;date&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">19990901</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;place&nbsp;</span><span style="color: #808080">IN</span><span style="color: #000000">&nbsp;(</span><span style="color: #ff0000">'</span><span style="color: #ff0000">BJ</span><span style="color: #ff0000">'</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">SH</span><span style="color: #ff0000">'</span><span style="color: #000000">)</span></div>
<p><br />
<br />
语句C<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;date,</span><span style="color: #ff00ff">sum</span><span style="color: #000000">(amount)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;record<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">group</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">by</span><span style="color: #000000">&nbsp;date</span></div>
<p><br />
1&nbsp;在date上建有一个非聚集索引<br />
A：(25秒)<br />
B：(27秒)<br />
C：(55秒)<br />
分析：<br />
date上有大量的重复值，在非聚集索引下，数据在物理上随机存放在数据页上，在范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。<br />
2&nbsp;在date上的一个聚集索引<br />
A：（14秒）<br />
B：（14秒）<br />
C：（28秒）<br />
分析：<br />
在聚集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。<br />
3&nbsp;在place，date，amount上的组合索引<br />
A：（26秒）<br />
C：（27秒）<br />
B：（&lt;&nbsp;1秒）<br />
分析：<br />
这是一个不很合理的组合索引，因为它的前导列是place，第一和第二条SQL没有引用place，因此也没有利用上索引；第三个SQL使用了place，且引用的所有列都包含在组合索引中，形成了索引覆盖，所以它的速度是非常快的。<br />
4&nbsp;在date，place，amount上的组合索引<br />
A：&nbsp;(&lt;&nbsp;1秒)<br />
B：（&lt;&nbsp;1秒）<br />
C：（11秒）<br />
分析：<br />
这是一个合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/206919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-10 13:47 <a href="http://www.blogjava.net/baoyaer/articles/206919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对数据表中大字段的处理方式</title><link>http://www.blogjava.net/baoyaer/articles/203996.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 May 2008 01:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/203996.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/203996.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/203996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/203996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/203996.html</trackback:ping><description><![CDATA[在数据库中，经常需要用到大字段类型，如oracle中long/blob/clob,sqlserver中text/image，mysql中的text/longtext/clob/blob。 <br />
存储的信息大概主要是两类，一类是长文本，如大段的文字，普通的varchar最长只能存储4000个汉字，已经不能满足要求；另一类是存储二进制信息，如上传的文件等。 <br />
　<br />
那么假如现在有一个表，记录某人发布的文档信息，字段包括：发布人，发布时间，文档标题，文档内容(实际中还会有其它字段)，一般建表如下(sqlserver)： <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;document(&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />id&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">identity</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />createuser_id&nbsp;</span><span style="font-weight: bold; color: #000000">int</span><span style="color: #000000">,&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document_title&nbsp;</span><span style="font-weight: bold; color: #000000">varchar</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">255</span><span style="color: #000000">),&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />document_context&nbsp;</span><span style="font-weight: bold; color: #000000">text</span><span style="color: #000000">);&nbsp;</span></div>
<br />
这张表的结构，表面上看起来，从数据库设计角度和对应的JAVA类的设计来讲，都是没有问题的。 <br />
但实际上，这里面隐藏着两个比较严重的问题！ <br />
一、不能完全跨数据库 <br />
<br />
　why?问题出在需要查重(distinct)的时候。 <br />
　　在需要查重时，采用纯jdbc技术，则可以自定义要查重的字段，如select distinct id,createuser_id,document_title from document。而当采用hibernate时，若不想自已创建若干个新的Pojo或者使用Object[]方式来处理数据，则只能使用select distinct d from document as d这样的语句，而hibernate会将其解析为类似：select distinct id,createuser_id,document_title,document_context from document。 <br />
　　问题就出在这个document_context字段上！ <br />
　　对于mysql来讲，hibernate生成的sql是可以执行的。但对于sqlserver来讲，是不允许在text/image列上进行distinct查询的！oracle中同样不可以对clob/blob进行distinct查询。 <br />
　　因此系统在sqlserver/oracle上部署时，当需要查重时则会出错。当然如果你用不到查重语句，是一点不受影响的。 <br />
<br />
二、严重影响列表显示和统计的效率 <br />
　　影响一张表的查询速度的，除了行数，还包括表所占的物理空间的大小。此表在数据量较小时，在查询方面感觉不到明显的差异。但是如果document_context字段所存储的数据都是大段文本或较大的文件时，会导致表的物理空间迅速变大，该字段所占用的空间有可能达到整表所占空间的90%以上。在此基础上，如果行数再增加到数十万、上百万级时，整个表所占的空间将达到一个惊人的数字。 <br />
　　保守估计，一条记录占用的空间平均为10K的话，一万条记录将占用100M的空间，一百万条记录将占用10G！在此表上的CRUD操作，亦将变慢，查询的速度亦会受到非常大的影响 。当然通过提高服务器本身的硬件性能和优化索引，可以提高查询速度，但面对无法预知的巨大洪水，单纯加固堤坝是不保险的。<br />
&nbsp;<br />
<br />
解决的方式？ <br />
　　曾经处理过公司内的一个老系统，表的行数达到十万左右，由于采用上面的设计方式，虽然已经尽可能优化了索引，但查询分页时，仍然需要十秒左右。我单独建了一个新表，将document_context这个字段移到新表中，在原表中加一个对应的外键列，经过处理后，分页显示响应时间降到毫秒级以内。（二进制数据的转移是无法使用普通 的数据导入导出方式的，我的方法是复制该表，然后再修改复制后的表结构） <br />
　　因为这个大字段，在最常用的列表显示中是根本不需要关心的，仅当用户需要查看某一记录的具体信息时，才需要调入该字段信息。因此分表后，显著提高了分页性能。 <br />
<br />
<p>在我现在开发的所有的系统中，我都采用了上述的方式，这样做属于未雨绸缪，一旦系统部署后再修改，可能就来不及了。 </p>
<p>补充：近日公司的另一套CMS系统，已经出现 了上述问题。clob字段直接置于业务表中，现业务表记录已达20余万，查询的速度非常缓慢，被迫采用各种方式来解决。如果当初设计时就考虑到这方面就不会有这样的问题了。 <br />
PS：解决方案之一是，可以在Pojo中加入构造函数，参数中包含除clob字段外的所有其它字段，通过select new Pojo(field1,field2,.....) from Pojo的方式来处理。但要注意，fieldx不能为集合类型，只能为基本数据类型或Po类型。如public Pojo(Long id,String name,User usr,Date createDate){} </p>
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/203996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-30 09:00 <a href="http://www.blogjava.net/baoyaer/articles/203996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle内置函数大全</title><link>http://www.blogjava.net/baoyaer/articles/194847.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 22 Apr 2008 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/194847.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/194847.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/194847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/194847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/194847.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;1SQL中的单记录函数&nbsp;&nbsp;21.ASCII&nbsp;&nbsp;3返回与指定的字符对应的十进制数;&nbsp;&nbsp;4SQL&gt;&nbsp;select&nbsp;ascii('A')&nbsp;A,ascii('a')&nbsp;a,ascii('0')&nbsp;zero,ascii('&nbsp;')&nbsp;space&nbsp;f...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/194847.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/194847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-22 18:10 <a href="http://www.blogjava.net/baoyaer/articles/194847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精简plsql/oracle客户端安装</title><link>http://www.blogjava.net/baoyaer/articles/193401.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 16 Apr 2008 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/193401.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/193401.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/193401.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/193401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/193401.html</trackback:ping><description><![CDATA[<p>1.下载软件</p>
<p>oracle.part1.rar、oracle.part2.rar、oracle.part3.rar</p>
<p>2.安装软件</p>
<p>分别安装&#8220;Oracle客户端&#8221;和&#8220;PLSQL Developer&#8221;软件。</p>
<p>3.配置</p>
<p>Oracle客户端的配制文件，默认会安装在&#8220;C:\Oracle\ora90\network\ADMIN&#8221;目录下，名为&#8220;tnsnames.ora&#8221;参考格式如下：</p>
<p>ORCL_192.168.1.246 =<br />
&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.246)(PORT = 1521))<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID = orcl)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVER = DEDICATED)<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/193401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-16 13:22 <a href="http://www.blogjava.net/baoyaer/articles/193401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> MySQL数据库单一表突破4G限制的实现方法  </title><link>http://www.blogjava.net/baoyaer/articles/175440.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 15 Jan 2008 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/175440.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/175440.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/175440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/175440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/175440.html</trackback:ping><description><![CDATA[<table id="tblDetail_118520" style="table-layout: fixed; word-break: break-all; word-wrap: break-word" cellspacing="0" cellpadding="0" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <table class="bottomline" cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td align="right" height="25"><span>2008-01-15 10:28:19</span>&nbsp;发表, 已被浏览了( <span class="article_view_count">7</span> )次&nbsp;┆ <span id="quote_118520" style="display: inline"><a title="推荐到内网最新文章栏目" onclick="quoteDoc('MySQL数据库单一表突破4G限制的实现方法','118520','刘开玄','http://intranet.trs.com.cn/portal/blog/u/liu.kaixuan/d118520.html')" href="javascript:">推荐到内网</a>┆ </span><span><a id="lnkHomePage" href="http://intranet.trs.com.cn/portal/blog/u/liu.kaixuan/">首页</a></span>&nbsp;┆ <span><a href="http://intranet.trs.com.cn/portal/blog/u/liu.kaixuan/d118520.html#Commenting">查看评论</a></span>&nbsp;&nbsp; </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td class="docbody">
            <p>zt, for MYISAM&nbsp;tables of&nbsp;older Mysql&nbsp;versions.</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;近日，一位Discuz!老用户的论坛在发表回复时出现&#8220;<font color="#ff0000">The table is full</font>&#8221;的提示，字面意义上是数据表已满的意思。因为很少有开发者遭遇单一表超过4G的情况，因此朋友间的讨论只能提供一些外围的信息。为解决此问题，我翻阅了很多资料，本文将以我此次问题的解决过程，介绍问题发生的原因及对策。</p>
            <p>　　根据经验，The table is full提示往往出现在以下两种情况：</p>
            <p>　　1. 表中设置了MAX_ROWS值，简单的说，若MAX_ROWS设置为100，而程序试图写入第101条记录，会出现此错误。</p>
            <p>　　2. 表满。这种情况是本文讨论的重点。</p>
            <p>　　我们认为MySQL在存取表的时候，存在一种定位分配规律。这个规律在默认的情况下，可以寻址4G以内的数据。超过这个大小，数据库将不能对数据定位，因而也无法进行读写。经过实验，这个限制是完全可以被突破的。</p>
            <p>　　本例中，用户的系统环境为双Athlon处理器、SCSI硬盘72G、2G内存，用户的帖子表数据尺寸为4294963640，接近4G(4G的实际字节数为4294967296)。</p>
            <p>　　首先SSH登录后，查看用户的系统信息：</p>
            <p>　　# uname -a</p>
            <p>　　Linux zichen.com 2.4.20-8smp #1 SMP Thu Mar 13 16:43:01 EST 2003 i686 athlon i386 GNU/Linux</p>
            <p>　　证明是Linux系统，根据内核版本2.4.20-8smp，加上国内使用的常见系统，估计应该是redhat 9发行包。</p>
            <p>　　# cat /etc/*release*</p>
            <p>　　Red Hat Linux release 9 (Shrike)</p>
            <p>　　这也证明了我们对系统版本的猜想。</p>
            <p>　　然后看一下用的是什么文件系统。因为该用户并非高手，估计在装系统的时候就是一路回车下来，redhat 9默认的应该是EXT3，不过我们还是看一下：</p>
            <p>　　# parted</p>
            <p>　　GNU Parted 1.6.3</p>
            <p>　　Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.</p>
            <p>This program is free software, covered by the GNU General Public License.</p>
            <p>　　This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of</p>
            <p>　　MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>
            <p>　　Using /dev/sda</p>
            <p>　　Information: The operating system thinks the geometry on /dev/sda is 8942/255/63. Therefore, cylinder 1024 ends at 8032.499M.</p>
            <p>　　(parted) print</p>
            <p>　　Disk geometry for /dev/sda: 0.000-70149.507 megabytes</p>
            <p>　　Disk label type: msdos</p>
            <p>　　Minor Start End Type Filesystem Flags</p>
            <p>　　1 0.031 101.975 primary ext3 boot</p>
            <p>　　2 101.975 10103.378 primary linux-swap</p>
            <p>　　证明确实是这样子。随后我们翻阅了EXT3文件系统的相关技术参数，EXT3是在EXT2基础上演变而来。<font color="#ff0000">EXT2所支持最大单一文件长度是2G，这个是很蹩脚的一个限制。EXT3做的很大一个改善就是将这个限制放大到了2TB</font>，由此稍松一口气，起码不是操作系统上的限制。</p>
            <p>　　经过朋友的开导，了解到单一文件大小有如下几个因素：</p>
            <p>　　1. 文件系统的限制(如刚存所说EXT3的2TB限制)</p>
            <p>　　2. <font color="#ff0000">某一程序进程所能存取的第一文件最大尺寸(例如apache在Linux EXT3下能存取的最大尺寸为2G，诸如日志)</font></p>
            <p>　　初步判断瓶颈就在上述其中第二项。随后找到myisamchk来显示一下表信息，证明了瓶颈就在MySQL本身的存取上。</p>
            <p><font color="#ff0000">　　# myisamchk -dv cdb_posts</font></p>
            <p>　　结果就不贴了，其中有一项Max datafile length的值恰好就是4G。由此产生了瓶颈。</p>
            <p>　　后来翻阅了N多资料，进行了N多尝试，也走了不少弯路，最终觉得还是官方文档比较可靠。比较老的文档里写道这是由于tmp_table_size的值造成的，也有提到用BIG-TABLES这个参数。事实证明这些都是歧途。大晚上的确实很累，这里只给出最终的解决方案吧，中间的就不罗嗦了。</p>
            <p>　进到mysql客户端。</p>
            <p>　　# mysql -uroot -p</p>
            <p>　　Enter password: ******</p>
            <p>　　Welcome to the MySQL monitor. Commands end with ; or g.</p>
            <p>　　Your MySQL connection id is 59411 to server version: 4.0.18-standard</p>
            <p>　　Type 'help;' or 'h' for help. Type 'c' to clear the buffer.</p>
            <p>　　mysql&gt; use ******</p>
            <p>　　Database changed</p>
            <p>　　mysql&gt; <font color="#ff0000">ALTER TABLE cdb_posts MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;</font></p>
            <p>　　因为这个表非常大，执行时间在双Athlon的专业服务器上竟然花了30分钟！</p>
            <p>　　之后再通过myisamchk查看该表的信息：</p>
            <p>　　# myisamchk -dv cdb_posts</p>
            <p>　　MyISAM file: cdb_posts</p>
            <p>　　Record format: Packed</p>
            <p>　　Character set: latin1 (8)</p>
            <p>　　File-version: 1</p>
            <p>　　Creation time: 2004-08-30 22:19:48</p>
            <p>　　Recover time: 2004-08-30 22:42:47</p>
            <p>　　Status: open,changed</p>
            <p>　　Auto increment key: 1 Last value: 1063143</p>
            <p>　　Data records: 619904 Deleted blocks: 5</p>
            <p>　　Datafile parts: 619909 Deleted data: 323872</p>
            <p>　　Datafile pointer (bytes): 6 Keyfile pointer (bytes): 4</p>
            <p>　　Datafile length: 4295287332 Keyfile length: 40421376</p>
            <p>　　Max datafile length: 281474976710654 Max keyfile length: 4398046510079</p>
            <p>　　Recordlength: 149</p>
            <p>　　table description:</p>
            <p>　　Key Start Len Index Type Rec/key Root Blocksize</p>
            <p>　　1 1 4 unique unsigned long 1 4535296 1024</p>
            <p>　　2 5 2 multip. unsigned short 13776 12540928 1024</p>
            <p>　　3 111 4 multip. unsigned long 1 18854912 1024</p>
            <p>　　4 28 3 multip. uint24 18 24546304 1024</p>
            <p>　　5 7 3 multip. uint24 7 32827392 1024</p>
            <p>　　111 4 unsigned long 1</p>
            <p>　　6 7 3 multip. uint24 7 40418304 1024</p>
            <p>　　28 3 uint24</p>
            <p>　　令人振奋的事情发生了，该表的 Max datafile length: 281474976710654 Max keyfile length: 4398046510079，即最大数据尺寸(MYD文件)达到了2TB，最大索引尺寸(MYI)仍然为4G。</p>
            <p>　　由此默认的4G限制被突破了。关于其中的原理，其实很简单：假设你有一个日记本，上面有10页纸可以写东西，编排目录只需要1个字节(因为0～9就够了)。如果你把这本子又塞进两张纸，变成12页，1个字节的目录空间就无法寻址到后面的两页中，进而产生了错误。上面那个ALTER语句中的数值都是我为保证成功，取的比较大的值(因为ALTER一次实在是太慢了，没时间在那乱试验)，相当于告诉数据库，这个本子有1000000000页，每页平均有 15000个字节。这样数据库便知道这是很大的一个本子，因此不遗余力的拿出了100页(假设说)做目录编排，这样这个新的目录就可以寻址到日记本的所有内容了。错误消失。</p>
            <p>　　惟一的缺点就是，目录占用的空间多了一些，但已经微乎其微了，做了这种改变其实4G的文件尺寸大小只增大了1M多，非常令人振奋。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/baoyaer/aggbug/175440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-15 13:00 <a href="http://www.blogjava.net/baoyaer/articles/175440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>维护oracle10g的回收站(转自eygle的网站)</title><link>http://www.blogjava.net/baoyaer/articles/172736.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 04 Jan 2008 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/172736.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/172736.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/172736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/172736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/172736.html</trackback:ping><description><![CDATA[<h4 class="TextColor1" id="subjcns!f065e15da80cfaa9!258" style="margin-bottom: 0px">&nbsp;</h4>
<div class="bvMsg" id="msgcns!f065e15da80cfaa9!258">
<div>本文转自eygle的文章:<a href="http://www.eygle.com/archives/2005/12/how_to_maintain_10g_recyclebin.html"><font color="#0082ff">http://www.eygle.com/archives/2005/12/how_to_maintain_10g_recyclebin.html</font></a> </div>
<p>从Oracle10g开始，Oracle引入了<a href="http://www.eygle.com/archives/2005/03/eoaoracle10giaa.html"><font color="#0082ff">flashback drop的新特性</font></a>，这个新特性，允许你从当前数据库中恢复一个被drop了的对象。在执行drop操作时，现在Oracle不是真正删除它，而是将该对象自动将放入回收站。对于一个对象的删除，其实仅仅就是简单的重令名操作。
<p><br />
所谓的回收站，是一个虚拟的容器，用于存放所有被删除的对象。在回收站中，被删除的对象将占用创建时的同样的空间，你甚至还可以对已经删除的表查询，也可以利用flashback功能来恢复它， 这个就是flashback drop功能。
<p>这个功能虽然可以极大的简化误drop导致的恢复操作，但是长时间的积累可能会导致大量的空间占用(虽然Oracle具有自己的清理机制)，很多时候我们需要手工介入去清理回收站。本文主要介绍清理回收站的几种方法.
<p>&nbsp;1.大量累计的空间占用
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <pre>Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 <br />
            Connected as SYS</pre>
            <pre><br />
            SQL&gt; col owner for a12<br />
            SQL&gt; select owner,object_name,CREATETIME,DROPTIME from dba_recyclebin<br />
            &nbsp; 2&nbsp; order by droptime<br />
            &nbsp; 3&nbsp; /</pre>
            <pre>OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATETIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DROPTIME<br />
            ------------ ------------------------------ ------------------- -------------------<br />
            COMMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIN$AHsQ+pi+Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17<br />
            COMMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIN$AHsQ+pi9Kb/gRAADumkBdQ==$0 2005-08-29:16:42:19 2005-09-11:15:36:17<br />
            PDA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIN$AdEb4zqqUcTgRAADumkBdQ==$0 2005-09-05:10:31:01 2005-09-28:15:40:39<br />
            ......<br />
            BJLAIS_RUN&nbsp;&nbsp; BIN$BtkGRT0dSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17<br />
            BJLAIS_RUN&nbsp;&nbsp; BIN$BtkGRT0cSwfgRAADumkBdQ==$0 2005-11-30:10:54:07 2005-12-01:16:13:17</pre>
            <pre>750 rows selected</pre>
            <pre>SQL&gt; </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>2.不同用户在回收站的对象
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <pre>SQL&gt; select owner,count(*) from dba_recyclebin group by owner;&nbsp;&nbsp; </pre>
            <pre>OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(*)<br />
            -------------------- ----------<br />
            BJLAIS_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 44<br />
            COMMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
            MMSBLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 618<br />
            MMSHAWA_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
            PDA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
            RING_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 70</pre>
            <pre>6 rows selected.</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>3.我们可以指定删除某些特定对象
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <p>SQL&gt; purge table common.T_SERVICE_CODE_INFO;
            <p>Table purged.</p>
            </td>
        </tr>
    </tbody>
</table>
<p>4.指定清除某个表空间的所有回收站对象
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <pre>SQL&gt; purge tablespace common;</pre>
            <pre>Tablespace purged.</pre>
            <pre>SQL&gt; select owner,count(*) from dba_recyclebin group by owner;&nbsp;&nbsp; </pre>
            <pre>OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COUNT(*)<br />
            -------------------- ----------<br />
            BJLAIS_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 44<br />
            MMSBLOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 618<br />
            MMSHAWA_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
            PDA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
            RING_RUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 70</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>5.以SYSDBA身份可以清除所有回收站对象
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <p><font face="Courier New">SQL&gt; purge dba_recyclebin;</font>
            <p><font face="Courier New">DBA Recyclebin purged.</font>
            <p><font face="Courier New">SQL&gt; select owner,count(*) from dba_recyclebin group by owner;&nbsp;&nbsp; </font>
            <p><font face="Courier New">no rows selected</font><br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<p>6.禁用recyclebin
<p>&nbsp;
<div>
<div>
<p>如果我们不希望使用Oracle的recyclebin,可以通过参数禁用这个特性。
<p>在Oracle10gR1中，通过修改一个隐含参数:_recyclebin 为False可以禁用这个特性:
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <pre>SQL&gt; set linesize 132<br />
            SQL&gt; column name format a30<br />
            SQL&gt; column value format a25<br />
            SQL&gt; select<br />
            &nbsp; 2&nbsp;&nbsp;&nbsp; x.ksppinm&nbsp; name,<br />
            &nbsp; y.ksppstvl&nbsp; value,<br />
            &nbsp; 3&nbsp;&nbsp;&nbsp; y.ksppstdf&nbsp; isdefault,<br />
            &nbsp; 4&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE')&nbsp; ismod,<br />
            &nbsp; 6&nbsp;&nbsp;&nbsp; decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE')&nbsp; isadj<br />
            &nbsp; 7&nbsp; from<br />
            &nbsp; 8&nbsp;&nbsp;&nbsp; sys.x$ksppi x,<br />
            &nbsp; 9&nbsp;&nbsp;&nbsp; sys.x$ksppcv y<br />
            &nbsp;10&nbsp; where<br />
            &nbsp;11&nbsp;&nbsp;&nbsp; x.inst_id = userenv('Instance') and<br />
            &nbsp;12&nbsp;&nbsp;&nbsp; y.inst_id = userenv('Instance') and<br />
            &nbsp;13&nbsp;&nbsp;&nbsp; x.indx = y.indx and<br />
            &nbsp;14&nbsp;&nbsp;&nbsp; x.ksppinm like '%&amp;par%'<br />
            &nbsp;15&nbsp; order by<br />
            &nbsp;16&nbsp;&nbsp;&nbsp; translate(x.ksppinm, ' _', ' ')<br />
            &nbsp;17&nbsp; /<br />
            Enter value for par: recyclebin<br />
            old&nbsp; 14:&nbsp;&nbsp; x.ksppinm like '%&amp;par%'<br />
            new&nbsp; 14:&nbsp;&nbsp; x.ksppinm like '%recyclebin%'</pre>
            <pre>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISDEFAULT ISMOD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISADJ<br />
            ------------------------------ ------------------------- --------- ---------- -----<br />
            _recyclebin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE</pre>
            <pre>1 row selected.<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>在Oracle10gR2中，recyclebin变成了一个常规参数，可以在session/system级动态修改:
<p>
<table>
    <tbody>
        <tr>
            <td width="500" bgcolor="#999999">
            <pre>[oracle@danaly ~]$ sqlplus "/ as sysdba"</pre>
            <pre>SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 12 15:34:56 2005</pre>
            <pre>Copyright (c) 1982, 2005, Oracle.&nbsp; All rights reserved.</pre>
            <pre><br />
            Connected to:<br />
            Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production<br />
            With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options</pre>
            <pre>SQL&gt; show parameter recyclebin </pre>
            <pre>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
            ------------------------------------ ----------- ------------------------------<br />
            recyclebin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on</pre>
            <pre>SQL&gt; alter session set recyclebin=off;</pre>
            <pre>Session altered.</pre>
            <pre>SQL&gt; alter session set recyclebin=on<br />
            &nbsp; 2&nbsp; /</pre>
            <pre>Session altered.</pre>
            <pre>SQL&gt; alter system set recyclebin=off;</pre>
            <pre>System altered.</pre>
            <pre>SQL&gt; alter system set recyclebin=on;</pre>
            <pre>System altered.</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/172736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-01-04 14:31 <a href="http://www.blogjava.net/baoyaer/articles/172736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver 创建数据库：</title><link>http://www.blogjava.net/baoyaer/articles/171110.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 28 Dec 2007 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/171110.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/171110.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/171110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/171110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/171110.html</trackback:ping><description><![CDATA[ＳＱＬ：　<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">exists</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">From</span><span style="color: #000000">&nbsp;master.dbo.sysdatabases&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;name</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">$SQLSERVER_DB_NAME$</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;status</span><span style="color: #808080">&lt;&gt;</span><span style="font-weight: bold; color: #800000">512</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">drop</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">database</span><span style="color: #000000">&nbsp;$SQLSERVER_DB_NAME$;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">not</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">exists</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">From</span><span style="color: #000000">&nbsp;master.dbo.sysdatabases&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;name</span><span style="color: #808080">=</span><span style="color: #ff0000">'</span><span style="color: #ff0000">$SQLSERVER_DB_NAME$</span><span style="color: #ff0000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">and</span><span style="color: #000000">&nbsp;status</span><span style="color: #808080">&lt;&gt;</span><span style="font-weight: bold; color: #800000">512</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">create</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">database</span><span style="color: #000000">&nbsp;$SQLSERVER_DB_NAME$;</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/171110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-28 10:56 <a href="http://www.blogjava.net/baoyaer/articles/171110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手工创建oracle数据库</title><link>http://www.blogjava.net/baoyaer/articles/171098.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 28 Dec 2007 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/171098.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/171098.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/171098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/171098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/171098.html</trackback:ping><description><![CDATA[<p class="date">&nbsp;</p>
<div>
<p>一直就想把这篇文章加进来，只可以一直没有时间。刚好今天给我在测试机器上来了个误操作rm * backup/*,把正在运行的数据库中的数据文件全部删除了，真是郁闷！还好这个是给我们新人们测试玩的，要不然就死定了！在此也做一个提醒，<strong>身为DBA,要永远记住甚用或者禁止使用rm命令，万不得以的情况下，使用时在敲enter也要看了又看、慎重又慎重才行！</strong>好了，费话不说了，下面请看我的过程。</p>
<br />
<p><strong><span lang="EN-US" style="font-size: 9pt">Red Hat Enterprise 3 + Oracle 10g Release 2</span></strong></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">$su &#8211; oracle</span></strong></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">1--- </span></strong><strong><span style="font-size: 9pt; font-family: 宋体">设置系统环境变量：</span></strong></p>
<p><span lang="EN-US" style="font-size: 9pt">ORACLE_HOME=/opt/oracle/product/10.2</span></p>
<p><span lang="EN-US" style="font-size: 9pt">ORACLE_BASE=/opt/oracle</span></p>
<p><span lang="EN-US" style="font-size: 9pt">ORACLE_SID=dbtest</span></p>
<p><span lang="EN-US" style="font-size: 9pt">......</span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">2--- </span></strong><strong><span style="font-size: 9pt; font-family: 宋体">系统规划：</span></strong></p>
<p><span style="font-size: 9pt; font-family: 宋体">实例名称</span><span lang="EN-US" style="font-size: 9pt">ORACLE_SID=dbtest</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">数据库名称</span><span lang="EN-US" style="font-size: 9pt">DB_NAME=dbtest</span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">3--- </span></strong><strong><span style="font-size: 9pt; font-family: 宋体">手工创建如下目录：</span></strong></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/admin/dbtest/cdump</span></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/admin/dbtest/bdump</span></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/admin/dbtest/udump</span></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/admin/dbtest/pfile</span></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/oradata/dbtest/</span></p>
<p><span lang="EN-US" style="font-size: 9pt">/opt/oracle/oradata/dbtest/archive</span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">4--- </span></strong><strong><span style="font-size: 9pt; font-family: 宋体">建立密码文件：</span></strong></p>
<p><span lang="EN-US" style="font-size: 9pt">orapwd file=/opt/oracle/product/10.2/dbs/orapwd_dbtest password=superman</span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt">5---</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">修改参数文件：</span></strong></p>
<p><span style="font-size: 9pt; font-family: 宋体">格式：</span><span lang="EN-US" style="font-size: 9pt">/opt/oracle/product/10.2/dbs/init.ora</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">实例：</span><span lang="EN-US" style="font-size: 9pt">/opt/oracle/product/10.2/dbs/initdbtest.ora</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">内容如下：</span></p>
<span style="font-size: 9pt; font-family: 宋体"><font face="宋体, MS Song"><font size="3">
<p>---------------------------------------------------</p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">dbtest.__db_cache_size=331350016</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">dbtest.__java_pool_size=4194304</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">dbtest.__large_pool_size=8388608</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">dbtest.__shared_pool_size=138412032</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">dbtest.__streams_pool_size=0</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*._kgl_large_heap_warning_threshold=8388608</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.audit_file_dest='/opt/oracle/admin/dbtest/adump'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.background_dump_dest='/opt/oracle/admin/dbtest/bdump'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.compatible='10.2.0.1.0'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.control_files='/opt/oracle/oradata/dbtest/control01.ctl','/opt/oracle/oradata/dbtest/control02.ctl','/opt/oracle/oradata/dbtest/control03.ctl'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.core_dump_dest='/opt/oracle/admin/dbtest/cdump'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_2k_cache_size=33554432</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_block_size=8192</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_domain=''</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_file_multiblock_read_count=128</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_files=4000</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_name='dbtest'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_recovery_file_dest_size=4294967296</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.db_recovery_file_dest=''</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.log_archive_dest='/opt/oracle/oradata/dbtest/archive'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.log_checkpoints_to_alert=FALSE</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.open_cursors=300</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.parallel_execution_message_size=65535</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.parallel_max_servers=128</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.pga_aggregate_target=209715200</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.processes=150</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.recyclebin='OFF'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.remote_login_passwordfile='EXCLUSIVE'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.replication_dependency_tracking=FALSE</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.session_cached_cursors=100</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.sga_target=500m</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.shared_pool_size=100m</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.undo_management='AUTO'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.undo_retention=0</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.undo_tablespace='UNDOTS'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.user_dump_dest='/opt/oracle/admin/dbtest/udump'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">*.workarea_size_policy='AUTO'</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">_allow_resetlogs_corruption=true</font></span></p>
<p>
<p>---------------------------------------------------</p>
<p>
<p><strong><span style="font-size: 9pt; font-family: 宋体">可将此文件复制到：</span></strong><strong><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">/opt/oracle/admin/dbtest/pfile/init.ora</font></span></strong></p>
<p><strong><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">6--- </font></span></strong><strong><span style="font-size: 9pt; font-family: 宋体">登陆</span></strong><strong><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">oracle</font></span></strong><strong><span style="font-size: 9pt; font-family: 宋体">：</span></strong></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">&gt; sqlplus &#8220;/ as sysdba&#8221;</font></span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">7--- </font></span></strong><strong><span style="font-size: 9pt; font-family: 宋体">启动实例：</span></strong></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">SQL&gt; startup nomount pfile=/opt/oracle/admin/dbtest/pfile/init.ora</font></span></p>
<p><strong><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">8--- </font></span></strong><strong><span style="font-size: 9pt; font-family: 宋体">创建数据库的脚本：</span></strong></p>
<p><strong><span style="font-size: 9pt; font-family: 宋体">-----------------------------------------------------------</span></strong></p>
<span style="font-size: 9pt; font-family: 宋体">
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">CREATE DATABASE dbtest</font></span></p>
<p><font face="Times New Roman"><span lang="EN-US" style="font-size: 9pt">LOGFILE</span></font></p>
<p style="text-indent: 40.5pt"><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">GROUP 1 ('/opt/oracle/oradata/dbtest/redo01.log','/opt/oracle/oradata/dbtest/redo01_1.log') size 100m reuse, </font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">GROUP 2 ('/opt/oracle/oradata/dbtest/redo02.log','/opt/oracle/oradata/dbtest/redo02_1.log') size 100m reuse, </font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">GROUP 3 ('/opt/oracle/oradata/dbtest/redo03.log','/opt/oracle/oradata/dbtest/redo03_1.log') size 100m reuse</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">MAXLOGFILES 50</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">MAXLOGMEMBERS 5</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">MAXLOGHISTORY 200</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">MAXDATAFILES 500</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">MAXINSTANCES 5</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">ARCHIVELOG</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">CHARACTER SET UTF8</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">NATIONAL CHARACTER SET UTF8</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">DATAFILE '/opt/oracle/oradata/dbtest/system01.dbf' SIZE 1000M EXTENT MANAGEMENT LOCAL </font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">SYSAUX DATAFILE '/opt/oracle/oradata/dbtest/sysaux01.dbf' SIZE 1000M</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">UNDO TABLESPACE UNDOTS DATAFILE '/opt/oracle/oradata/dbtest/undo.dbf' SIZE 500M</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/opt/oracle/oradata/dbtest/temp.dbf' SIZE 500M</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">;</font></span></p>
<p><strong><span style="font-size: 9pt; font-family: 宋体">-----------------------------------------------------------</span></strong></p>
<span style="font-size: 9pt; font-family: 宋体">
<p><span><strong><font face="Times New Roman">9--- </font>运行如下文件<font face="Times New Roman">(</font>安装下面的先后顺序<font face="Times New Roman">)</font>：</strong></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">/opt/oracle/product/10.2/rdbms/admin/catalog.sql</font></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">/opt/oracle/product/10.2/rdbms/admin/catproc.sql</font></span></p>
<p><span><strong><font face="Times New Roman">10--- </font>创建相关表空间与用户：</strong></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">CREATE TABLESPACE USERS DATAFILE '/opt/oracle/oradata/dbtest/users01.dbf' SIZE 1000M;---</font></span><span style="font-size: 9pt; font-family: 宋体">数据表空间</span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">CREATE TABLESPACE INDX DATAFILE '/opt/oracle/oradata/dbtest/indx01.dbf' SIZE 1000M;---</font></span><span style="font-size: 9pt; font-family: 宋体">在建立索引的时候把此表空间作为存储空间，即单独用一个表空间来存储索引，这是个好习惯，虽然我们没有办法建立一个默认的索引表空间！</span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE users ;---</font></span><span style="font-size: 9pt; font-family: 宋体">测试用户</span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">GRANT CONNECT,RESOURCE TO test;</font></span></p>
<p><span><strong><font face="Times New Roman">11--- </font>一点注意的地方：</strong></span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">1&gt;.</font></span><span style="font-size: 9pt; font-family: 宋体">相关文件的目录要设置正确，有数据文件，控制文件，参数文件等，还有就是它们的位置要与控制文件中指定的要一致。</span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">2&gt;.init.ora</font></span><span style="font-size: 9pt; font-family: 宋体">中的</span><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">undo_tablespace</font></span><span style="font-size: 9pt; font-family: 宋体">的名字必须要与</span><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">create database</font></span><span style="font-size: 9pt; font-family: 宋体">的相同，包括大小写等注意。否则很麻烦，报的错误你都不知道是不是在忽悠你！总之，一句话，控制文件中的内容要和</span><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">init</font></span><span style="font-size: 9pt; font-family: 宋体">文件中的内容以及要和实际文件的实际情况要相同。</span></p>
<p><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">3&gt;.</font></span><span style="font-size: 9pt; font-family: 宋体">分析数据库出错可以到</span><span lang="EN-US" style="font-size: 9pt"><font face="Times New Roman">/opt/oracle/admin/dbtest/bdump/alert_dbtest.log</font></span><span style="font-size: 9pt; font-family: 宋体">中查找。</span></span></span></font></font></span></p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/171098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-28 10:34 <a href="http://www.blogjava.net/baoyaer/articles/171098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>乐观锁和悲观锁</title><link>http://www.blogjava.net/baoyaer/articles/167458.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167458.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167458.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167458.html</trackback:ping><description><![CDATA[<p>数据的锁定分为两种方法，第一种叫做悲观锁，第二种叫做乐观锁。什么叫悲观锁呢，悲观锁顾名思义，就是对数据的冲突采取一种悲观的态度，也就是说假设数据肯定会冲突，所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突，所以在数据进行提交更新的时候，才会正式对数据的冲突与否进行检测，如果发现冲突了，则让用户返回错误的信息，让用户决定如何去做。<strong> <br />
</strong></p>
<p><strong></strong>&nbsp;</p>
<p><strong>所谓悲观锁<br />
</strong>先从悲观锁开始说。在SqlServer等其余很多数据库中，数据的锁定通常采用页级锁的方式，也就是说对一张表内的数据是一种串行化的更新插入机制，在任何时间同一张表只会插1条数据，别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低，在多用户并发访问的时候，当对一张表进行频繁操作时，会发现响应效率很低，数据库经常处于一种假死状态。而Oracle用的是行级锁，只是对想锁定的数据才进行锁定，其余的数据不相干，所以在对Oracle表中并发插数据的时候，基本上不会有任何影响。 <br />
<br />
<span style="color: red">注：对于悲观锁是针对并发的可能性比较大，而一般在我们的应用中用乐观锁足以。</span> <br />
<br />
Oracle的悲观锁需要利用一条现有的连接，分成两种方式，从SQL语句的区别来看，就是一种是for update，一种是for update nowait的形式。比如我们看一个例子。首先建立测试用的数据库表。 <br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;TEST(ID,NAME,LOCATION,VALUE,</span><span style="color: #0000ff">CONSTRAINT</span><span style="color: #000000">&nbsp;test_pk&nbsp;</span><span style="color: #0000ff">PRIMARY</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">KEY</span><span style="color: #000000">(ID))</span><span style="color: #0000ff">AS</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;deptno,&nbsp;dname,&nbsp;loc,&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;scott.dept&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
这里我们利用了Oracle的Sample的scott用户的表，把数据copy到我们的test表中。首先我们看一下for update锁定方式。首先我们执行如下的select for update语句。 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;test&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">update</span><span style="color: #000000">&nbsp;</span></div>
<p><br />
通过这条检索语句锁定以后，再开另外一个sql*plus窗口进行操作，再把上面这条sql语句执行一便，你会发现sqlplus好像死在那里了，好像检索不到数据的样子，但是也不返回任何结果，就属于卡在那里的感觉。这个时候是什么原因呢，就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait那就是wait)，所以第二个Session(也就是卡住的那个sql*plus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后，第二个session中的检索结果就是自动跳出来，并且也把数据锁定住。不过如果你第二个session中你的检索语句如下所示。 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;test&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">&nbsp;</span></div>
<p>也就是没有for update这种锁定数据的语句的话，就不会造成阻塞了。另外一种情况，就是当数据库数据被锁定的时候，也就是执行刚才for update那条sql以后，我们在另外一个session中执行for update nowait后又是什么样呢。比如如下的sql语句。 由于这条语句中是制定采用nowait方式来进行检索，所以当发现数据被别的session锁定中的时候，就会迅速返回ORA-00054错误，内容是资源正忙, 但指定以 NOWAIT 方式获取资源。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中，如果锁定中的话，就要采取相应的业务措施进行处理。 <br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;test&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">update</span><span style="color: #000000">&nbsp;nowait&nbsp;</span></div>
<p>那这里另外一个问题，就是当我们锁定住数据的时候，我们对数据进行更新和删除的话会是什么样呢。比如同样，我们让第一个Session锁定住id=10的那条数据，我们在第二个session中执行如下语句。 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">update</span><span style="color: #000000">&nbsp;test&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;value</span><span style="color: #808080">=</span><span style="font-weight: bold; color: #800000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">where</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">&nbsp;</span></div>
<p>这个时候我们发现update语句就好像select for update语句一样也停住卡在这里，当你第一个session放开锁定以后update才能正常运行。当你update运行后，数据又被你update语句锁定住了，这个时候只要你update后还没有commit，别的session照样不能对数据进行锁定更新等等。 <br />
<br />
<br />
总之，Oracle中的悲观锁就是利用Oracle的Connection对数据进行锁定。在Oracle中，用这种行级锁带来的性能损失是很小的，只是要注意程序逻辑，不要给你一不小心搞成死锁了就好。而且由于数据的及时锁定，在数据提交时候就不呼出现冲突，可以省去很多恼人的数据冲突处理。缺点就是你必须要始终有一条数据库连接，就是说在整个锁定到最后放开锁的过程中，你的数据库联接要始终保持住。与悲观锁相对的，我们有了乐观锁。乐观锁一开始也说了，就是一开始假设不会造成数据冲突，在最后提交的时候再进行数据冲突检测。<br />
<br />
</p>
<p><strong>所谓乐观锁<br />
</strong>在乐观锁中，我们有2种 <br />
</p>
<p>第一种乐观锁的做法就是采用版本戳，这个在Hibernate中得到了使用。采用版本戳的话，首先需要在你有乐观锁的数据库table上建立一个新的column，比如为number型，当你数据每更新一次的时候，版本数就会往上增加1。比如同样有2个session同样对某条数据进行操作。两者都取到当前的数据的版本号为1，当第一个session进行数据更新后，在提交的时候查看到当前数据的版本还为1，和自己一开始取到的版本相同。就正式提交，然后把版本号增加1，这个时候当前数据的版本为2。当第二个session也更新了数据提交的时候，发现数据库中版本为2，和一开始这个session取到的版本号不一致，就知道别人更新过此条数据，这个 </p>
<p>时候再进行业务处理，比如整个Transaction都Rollback等等操作。在用版本戳的时候，可以在应用程序侧使用版本戳的验证，也可以在数据库侧采用Trigger(触发器)来进行验证。不过数据库的Trigger的性能开销还是比较的大，所以能在应用侧进行验证的话还是推荐不用Trigger。 </p>
<p>第二种做法和第二种做法有点类似，就是也新增一个Table的Column，不过这次这个column是采用timestamp型，存储数据最后更新的时间。在Oracle9i以后可以采用新的数据类型，也就是timestamp with time zone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的，精确到微秒(还没与到纳秒的级别)，一般来说，加上数据库处理时间和人的思考动作时间，微秒级别是非常非常够了，其实只要精确到毫秒甚至秒都应该没有什么问题。和刚才的版本戳类似，也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比，如果一致则OK，否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中，也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中。 </p>
<p><br />
是基于应用的版本机制来实现的。一般会在表里面设计一个版本字段v（我一般会把这个字段设为timestamp）。一般的update场景是这样：<br />
1 select a, v from tb where id=1;&nbsp;&nbsp;&nbsp;<br />
假设得到数据是：['xxx', 11111] </p>
<p>2 update tb set a='yyyy', v=systimestamp where v=11111; //注意, v一般不会在业务操作的时候修改<br />
<br />
这要求每一次update操作都变更版本字段。否则还是要进程间的数据还是会被相互覆盖。 </p>
<p>乐观锁无法锁定其他应用对数据的操作。<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/167458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 12:03 <a href="http://www.blogjava.net/baoyaer/articles/167458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据迁移到SQL Server小结 </title><link>http://www.blogjava.net/baoyaer/articles/155017.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 22 Oct 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/155017.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/155017.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/155017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/155017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/155017.html</trackback:ping><description><![CDATA[<p>前两个月接了一个公安局的项目，这段时间终于接近尾声了，程序也基本没什么问题了。但数据迁移的需求摆到了我的面前，因为目前他们正在使用一套基于Oracle的C/S系统，这套系统里面有到目前为止所有的人员和案件信息，他们不想重新录入，所以需要从Oracle中迁移到目前的SQL Server中。<br />
1.我先在本机安装了一个高版本的Oracle数据库(9i),测试熟悉了一下，学习了一下数据的导入导出等等功能，然后从服务器上将现有的数据库导出并Download下来，在本地数据库中建立相同的用户，导入进本地数据库。<br />
2.由于Oracle转到SQL Server比较麻烦，所以我使用了现成的工具Full Convert Enterprise软件，很方便的将Oracle数据转移到了SQl Server，只有一条数据出现了错误，这点错误可以忽略不计。<br />
3.转移过来之后，查看数据库，发现绝大部分的字段都是varchar类型，就是因为都是这种类型带来了一些问题，比如日期，竟然有1940-04-00，晕死了，怪不得总是出现smalldatetime转换溢出，日起非法的问题，可以使用IsDate函数来检查一下，正确返回1，非法返回0<br />
4.原系统设计中最大的问题就是，犯罪人员可以重复添加进去，导致不同的案件相同的人员却有多个人员记录，冗余大。这还不算，身份证和出生日期可以为空，就更麻烦了，根本无法识别哪些是同一人员，对于迁移到新系统中来说很麻烦，没办法，只能修改原系统的数据库结构，将唯一性去掉。<br />
5.原系统中还有几点不好的地方就是，专门有一个表用来存放词典，而且比较大，几万条，案别，类别，省市区等等都放进去，最让我痛恨的是他省市区不是分开的，而且放在一起的，比如江苏南京，南京江宁，南京鼓楼，光这样都三条了，不大家可以推一下全国会出现多少条，不仅如此，他还没有分割称号，比如省、市、区、县、自治区等等。都没有，有的话还可以切分。新系统使用的省市区是分离的，所以我暂时没想到好的办法解决，就把原系统中的省市区加到了新系统的详细地址里面去了。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/155017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-22 16:14 <a href="http://www.blogjava.net/baoyaer/articles/155017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver 无法删除用户</title><link>http://www.blogjava.net/baoyaer/articles/143891.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Sep 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/143891.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/143891.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/143891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/143891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/143891.html</trackback:ping><description><![CDATA[碰到一个数据库下无法删除用户的情况，总是提示"该用户拥有对象，无法删除"，最后老大过来解释后，发现原来在该用户下有几个表对象，用sql语句去改变那些表的用户的语句：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">sp_changeobjectowner&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">can.WCMDocQuoteImage</span><span style="color: #ff0000">'</span><span style="color: #000000">,</span><span style="color: #ff0000">'</span><span style="color: #ff0000">dbo</span><span style="color: #ff0000">'</span></div>
注意，这里can是要删除的用户，同时它拥有对象--WCMDocQuoteImage，最后我们改变成让ｄｂｏ拥有这个对象。&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 通过执行 &nbsp; sp_addlogin，把登录 &nbsp; janetl &nbsp; 改名为 &nbsp; dbo。 &nbsp; &nbsp; <br />
&nbsp; sp_addlogin &nbsp; 'janetl', &nbsp; 'dbo' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 备份数据库。在本例中，备份 &nbsp; Northwind。 &nbsp; &nbsp; <br />
&nbsp; BACKUP &nbsp; DATABASE &nbsp; Northwind &nbsp; <br />
&nbsp; TO &nbsp; DISK &nbsp; = &nbsp; 'c:\mssql\backup\northwnd' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 除去刚刚备份的数据库。 &nbsp; &nbsp; <br />
&nbsp; DROP &nbsp; DATABASE &nbsp; Northwind &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 除去登录。 &nbsp; &nbsp; <br />
&nbsp; sp_droplogin &nbsp; 'janetl' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 还原<nobr oncontextmenu="return false;" onmousemove="kwM(7);" id="key5" onmouseover="kwE(event,7, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">备份</nobr>的数据库。 &nbsp; &nbsp; <br />
&nbsp; RESTORE &nbsp; DATABASE &nbsp; Northwind &nbsp; <br />
&nbsp; FROM &nbsp; DISK &nbsp; = &nbsp; 'c:\mssql\backup\northwnd' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; janetl &nbsp; 登录不能访问 &nbsp; Northwind &nbsp; 数据库，除非允许 &nbsp; guest &nbsp; 登录。尽管 &nbsp; janetl &nbsp; 登录已经删除，它仍然（作为一个孤立行）显示在 &nbsp; sysusers &nbsp; 表中： &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; USE &nbsp; Northwind &nbsp; <br />
&nbsp; SELECT &nbsp; * &nbsp; <br />
&nbsp; FROM &nbsp; sysusers &nbsp; <br />
&nbsp; WHERE &nbsp; name &nbsp; = &nbsp; 'janetl' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 解决孤立<nobr oncontextmenu="return false;" onmousemove="kwM(4);" id="key3" onmouseover="kwE(event,4, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">用户</nobr>问题 &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 用 &nbsp; sp_addlogin &nbsp; 添加一个临时登录。为孤立用户指定安全标识符 &nbsp; (SID)（从 &nbsp; sysusers）。 &nbsp; &nbsp; <br />
&nbsp; sp_addlogin &nbsp; @loginame &nbsp; = &nbsp; 'nancyd', &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @sid &nbsp; = &nbsp; 0x32C864A70427D211B4DD00104B9E8A00 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 用 &nbsp; sp_dropalias &nbsp; 除去属于别名 &nbsp; SID &nbsp; 的临时别名。 &nbsp; &nbsp; <br />
&nbsp; sp_dropalias &nbsp; 'nancyd' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 用 &nbsp; sp_dropuser &nbsp; 除去原始用户（即现在的孤立用户）。 &nbsp; &nbsp; <br />
&nbsp; sp_dropuser &nbsp; 'janetl' &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 用 &nbsp; sp_dropuser &nbsp; 除去原始登录。 &nbsp; &nbsp; <br />
&nbsp; sp_droplogin &nbsp; 'nancyd'&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/baoyaer/aggbug/143891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-10 09:49 <a href="http://www.blogjava.net/baoyaer/articles/143891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlserver /oracle 判断表/索引  存在语句</title><link>http://www.blogjava.net/baoyaer/articles/134092.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 02 Aug 2007 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/134092.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/134092.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/134092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/134092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/134092.html</trackback:ping><description><![CDATA[sql: <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">not</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">exists</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dbo.sysobjects<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;id&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff00ff">object_id</span><span style="COLOR: #000000">(N</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">[WCMDocQuoteImage]</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #808080">and</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff00ff">OBJECTPROPERTY</span><span style="COLOR: #000000">(id,&nbsp;N</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">IsUserTable</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000">&nbsp;WCMDocQuoteImage(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocId&nbsp;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QuoteImageId&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">not</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">exists</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;dbo.sysindexes&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;name</span><span style="COLOR: #808080">=</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">IX_WCMDocQuoteImage</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">index</span><span style="COLOR: #000000">&nbsp;IX_WCMDocQuoteImage&nbsp;</span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000">&nbsp;WCMDocQuoteImage(DocId,&nbsp;QuoteImageId);</span></div>
<br><br>oracle:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">declare</span><span style="COLOR: #000000">&nbsp;nFlowRuleCount&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">number</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">begin</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff00ff">count</span><span style="COLOR: #000000">(</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">into</span><span style="COLOR: #000000">&nbsp;nFlowRuleCount&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;USER_OBJECTS<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff00ff">object_name</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">WCMDOCQUOTEIMAGE</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">&nbsp;;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;nFlowRuleCount&nbsp;</span><span style="COLOR: #808080">=</span><span style="FONT-WEIGHT: bold; COLOR: #800000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">then</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbms_output.put_line(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">create&nbsp;table&nbsp;WCMDOCQUOTEIMAGE(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocId&nbsp;&nbsp;int,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QuoteImageId&nbsp;int<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">execute</span><span style="COLOR: #000000">&nbsp;immediate(</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">create&nbsp;table&nbsp;WCMDOCQUOTEIMAGE(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DocId&nbsp;&nbsp;int,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QuoteImageId&nbsp;int<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">;</span></div>
<br><br>这里要注意的是： <br>oracle对表名大小写的区分，创建的时候无论是什么形式，创建表后oracle都会将名称转换为大写，我在写语句时就因为这个问题而导致执行时总是报错。<br>
<img src ="http://www.blogjava.net/baoyaer/aggbug/134092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-02 18:47 <a href="http://www.blogjava.net/baoyaer/articles/134092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dbunit的使用</title><link>http://www.blogjava.net/baoyaer/articles/112196.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 20 Apr 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/112196.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/112196.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/112196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/112196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/112196.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: dbunit是一个基于junit扩展的数据库测试框架。它提供了大量的类对与数据库相关的操作进行了抽象和封装，虽然在80%的情况，你只需使用它极少的api。它通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态，从而使得测试自动化、可重复和相对独立。虽然不用dbunit也可以达到这种目的，但是我们必须为此付出代价（编写大量代码，测试及维护），既然有了这么优秀的开源框架，我们又何必再造轮子...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/112196.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/112196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-04-20 14:31 <a href="http://www.blogjava.net/baoyaer/articles/112196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql osql命令</title><link>http://www.blogjava.net/baoyaer/articles/107423.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 Mar 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/107423.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/107423.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/107423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/107423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/107423.html</trackback:ping><description><![CDATA[ 
<p>C:\&gt;osql /?<br />用法: osql              [-U login id]          [-P password]<br />  [-S server]            [-H hostname]          [-E trusted connection]<br />  [-d use database name] [-l login timeout]     [-t query timeout]<br />  [-h headers]           [-s colseparator]      [-w columnwidth]<br />  [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]<br />  [-L list servers]      [-c cmdend]            [-D ODBC DSN name]<br />  [-q "cmdline query"]   [-Q "cmdline query" and exit]<br />  [-n remove numbering]  [-m errorlevel]<br />  [-r msgs to stderr]    [-V severitylevel]<br />  [-i inputfile]         [-o outputfile]<br />  [-p print statistics]  [-b On error batch abort]<br />  [-O use Old ISQL behavior disables the following]<br />      &lt;EOF&gt; 正在进行批处理<br />      控制台宽度自动调整<br />      宽消息<br />      默认错误级别为 — 1 对 1<br />  [-? show syntax summary]<br /></p><p><font face="Times New Roman" color="#000000" size="3">Windows集成身份登陆&gt;&gt;&gt;<br />C:\&gt;osql -E<br />1&gt;<br />登陆后执行系统存储过程<br />1&gt; sp_password NULL,"newpass","sa"<br />2&gt; go<br />密码已更改。<br />1&gt; exit<br /><br />再来看看sa混合模式登陆&gt;&gt;&gt;<br /></font><font face="Times New Roman" color="#000000" size="3">C:\&gt;osql -SLocalhost -Usa -Pnewpass<br />1&gt;<br />出现1&gt;提示符表示登陆成功!<br /><br />再来看看osql命令行下查询C:\&gt;osql -SLocalhost -Usa -Pnewpass<br />1&gt; use qz<br />2&gt; Select count(*) from crjsj where kh=0<br />3&gt; go</font></p><p><font face="Times New Roman" color="#000000" size="3"> -----------<br />           0</font></p><p><font face="Times New Roman" color="#000000" size="3">（1 行受到影响）<br />1&gt;<br />查询系统表<br /></font><font face="Times New Roman" color="#000000" size="3">1&gt; select name from sysobjects where xtype='U'<br />2&gt; go<br /> name</font></p><img src ="http://www.blogjava.net/baoyaer/aggbug/107423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-30 10:17 <a href="http://www.blogjava.net/baoyaer/articles/107423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>schema解释</title><link>http://www.blogjava.net/baoyaer/articles/102542.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 08 Mar 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/102542.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/102542.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/102542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/102542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/102542.html</trackback:ping><description><![CDATA[
		<p>schema是用户和用户所拥有的对象的集合.就是相当于Ms sql server的一个数据库，可以理解为schema就是用户<br />每创建一个用户，都会为它创建一个同名的schema.<br /><br /><br />schema是用户和用户所拥有的对象的集合.在 OEM 中创建一个用户，此时实际上已经有了一个同名的schema.但是如果<br />该用户没有对象，则在oem中看不到这个 schema。一旦创建了用户的对象，比如表，那么oem中就可以看到了。<br /><br /><font color="#ff0000">我用MTP_CO登陆数据库，运行select * from MTP_TEST.login<br />报错:"table or view does not exist"<br />其中MTP_TEST是个ＳＣＨＥＭＡ．<br />怎么解释这个错误？是用户MTP_CO没有MTP_TEST这个ＳＣＨＥＭＡ引起的吗？<br /><br /><br /><font color="#000000">schema和你的建的user name是一样的。当你用这个user创建table时，就把该用户建的table存放在这个schema中</font><br /></font></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/102542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-08 09:53 <a href="http://www.blogjava.net/baoyaer/articles/102542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle监听在服务中失效的处理</title><link>http://www.blogjava.net/baoyaer/articles/102174.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 06 Mar 2007 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/102174.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/102174.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/102174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/102174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/102174.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: center" align="center">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-fareast-font-family: 楷体_GB2312">Oracle</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 16pt; FONT-FAMILY: 楷体_GB2312; mso-ascii-font-family: 'Times New Roman'">监听在服务中失效的处理</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt; mso-fareast-font-family: 楷体_GB2312">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-ALIGN: right" align="right">
				<font size="3">
						<span lang="EN-US">
								<span style="mso-tab-count: 11">                                                                          </span>
						</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">
						</span>
				</span> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>如果，你在<b style="mso-bidi-font-weight: normal">控制面板/管理工具/服务</b>中双击打开<b style="mso-bidi-font-weight: normal">OracleOraHome92TNSListener</b>的服务看到其“<b style="mso-bidi-font-weight: normal">可执行文件的路径</b>”一栏为空时的处理方法：<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>首先运行regedit.exe启动注册表编辑器，在<b style="mso-bidi-font-weight: normal">HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/</b>下的<b style="mso-bidi-font-weight: normal">Services和CurrentControlSet/Services</b>下找到<b style="mso-bidi-font-weight: normal">OracleOraHome92TNSListener</b>项，在右边窗口按右键，<b style="mso-bidi-font-weight: normal">新建/字符串</b>，取名<b style="mso-bidi-font-weight: normal">ImagePath</b>。<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>双击新见的建，在“数值数据”项输入D:\oracle\ora92\bin\TNSLSNR.EXE（根据你自己的实际情况进行修改），确定完成。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>再次在服务中双击打开<b style="mso-bidi-font-weight: normal">OracleOraHome92TNSListener</b>的服务看到其“<b style="mso-bidi-font-weight: normal">可执行文件的路径</b>”一栏已经显示了其正确的值。这时你可以启动监听了。<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<span style="mso-tab-count: 1">    </span>同样也可以对<b style="mso-bidi-font-weight: normal">OracleServiceKKDB</b>进行操作，不过将<b style="mso-bidi-font-weight: normal">ImagePath</b>的值改为<b style="mso-bidi-font-weight: normal">D:\oracle\ora92\bin\oracle.exe KKDB</b>即可。<o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/102174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-03-06 15:17 <a href="http://www.blogjava.net/baoyaer/articles/102174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库备份与恢复</title><link>http://www.blogjava.net/baoyaer/articles/99029.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 09 Feb 2007 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/99029.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/99029.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/99029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/99029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/99029.html</trackback:ping><description><![CDATA[Oracle数据库有三种标准的备份方法，它们分别是导出／导入（EXP/IMP）、热备份和冷备份。导出备件是一种逻辑备份，冷备份和热备份是物理备份。 <br />一、 导出／导入（Export／Import） <br />利用Export可将数据从数据库中提取出来，利用Import则可将提取出来的数据送回到Oracle数据库中去。 <br />１、 简单导出数据（Export）和导入数据（Import） <br />Oracle支持三种方式类型的输出： <br />（１）、表方式（T方式），将指定表的数据导出。 <br />（２）、用户方式（U方式），将指定用户的所有对象及数据导出。 <br />（３）、全库方式（Full方式），瘵数据库中的所有对象导出。 <br />数据导入（Import）的过程是数据导出（Export）的逆过程，分别将数据文件导入数据库和将数据库数据导出到数据文件。 <br />２、 增量导出／导入 <br />增量导出是一种常用的数据备份方法，它只能对整个数据库来实施，并且必须作为SYSTEM来导出。在进行此种导出时，系统不要求回答任何问题。导出文件名缺省为export.dmp，如果不希望自己的输出文件定名为export.dmp，必须在命令行中指出要用的文件名。 <br />增量导出包括三种类型： <br />（１）、“完全”增量导出（Complete） <br />即备份三个数据库，比如： <br />exp system/manager inctype=complete file=040731.dmp <br />（２）、“增量型”增量导出 <br />备份上一次备份后改变的数据，比如： <br />exp system/manager inctype=incremental file=040731.dmp <br />（３）、“累积型”增量导出 <br />累计型导出方式是导出自上次“完全”导出之后数据库中变化了的信息。比如： <br />exp system/manager inctype=cumulative file=040731.dmp <br />数据库管理员可以排定一个备份日程表，用数据导出的三个不同方式合理高效的完成。 <br />比如数据库的被封任务可以做如下安排： <br />星期一：完全备份（A） <br />星期二：增量导出（B） <br />星期三：增量导出（C） <br />星期四：增量导出（D） <br />星期五：累计导出（E） <br />星期六：增量导出（F） <br />星期日：增量导出（G） <br />如果在星期日，数据库遭到意外破坏，数据库管理员可按一下步骤来回复数据库： <br />第一步：用命令CREATE DATABASE重新生成数据库结构； <br />第二步：创建一个足够大的附加回滚。 <br />第三步：完全增量导入A： <br />imp system/manager inctype=RESTORE FULL=y FILE=A <br />第四步：累计增量导入E： <br />imp system/manager inctype=RESTORE FULL=Y FILE=E <br />第五步：最近增量导入F： <br />imp system/manager inctype=RESTORE FULL=Y FILE=F <br />二、 冷备份 <br />冷备份发生在数据库已经正常关闭的情况下，当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言，冷备份时最快和最安全的方法。冷备份的优点是： <br />１、 是非常快速的备份方法（只需拷文件） <br />２、 容易归档（简单拷贝即可） <br />３、 容易恢复到某个时间点上（只需将文件再拷贝回去） <br />４、 能与归档方法相结合，做数据库“最佳状态”的恢复。 <br />５、 低度维护，高度安全。 <br />但冷备份也有如下不足： <br />１、 单独使用时，只能提供到“某一时间点上”的恢复。 <br />２、 再实施备份的全过程中，数据库必须要作备份而不能作其他工作。也就是说，在冷备份过程中，数据库必须是关闭状态。 <br />３、 若磁盘空间有限，只能拷贝到磁带等其他外部存储设备上，速度会很慢。 <br />４、 不能按表或按用户恢复。 <br />如果可能的话（主要看效率），应将信息备份到磁盘上，然后启动数据库（使用户可以工作）并将备份的信息拷贝到磁带上（拷贝的同时，数据库也可以工作）。冷备份中必须拷贝的文件包括： <br />１、 所有数据文件 <br />２、 所有控制文件 <br />３、 所有联机REDO LOG文件 <br />４、 Init.ora文件（可选） <br />值得注意的使冷备份必须在数据库关闭的情况下进行，当数据库处于打开状态时，执行数据库文件系统备份是无效的。 <br />下面是作冷备份的完整例子。 <br />（1） 关闭数据库 <br />sqlplus /nolog <br />sql&gt;connect /as sysdba <br />sql&gt;shutdown normal; <br />（2） 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件 <br />sql&gt;cp &lt;file&gt; &lt;backup directory&gt; <br />（3） 重启Oracle数据库 <br />sql&gt;startup <br />三、 热备份 <br />热备份是在数据库运行的情况下，采用archivelog mode方式备份数据库的方法。所以，如果你有昨天夜里的一个冷备份而且又有今天的热备份文件，在发生问题时，就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作，并需要大量的档案空间。一旦数据库运行在archivelog状态下，就可以做备份了。热备份的命令文件由三部分组成： <br />1． 数据文件一个表空间一个表空间的备份。 <br />（1） 设置表空间为备份状态 <br />（2） 备份表空间的数据文件 <br />（3） 回复表空间为正常状态 <br />2． 备份归档log文件 <br />（1） 临时停止归档进程 <br />（2） log下那些在archive rede log目标目录中的文件 <br />（3） 重新启动archive进程 <br />（4） 备份归档的redo log文件 <br />3． 用alter database bachup controlfile命令来备份控制文件 <br />热备份的优点是： <br />1． 可在表空间或数据库文件级备份，备份的时间短。 <br />2． 备份时数据库仍可使用。 <br />3． 可达到秒级恢复（恢复到某一时间点上）。 <br />4． 可对几乎所有数据库实体做恢复 <br />5． 恢复是快速的，在大多数情况下爱数据库仍工作时恢复。 <br />热备份的不足是： <br />1． 不能出错，否则后果严重 <br />2． 若热备份不成功，所得结果不可用于时间点的恢复 <br />3． 因难于维护，所以要特别仔细小心，不允许“以失败告终”。<img src ="http://www.blogjava.net/baoyaer/aggbug/99029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-02-09 16:07 <a href="http://www.blogjava.net/baoyaer/articles/99029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle语句拾贝</title><link>http://www.blogjava.net/baoyaer/articles/83068.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 23 Nov 2006 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/83068.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/83068.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/83068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/83068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/83068.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、查看当前所有对象 SQL=========&gt;select&nbsp;*&nbsp;from&nbsp;tab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/83068.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/83068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-23 16:27 <a href="http://www.blogjava.net/baoyaer/articles/83068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle select语句学习</title><link>http://www.blogjava.net/baoyaer/articles/82721.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 22 Nov 2006 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/82721.html</guid><description><![CDATA[<strong>&gt;字符处理<br />
<br />
</strong>upper(str)---将字符串str全部转换成大写<br />
lower(str)---将字符串str全部转换成小写<br />
initcap(str)---将字符串中每个单词的首字母大写<br />
concat(str1,str2)---将字符串str1与str2连接起来(也可以通过'||'号直接相连)<br />
substr(str,a,b)---取字符串str中的指定字符，从位置a开始取长度为b的字符串，假如a为正则从左边开始，否则从右边开始<br />
instr(str,'z')---取得str字符串中从左边开始每一次出现z字符的下标位置(下标从1开始)<br />
lpad(str,12,'*')---左填充，即将字符串str长度填充到12，假如其不足12位则在左边以*号填充<br />
rpad(str,12,'*')---右填充，同上<br />
length(str)---计算字符串str的长度<br />
<br />
<strong>2&gt;数字函数<br />
</strong><br />
round(45.926,2)---将前一数保留指定的小数位，并四舍五入(45.93)，假如指定位是负数则意为在小数点左边保留指定位,如round(45.923,-1)=50,rount(45.923,0)=46,round(45.93,-2)=0,round(55.93,-2)=100<br />
trunc(45.926,2)---同上，得不四舍五入(45.92)<br />
mod(1600,300)---求余(100)<br />
<br />
<strong>3&gt;日期型函数<br />
</strong><br />
oracle中默认的格式是：DD-MON-RR。<br />
oracle中有个到当前系统时间--sysdate，如：<br />
select sysdate from dual <br />
<br />
可对日期进行自述运算：<br />
select (sysdate-mybirthday)/7 from person<br />
<br />
months_between('01-sep-95','11-jan-94')---取得二个日期之间的间隔月数(19.6774194)<br />
add_months('11-jan-94',6)---给指定日期加上指定的月份后得到一个新的日期(11-jul-94)<br />
next_day('01-sep-85','friday')---取得当前日期中下个周五的日期(01-jul-95)<br />
last_day('01-feb-95')---取得当前日期中月份的最后一天(28-feb-95)<br />
<br />
round进行四舍五入，trunc则否,以下是我的操作结果：<br />
sysdate为：<br />
SYSDATE<br />
----------<br />
28-7月 -06
<p>&nbsp;select <br />
&nbsp;round(sysdate,'month') RM,<br />
&nbsp;round(sysdate,'year') RY,<br />
&nbsp;trunc(sysdate,'month') TM,<br />
&nbsp;trunc(sysdate,'year') TY<br />
&nbsp;from dual;</p>
<p>RM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TY<br />
---------- ---------- ---------- ----------<br />
01-8月 -06 01-1月 -07 01-7月 -06 01-1月 -06<br />
</p>
<p><br />
<strong>4&gt;转换函数<br />
</strong><br />
隐式转换:系统自动转换,如：<br />
varchar2 or char to number<br />
varchar2 or char to date<br />
number to varchar2<br />
date to varchar2<br />
<br />
显式转换：人为以函数加以转换<br />
日期，字符，数据三者之间可以相互转换:日期&lt;--&gt;字符&lt;--&gt;数据<br />
日期格式:YYYY<br />
<br />
<em>日期--&gt;字符</em><br />
select to_char(sysdate,'yyyy-mm-dd') ch from dual</p>
<p>CH<br />
----------<br />
2006-07-28<br />
<br />
<em>数字--&gt;字符<br />
</em>to_char(number,'format_model'),oramat_model有如下：<br />
9---用对应数字表示<br />
0---强制用０表示<br />
$---加一$符号<br />
L---前加本地货币单位表示<br />
.---十进制点<br />
,---千进制点<br />
<br />
select to_char(0917,'l9999.99') local from dual<br />
LOCAL<br />
------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RMB917.00<br />
<br />
<em>字符--&gt;日期</em><br />
tselect to_date('19830917','yyyy-mm-dd') bir from dual<br />
BIR<br />
----------<br />
17-9月 -83<br />
<br />
<em>字符--&gt;数字</em><br />
select to_number('19821217','999999999') mybr from dual<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MYBR<br />
----------<br />
&nbsp; 19821217</p>
<p>注：所有函数均可以嵌套使用</p>
<p><strong>5&gt;通用函数<br />
</strong><br />
nvl(expr1,expr2)---expr1为空则显示expr2,否则显示expr1<br />
nvl2(expr1,expr2,expr3)---expr1为空则显示expr2,否则显示expr3<br />
nullif(expr1,expr2)---二个相等则显示空符,否则显示expr1<br />
coalesce(expr1,expr2,...,exprn)---从expr1开始依次找到不为空的expr，找到就显示，直到最后，否则显</p>
<p>示exprn<br />
case表达式，如下图:</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/jkallen/9085/r_oracle_case.bmp"  alt="" />&nbsp;<br />
<br />
<strong>6&gt;多表查询</strong><br />
对普通的多表查询，也就是不加where条件的时候实际上查询结果是各表的笛卡尔集<br />
外连接：oracle实现外连接时在=号的二边加+号就OK，当+在左边时称为右连接，反之为左连接,它常常用来当要求未受限制对象的表数据也要求显示时，如下：<br />
select * from student</p>
<p>ID NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
-------------------- --------------<br />
1 zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhejiang<br />
3 lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
7 lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou</p>
<p>select * from person</p>
<p>ID NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
- -------------------- -----------<br />
1 zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhejiang<br />
3 lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
7 lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou</p>
<p>select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id(+) = s.id</p>
<p>ID SEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
-- ---- ---------- -------------------- ------------<br />
&nbsp;1 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhejiang<br />
&nbsp;3 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou</p>
<p>select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id = s.id(+)</p>
<p>ID SEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
-- ---- ---------- -------------------- --------------<br />
&nbsp;1 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhejiang<br />
&nbsp;2 girl<br />
&nbsp;3 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
&nbsp;4 boy<br />
&nbsp;5 girl</p>
<p>self-join，就是同一张表连接，用自连接的时候要注意排除重复的记录（自身，循环重复等），比如说找出student表中所有住在同一个地方的人。<br />
select * from student</p>
<p>&nbsp;ID NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
--- -------------------- ---------<br />
&nbsp; 1 zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhejiang<br />
&nbsp; 3 lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
&nbsp; 7 lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
&nbsp; 2 name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
&nbsp; 4 name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
&nbsp; 5 name5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
&nbsp; 6 name6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shanghai<br />
&nbsp; 8 name8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shanghai</p>
<p>没有排除重复记录时的结果：<br />
&nbsp;select t1.name,t2.name <br />
&nbsp;from student t1, student t2<br />
&nbsp;where t1.address = t2.address</p>
<p>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
-------------------- --------------<br />
lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lily<br />
name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lily<br />
name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lily<br />
lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2<br />
name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2<br />
name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2<br />
lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name4<br />
name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name4<br />
name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name4<br />
lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lishi<br />
name5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lishi</p>
<p>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAME<br />
-------------------- --------------<br />
lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name5<br />
name5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name5<br />
name6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name6<br />
name8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name6<br />
name6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name8<br />
name8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name8<br />
zhangshan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zhangshan</p>
<p>已选择18行</p>
<p>排除重复与循环记录之后：<br />
select t1.name,t2.name,t1.address<br />
&nbsp;from student t1, student t2<br />
&nbsp;where t1.address = t2.address<br />
and t1.id &gt; t2.id</p>
<p>NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADDRESS<br />
-------------------- -------------------- -------------------<br />
lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
lily&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; guangzhou<br />
name5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lishi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hangzhou<br />
name8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shanghai</p>
<p>cross join,无条件连接，实际上跟不带where时一样得到的是笛卡尔集</p>
<p>natural join（也可以直接记作join），根据表中同名栏位来连接记录,若表中可能出现多个同名栏位，则用using(col_name)来指定所栏位。colname不能指定表的别名！限制条件用on来指定<br />
select id,p.sex,id,s.name from person p join student s using(id);</p>
<p>&nbsp; ID SEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME<br />
---- ---- ---------- --------------------<br />
&nbsp;&nbsp; 1 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 zhangshan<br />
&nbsp;&nbsp; 2 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 name2<br />
&nbsp;&nbsp; 3 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 lishi<br />
&nbsp;&nbsp; 4 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 name4<br />
&nbsp;&nbsp; 5 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 name5</p>
<p>在sql标准语法中,左(右)连接用left(right) out join,限制条件用on就可以了。</p>
<p>full out join完全外连接,顾名思义就是左外连接与右外连接都有<br />
select id,p.sex,id,s.name from person p full join student s using(id);</p>
<p>&nbsp; ID SEX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID NAME<br />
---- ---- ---------- ------------------<br />
&nbsp;&nbsp; 1 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 zhangshan<br />
&nbsp;&nbsp; 3 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 lishi<br />
&nbsp;&nbsp; 2 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 name2<br />
&nbsp;&nbsp; 4 boy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 name4<br />
&nbsp;&nbsp; 5 girl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 name5<br />
&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 name8<br />
&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 name6<br />
&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 lily<br />
<br />
</p>
<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/amigoxie/archive/2007/04/26/113722.html"><u><font color="#0000ff">Oracal的Lpad函数</font></u></a> </div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;翻译自：<a href="http://mfm088.itpub.net/post/22599/250400"><u><font color="#0000ff">http://mfm088.itpub.net/post/22599/250400</font></u></a> <br />
&nbsp;&nbsp;&nbsp; 在Oracle/PLSQL中，lpad函数将左边的字符串填充一些特定的字符，其语法格式如下：&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpad( string1, padded_length, [ pad_string ] )<br />
&nbsp;&nbsp;&nbsp;&nbsp; 其中<em>string1</em>是需要粘贴字符的字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; <em>padded_length</em>是返回的字符串的数量，如果这个数量比原字符串的长度要短，lpad函数将会把字符串截取成<em>padded_length;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp; pad_string</em>是个可选参数，这个字符串是要粘贴到string1的左边，如果这个参数未写，lpad函数将会在string1的左边粘贴空格。<br />
&nbsp;&nbsp;&nbsp;&nbsp;例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<table cellspacing="0" cellpadding="3" width="432" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="207">lpad('tech', 7);</td>
            <td class="function_desc">将返回' tech'</td>
        </tr>
    </tbody>
</table>
<br />
<table cellspacing="0" cellpadding="3" width="432" border="0">
    <tbody>
        <tr>
            <td class="function_example">lpad('tech', 2);</td>
            <td class="function_desc">将返回'te'</td>
        </tr>
        <tr>
            <td class="function_example">lpad('tech', 8, '0');</td>
            <td class="function_desc">将返回'0000tech'</td>
        </tr>
        <tr>
            <td class="function_example">lpad('tech on the net', 15, 'z');</td>
            <td class="function_desc">将返回&nbsp;'tech on the net'</td>
        </tr>
        <tr>
            <td class="function_example">lpad('tech on the net', 16, 'z');</td>
            <td class="function_desc">将返回&nbsp;'ztech on the net'</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
-----------------------<br />
<br />
select a.*, Level from (select * from dlsys.tcUnit order by DisplayOrder) a<br />
&nbsp;&nbsp;&nbsp;&nbsp; start with a.SeniorUnitID is null<br />
&nbsp;&nbsp;&nbsp;&nbsp; connect by a.SeniorUnitID = prior a.UnitID<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/82721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2006-11-22 11:39 <a href="http://www.blogjava.net/baoyaer/articles/82721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>