﻿<?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>IT博客-大话人生-随笔分类-数据库</title><link>http://www.cnitblog.com/stomic/category/7071.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2022 04:02:53 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2022 04:02:53 GMT</pubDate><ttl>60</ttl><item><title>务开始之前所处的状态。不管是哪种情况，</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96064.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96064.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ，通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时，自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时，自从事务启动以来对数据库所做的一切更改都被撤销，并且数据库返回到事务开始之前所处的状态。不管是哪种情况，数据库在事务完成时都保证能回到一致状态614280199355033851305292407431...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:50 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（4）——简单实现Redis缓存中的排序功能</title><link>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 18:02:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90330.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90330.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90330.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 在实现缓存排序功能之前，必须先明白这一功能的合理性。不妨思考一下，既然可以在数据库中排序，为什么还要把排序功能放在缓存中实现呢？这里简单总结了两个原因：首先，排序会增加数据库的负载，难以支撑高并发的应用；其次，在缓存中排序不会遇到表锁定的问题。Redis恰好提供了排序功能，使我们可以方便地实现缓存排序。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; Redis中用于实现排序功能的是SORT命令。该命令提供了多种参数，可以对列表，集合和有序集合进行排序。SORT命令格式如下：</span></p>
<p><span style="font-size:18px"></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 444px; top: 674px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;key&nbsp;[BY&nbsp;pattern]&nbsp;[LIMIT&nbsp;offset&nbsp;count]&nbsp;[GET&nbsp;pattern&nbsp;[GET&nbsp;pattern&nbsp;...]]&nbsp;[ASC&nbsp;|&nbsp;DESC]&nbsp;[ALPHA]&nbsp;[STORE&nbsp;destination]&nbsp;&nbsp;</span></span></li></ol></div><pre name="code" class="plain" style="display: none;">SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; BY参数用于指定排序字段，功能类似于SQL中的order by。对于列表和集合而言，仅按照它们的值进行排序往往没有实际意义。以函数Cache2Hash返回的集合为例（实际上返回的是集合键），该集合中存储的是一系列完整的哈希键，只按照这些键进行排序，结果无非是按照数字或字典顺序排列，其用处显然不大。这是因为真正存储行数据的是哈希结构本身，而非哈希键。假设集合键为"resultset.hash:123456"，集合中每个哈希键对应的哈希结构中都有一个名为&#8220;timestamp&#8221;的字段，现在要把集合中的所有哈希键按照timestamp字段进行排序，这时，只需执行以下命令：
<p>&nbsp;</p>
<p><span style="font-size:18px"></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 444px; top: 891px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;resultset.hash:123456&nbsp;BY&nbsp;*-&gt;timestamp&nbsp;&nbsp;</span></span></li></ol></div><pre name="code" class="plain" style="display: none;">SORT resultset.hash:123456 BY *-&gt;timestamp</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 从上例可以看出，BY的真正威力在于它可以让SORT命令按照一个指定的外部键的外部字段进行排序。SORT用集合<span style="font-size:18px">resultset.hash:123456中的每个值（即每个哈希键）替换BY参数后的第一个&#8220;*&#8221;，并依据&#8220;-&gt;&#8221;后面给出的字段获取其值，最后根据这些字段值对哈希键进行排序。</span>
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; LIMIT参数用于限制排序以后返回元素的数量，功能类似于SQL中的limit。该参数接受另外两个参数，即offset和count，LIMIT offset count表示跳过前offset个元素，返回之后的连续count个元素。可见，LIMIT参数可以用于实现分页功能。</span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; GET参数用于返回指定的字段值。以集合<span style="font-size:18px">resultset.hash:123456为例，使用BY参数对集合中的所有哈希键按照哈希结构中的timestamp字段排序后，SORT命令返回所有排序之后的哈希键。如果某个请求需要不是键而是某些字段值，这时就要使用GET参数，使SORT命令返回指定字段值。假设除timestamp字段以外，<span style="font-size:18px">集合中每个哈希键对应的哈希结构中还有一个名为&#8220;id&#8221;的字段，通过以下命令可以使SORT返回按照timestamp排序以后的每个哈希键对应的哈希结构中的timestamp和id值：</span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 444px; top: 1291px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;resultset.hash:123456&nbsp;BY&nbsp;*-&gt;timestamp&nbsp;GET&nbsp;*-&gt;timestamp&nbsp;GET&nbsp;*-&gt;id&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_3_4745967" name="code" class="plain" style="display: none;">SORT resultset.hash:123456 BY *-&gt;timestamp GET *-&gt;timestamp GET *-&gt;id</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; SORT用<span style="font-size:18px">集合</span><span style="font-size:18px">resultset.hash:123456中的每个值（即每个哈希键）替换GET参数之后的第一个&#8220;*&#8221;，并将其作为返回值。值得注意的是，利用GET #能够得到集合中的哈希键本身。</span>
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; ASC和DESC参数用于指定排序顺序（默认为ASC，即从低到高），ALPHA参数用于按照字典顺序排列非数字元素。</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; STORE参数用于将SORT命令的返回值，即排序结果存入一个指定的列表。加上STORE参数后，SORT命令的返回值就变为排序结果的个数。</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 下面的代码实现了按照哈希的某个字段对集合中的哈希键排序，并将结果存入列表的过程：</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></span></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 1587px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数对集合中的所有HASH键进行排序，排序依据是HASH键所对应的HASH中的某个字段，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;排序结果被存入一个LIST结构，LIST键应当包含结果集标识符和排序字段标识符，</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="comment">//&nbsp;形如&#8220;sorted:123456:1234&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>string&nbsp;SortHash(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sort_field,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;offset,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;count,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;order,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;只考虑存储HASH键的SET</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key&nbsp;=&nbsp;<span class="string">"resultset.hash:"</span><span>&nbsp;+&nbsp;resultset_id;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;检测SET是否存在</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXISTS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;integer&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;resultsets"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;field_md5&nbsp;=&nbsp;md5(sort_field);&nbsp;&nbsp;<span class="comment">//&nbsp;利用MD5排除排序字段中空格造成的影响&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将排序结果存入该LIST</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_sorted_list_key&nbsp;=&nbsp;<span class="string">"sorted:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;field_md5;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;by(<span class="string">"*-&gt;"</span><span>&nbsp;+&nbsp;sort_field);&nbsp;&nbsp;</span><span class="comment">//确定排序字段</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ord&nbsp;=&nbsp;(order&nbsp;==&nbsp;1)&nbsp;?&nbsp;<span class="string">"ASC"</span><span>&nbsp;:&nbsp;</span><span class="string">"DESC"</span><span>;&nbsp;&nbsp;</span><span class="comment">//order==1时按照升序排列；否则为降序</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ofsstream,&nbsp;cntstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ofsstream&nbsp;&lt;&lt;&nbsp;offset;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;cntstream&nbsp;&lt;&lt;&nbsp;count;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;执行排序命令，并把排序结果存入LIST</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SORT&nbsp;%s&nbsp;BY&nbsp;%s&nbsp;LIMIT&nbsp;%s&nbsp;%s&nbsp;GET&nbsp;%s&nbsp;ALPHA&nbsp;STORE&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;by.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;ofsstream.str().c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;cntstream.str().c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"#"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置LIST的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstream.str().c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_sorted_list_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回LIST键，以便于其他函数获取该LIST中的内容</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_4_6633341" name="code" class="cpp" style="display: none;">// 该函数对集合中的所有HASH键进行排序，排序依据是HASH键所对应的HASH中的某个字段，
// 排序结果被存入一个LIST结构，LIST键应当包含结果集标识符和排序字段标识符，
// 形如&#8220;sorted:123456:1234&#8221;
string SortHash(sql::Connection *mysql_connection,
                redisContext *redis_connection, 
                const string &amp;resultset_id, 
                const string &amp;sort_field, 
                int offset, int count, int order, int ttl) {
  // 只考虑存储HASH键的SET
  string redis_row_set_key = "resultset.hash:" + resultset_id;
  redisReply *reply;
  // 检测SET是否存在
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXISTS %s",
                                               redis_row_set_key.c_str()));
  if (reply-&gt;integer == 0) {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - no resultsets");
  } else {
    freeReplyObject(reply);
  }
  string field_md5 = md5(sort_field);  // 利用MD5排除排序字段中空格造成的影响 
  // 将排序结果存入该LIST
  string redis_sorted_list_key = "sorted:" + resultset_id + ":" + field_md5;
  string by("*-&gt;" + sort_field);  //确定排序字段
  string ord = (order == 1) ? "ASC" : "DESC";  //order==1时按照升序排列；否则为降序
  stringstream ofsstream, cntstream;
  ofsstream &lt;&lt; offset;
  cntstream &lt;&lt; count;
  // 执行排序命令，并把排序结果存入LIST
  reply = static_cast&lt;redisReply*&gt;(redisCommand(
                                      redis_connection, 
                                      "SORT %s BY %s LIMIT %s %s GET %s ALPHA STORE %s",
                                      redis_row_set_key.c_str(), 
                                      by.c_str(), 
                                      ofsstream.str().c_str(), 
                                      cntstream.str().c_str(), 
                                      "#", 
                                      redis_sorted_list_key.c_str()));
  freeReplyObject(reply);
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  // 设置LIST的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                       redis_sorted_list_key.c_str(), 
                                               ttlstream.str().c_str()));
  freeReplyObject(reply);
  return redis_sorted_list_key;  // 返回LIST键，以便于其他函数获取该LIST中的内容</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 显然，对结果集中的哈希键进行排序要比对字符串键排序更加直观和方便。借助于排序函数，可以方便地实现在Redis中查询排序后的结果集，代码如下：
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></span></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 2616px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数根据sql语句和排序参数，在Redis中查询相应的结果集并进行排序，最后返回</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;排序之后的HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>vector&lt;string&gt;&nbsp;GetSortedCache(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><span>&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;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&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 class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sql,&nbsp;</span><span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sort_field,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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 class="datatypes">int</span><span>&nbsp;offset,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;count,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;order,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;vector&lt;string&gt;&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;resultset_id&nbsp;=&nbsp;md5(sql);&nbsp;&nbsp;<span class="comment">//&nbsp;结果集标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;field_md5&nbsp;=&nbsp;md5(sort_field);&nbsp;&nbsp;<span class="comment">//&nbsp;排序字段标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_sorted_list_key&nbsp;=&nbsp;<span class="string">"sorted:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;field_md5;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"LRANGE&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"0"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"-1"</span><span>));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;type&nbsp;==&nbsp;REDIS_REPLY_ARRAY)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;如果LIST不存在，调用Cache2Hash函数从Mysql中拉取数据到Redis，然后调用SortHash函数</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;对结果集进行排序并将排序后的HASH键存入LIST</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;elements&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::Statement&nbsp;*stmt&nbsp;=&nbsp;mysql_connection-&gt;createStatement();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset&nbsp;=&nbsp;stmt-&gt;executeQuery(sql);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache2Hash(mysql_connection,&nbsp;redis_connection,&nbsp;resultset,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key&nbsp;=&nbsp;SortHash(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset_id,&nbsp;sort_field,&nbsp;offset,&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count,&nbsp;order,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;再次尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"LRANGE&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"0"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"-1"</span><span>));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;resultset;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;stmt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将LIST中的所有HASH键存入redis_row_key_vector中</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;reply-&gt;elements;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;reply-&gt;element[i]-&gt;str;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key_vector.push_back(redis_row_key);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;LRANGE&nbsp;error"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_5_1409871" name="code" class="cpp" style="display: none;">// 该函数根据sql语句和排序参数，在Redis中查询相应的结果集并进行排序，最后返回
// 排序之后的HASH键
vector&lt;string&gt; GetSortedCache(sql::Connection *mysql_connection,
                              redisContext *redis_connection,
                              const string &amp;sql, const string &amp;sort_field, 
                              int offset, int count, int order, int ttl) {
  vector&lt;string&gt; redis_row_key_vector;
  redisReply *reply;
  string resultset_id = md5(sql);  // 结果集标识符
  string field_md5 = md5(sort_field);  // 排序字段标识符
  // 尝试获取LIST中的所有HASH键
  string redis_sorted_list_key = "sorted:" + resultset_id + ":" + field_md5;
  // 尝试获取LIST中的所有HASH键
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "LRANGE %s %s %s",
                                               redis_sorted_list_key.c_str(), 
                                               "0", 
                                               "-1"));
  if (reply-&gt;type == REDIS_REPLY_ARRAY) {
    // 如果LIST不存在，调用Cache2Hash函数从Mysql中拉取数据到Redis，然后调用SortHash函数
    // 对结果集进行排序并将排序后的HASH键存入LIST
    if (reply-&gt;elements == 0) { 
      freeReplyObject(reply);
      sql::Statement *stmt = mysql_connection-&gt;createStatement();
      sql::ResultSet *resultset = stmt-&gt;executeQuery(sql);
      Cache2Hash(mysql_connection, redis_connection, resultset, 
                 resultset_id, ttl);
      redis_sorted_list_key = SortHash(mysql_connection, redis_connection, 
                                       resultset_id, sort_field, offset, 
                                       count, order, ttl);
      // 再次尝试获取LIST中的所有HASH键
      reply = static_cast&lt;redisReply*&gt;(redisCommand(
                                          redis_connection, 
                                          "LRANGE %s %s %s",
                                          redis_sorted_list_key.c_str(), 
                                          "0", 
                                          "-1"));
      delete resultset;
      delete stmt;
    }
    // 将LIST中的所有HASH键存入redis_row_key_vector中
    string redis_row_key;
    for (int i = 0; i &lt; reply-&gt;elements; ++i) {
      redis_row_key = reply-&gt;element[i]-&gt;str;
      redis_row_key_vector.push_back(redis_row_key);
    }
    freeReplyObject(reply);
  } else {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - LRANGE error");
  }
  return redis_row_key_vector;
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 这样，在Redis中对结果集进行简单排序操作的功能就实现了。
<p>&nbsp;</p>
</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/90330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-25 02:02 <a href="http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（3）——用Redis作为Mysql数据库的缓存</title><link>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 17:47:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90329.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90329.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90329.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 把Mysql结果集缓存到Redis的字符串或哈希结构中以后，我们面临一个新的问题，即如何为这些字符串或哈希命名，也就是如何确定它们的键。因为这些数据结构所对应的行都属于某个结果集，假如可以找到一种唯一标识结果集的方法，那么只需为这些数据结构分配一个唯一的序号，然后把结果集标识符与该序号结合起来，就能唯一标识一个数据结构了。于是，为字符串和哈希命名的问题就转化为确定结果集标识符的问题。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 经过调研，发现一种较为通用的确定结果集标识符的方法。正如我们所知道的，缓存在Redis中的结果集数据都是利用select等sql语句从Mysql中获取的。同样的查询语句会生成同样的结果集（这里暂时不讨论结果集中每条记录的顺序问题），这一性质刚好可以用来确定结果集的唯一标识符。当然，简单地把整个sql语句作为结果集标识符是不可取的，一个显而易见的理由是，未经处理的sql查询语句均包含若干空格，而Redis的键是不允许存在空格的。这时，我们需要一个可以把sql语句转换为唯一标识符的函数。通常，这一功能由散列函数完成，包括MD5，SHA系列等加密散列函数在内的很多算法均可达到这一目的。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 确定结果集标识符之后，从Redis读数据或向Redis写数据的思路就很清晰了。对于一个sql语句格式的数据请求，首先计算该语句的MD5并据此得到结果集标识符，然后利用该标识符在Redis中查找该结果集。注意，结果集中的每一行都有一个相应的键，这些键都存储在一个Redis集合结构中。这个集合恰好对应了所需的结果集，所以，该集合的键必须包含结果集标识符。如果Redis中不存在这样一个集合，说明要找的结果集不在Redis中，所以需要执行相应的sql语句，在Mysql中查询到相应的结果集，然后按照上面所说的办法把结果集中的每一行以字符串或哈希的形式存入Redis。在Redis中查找相应结果集的代码如下：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 434px; top: 960px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数根据sql语句在Redis中查询相应的结果集，并返回结果集中每一行所对应的数据结构的键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>vector&lt;string&gt;&nbsp;GetCache(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sql,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;type)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;vector&lt;string&gt;&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;resultset_id&nbsp;=&nbsp;md5(sql);&nbsp;&nbsp;<span class="comment">//&nbsp;计算sql语句的md5，这是唯一标识结果集的关键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;type==1时，该函数将查询相应的STRING集合或将结果集写入若干STRING</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;cache_type&nbsp;=&nbsp;(type&nbsp;==&nbsp;1)&nbsp;?&nbsp;<span class="string">"string"</span><span>&nbsp;:&nbsp;</span><span class="string">"hash"</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;根据type信息和结果集标识符合成SET键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key&nbsp;=&nbsp;<span class="string">"resultset."</span><span>&nbsp;+&nbsp;cache_type&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;resultset_id;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试从reply中获取SET中保存的所有键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SMEMBERS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;type&nbsp;==&nbsp;REDIS_REPLY_ARRAY)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;如果要找的SET不存在，说明Redis中没有相应的结果集，需要调用Cache2String或</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Cache2Hash函数把数据从Mysql拉取到Redis中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;elements&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::Statement&nbsp;*stmt&nbsp;=&nbsp;mysql_connection-&gt;createStatement();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset&nbsp;=&nbsp;stmt-&gt;executeQuery(sql);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(type&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key&nbsp;=&nbsp;Cache2String(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset,&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key&nbsp;=&nbsp;Cache2Hash(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset,&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;再次尝试从reply中获取SET中保存的所有键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SMEMBERS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;resultset;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;stmt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;把SET中的每个STRING或HASH键存入redis_row_key_vector中</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;reply-&gt;elements;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;reply-&gt;element[i]-&gt;str;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key_vector.push_back(redis_row_key);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;SMEMBERS&nbsp;error"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="cpp" style="display: none;">// 该函数根据sql语句在Redis中查询相应的结果集，并返回结果集中每一行所对应的数据结构的键
vector&lt;string&gt; GetCache(sql::Connection *mysql_connection,
                      redisContext *redis_connection,
                      const string &amp;sql, int ttl, int type) {
  vector&lt;string&gt; redis_row_key_vector;
  string resultset_id = md5(sql);  // 计算sql语句的md5，这是唯一标识结果集的关键
  // type==1时，该函数将查询相应的STRING集合或将结果集写入若干STRING
  string cache_type = (type == 1) ? "string" : "hash";
  // 根据type信息和结果集标识符合成SET键
  string redis_row_set_key = "resultset." + cache_type + ":" + resultset_id;
  redisReply *reply;
  // 尝试从reply中获取SET中保存的所有键
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "SMEMBERS %s",
                                               redis_row_set_key.c_str()));
  if (reply-&gt;type == REDIS_REPLY_ARRAY) {
// 如果要找的SET不存在，说明Redis中没有相应的结果集，需要调用Cache2String或
// Cache2Hash函数把数据从Mysql拉取到Redis中
    if (reply-&gt;elements == 0) {
      freeReplyObject(reply);
      sql::Statement *stmt = mysql_connection-&gt;createStatement();
      sql::ResultSet *resultset = stmt-&gt;executeQuery(sql);
      if (type == 1) {
        redis_row_set_key = Cache2String(mysql_connection, redis_connection,
                                         resultset, resultset_id, ttl);
      } else {
        redis_row_set_key = Cache2Hash(mysql_connection, redis_connection, 
                                       resultset, resultset_id, ttl);
      }
  // 再次尝试从reply中获取SET中保存的所有键
      reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                   "SMEMBERS %s",
                                                   redis_row_set_key.c_str()));
      delete resultset;
      delete stmt;
    }
// 把SET中的每个STRING或HASH键存入redis_row_key_vector中
    string redis_row_key;
    for (int i = 0; i &lt; reply-&gt;elements; ++i) {
      redis_row_key = reply-&gt;element[i]-&gt;str;
      redis_row_key_vector.push_back(redis_row_key);
    }
    freeReplyObject(reply);
  } else {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - SMEMBERS error");
  }
  return redis_row_key_vector;
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 现在我们已经掌握了确定Redis中的结果集标识符以及各数据结构的键的方法。下一篇文章将研究结果集在Redis中的排序和分页问题。<p>&nbsp;</p>
</div><img src ="http://www.cnitblog.com/stomic/aggbug/90329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-25 01:47 <a href="http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（2）——用Redis作为Mysql数据库的缓存</title><link>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 15:46:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90328.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90328.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90328.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 用Redis作Mysql数据库缓存，必须解决2个问题。首先，应该确定用何种数据结构存储来自<span style="font-size:18px">Mysql的数据；在</span>确定数据结构之后，还要考虑用什么标识作为该数据结构的键。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 直观上看，Mysql中的数据都是按表存储的；更微观地看，这些表都是按行存储的。每执行一次select查询，Mysql都会返回一个结果集，这个结果集由若干行组成。所以，一个自然而然的想法就是在Redis中找到一种对应于Mysql行的数据结构。Redis中提供了五种基本数据结构，即字符串（string）、列表（list）、哈希（hash）、集合（set）和有序集合（sorted set）。经过调研，发现适合存储行的数据结构有两种，即string和hash。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 要把Mysql的行数据存入string，首先需要对行数据进行格式化。事实上，结果集的每一行都可以看做若干由字段名和其对应值组成的键值对集合。这种键值对结构很容易让我们想起Json格式。因此，这里选用Json格式作为结果集每一行的格式化模板。根据这一想法，我们可以实现将结果集格式化为若干Json对象，并将Json对象转化为字符串存入Redis的代码：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/474440" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/474440/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 804px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数把结果集中的每一行转换为一个Json格式的字符串并存入Redis的STRING结构中，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;STRING键应该包含结果集标识符和STRING编号，形式如&#8220;cache.string:123456:1&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>string&nbsp;Cache2String(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(resultset-&gt;rowsCount()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;rows"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;STRING键的前缀，包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;prefix(<span class="string">"cache.string:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_row&nbsp;=&nbsp;1;&nbsp;&nbsp;</span><span class="comment">//&nbsp;STRING编号，附加于STRING键的末尾，从1开始</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;sql::ResultSetMetaData&nbsp;*meta&nbsp;=&nbsp;resultset-&gt;getMetaData();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_col&nbsp;=&nbsp;meta-&gt;getColumnCount();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中所有行对应的所有STRING键存入该SET，SET键包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key(<span class="string">"resultset.string:"</span><span>&nbsp;+&nbsp;resultset_id);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ttlstr;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;ttlstr&nbsp;=&nbsp;ttlstream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;resultset-&gt;beforeFirst();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中的每一行转为Json格式的字符串，将这些Json字符串存入STRING，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;每个STRING对应结果集中的一行</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(resultset-&gt;next())&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;<span class="comment">//&nbsp;STRING键名，由前缀和STRING编号组成</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;keystream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;keystream&nbsp;&lt;&lt;&nbsp;prefix&nbsp;&lt;&lt;&nbsp;num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;keystream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Json::Value&nbsp;row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;num_col;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_label&nbsp;=&nbsp;meta-&gt;getColumnLabel(i);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_value&nbsp;=&nbsp;resultset-&gt;getString(col_label);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row[col_label]&nbsp;=&nbsp;col_value;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Json::FastWriter&nbsp;writer;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_value&nbsp;=&nbsp;writer.write(row);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将STRING键及Json格式的对应值对存入Redis</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SET&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_value.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将STRING键加入SET中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SADD&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;设置STRING的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;++num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置SET的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_set_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回SET键，以便于其他函数获取该SET中的内容</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="474440" snippet_file_name="blog_20140924_1_7066320" name="code" class="cpp" style="display: none;">// 该函数把结果集中的每一行转换为一个Json格式的字符串并存入Redis的STRING结构中，
// STRING键应该包含结果集标识符和STRING编号，形式如&#8220;cache.string:123456:1&#8221;
string Cache2String(sql::Connection *mysql_connection,
                    redisContext *redis_connection,
                    sql::ResultSet *resultset,
                    const string &amp;resultset_id, int ttl) {
  if (resultset-&gt;rowsCount() == 0) {
    throw runtime_error("FAILURE - no rows");
  }
  // STRING键的前缀，包含了结果集的标识符
  string prefix("cache.string:" + resultset_id + ":");
  unsigned int num_row = 1;  // STRING编号，附加于STRING键的末尾，从1开始
  sql::ResultSetMetaData *meta = resultset-&gt;getMetaData();
  unsigned int num_col = meta-&gt;getColumnCount();
  // 将结果集中所有行对应的所有STRING键存入该SET，SET键包含了结果集的标识符
  string redis_row_set_key("resultset.string:" + resultset_id);
  redisReply *reply;
  string ttlstr;
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  ttlstr = ttlstream.str();
  resultset-&gt;beforeFirst();
  // 将结果集中的每一行转为Json格式的字符串，将这些Json字符串存入STRING，
  // 每个STRING对应结果集中的一行
  while (resultset-&gt;next()) {
    string redis_row_key;  // STRING键名，由前缀和STRING编号组成
    stringstream keystream;
    keystream &lt;&lt; prefix &lt;&lt; num_row;
    redis_row_key = keystream.str();
    Json::Value row;
    for (int i = 1; i &lt;= num_col; ++i) {
      string col_label = meta-&gt;getColumnLabel(i);
      string col_value = resultset-&gt;getString(col_label);
      row[col_label] = col_value;
    }
    Json::FastWriter writer;
    string redis_row_value = writer.write(row);
// 将STRING键及Json格式的对应值对存入Redis
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SET %s %s",
                                                 redis_row_key.c_str(), 
                                                 redis_row_value.c_str()));
    freeReplyObject(reply);
    // 将STRING键加入SET中
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SADD %s %s",
                                                 redis_row_set_key.c_str(), 
                                                 redis_row_key.c_str()));
    freeReplyObject(reply);
    // 设置STRING的过期时间
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "EXPIRE %s %s",
                                                 redis_row_key.c_str(), 
                                                 ttlstr.c_str()));
    freeReplyObject(reply);
    ++num_row;
  }
  // 设置SET的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                                               redis_row_set_key.c_str(), 
                                               ttlstr.c_str()));
  freeReplyObject(reply);
  return redis_row_set_key;  // 返回SET键，以便于其他函数获取该SET中的内容
}</pre><br />
<br />
<p>&nbsp;</p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 要把Mysql的行数据存入hash，过程要比把数据存入string直观很多。这是由hash的结构性质决定的&#8212;&#8212;hash本身就是一个键值对集合：<span style="font-size:18px">一个&#8220;父键&#8221;下面包含了很多&#8220;子键&#8221;，每个&#8220;子键&#8221;都对应一个值</span>。根据前面的分析可知，结果集中的每一行实际上也是键值对集合。用Redis键值对集合表示Mysql键值对集合应该再合适不过了：对于结果集中的某一行，字段对应于hash的&#8220;子键&#8221;，字段对应的值就是hash&#8220;子键&#8221;对应的值，即结果集的一行刚好对应一个hash。这一想法的实现代码如下：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/474440" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/474440/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 2225px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数把结果集中的每一行都存入一个HASH结构。HASH键应当包括结果集标识符和HASH编号，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;形如&#8220;cache.string:123456:1&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>string&nbsp;Cache2Hash(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(resultset-&gt;rowsCount()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;rows"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;HASH键的前缀，包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;prefix(<span class="string">"cache.hash:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_row&nbsp;=&nbsp;1;&nbsp;&nbsp;</span><span class="comment">//&nbsp;HASH编号，附加于HASH键的末尾，从1开始</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;sql::ResultSetMetaData&nbsp;*meta&nbsp;=&nbsp;resultset-&gt;getMetaData();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_col&nbsp;=&nbsp;meta-&gt;getColumnCount();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中所有行对应的所有HASH键存入该SET，SET键包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key(<span class="string">"resultset.hash:"</span><span>&nbsp;+&nbsp;resultset_id);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ttlstr;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;ttlstr&nbsp;=&nbsp;ttlstream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;结果集中的每一行对应于一个HASH，将结果集的所有行都存入相应HASH中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;resultset-&gt;beforeFirst();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(resultset-&gt;next())&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;<span class="comment">//&nbsp;HASH键名，由前缀和HASH编号组成</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;keystream;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;keystream&nbsp;&lt;&lt;&nbsp;prefix&nbsp;&lt;&lt;&nbsp;num_row;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;keystream.str();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;num_col;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_label&nbsp;=&nbsp;meta-&gt;getColumnLabel(i);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_value&nbsp;=&nbsp;resultset-&gt;getString(col_label);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中一行的字段名和对应值存入HASH</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"HSET&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col_label.c_str(),&nbsp;&nbsp;</span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col_value.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将HASH键加入SET中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SADD&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str()));&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;设置HASH的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;++num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置SET的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_set_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回SET键，以便于其他函数获取该SET中的内容</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="474440" snippet_file_name="blog_20140924_2_3239073" name="code" class="cpp" style="display: none;">// 该函数把结果集中的每一行都存入一个HASH结构。HASH键应当包括结果集标识符和HASH编号，
// 形如&#8220;cache.string:123456:1&#8221;
string Cache2Hash(sql::Connection *mysql_connection,
                  redisContext *redis_connection,
                  sql::ResultSet *resultset,
                  const string &amp;resultset_id, int ttl) {
  if (resultset-&gt;rowsCount() == 0) {
    throw runtime_error("FAILURE - no rows");
  }
  // HASH键的前缀，包含了结果集的标识符
  string prefix("cache.hash:" + resultset_id + ":");
  unsigned int num_row = 1;  // HASH编号，附加于HASH键的末尾，从1开始
  sql::ResultSetMetaData *meta = resultset-&gt;getMetaData();
  unsigned int num_col = meta-&gt;getColumnCount();
  // 将结果集中所有行对应的所有HASH键存入该SET，SET键包含了结果集的标识符
  string redis_row_set_key("resultset.hash:" + resultset_id);
  redisReply *reply;
  string ttlstr;
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  ttlstr = ttlstream.str();
  // 结果集中的每一行对应于一个HASH，将结果集的所有行都存入相应HASH中
  resultset-&gt;beforeFirst();
  while (resultset-&gt;next()) {
    string redis_row_key;  // HASH键名，由前缀和HASH编号组成
    stringstream keystream;
    keystream &lt;&lt; prefix &lt;&lt; num_row;
    redis_row_key = keystream.str();
    for (int i = 1; i &lt;= num_col; ++i) {
      string col_label = meta-&gt;getColumnLabel(i);
      string col_value = resultset-&gt;getString(col_label);
  // 将结果集中一行的字段名和对应值存入HASH
      reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection,
                                                   "HSET %s %s %s",
                                                   redis_row_key.c_str(), 
                                                   col_label.c_str(),
                                                   col_value.c_str()));
      freeReplyObject(reply);
    }
// 将HASH键加入SET中
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SADD %s %s",
                                                 redis_row_set_key.c_str(), 
                                                 redis_row_key.c_str())); 
    freeReplyObject(reply);
// 设置HASH的过期时间
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "EXPIRE %s %s",
                                                 redis_row_key.c_str(), 
                                                 ttlstr.c_str()));
    freeReplyObject(reply);
    ++num_row;
  }
  // 设置SET的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                                               redis_row_set_key.c_str(), 
                                               ttlstr.c_str()));
  freeReplyObject(reply);
  return redis_row_set_key;  // 返回SET键，以便于其他函数获取该SET中的内容
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 至此，我们已经给出了两种存储Mysql结果集的方案，这就是我们在篇首提出的第一个问题，即选择何种数据结构存储Mysql结果集的答案。下一篇文章将研究第二个问题，即数据结构键的标识符选择问题。<p>&nbsp;</p>
</div><img src ="http://www.cnitblog.com/stomic/aggbug/90328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-24 23:46 <a href="http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（1）——认识Redis</title><link>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 15:12:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90326.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90326.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90326.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp;Redis官网对Redis的定义是：&#8220;Redis is an open source, BSD licensed, advanced key-value cache and store&#8221;，可以看出，Redis是一种键值系统，可以用来缓存或存储数据。Redis是&#8220;Remote Dictionary Server&#8221;（远程字典服务）的缩写，提供了字符串（string），列表（list），哈希（hash），集合（set）和有序集合（sorted set）等5种数据结构，这些数据结构使它成为一种便于使用的键值系统。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 作为Redis提供的最简单的数据结构，字符串示意图及其常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925184857911?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="450" height="265" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图1</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 可见，Redis字符串类型实际上类似于C++中的map，一个键对应一个值。列表类型则是一种相对高级的数据结构，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925185250133?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="391" height="283" alt="" style="border: none; max-width: 100%;" />&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图2</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 列表实际上由一个双向链表实现，所以在列表两端插入或删除数据效率极高，可以用于实现类似于微博、人人网上的&#8220;新鲜事&#8221;功能。 Redis提供的一个更有趣的结构称为哈希，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925185805253?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="540" height="273" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图3</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 一个哈希实际上是一组键值对的集合，哈希本身的键是&#8220;父键&#8221;，哈希中包含的若干字段是&#8220;子键&#8221;，每个&#8220;子键&#8221;都有相应的值。&#8220;子键&#8221;之间并没有一定的联系，但是它们共同组成了一个完整的哈希结构。我们可以把一个哈希看做关系数据库中的一行，哈希的每个子键对应行的一个字段。因此，当把关系数据库中的数据缓存至Redis时，使用哈希结构可能会带来方便。需要注意的是，哈希结构内部的子键之间是没有顺序关系的。Redis提供的另一个无顺序关系的结构是集合，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925190618635?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="600" height="296" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图4</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 集合中的数据满足唯一性和无序性。集合在Redis内部是用哈希表实现的，所以插入和删除操作的时间复杂度均为O(1)。Redis为集合提供了求交并差等运算命令，使用起来非常方便。与集合密切相关的另一个数据结构是有序集合，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925191134083?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="486" height="313" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图5</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 有序集合与集合的最大差异在于有序集合中的每个数据都有一个对应的分数，集合中的元素就是按照这些分数进行排序的。从结构功能和使用方法上来看，有序集合可能是Redis提供的5种数据结构中最高级的一种。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis是一种内存数据库，这使其在数据存取效率方面表现突出。由于内存中的数据时刻面临丢失的危险，Redis提供了两种持久化机制，及时将内存中的数据写入硬盘。第一种机制为RDB，利用存储快照的方式把内存数据定期写入硬盘；第二种机制为AOF，利用写日志的方式，每执行一条更改Redis数据的命令，就在日志里附加上该命令并保存在硬盘上。Redis默认开启RDB模式，关闭AOF模式，这是因为AOF更加耗时。但是，如果对数据安全要求极高，无法承担任何数据丢失的后果，AOF模式就变成了持久化的首选。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 当然，即使Redis具备持久化机制，但是一旦本地硬盘损坏，数据丢失依然在所难免。所以，Redis又提供了复制功能，作用是将一个主数据库（master）的数据自动同步到多个从数据库（slave），从而尽可能防止数据丢失。Redis主从机制可以简单描述为：从数据库启动后，先向主数据库发送SYNC命令；主数据库接到SYNC命令后就开始保存快照，在此期间，所有发给主数据库的命令都被缓存起来；快照保存完成后，主数据库把快照和缓存的命令一起发给从数据库；从数据库保存主数据库发来的快照文件，并依次执行主数据库发来的缓存命令。在同步过程中，从数据库不会阻塞，它默认使用同步之前的数据继续响应客户端发来的命令。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 事务是Redis提供的特性之一。首先利用MULTI命令通知Redis，接下来的若干命令属于同一事务；然后输入若干命令，这些命令都被放入命令队列而不会被立即执行；最后，利用EXEC命令通知Redis，属于同一事务的所有命令均已输入完成，现在开始执行该事物。属于同一个事务的所有有效命令或者全部被执行，或者全部不执行，且在执行过程中不会插入其他命令。</span><span style="font-size: 18px;">管道（pipeline）是Redis提供的另一个特性。该特性使Redis能够一次性接收多个命令，执行之后再一次性返回结果。这样能够减少客户端与Redis服务器的通信次数，从而降低往返时延。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 除事务和管道以外，Redis还提供了很多其他特性，如设置键的过期时间，利用BLPOP/BRPOP命令实现优先级队列，利用PUBLISH/SUBSCRIBE命令实现消息订阅和发布等，这里不再赘述。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis由ANSI C写成，能够运行在包括Linux和OS X在内的大部分POSIX系统上，官方推荐的操作系统为Linux。Redis没有官方的Windows版本，但是微软移植并维护了一个能够运行在Windows上的Redis并放在github上（https://github.com/MSOpenTech/redis）。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis的编程接口被称为客户端（clients），绝大部分主流编程语言都有官方推荐的客户端。下图中，具有Redis官方推荐客户端的语言标为绿色，没有官方推荐客户端的标为蓝色：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925175354168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图6</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 由于Redis没有官方推荐的C++客户端，因此可以使用C客户端予以代替。官方推荐的C客户端是hiredis，可以从github上找到（https://github.com/redis/hiredis）。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 作为一款功能强大，效率极高的NoSQL数据库，Redis已被包括新浪微博，知乎，Stackoverflow，暴雪和Flickr在内的多家公司成功用于实战。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">注：图1-5均来自《Redis in Action》,Josiah L.Carlson, Manning Publications, 2013</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">参考文献：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">1. 李子骅，Redis入门指南，人民邮电出版社，2013年5月第1版</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">2.Josiah L.Carlson, Redis in Action, Manning Publications, 2013</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">3. Redis官方网站http://www.redis.io</span></p><img src ="http://www.cnitblog.com/stomic/aggbug/90326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-24 23:12 <a href="http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>m​y​s​q​l​主​从​原​理</title><link>http://www.cnitblog.com/stomic/archive/2014/06/09/89596.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 09 Jun 2014 12:58:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2014/06/09/89596.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/89596.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2014/06/09/89596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/89596.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/89596.html</trackback:ping><description><![CDATA[<div><br />（1）、修改mysql的配置文件（/etc/my.cnf）在配置文件中设置： <br />server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1&nbsp;&nbsp;&nbsp;###每一个数据库服务器都要制定一个唯一的server-id，通常主服务器制定为1。&nbsp;log-bin=mysql-bin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;###mysql进行主从复制是通过二进制的日志文件来进行的，所以必须开启mysql的日志功能 <br />（这个是/etc/my.cnf的默认配置，保持不变即可） <br />（2）、GRANT&nbsp;REPLICATION&nbsp;SLAVE&nbsp;ON&nbsp;*.*&nbsp;TO&nbsp;'&nbsp;replication'@'172.28.3.41'&nbsp;IDENTIFIED&nbsp;BY&nbsp;'koncept';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#####给主数据库服务器授予一个可以进行复制的用户，172.28.3.41为从服务器的IP，这样从服务器就能有钱先来访问主数据库服务器&nbsp;2、从数据库服务器的设置 <br />修改数据库配置文件/etc/my.cnf，配置如下内容： <br />&nbsp;&nbsp;&nbsp;#server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1&nbsp;&nbsp;####必须把server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1注释掉，&nbsp;&nbsp;&nbsp;&nbsp;server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2&nbsp;&nbsp;####设置从的ID号 <br />&nbsp;&nbsp;&nbsp;master-host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;172.28.3.43&nbsp;&nbsp;#####设置主服务器的IP&nbsp;&nbsp;&nbsp;&nbsp;master-user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;replication&nbsp;&nbsp;#####设置连接主服务器的用户名&nbsp;&nbsp;&nbsp;&nbsp;master-password&nbsp;=&nbsp;&nbsp;&nbsp;concept&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#####设置连接主服务器的密码 <br />&nbsp;&nbsp;&nbsp;replicate-do-db=imtest0&nbsp;&nbsp;######设置你要同步的数据库，可以设置多个&nbsp;&nbsp;&nbsp;&nbsp;####就是我们前面建的用户名和密码，另外如果有端口号的变化还要配置端口&nbsp;master-port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&lt;port&gt;&nbsp;配置成你设置的端口就OK了！ <br />3、分别重新启动主从服务器&nbsp;####&nbsp;如果不重新启动主服务器在后面查看status的时候会出现问题！&nbsp;4在从服务器上登录mysql，输入：show&nbsp;slave&nbsp;status\G&nbsp;&nbsp;如果发现有：&nbsp;&nbsp;&nbsp;Slave_IO_Running:&nbsp;Yes&nbsp;Slave_SQL_Running:&nbsp;Yes <br />&nbsp;&nbsp;就说明已经成功了，如果这两个选项不全是Yes，那就说明你钱面的某个配置错了，&nbsp;&nbsp;&nbsp;我做的时候没有把主服务器重启，就出现&nbsp;&nbsp;Slave_IO_Running:&nbsp;NO。重启后好了！&nbsp;&nbsp;四、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;监控服务器的状态&nbsp;1、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;监控主服务器的状态 <br />可通过show&nbsp;master&nbsp;status来监控主服务器的状态，内容如下：&nbsp;+------------------+----------+--------------+------------------+&nbsp;|&nbsp;File&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;Position&nbsp;|&nbsp;Binlog_Do_DB&nbsp;|&nbsp;Binlog_Ignore_DB&nbsp;|&nbsp;+------------------+----------+--------------+------------------+&nbsp;|&nbsp;mysql-bin.000003&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1164&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;+------------------+----------+--------------+------------------+ <br />#####其中File表示日志文件记录，Position表示日志文件的位置，这个也是数据库执行复制操作的必须标识，后面两字段表示复制的数据库名和不复制的数据库名，也可以在配置文件中你进行配置。&nbsp;2、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;监控从服务器的状态 <br />可以通过：show&nbsp;slave&nbsp;status\G来查看，另外如果从数据库在复制的过程中出现问题，可以通过命令reset&nbsp;slave从数据库服务器复制的线程，从数据库服务器的通常操作命令有：&nbsp;start&nbsp;slave；&nbsp;&nbsp;####启动复制线程&nbsp;stop&nbsp;slave；&nbsp;&nbsp;####停止复制线程&nbsp;reset&nbsp;slave；&nbsp;&nbsp;####重置复制线程 <br />change&nbsp;master&nbsp;to；&nbsp;###动态改变到主服务器的配置</div><img src ="http://www.cnitblog.com/stomic/aggbug/89596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2014-06-09 20:58 <a href="http://www.cnitblog.com/stomic/archive/2014/06/09/89596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE中的锁（oracle lock mode）</title><link>http://www.cnitblog.com/stomic/archive/2011/05/26/74079.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 26 May 2011 08:46:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/05/26/74079.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/74079.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/05/26/74079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/74079.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/74079.html</trackback:ping><description><![CDATA[<div>                     关键字: oracle 锁            <span style="font-size: small;">ORACLE里锁有以下几种模式: <br /> 0：none <br /> 1：null&nbsp;空 <br /> 2：Row-S&nbsp;行共享(RS)：共享表锁，sub&nbsp;share&nbsp; <br /> 3：Row-X&nbsp;行独占(RX)：用于行的修改，sub&nbsp;exclusive&nbsp; <br /> 4：Share&nbsp;共享锁(S)：阻止其他DML操作，share <br /> 5：S/Row-X&nbsp;共享行独占(SRX)：阻止其他事务操作，share/sub&nbsp;exclusive&nbsp; <br /> 6：exclusive&nbsp;独占(X)：独立访问使用，exclusive <br /><br /> 数字越大锁级别越高,&nbsp;影响的操作越多。 <br /><br /> 1级锁有：Select，有时会在v$locked_object出现。 <br /> 2级锁有：Select&nbsp;for&nbsp;update,Lock&nbsp;For&nbsp;Update,Lock&nbsp;Row&nbsp;Share&nbsp; <br /> select&nbsp;for&nbsp;update当对话使用for&nbsp;update子串打开一个游标时，所有返回集中的数据行都将处于行级(Row-X)独占式锁定，其他对象只能查询这些数据行，不能进行update、delete或select&nbsp;for&nbsp;update操作。 <br /> 3级锁有：Insert,&nbsp;Update,&nbsp;Delete,&nbsp;Lock&nbsp;Row&nbsp;Exclusive <br /> 没有commit之前插入同样的一条记录会没有反应,&nbsp;因为后一个3的锁会一直等待上一个3的锁,&nbsp;我们必须释放掉上一个才能继续工作。 <br /> 4级锁有：Create&nbsp;Index,&nbsp;Lock&nbsp;Share <br /> locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,&nbsp;但DDL(alter,drop等)操作会提示ora-00054错误。 <br /> 00054,&nbsp;00000,&nbsp;"resource&nbsp;busy&nbsp;and&nbsp;acquire&nbsp;with&nbsp;NOWAIT&nbsp;specified" <br /> //&nbsp;*Cause:&nbsp;Resource&nbsp;interested&nbsp;is&nbsp;busy. <br /> //&nbsp;*Action:&nbsp;Retry&nbsp;if&nbsp;necessary. <br /> 5级锁有：Lock&nbsp;Share&nbsp;Row&nbsp;Exclusive&nbsp; <br /> 具体来讲有主外键约束时update&nbsp;/&nbsp;delete&nbsp;...&nbsp;;&nbsp;可能会产生4,5的锁。 <br /> 6级锁有：Alter&nbsp;table,&nbsp;Drop&nbsp;table,&nbsp;Drop&nbsp;Index,&nbsp;Truncate&nbsp;table,&nbsp;Lock&nbsp;Exclusive <br /><br /> 以DBA角色,&nbsp;查看当前数据库里锁的情况可以用如下SQL语句： <br /><br /> col&nbsp;owner&nbsp;for&nbsp;a12 <br /> col&nbsp;object_name&nbsp;for&nbsp;a16 <br /> select&nbsp;b.owner,b.object_name,l.session_id,l.locked_mode <br /> from&nbsp;v$locked_object&nbsp;l,&nbsp;dba_objects&nbsp;b <br /> where&nbsp;b.object_id=l.object_id <br /> / <br /><br /> select&nbsp;t2.username,t2.sid,t2.serial#,t2.logon_time&nbsp; <br /> from&nbsp;v$locked_object&nbsp;t1,v$session&nbsp;t2&nbsp; <br /> where&nbsp;t1.session_id=t2.sid&nbsp;order&nbsp;by&nbsp;t2.logon_time <br /> / <br /><br /> 如果有长期出现的一列，可能是没有释放的锁。我们可以用下面SQL语句杀掉长期没有释放非正常的锁： <br /><br /> alter&nbsp;system&nbsp;kill&nbsp;session&nbsp;'sid,serial#'; <br /><br /> 如果出现了锁的问题,&nbsp;某个DML操作可能等待很久没有反应。 <br /><br /> 当你采用的是直接连接数据库的方式，也不要用OS系统命令&nbsp;$kill&nbsp;process_num&nbsp;或者&nbsp;$kill&nbsp;-9&nbsp;process_num来终止用户连接，因为一个用户进程可能产生一个以上的锁,&nbsp;杀OS进程并不能彻底清除锁的问题</span></div><img src ="http://www.cnitblog.com/stomic/aggbug/74079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-05-26 16:46 <a href="http://www.cnitblog.com/stomic/archive/2011/05/26/74079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle之PL/SQL的变量</title><link>http://www.cnitblog.com/stomic/archive/2011/04/10/73309.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 10 Apr 2011 08:06:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/04/10/73309.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73309.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/04/10/73309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73309.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73309.html</trackback:ping><description><![CDATA[<div>
<p>PLSQL变量有四种类型，分别是：</p>
<p>－ 标量类型（Scalar） </p>
<p>－ 复合类型（Composite）</p>
<p>－
参照类型（Reference）</p>
<p>－ LOB类型（Large Object）
</p>
<br>
<p><strong>1、标量类型：</strong><br> － 只能存放单个数值的变量<br> － 定义时，必须要指定标量的数据类型</p>
<p>1.1常用标量类型<br>（1）VARCHAR2(n)<br>定义可变长度的字符串<br>n指定字符串最大长度<br>n最大值是32767字节<br>使用时必须指定长度<br>当在PLSQL块钟使用该数据类型操纵VARCHAR2表列时，起数值长度不应超过4000字节</p>
<p>（2）CHAR(n)<br>定义固定长度字符串<br>n指定字符串的最大长度<br>n最大值是32767自己<br>使用时指定长度，若没指定，则使用默认值1<br>当在PLSQL块钟使用该数据类型操纵CHAR2表列时，起数值长度不应超过2000字节</p>
<p>（3）NUMBER(p，s)<br>定义固定长度的整数和浮点数<br>p表示精度，用于指定数字的总位数<br>s表示标度，用于指定小数点后的数字位数</p>
<p>（4）DATE<br>定义日期和数据数据</p>
<p>（5）BOOLEAN<br>定义布尔变量<br>值为：TRUE、FALSE、NULL<br>为PLSQL独有数据类型，表列不能采用该数据类型<br>NULL表示missing、inapplicable或者unknown</p>
<p>（6）LONG和LONG
ROW<br>long：数据类型用于定义变长字符串，类似于VARCHAR2数据类型，但其字符串的最大长度为32760字节<br>long
row：数据类型用于定义变长的二进制数据，其数据最大长度为32760字节</p>
<p>（7）BINARY_INTEGER<br>定义整数<br>数值范围-2147483647和2174483647之间</p>
<p>（8）BINARY_FLOAT和BINARY_DOUBLE<br>BINARY_FLOAT定义单精度浮点数（oracle
10g新增加）<br>BINARY_DOUBLE定义双精度浮点数（oracle 10g新增加）</p>
<p>（9）TIMESTAMP<br>定义时间和日期数据（oracle
9i新增加）<br>对其赋值方法与对date变量赋值方法完全相同<br>当显示TIMESTAMP变量数据时，不仅会显示日期，而且还会显示时间和上下午标记</p>
<p>1.2、定义标量类型<br>语法：<br>identifier [CONSTANT] datatype [NOT NULL] [ :=|DEFAULT
expr]<br>identifier：指定变量或常量名称<br>CONSTANT：指定是常量<br>datatype：用于指定变量或常量的类型<br>NOT
NULL：非空，有它是必须初始化<br>:= ：赋值符合<br>DEFAULT：默认值<br>expr：初始值</p>
<p>1.3、标量定义规则<br>每行声明一个变量<br>变量的赋值使用：identifier := value;<br>变量名称最多30个字符</p>
<p>1.4使用%TYPE属性<br>安装数据库列或其他变量来确定新变量的类型和长度（具有动态性和绑定性）<br>语法：identifier
Table.column_name%TYPE;<br>   或 identifier other_variable_name%TYPE;</p>
<p><br><strong>2、复合变量</strong>指用于存放多个值的变量<br>当定义复合变量时，必须要使用PL/SQL的复合数据类型<br>PL/SQL的复合数据类型包括：<br> PL/SQL记录<br> PL/SQL表（索引表）<br> PL/SQL嵌套表<br> VARRAY<br>关于这些复合数据类型，由相关章节给出</p>
<p><br><strong>3、参照变量</strong>指用于存放数值指针的变量<br>可以通过参照变量来共享相同对象，从而降低占用空间<br>两种参照变量：<br> 游标变量（REF
CURSOR）<br> 对象类型变量（REF obj_type）<br>关于这些参照变量，由相关章节给出</p>
<p><br><strong>4、LOB变量</strong>用于存储大批量数据的变量<br>分为两种：<br> 内部LOB：包括CLOB、BLOB、NCLOB，它们的数据被存储在数据库中，并且支持事务操作<br> 外部LOB：BFILE，该类型数据被存储在OS文件中，并且不支持事务操作</p>
<p>CLOB：存储大批量字符数据<br>NCLOB：存储大批量字符数据，unicode编码<br>BLOB：存储大批量二进制数据<br>BFILE：存储指向OS文件的指针</p>
<p><br><strong>5、非PL/SQL变量</strong>5.1、<strong>替换变量</strong>（仅用于SQL
*Plus或者用于原理和SQL
*Plus相同的开发工具）：<br>临时存储值<br>利用它可以达到创建通用脚本的目的<br>利用它可以达到和用户交互，故在SQL
*Plus中又称交互式命令<br>替换变量的格式式在变量名称前加一个&amp;，以便在运行SQL命令时提示用户输入替换数据，然后按输入数据运行SQL命令<br>语法：<br>（1）&amp;
：&#8220;&amp;变量名&#8221;eg：&amp;name;<br>生命周期：单次引用中，不需要声明，如果替换字符或日期类型，最好用单引号扩起<br>使用范围：where、order
by、列表达式、表名、整个SELECT 语句中</p>
<p>（2）&amp;&amp;
：&#8220;&amp;&amp;变量名&#8221;eg：&amp;&amp;name;<br>生命周期：整个会话（session连接）,不需要声明</p>
<p>（3）define ：&#8220;define 变量名=变量值&#8221;eg：DEFINE a =
clark;<br>生命周期：整个会话，预先声明，使用时用&amp;引用声明的变量<br>define
variable=用户创建的CHAR类型的值：define 变量名=值；<br>define
column_name(变量名)：查看变量命令。 <br>undefine
变量名：清除变量<br>define：查看在当前会话中所有的替换变量和它们的值</p>
<p>（4）accept</p>
<p>生命周期：整个会话<br>预先声明，可以客户化提示信息，使用时用&amp;引用声明的变量。<br>定义：<br><font color="#6d22dd">accept   变量名name   number/char/date   prompt
'提示信息内容'</font>即：ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT]
format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]]
[HIDE]<br>解释：<br>PROMPT命令：用于输出提示用户的信息，以便使用户了解脚本文件的功能和运行情况<br>PAUSE命令：用于暂停脚本文件的运行<br>HIDE选项：用于隐藏用户的输入，使别人不可见，安全<br>这条命令的意思是：当plsql程序段执行到变量<font color="#1a1ae6">name</font>的时候，此时需要用户的交互才能继续执行下去，plsql程序段会显示&#8220;<font color="#2222dd">提示信息内容</font>&#8221;让用户输入相关信息（如果指定<font color="#3333cc">hide</font>选项，那么在接下去用户输入的东西将被用星号显示出来增加安全，有点像输入密码），用户输入的内容被接收到并且把它付给name，关于在&#8220;提示信息内容&#8221;下用户输入的内容的类型，plsql程序段开发人员来通过<font color="#2b2bd5">number/char/date</font>指定，变量name得到正确的值以后，继续执行相关下面的程序！<br>例：accept
a char prompt '请输入员工的雇佣时间(yyyy-mm-dd):' hide <br>例：accept a char prompt 'input
a:' hide<br><br>替换变量非常的依赖SQL
*Plus的环境，当环境变量verify被关闭的时候它就不可用，只有通过打开它才能使用：<br>set verify(环境变量)
off;关闭调试命令（关掉替换过程）<br>set verify(环境变量) on;打开调试命令(可以看到替换过程)</p>
<p><br>5.2、<strong>SQL *PLUS环境变量</strong>（仅用于SQL *Plus或者用于原理和SQL
*Plus相同的开发工具）：<br>ECHO 显示回显<br>HEADING
{OFF/ON}是否显示列标题<br>ARRAYSIZE{20/n}每一次从查询得到的返回量的大小<br>FEEDBACK{OFF/ON}回馈，反馈信息<br>LONG{80/n}on/text}
LONG类型<br>LINESIZE 行的宽度<br>SET LINESIZE n(最好是在200之内)<br>PAGESIZE ：设置页的大小。SET
PAGESIZE N<br>wrap{off/on} 折行<br>SET 修改<br>SHOW 显示</p>
<p>SQL *PLUS中格式化显示的命令：<br>COLUMN[column option]可以设置字段或字段别名的格式<br>COLUMN
last_name HEADING employee|name  '|'代表换行<br>col 字段名
查看命令<br>CLE[AR]：清除列的格式<br>HEA[DING] TEXT：设置列标题<br>FOR[MAT]
FORMAT：格式化显示列的值，对字符和数字有效，对日期无效，eg：column salary justify left format
＄999,999.00，其中justify left:左对齐；col manager_id format
999999999<br>限制字符串的长度有A+数字限制<br>限制数字的长度有9，有几为9就限制成几位。<br>NOPRINT/PRINT
NOPRINT：把一个字段从输出上屏蔽掉（返回但不显示）。<br>col 字段名 noprint/print.
<br>NULL如果有NULL值，显示什么。<br>col name null 'on employee'
<br>TTITLE[text/off/on]设置报表的表头<br>BTITLE[text/off/on]设置报表的表尾<br>做报表的时候要先想好PAGESIZE的大小。<br>BREAK
ON [REPORT_ELEMENT]<br>压制重复值的显示，只能跟一个字段名才有效，eg：<br>select
department_id,last_name<br>from employees<br>where rownum&lt;30<br>order by
1,2;<br>break on department_id</p>
<p>5.3、<strong>做PL/SQL脚本文件的过程：</strong>变量定义accept<br>环境变量设置SET<br>格式控制命令<br>SPOOL<br>使用变量的SQL<br>SPOOL
OFF<br>清除格式控制<br>重置环境变量<br>释放变量</p>
<p>5.4、<strong>引用非PL/SQL变量</strong>当要在PL/SQL块中引用非PL/SQL变量时，也就是要引用PL/SQL块所在地的host变量（或称&#8220;环境变量&#8221;）时，必须要在非PL/SQL变量前加冒号（&#8220;：&#8221;），eg：&#8221;:name&#8221;,name为非PL/SQL变量。</p>
</div><img src ="http://www.cnitblog.com/stomic/aggbug/73309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-04-10 16:06 <a href="http://www.cnitblog.com/stomic/archive/2011/04/10/73309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 索引结构及其使用（一）</title><link>http://www.cnitblog.com/stomic/archive/2011/04/10/73305.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 10 Apr 2011 05:31:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/04/10/73305.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73305.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/04/10/73305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73305.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73305.html</trackback:ping><description><![CDATA[<strong>SQL Server 索引结构及其使用（一）</strong>
<br>作者：<a  href="http://www.vckbase.com/bbs/userinfo.asp?id=freedk" target="_blank">freedk</a>
<p><strong>一、深入浅出理解索引结构</strong>
<br>
<br>　　实际上，您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引：聚集索引（clustered
index，也称聚类索引、簇集索引）和非聚集索引（nonclustered
index，也称非聚类索引、非簇集索引）。下面，我们举例来说明一下聚集索引和非聚集索引的区别：
<br>　　其实，我们的汉语字典的正文本身就是一个聚集索引。比如，我们要查&#8220;安&#8221;字，就会很自然地翻开字典的前几页，因为&#8220;安&#8221;的拼音是&#8220;an&#8221;，而
按照拼音排序汉字的字典是以英文字母&#8220;a&#8221;开头并以&#8220;z&#8221;结尾的，那么&#8220;安&#8221;字就自然地排在字典的前部。如果您翻完了所有以&#8220;a&#8221;开头的部分仍然找不到这
个字，那么就说明您的字典中没有这个字；同样的，如果查&#8220;张&#8221;字，那您也会将您的字典翻到最后部分，因为&#8220;张&#8221;的拼音是&#8220;zhang&#8221;。也就是说，字典的
正文部分本身就是一个目录，您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为&#8220;聚集索引&#8221;。
<br>　　如果您认识某个字，您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字，不知道它的发音，这时候，您就不能按照刚才的方法找到您
要查的字，而需要去根据&#8220;偏旁部首&#8221;查到您要找的字，然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合&#8220;部首目录&#8221;和&#8220;检字表&#8221;而查到的字
的排序并不是真正的正文的排序方法，比如您查&#8220;张&#8221;字，我们可以看到在查部首之后的检字表中&#8220;张&#8221;的页码是672页，检字表中&#8220;张&#8221;的上面是&#8220;驰&#8221;字，但
页码却是63页，&#8220;张&#8221;的下面是&#8220;弩&#8221;字，页面是390页。很显然，这些字并不是真正的分别位于&#8220;张&#8221;字的上下方，现在您看到的连续的&#8220;驰、张、弩&#8221;三字
实际上就是他们在非聚集索引中的排序，是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字，但它需要两个过程，先找到目录中
的结果，然后再翻到您所需要的页码。我们把这种目录纯粹是目录，正文纯粹是正文的排序方式称为&#8220;非聚集索引&#8221;。
<br>　　通过以上例子，我们可以理解到什么是&#8220;聚集索引&#8221;和&#8220;非聚集索引&#8221;。进一步引申一下，我们可以很容易的理解：每个表只能有一个聚集索引，因为目录只能按照一种方法进行排序。
<br>
<br><strong>二、何时使用聚集索引或非聚集索引</strong>
<br>
<br>下面的表总结了何时使用聚集索引或非聚集索引（很重要）：
</p>
<table id="AutoNumber1" style="color: #000000; border-collapse: collapse;" width="62%" border="1" cellpadding="0" cellspacing="0" height="107">
    <tbody>
        <tr>
            <td width="40%" align="center" height="23">动作描述</td>
            <td width="29%" align="center" height="23">使用聚集索引</td>
            <td width="31%" align="center" height="23">使用非聚集索引</td>
        </tr>
        <tr>
            <td width="40%" height="20">列经常被分组排序</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">返回某范围内的数据</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">一个或极少不同值</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">小数目的不同值</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">不应</td>
        </tr>
        <tr>
            <td width="40%" height="20">大数目的不同值</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">频繁更新的列</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">外键列</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">主键列</td>
            <td width="29%" height="20">应</td>
            <td width="31%" height="20">应</td>
        </tr>
        <tr>
            <td width="40%" height="20">频繁修改索引列</td>
            <td width="29%" height="20">不应</td>
            <td width="31%" height="20">应</td>
        </tr>
    </tbody>
</table>
<p>　　事实上，我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如：返回某范围内的数据一项。比如您的某个表有一个时间列，恰好您把聚
合索引建立在了该列，这时您查询2004年1月1日至2004年10月1日之间的全部数据时，这个速度就将是很快的，因为您的这本字典正文是按日期进行排
序的，聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可；而不像非聚集索引，必须先查到目录中查到每一项数据对应的页码，然后再根据页码查到具
体内容。
<br>
<br><strong>三、结合实际，谈索引使用的误区</strong>
<br>
<br>　　理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引，但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区，以便于大家掌握索引建立的方法。
<br>
<br>1、主键就是聚集索引
<br>　　这种想法笔者认为是极端错误的，是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。
<br>　　通常，我们会在每个表中都建立一个ID列，以区分每条数据，并且这个ID列是自动增大的，步长一般为1。我们的这个办公自动化的实例中的列
Gid就是如此。此时，如果我们将这个列设为主键，SQL
SERVER会将此列默认为聚集索引。这样做有好处，就是可以让您的数据在数据库中按照ID进行物理排序，但笔者认为这样做意义不大。
<br>　　显而易见，聚集索引的优势是很明显的，而每个表中只能有一个聚集索引的规则，这使得聚集索引变得更加珍贵。
<br>　　从我们前面谈到的聚集索引的定义我们可以看出，使用聚集索引的最大好处就是能够根据查询要求，迅速缩小查询范围，避免全表扫描。在实际应用
中，因为ID号是自动生成的，我们并不知道每条记录的ID号，所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源
浪费。其次，让每个ID号都不同的字段作为聚集索引也不符合&#8220;大数目的不同值情况下不应建立聚合索引&#8221;规则；当然，这种情况只是针对用户经常修改记录内
容，特别是索引项的时候会负作用，但对于查询速度并没有影响。
<br>　　在办公自动化系统中，无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。
<br>　　通常，办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况，但如果您的系统
已建立了很长时间，并且数据量很大，那么，每次每个用户打开首页的时候都进行一次全表扫描，这样做意义是不大的，绝大多数的用户1个月前的文件都已经浏览
过了，这样做只能徒增数据库的开销而已。事实上，我们完全可以让用户打开系统首页时，数据库仅仅查询这个用户近3个月来未阅览的文件，通过&#8220;日期&#8221;这个字
段来限制表扫描，提高查询速度。如果您的办公自动化系统已经建立的2年，那么您的首页显示速度理论上将是原来速度8倍，甚至更快。
<br>　　在这里之所以提到&#8220;理论上&#8221;三字，是因为如果您的聚集索引还是盲目地建在ID这个主键上时，您的查询速度是没有这么高的，即使您在&#8220;日期&#8221;这
个字段上建立的索引（非聚合索引）。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现（3个月内的数据为25万条）：
<br>
<br>（1）仅在主键上建立聚集索引，并且不划分时间段：
</p>
<pre>Select gid,fariqi,neibuyonghu,title from tgongwen</pre>
<p>用时：128470毫秒（即：128秒）
<br>
<br>（2）在主键上建立聚集索引，在fariq上建立非聚集索引：
</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen<br>where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：53763毫秒（54秒）
<br>
<br>（3）将聚合索引建立在日期列（fariqi）上：
</p>
<pre>select gid,fariqi,neibuyonghu,title from Tgongwen<br>where fariqi&gt; dateadd(day,-90,getdate())</pre>
<p>用时：2423毫秒（2秒）
<br>
<br>　　虽然每条语句提取出来的都是25万条数据，各种情况的差异却是巨大的，特别是将聚集索引建立在日期列时的差异。事实上，如果您的数据库真的有
1000万容量的话，把主键建立在ID列上，就像以上的第1、2种情况，在网页上的表现就是超时，根本就无法显示。这也是我摒弃ID列作为聚集索引的一个
最重要的因素。得出以上速度的方法是：在各个select语句前加：
</p>
<pre>declare @d datetime<br>set @d=getdate()</pre>
<p>并在select语句后加：</p>
<pre>select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())</pre>
<p>2、只要建立索引就能显著提高查询速度
<br>　　事实上，我们可以发现上面的例子中，第2、3条语句完全相同，且建立索引的字段也相同；不同的仅是前者在fariqi字段上建立的是非聚合索引，后者在此字段上建立的是聚合索引，但查询速度却有着天壤之别。所以，并非是在任何字段上简单地建立索引就能提高查询速度。
<br>　　从建表的语句中，我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。
在现实中，我们每天都会发几个文件，这几个文件的发文日期就相同，这完全符合建立聚集索引要求的：&#8220;既不能绝大多数都相同，又不能只有极少数相同&#8221;的规
则。由此看来，我们建立&#8220;适当&#8221;的聚合索引对于我们提高查询速度是非常重要的。
<br>
<br>3、把所有需要提高查询速度的字段都加进聚集索引，以提高查询速度
<br>　　上面已经谈到：在进行数据查询时都离不开字段的是&#8220;日期&#8221;还有用户本身的&#8220;用户名&#8221;。既然这两个字段都是如此的重要，我们可以把他们合并起来，建立一个复合索引（compound index）。
<br>　　很多人认为只要把任何字段加进聚集索引，就能提高查询速度，也有人感到迷惑：如果把复合的聚集索引字段分开查询，那么查询速度会减慢吗？带着
这个问题，我们来看一下以下的查询速度（结果集都是25万条数据）：（日期列fariqi首先排在复合聚集索引的起始列，用户名neibuyonghu排
在后列）：
</p>
<pre>（1）select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi&gt;''2004-5-5'' </pre>
<p>查询速度：2513毫秒</p>
<pre>（2）select gid,fariqi,neibuyonghu,title from Tgongwen <br>　　　　　　　　　　　　where fariqi&gt;''2004-5-5'' and neibuyonghu=''办公室''</pre>
<p>查询速度：2516毫秒</p>
<pre>（3）select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''</pre>
<p>查询速度：60280毫秒
<br>
<br>　　从以上试验中，我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的，甚至比用上全部的
复合索引列还要略快（在查询结果集数目一样的情况下）；而如果仅用复合聚集索引的非起始列作为查询条件的话，这个索引是不起任何作用的。当然，语句1、2
的查询速度一样是因为查询的条目数一样，如果复合索引的所有列都用上，而且查询结果少的话，这样就会形成&#8220;索引覆盖&#8221;，因而性能可以达到最优。同时，请记
住：无论您是否经常使用聚合索引的其他列，但其前导列一定要是使用最频繁的列。
<br>
<br><strong>四、其他书上没有的索引使用经验总结</strong>
<br>
<br>1、用聚合索引比用不是聚合索引的主键速度快
<br>　　下面是实例语句：（都是提取25万条数据）
</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>使用时间：3326毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid&lt;=250000</pre>
<p>使用时间：4470毫秒
<br>
<br>这里，用聚合索引比用不是聚合索引的主键速度快了近1/4。
<br>
<br>2、用聚合索引比用一般的主键作order by时速度快，特别是在小数据量情况下
</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi</pre>
<p>用时：12936</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid</pre>
<p>用时：18843
<br>
<br>　　这里，用聚合索引比用一般的主键作order by时，速度快了3/10。事实上，如果数据量很小的话，用聚集索引作为排序列要比使用非聚集索引速度快得明显的多；而数据量如果很大的话，如10万以上，则二者的速度差别不明显。
<br>
<br>3、使用聚合索引内的时间段，搜索时间会按数据占整个数据表的百分比成比例减少，而无论聚合索引使用了多少个：
</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-1-1''</pre>
<p>用时：6343毫秒（提取100万条） </p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi&gt;''2004-6-6''</pre>
<p>用时：3170毫秒（提取50万条）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''</pre>
<p>用时：3326毫秒（和上句的结果一模一样。如果采集的数量一样，那么用大于号和等于号是一样的）</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br>　　　　　　　　　　　　where fariqi&gt;''2004-1-1'' and fariqi&lt;''2004-6-6''</pre>
<p>用时：3280毫秒
<br>
<br>4、日期列不会因为有分秒的输入而减慢查询速度
<br>　　下面的例子中，共有100万条数据，2004年1月1日以后的数据有50万条，但只有两个不同的日期，日期精确到日；之前有数据50万条，有5000个不同的日期，日期精确到秒。
</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br>　　　　　　　　　　where fariqi&gt;''2004-1-1'' order by fariqi</pre>
<p>用时：6390毫秒</p>
<pre>select gid,fariqi,neibuyonghu,reader,title from Tgongwen <br>　　　　　　　　　　　　where fariqi&lt;''2004-1-1'' order by fariqi</pre>
用时：6453毫秒
<br>
<br><strong>五、其他注意事项</strong>
<br>
<br>　　&#8220;水可载舟，亦可覆舟&#8221;，索引也一样。索引有助于提高检索性能，但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引，数据库就要做更多的工作。过多的索引甚至会导致索引碎片。
<br>　　所以说，我们要建立一个&#8220;适当&#8221;的索引体系，特别是对聚合索引的创建，更应精益求精，以使您的数据库能得到高性能的发挥。
<br>　　当然，在实践中，作为一个尽职的数据库管理员，您还要多测试一些方案，找出哪种方案效率最高、最为有效。<img src ="http://www.cnitblog.com/stomic/aggbug/73305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-04-10 13:31 <a href="http://www.cnitblog.com/stomic/archive/2011/04/10/73305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Cursors语法总结</title><link>http://www.cnitblog.com/stomic/archive/2011/04/10/73303.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 10 Apr 2011 02:45:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/04/10/73303.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73303.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/04/10/73303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73303.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73303.html</trackback:ping><description><![CDATA[<div class="introduce">关于Oracle Cursors的语法总结，Oracle Cursors是用来查询数据库，获取记录集合（结果集）的指针，可以让开发者一次访问一行结果集，在每条结果集上作操作。</div>
<div class="content_right">
<ins style="display: inline-table; border: medium none; height: 250px; margin: 0pt; padding: 0pt; position: relative; visibility: visible; width: 300px;"><ins id="aswift_0_anchor" style="display: block; border: medium none; height: 250px; margin: 0pt; padding: 0pt; position: relative; visibility: visible; width: 300px;"></ins></ins>
</div>
一．<strong>Oracle的Cursors概念</strong>：<br>
游标：用来查询数据库，获取记录集合（结果集）的指针，可以让开发者一次访问一行结果集，在每条结果集上作操作。<br>
<br>
二．<strong>Oracle的Cursors分类</strong>：<br>
1．静态游标：<br>
分为显式游标和隐式游标。<br>
2．REF游标：<br>
是一种引用类型，类似于指针。<br>
<br>
三．<strong>Oracle的Cursors详细内容</strong>：<br>
1．显式游标：<br>
CURSOR游标名(参数) [返回值类型] IS<br>
Select语句<br>
生命周期：<br>
a.打开游标(OPEN)<br>
解析，绑定。。。不会从数据库检索数据<br>
b.从游标中获取记录(FETCH INTO)<br>
执行查询，返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。<br>
c.关闭游标(CLOSE)<br>
完成游标处理，用户不能从游标中获取行。还可以重新打开。<br>
选项：参数和返回类型
<div class="blockcode"><code id="code">set serveroutput on<br>
declare<br>
cursor emp_cur ( p_deptid in number) is<br>
select * from employees where department_id = p_deptid;<br>
l_emp employees%rowtype;<br>
begin<br>
dbms_output.put_line('Getting employees from department 30');<br>
open emp_cur(30);<br>
loop<br>
&nbsp;&nbsp;fetch emp_cur into l_emp;<br>
&nbsp;&nbsp;exit when emp_cur%notfound;<br>
&nbsp;&nbsp;dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');<br>
&nbsp;&nbsp;dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);<br>
end loop;<br>
close emp_cur;<br>
dbms_output.put_line('Getting employees from department 90');<br>
open emp_cur(90);<br>
loop<br>
&nbsp;&nbsp;fetch emp_cur into l_emp;<br>
&nbsp;&nbsp;exit when emp_cur%notfound;<br>
&nbsp;&nbsp;dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');<br>
&nbsp;&nbsp;dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);<br>
end loop;<br>
close emp_cur;<br>
end;<br>
/</code><br>
</div>
2．隐式游标：<br>
不用明确建立游标变量，分两种：<br>
a.在PL/SQL中使用DML语言，使用ORACLE提供的名为SQL的隐示游标<br>
b.CURSOR FOR LOOP，用于for loop语句<br>
a.举例：
<div class="blockcode"><code id="code1">declare<br>
begin<br>
update departments set department_name=department_name;<br>
--where 1=2;<br>
<br>
dbms_output.put_line('update '|| sql%rowcount ||' records');<br>
end;<br>
/</code><br>
</div>
b.举例：
<div class="blockcode"><code id="code2">declare<br>
begin<br>
for my_dept_rec in ( select department_name, department_id from departments)<br>
loop<br>
&nbsp;&nbsp;dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);<br>
end loop;<br>
end;<br>
/</code><br>
</div>
c.举例：<br>
单独select
<div class="blockcode"><code id="code3">declare<br>
l_empno emp.EMPLOYEE_ID%type;<br>
-- l_ename emp.ename%type;<br>
begin<br>
select EMPLOYEE_ID&nbsp; &nbsp;<br>
&nbsp;&nbsp;into l_empno<br>
from emp;<br>
--where rownum =1;<br>
dbms_output.put_line(l_empno);<br>
end;<br>
/</code><br>
</div>
使用INTO获取值，只能返回一行。<br>
<br>
游标属性：<br>
%FOUND：变量最后从游标中获取记录的时候，在结果集中找到了记录。<br>
%NOTFOUND：变量最后从游标中获取记录的时候，在结果集中没有找到记录。<br>
%ROWCOUNT：当前时刻已经从游标中获取的记录数量。<br>
%ISOPEN：是否打开。
<div class="blockcode"><code id="code4">Declare<br>
Cursor emps is<br>
Select * from employees where rownum&lt;6 order by 1;<br>
<br>
Emp employees%rowtype;<br>
Row number :=1;<br>
Begin<br>
Open emps;<br>
Fetch emps into emp;<br>
<br>
Loop<br>
&nbsp;&nbsp;If emps%found then<br>
&nbsp; &nbsp;Dbms_output.put_line('Looping over record '||row|| ' of ' || emps%rowcount);<br>
&nbsp; &nbsp;Fetch emps into emp;<br>
&nbsp; &nbsp;Row := row + 1;<br>
&nbsp;&nbsp;Elsif emps%notfound then<br>
&nbsp; &nbsp;Exit;&nbsp;&nbsp;---exit loop, not IF<br>
&nbsp;&nbsp;End if;<br>
End loop;<br>
<br>
If emps%isopen then<br>
&nbsp;&nbsp;Close emps;<br>
End if;<br>
End;<br>
/</code><br>
</div>
<strong>显式和隐式游标的区别</strong>：<br>
尽量使用隐式游标，避免编写附加的游标控制代码（声明，打开，获取，关闭），也不需要声明变量来保存从游标中获取的数据。<br>
<br>
3．REF CURSOR游标：<br>
动态游标，在运行的时候才能确定游标使用的查询。分类：<br>
1．强类型（限制）REF CURSOR，规定返回类型<br>
2．弱类型（非限制）REF CURSOR，不规定返回类型，可以获取任何结果集。
<div class="blockcode"><code id="code5">TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]<br>
<br>
Declare<br>
Type refcur_t is ref cursor;<br>
<br>
Type emp_refcur_t is ref cursor return employee%rowtype;<br>
Begin<br>
Null;<br>
End;<br>
/</code><br>
</div>
强类型举例：<code id="code6">declare<br>
--声明记录类型<br>
type emp_job_rec is record(<br>
&nbsp;&nbsp;employee_id number,<br>
&nbsp;&nbsp;employee_name varchar2(50),<br>
&nbsp;&nbsp;job_title varchar2(30)<br>
);<br>
--声明REF CURSOR，返回值为该记录类型<br>
type emp_job_refcur_type is ref cursor<br>
&nbsp;&nbsp;return emp_job_rec;<br>
--定义REF CURSOR游标的变量<br>
emp_refcur emp_job_refcur_type;<br>
emp_job emp_job_rec;<br>
begin<br>
open emp_refcur for<br>
&nbsp;&nbsp;select e.employee_id,<br>
&nbsp; &nbsp; e.first_name || ' ' ||e.last_name "employee_name",<br>
&nbsp; &nbsp; j.job_title<br>
&nbsp;&nbsp;from employees e, jobs j<br>
&nbsp;&nbsp;where e.job_id = j.job_id and rownum &lt; 11 order by 1;<br>
fetch emp_refcur into emp_job;<br>
while emp_refcur%found loop<br>
&nbsp;&nbsp;dbms_output.put_line(emp_job.employee_name || '''s job is ');<br>
&nbsp;&nbsp;dbms_output.put_line(emp_job.job_title);<br>
&nbsp;&nbsp;fetch emp_refcur into emp_job;<br>
end loop;<br>
end;<br>
/</code><img src ="http://www.cnitblog.com/stomic/aggbug/73303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-04-10 10:45 <a href="http://www.cnitblog.com/stomic/archive/2011/04/10/73303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PRAGMA EXCEPTION_INIT用法</title><link>http://www.cnitblog.com/stomic/archive/2011/03/30/73223.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 30 Mar 2011 09:21:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/03/30/73223.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73223.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/03/30/73223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73223.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73223.html</trackback:ping><description><![CDATA[<font size="2">如果要处理未命名的内部异常，必须使用OTHERS异常处理器或PRAGMA EXCEPTION_INIT
。PRAGMA由编译器控制，或者是对于编译器的注释。PRAGMA在编译时处理，而不是在运行时处理。EXCEPTION_INIT告诉编译器将异常名
与ORACLE错误码结合起来，这样可以通过名字引用任意的内部异常，并且可以通过名字为异常编写一适当的异常处理器。<br>
<br>
在子程序中使用EXCEPTION_INIT的语法如下：<br>
PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);<br>
<br>
在该语法中，异常名是声明的异常，下例是其用法：<br>
DECLARE<br>
deadlock_detected EXCEPTION;<br>
PRAGMA EXCEPTION_INIT(deadlock_detected, -60);<br>
BEGIN<br>
... -- Some operation that causes an ORA-00060 error<br>
EXCEPTION<br>
WHEN deadlock_detected THEN<br>
-- handle the error<br>
END;<br>
<br>
对于用户自定义异常，只能在PL/SQL块中的声明部分声明异常，异常的名字由EXCEPTION关键字引入：<br>
reserved_loaned Exception<br>
<br>
产生异常后，控制传给了子程序的异常部分，将异常转向各自异常控制块，必须在代码中使用如下的结构处理错误：<br>
Exception<br>
When exception1 then<br>
Sequence of statements;<br>
When exception2 then<br>
Sequence of statements;<br>
When others then</font><img src ="http://www.cnitblog.com/stomic/aggbug/73223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-03-30 17:21 <a href="http://www.cnitblog.com/stomic/archive/2011/03/30/73223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL的内连接与外连接</title><link>http://www.cnitblog.com/stomic/archive/2011/03/24/73180.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Mar 2011 09:09:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/03/24/73180.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73180.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/03/24/73180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73180.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73180.html</trackback:ping><description><![CDATA[<p>在oracle的SQL语句常用的连接有内连接（inner join），外连接（outer join）等，内连接又包括等值连接，非等值连接，自连接；而外连接又分为左连接和右连接。其中默认的是内连接的等值连接。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 为了方便我们创建两张最简易的表A、B，具体的表结构参看下面，来分析内连接与外连接的区别</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=298 alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/A.JPG" width=249 border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/B.JPG" border=0></p>
<p>&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; 图1&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;&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;&nbsp; 图2</p>
<p>两个表要做连接，必须要有连接字段，而在表A和表B中连接字段是Aid和Bnamid,下图说明了连接之间关系图3</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height=303 alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/ALL.JPG" width=492 border=0></p>
<p>&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;&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; 图3</p>
<p>&nbsp;<strong>&nbsp;&nbsp; （1) 内连接：利用内连接（等值）就可获取蓝色的公共部分C，即图3中的数据集C，结果集为如下：</strong><br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=257 alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/Inner_join.JPG" width=478 border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&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;&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; 图4</p>
<p>&nbsp;&nbsp; 其实select * from A join B on A.Aid=B.Bnamid;等价于select * from A,B where A.Aid=B.Bnamid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：非等值连接主要的话是针对一个范围来查询数据，自连接主要就是把1张表堪称两张表来用</p>
<p>&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>&nbsp;&nbsp;<strong> (2)外连接：分为左外连接（left join）与右外连接（right join）<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 左外连接即公共显示的蓝色部分C1+显示黄色的记录集A1，显示语句等价于select * from A,B where A.Aid=B.Bnamid（+）；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=324 alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/Left_join.JPG" width=517 border=0></p>
<p>&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;&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; 5</p>
<p>右外连接即公共显示的蓝色部分C1+显示绿色的B1，显示语句等价于select * from A,B where A.Aid(+)=B.Bnamid；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=301 alt="" src="http://www.cnitblog.com/images/cnitblog_com/stomic/Right_join.JPG" width=530 border=0></p>
<p>&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;&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;&nbsp; 图6</p>
<p>&nbsp; 表A和表B情况是相对的，以上实验都是A在左边的情况，其实A left join B与B right join A的情况的结果集是一样的。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/73180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-03-24 17:09 <a href="http://www.cnitblog.com/stomic/archive/2011/03/24/73180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SQL_TRACE进行数据库诊断</title><link>http://www.cnitblog.com/stomic/archive/2011/03/08/73012.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 08 Mar 2011 07:45:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/03/08/73012.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/73012.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/03/08/73012.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/73012.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/73012.html</trackback:ping><description><![CDATA[<p>SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段，是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中，SQL_TRACE是非常常用的方法。<br>本文就SQL_TRACE的使用作简单探讨，并通过具体案例对sql_trace的使用进行说明.<br></p>
<p><br>一、 基础介绍</p>
<p>(a) SQL_TRACE说明</p>
<p>SQL_TRACE可以作为初始化参数在全局启用，也可以通过命令行方式在具体session启用。<br><strong>1． 在全局启用</strong><br>在参数文件(pfile/spfile)中指定:</p>
<p><strong>sql_trace =true
</strong></p>
<p>在全局启用SQL_TRACE会导致所有进程的活动被跟踪，包括后台进程及所有用户进程，这通常会导致比较严重的性能问题，所以在生产环境中要谨慎使用，这个参数在10g之后是动态参数，可以随时调整，在某些诊断中非常有效。<br>提示: 通过在全局启用sql_trace，我们可以跟踪到所有后台进程的活动，很多在文档中的抽象说明，通过跟踪文件的实时变化，我们可以清晰的看到各个进程之间的紧密协调.</p>
<p><strong>2． 在当前session级设置</strong><br>大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效)，<br>研究SQL执行，发现后台错误等.<br>在session级启用和停止sql_trace方式如下:<br></p>
<pre>启用当前session的跟踪:<br>SQL&gt; alter session set sql_trace=true;<br><br>Session altered.<br><br>此时的SQL操作将被跟踪:<br>SQL&gt; select count(*) from dba_users;<br><br>  COUNT(*)<br>----------<br>        34<br>结束跟踪:<br>SQL&gt; alter session set sql_trace=false;<br><br>Session altered.<br>       </pre>
<p><br><strong>3． 跟踪其他用户进程</strong><br>在很多时候我们需要跟踪其他用户的进程，而不是当前用户，这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION<br>来完成</p>
<p>SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:<br></p>
<pre>SQL&gt; desc dbms_system<br>...<br>PROCEDURE SET_SQL_TRACE_IN_SESSION<br> Argument Name                     Type                    In/Out Default?<br> ------------------------------           -----------------------   ------ --------<br> SID                               NUMBER                  IN<br> SERIAL#                          NUMBER                  IN<br> SQL_TRACE                        BOOLEAN                 IN<br>...</pre>
<p>&nbsp;</p>
<p>通过v$session我们可以获得sid、serial#等信息:</p>
<pre>获得进程信息，选择需要跟踪的进程:<br><br>SQL&gt; select sid,serial#,username from v$session<br>  2  where username is not null;<br><br>       SID    SERIAL#  USERNAME<br>---------- ---------- ------------------------------<br>         8       2041  SYS<br>         9        437  EYGLE<br><br>设置跟踪:<br>SQL&gt; exec dbms_system.set_sql_trace_in_session(9,437,true)<br><br>PL/SQL procedure successfully completed.<br><br>....<br>可以等候片刻，跟踪session执行任务,捕获sql操作...<br>....<br><br>停止跟踪:<br>SQL&gt; exec dbms_system.set_sql_trace_in_session(9,437,false)<br><br>PL/SQL procedure successfully completed.<br>  <br></pre>
<p><strong>(b) 10046事件说明</strong><br>10046事件是Oracle提供的内部事件，是对SQL_TRACE的增强.<br>10046事件可以设置以下四个级别:<br>1 - 启用标准的SQL_TRACE功能,等价于sql_trace<br>4 - Level 1 加上绑定值(bind values)<br>8 - Level 1 + 等待事件跟踪<br>12 - Level 1 + Level 4 + Level 8<br>类似sql_trace，10046事件可以在全局设置，也可以在session级设置。<br><strong>1． 在全局设置</strong><br>在参数文件中增加: <br></p>
<p>event="10046 trace name context forever,level 12" <br></p>
<p>此设置对所有用户的所有进程生效、包括后台进程.</p>
<p><strong>2． 对当前session设置</strong><br>通过alter session的方式修改，需要alter session的系统权限: <br></p>
<pre>SQL&gt; alter session set events '10046 trace name context forever';<br><br>Session altered.<br><br>SQL&gt; alter session set events '10046 trace name context forever, level 8';<br><br>Session altered.<br><br>SQL&gt; alter session set events '10046 trace name context off';<br><br>Session altered.<br><br>      </pre>
<p><strong>3． 对其他用户session设置</strong><br>通过DBMS_SYSTEM.SET_EV系统包来实现:<br></p>
<pre><span class="style26"><span class="style6"></span><br></span>SQL&gt; desc dbms_system<br>...<br>PROCEDURE SET_EV<br> Argument Name                  Type                    In/Out Default?<br> ------------------------------ ----------------------- ------ --------<br> SI                             BINARY_INTEGER          IN<br> SE                             BINARY_INTEGER          IN<br> EV                             BINARY_INTEGER          IN<br> LE                             BINARY_INTEGER          IN<br> NM                             VARCHAR2                IN<br><br>...<br><br>其中的参数SI、SE来自v$session视图:<span class="style26"><br></span><span class="style25"><font face="Verdana" size="2">查询获得需要跟踪的session信息:<br>SQL&gt; select sid,serial#,username from v$session where username is not null;</font></span></pre>
<p class="style25">SID SERIAL# USERNAME<br>---------- ---------- ------------------------------<br>8 2041 SYS<br>9 437 EYGLE</p>
<p class="style25">执行跟踪:<br>SQL&gt; exec dbms_system.set_ev(9,437,10046,8,'eygle');</p>
<p class="style25">PL/SQL procedure successfully completed.</p>
<p class="style25">结束跟踪:<br>SQL&gt; exec dbms_system.set_ev(9,437,10046,0,'eygle');</p>
<p><span class="style25"><font size="2">PL/SQL procedure successfully completed.<br></font></span></p>
<p><strong>(c) 获取跟踪文件</strong><br>以上生成的跟踪文件位于user_dump_dest目录中，位置及文件名可以通过以下SQL查询获得:<span class="style26"><br></span></p>
<blockquote>
<p><span class="style26">
</span>SQL&gt; select<br></p>
<pre><span class="style25"><font face="Verdana" size="2">  2    d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name<br>  3  from<br>  4    ( select p.spid<br>  5      from sys.v$mystat m,sys.v$session s,sys.v$process p<br>  6      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,<br>  7    ( select t.instance from sys.v$thread  t,sys.v$parameter  v<br>  8      where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,<br>  9    ( select value from sys.v$parameter where name = 'user_dump_dest') d<br> 10  /</font></span> <br></pre>
<p class="style25">TRACE_FILE_NAME<br>--------------------------------------------------------------------------------<br>/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc&nbsp;
</p>
</blockquote>
<p><br><strong>(d) 读取当前session设置的参数</strong><br>当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取：<span class="style26"><br></span></p>
<blockquote>
<p><span class="style26">
</span>SQL&gt; set feedback off<br></p>
<pre><span class="style25"><font face="Verdana" size="2">SQL&gt; set serveroutput on </font></span></pre>
<p class="style25">SQL&gt; declare <br>2 event_level number; <br>3 begin <br>4 for event_number in 10000..10999 loop <br>5 sys.dbms_system.read_ev(event_number, event_level); <br>6 if (event_level &gt; 0) then <br>7 sys.dbms_output.put_line(<br>8 'Event ' ||<br>9 to_char(event_number) ||<br>10 ' is set at level ' || <br>11 to_char(event_level)<br>12 ); <br>13 end if; <br>14 end loop; <br>15 end; <br>16 /<br>Event 10046 is set at level 1</p>
</blockquote><img src ="http://www.cnitblog.com/stomic/aggbug/73012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-03-08 15:45 <a href="http://www.cnitblog.com/stomic/archive/2011/03/08/73012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 表空间管理常用语句</title><link>http://www.cnitblog.com/stomic/archive/2011/02/11/72777.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 11 Feb 2011 09:05:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2011/02/11/72777.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/72777.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2011/02/11/72777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/72777.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/72777.html</trackback:ping><description><![CDATA[<div>
<ol>
    <li>查看表空间<br>select * from dba_tablespaces;</li>
    <li>创建表空间<br>简单创建： create tablespace userdb datafile 'd:\datafile.dbf' size 200M;<br>复杂创建：create tablespace userdb datafile 'd:\datafile.dbf' size 200M autoextend on next 20M maxsize unlimited <br>extent management local <br>segment space management auto; <br>大文件表空间：create bigfile tablespace userdb datafile 'd:\datafile.dbf' size 200M autoextend on next 20M maxsize unlimited;</li>
    <li>删除表空间<br>删除表空间：drop tablespace userdb including contents ; <br>同时删除文件：drop tablespace userdb including contents and datafiles;</li>
    <li>扩展表空间<br>修改文件大小：alter database datafile 'd:\fatafile.dbf' resize 300M;<br>添加数据文件：alter dataspace userdb add datafile 'd:\datafile2.dbf' size ...;<br>将表空间的数据文件设成自动扩展：alter database datafile 'd:\datafile2.dbf' autoextend on next 5M maxsize unlimited;</li>
    <li>表空间重命名<br>alter tablespace userdb rename to userdb2;</li>
    <li>使表空间只读<br>alter tablespace userdb read only;</li>
    <li>使表空间离线/在线<br>alter tablespace userdb online/offline;</li>
</ol>
</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/72777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2011-02-11 17:05 <a href="http://www.cnitblog.com/stomic/archive/2011/02/11/72777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 10g 检查网络配置需求未通过问题的解决</title><link>http://www.cnitblog.com/stomic/archive/2010/09/21/68962.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 20 Sep 2010 18:32:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2010/09/21/68962.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/68962.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2010/09/21/68962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/68962.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/68962.html</trackback:ping><description><![CDATA[在<a href="#" target=_self><u><strong><font size=2>oracle</font></strong></u></a>官方网站上下了oracle 10g，<a href="http://www.cnitblog.com/stomic/admin/EditPosts.aspx#" target=_self><u><strong><font size=2>安装</font></strong></u></a>到检测硬件的时候突然遇到了这样的问题：
<p><font color=#ff0000>正在检查网络配置需求...<br>　　检查完成。此次检查的总体结果为: 未执行 &lt;&lt;&lt;&lt;<br>　　建议案: orcle支持在具有 DHCP 分配的 IP 地址的系统上进行安装。但在安装之前,<br>　　必须将 Microsoft LoopBack Adapter 配置为系统的主网络适配器。<br>　　有关在配置有 DHCP 的系统上安装软件的详细信息, 请参阅 Installation Guide。</font><br>　　=======================================================================</p>
<p>　　解决办法：<br>　　控制面板-&gt;添加硬件-&gt;是，我也经连接了此硬件-&gt;添加新硬件设备-&gt;安装我手动列表选择硬件(高级)-&gt;网络适配器-&gt;厂商：Microsoft 网卡：Microsoft Loopback Adapter 然后就行了。</p>
<p>操作之后你会发现你的网上邻居里面又两个网络连接。选择新建立的那个网络连接<br>　　随便为它配个IP地址就行了。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/68962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2010-09-21 02:32 <a href="http://www.cnitblog.com/stomic/archive/2010/09/21/68962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-01561: failed to remove all objects in the table space specified</title><link>http://www.cnitblog.com/stomic/archive/2010/07/06/67198.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 06 Jul 2010 08:55:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2010/07/06/67198.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/67198.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2010/07/06/67198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/67198.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/67198.html</trackback:ping><description><![CDATA[<p>DROP TABLESPACE
<tablespacename>
INCLUDING CONTENTS CASCADE CONSTRAINTS<br>Will give an error<br>ORA-01561: failed to remove all objects in the tablespace specified</p>
<p>Solution<br>Step 1:<br>select ts# from ts$ where name = &#8216;
<tablespacename>
&#8216;;</p>
<p>Step 2:<br>update seg$ set type# = 3 where ts#=<value found in step 1>;<br>commit; </p>
<p>Step 3<br>shutdown abort;<br>startup </p>
<p>Step 4<br>drop tablespace
<tablespacename>
including contents;</p>
<!-- Advanced AdSense by Jim Gaudet --><!-- google_ad_section_end --><!--end .entry-content .article--><!--begin .entry-meta .entry-footer-->
<img src ="http://www.cnitblog.com/stomic/aggbug/67198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2010-07-06 16:55 <a href="http://www.cnitblog.com/stomic/archive/2010/07/06/67198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORA-01163 SIZE clause indicates string</title><link>http://www.cnitblog.com/stomic/archive/2010/07/05/67176.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 04 Jul 2010 22:44:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2010/07/05/67176.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/67176.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2010/07/05/67176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/67176.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/67176.html</trackback:ping><description><![CDATA[<p>今天做<a onclick="javascript:tagshow(event, '%CA%B5%D1%E9');" href="javascript:;" target=_self><u><strong><font color=#0000ff>实验</font></strong></u></a>遇见一个问题</p>
<p>SQL&gt; CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS&nbsp;<br>&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAXLOGFILES 16<br>&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAXLOGMEMBERS 3<br>&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAXDATAFILES 100<br>&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAXINSTANCES 8<br>&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAXLOGHISTORY 292<br>&nbsp; 7&nbsp; LOGFILE<br>&nbsp; 8&nbsp;&nbsp;&nbsp; GROUP 1 '/u01/oracle/oradata/orcl/redo01.log'&nbsp; SIZE 50M,<br>&nbsp; 9&nbsp;&nbsp;&nbsp; GROUP 2 '/u01/oracle/oradata/orcl/redo02.log'&nbsp; SIZE 50M,<br>&nbsp;10&nbsp;&nbsp;&nbsp; GROUP 3 '/u01/oracle/oradata/orcl/redo03.log'&nbsp; SIZE 50M<br>&nbsp;11&nbsp; -- STANDBY LOGFILE<br>&nbsp;12&nbsp; DATAFILE<br>&nbsp;13&nbsp;&nbsp;&nbsp; '/u01/oracle/oradata/orcl/system01.dbf',<br>&nbsp;14&nbsp;&nbsp;&nbsp; '/u01/oracle/oradata/orcl/undotbs01.dbf',<br>&nbsp;15&nbsp;&nbsp;&nbsp; '/u01/oracle/oradata/orcl/sysaux01.dbf',<br>&nbsp;16&nbsp;&nbsp;&nbsp; '/u01/oracle/oradata/orcl/users01.dbf',<br>&nbsp;17&nbsp; CHARACTER SET ZHS16GBK<br>&nbsp;18&nbsp; ;<br>CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS<br>*<br>ERROR at line 1:<br>ORA-01503: CREATE CONTROLFILE failed<br>ORA-01163: SIZE clause indicates 12800 (blocks), but should match header 25600<br>ORA-01110: data file 4: '/u01/oracle/oradata/orcl/users01.dbf'</p>
<p>查了下官方文档</p>
<p>ORA-01163: SIZE clause indicates string (blocks), but should match header string<br>Cause: The size specified in bytes in the SIZE clause of the CREATE CONTROLFILE statement does not equate to the number of blocks recorded in the header.<br>Action: Specify the correct filename and size ( in bytes ).</p>
<p>问题原因</p>
<p>在user01.dbf后多了一个逗号 去掉逗号之后一切正常。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/67176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2010-07-05 06:44 <a href="http://www.cnitblog.com/stomic/archive/2010/07/05/67176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对于undotbs01.dbf文件太大的处理办法</title><link>http://www.cnitblog.com/stomic/archive/2010/05/25/66346.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 25 May 2010 03:45:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2010/05/25/66346.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/66346.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2010/05/25/66346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/66346.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/66346.html</trackback:ping><description><![CDATA[<p>-- 创建一个新的小空间的UNDO TABLESPACE<br>Create UNDO TABLESPACE UNDOTBS2 DATAFILE 'E:\oracle10g\product\10.2.0\oradata\wst10g\UNDOTBS02.DBF' SIZE 100M REUSE AUTOEXTEND ON;<br>-- 设置新的表空间为系统UNDO_TABLESPACE<br>Alter SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;<br>-- Drop 旧的表空间<br>Drop TABLESPACE UNDOTBS1 INCLUDING CONTENTS;<br>Select * FROM DBA_TABLESPACES;</p>
<p>完成后删除E:\oracle10g\product\10.2.0\oradata\wst10g\UNDOTBS01.DBF，然后进行出下操作：</p>
<p>-- 创建一个新的小空间的UNDO TABLESPACE<br>Create UNDO TABLESPACE UNDOTBS1 DATAFILE 'E:\oracle10g\product\10.2.0\oradata\wst10g\UNDOTBS01.DBF' SIZE 100M REUSE AUTOEXTEND ON;<br>-- 设置新的表空间为系统UNDO_TABLESPACE<br>Alter SYSTEM SET UNDO_TABLESPACE=UNDOTBS1;<br>-- Drop 旧的表空间<br>Drop TABLESPACE UNDOTBS2 INCLUDING CONTENTS;<br>--查看所有表空间的情况<br>Select * FROM DBA_TABLESPACES;</p>
<p>完成后删除E:\oracle10g\product\10.2.0\oradata\wst10g\UNDOTBS02.DBF。</p>
<p><br>如果临时表空间很大处理的方法类似。</p>
<p><br>限制<br>Alter DATABASE DATAFILE 'E:\oracle10g\product\10.2.0\oradata\wst10g\UNDOTBS01.DBF' AUTOEXTEND ON MAXSIZE 300M;</p>
<p>本文转自 ☆★ 黑白前线 ★☆ - <a href="http://www.hackline.net/">www.hackline.net</a> 转载请注明出处，侵权必究！<br>原文链接：<a href="http://www.hackline.net/a/Special/wlgf/jbst/2010/0113/2524.html">http://www.hackline.net/a/Special/wlgf/jbst/2010/0113/2524.html</a></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/66346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2010-05-25 11:45 <a href="http://www.cnitblog.com/stomic/archive/2010/05/25/66346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于oracle os认证和口令文件认证的简要解析</title><link>http://www.cnitblog.com/stomic/archive/2010/03/29/64908.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 29 Mar 2010 10:07:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2010/03/29/64908.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/64908.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2010/03/29/64908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/64908.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/64908.html</trackback:ping><description><![CDATA[<p>关于oracle os认证和口令文件认证的简要解析</p>
<p>环境&nbsp; <br>windows2000＋sp4，oracle9.201&nbsp; <br>oracle软件以oracle帐户安装&nbsp; </p>
<p>一、sysdba的权限&nbsp; <br>sysdba（sysoper和normal）是登录数据库的身份，与角色（dba、resource）、对象权限及系统权限有所区别，登录身份表明了可对数据库的整体进行哪些操作，sysdba有些类似unix下的root帐户。&nbsp; <br>sysdba的权限或可对数据库进行的操作：&nbsp; <br>startup,shutdown&nbsp; <br>alter database open|mount&nbsp; <br>alter database backup controlfile&nbsp; <br>alter tablespace begin/end backup&nbsp; <br>recover database&nbsp; <br>alter database archivelog,restricted session&nbsp; <br>create database&nbsp; <br>recover database until&nbsp; </p>
<p>二、os认证和口令文件认证&nbsp; </p>
<p>1、os认证和口令文件认证其实质是对oracle数据库采取何种管理方式，是本地管理还是通过一台管理服务器统一管理。&nbsp; <br>本地管理采用的就是os认证方式，统一管理采用的就是口令文件认证方式&nbsp; <br>2、两种认证的实现&nbsp; <br>oracle数据库通过sqlnet.ora文件中的参数SQLNET.AUTHENTICATION_SERVICES，PFILE（或SPFILE）文件中的参数REMOTE_LOGIN_PASSWORDFILE和口令文件PWDsid.ora三者协同作用实现身份认证。&nbsp; <br>&nbsp;<br>SQLNET.AUTHENTICATION_SERVICES＝(NTS)|(NONE)&nbsp; <br>SQLNET.AUTHENTICATION_SERVICES＝(NTS): 操作系统认证方式，不使用口令文件&nbsp; <br>SQLNET.AUTHENTICATION_SERVICES＝(NONE)：口令文件认证方式&nbsp; <br>&nbsp;<br>REMOTE_LOGIN_PASSWORDFILE=(NONE)|(EXCLUSIVE)|(SHARED)&nbsp; <br>REMOTE_LOGIN_PASSWORDFILE=(NONE)：不使用口令文件，操作系统认证&nbsp; <br>REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)：口令文件认证方式，但只有一个数据库实例可以使用此文件，&nbsp; <br>系统允许将SYSOPER／SYSDBA授予除INTERNAL／SYS以外的其他用户，且以具有这类身份的其他用户登录是有效的&nbsp; <br>REMOTE_LOGIN_PASSWORDFILE=(SHARED)：口令文件认证方式，可有多个数据库实例使用此文件，但是此设置下&nbsp; <br>只有INTERNAL／SYS帐号能被识别，即使文件中存有其他用户的信息，也不允许他们以SYSOPER／SYSDBA登录&nbsp; <br>&nbsp;<br>1）SQLNET.AUTHENTICATION_SERVICES＝(NTS)同时REMOTE_LOGIN_PASSWORDFILE=(NONE)，此时为操作系统认证方式。&nbsp; <br>当以oracle_dba组下的用户登录进入本地windows2000后进行下边的操作：&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn /as sysdba&nbsp; <br>或&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn 任意用户名/密码 as sysdba&nbsp; <br>均可以sysdba身份登录成功，进行数据库方面的操作&nbsp; <br>当以远程进行登录时，执行&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn /as sysdba&nbsp; <br>或&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn sys/密码 as sysdba&nbsp; <br>均显示&nbsp; <br>&#8220;ERROR：&nbsp; <br>ORA-01031： insufficient privileges&nbsp; <br>&#8221;&nbsp; <br>也就是不允许以sysdba身份远程登录系统，这也是os认证之所以也称为本地认证方式的原因&nbsp; <br>&nbsp;<br>2）SQLNET.AUTHENTICATION_SERVICES＝(NONE)同时REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)或(SHARED)，配合口令文件&nbsp; <br>PWDsid.ora，此时为口令文件认证方式&nbsp; <br>当在本地以oracle_dba组下的用户登录进入windows2000后进行下边的操作：&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn /as sysdba&nbsp; <br>显示&nbsp; <br>&#8220;ERROR：&nbsp; <br>ORA-01031： insufficient privileges&nbsp; <br>&#8221;&nbsp; <br>实质上是要求提供拥有sysdba身份的用户名和密码&nbsp; <br>在本地或远程进行下边的操作&nbsp; <br>sqlplus "sys/密码@服务名 as sysdba"&nbsp; <br>可进入系统&nbsp; <br>也就是说口令文件认证方式允许用户从本地或远程以sysdba身份登录，但必须提供口令字&nbsp; <br>&nbsp;<br>3）SQLNET.AUTHENTICATION_SERVICES＝(NTS)同时REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)或(SHARED)，配合口令文件PWDsid.ora，此时操作系统认证和口令文件认证同时起作用&nbsp; <br>当在本地以oracle_dba组下的用户登录进入windows2000后进行下边的操作：&nbsp; <br>sqlplus /nolog&nbsp; <br>sql&gt;conn /as sysdba&nbsp; <br>可进入系统&nbsp; <br>当在远程执行&nbsp; <br>sqlplus "sys/密码@服务名 as sysdba"&nbsp; <br>同样可正常登录到数据库系统上&nbsp; <br>上边的参数配置容易令人迷惑、混淆，造成假象。我推测网上有些朋友所以对身份认证产生费解可能就是因为这么&nbsp; <br>配置参数的！&nbsp; </p>
<p>三、其他 <br>&nbsp;<br>从前边的讨论可以知道，我们能够对sys以外的用户赋予sysdba身份，具体方法就是&nbsp; <br>SQLNET.AUTHENTICATION_SERVICES＝(NONE)&nbsp; <br>REMOTE_LOGIN_PASSWORDFILE=(EXCLUSIVE)&nbsp; <br>口令文件PWDsid.ora&nbsp; <br>SQL&gt;grant sysdba to 用户名&nbsp; <br>这样，其他具有sysdba身份的用户就加入到PWDsid.ora中，并可以被PWDsid.ora识别，我们可以用这个被赋予sysdba身份的用户登录并进行类似sys用户下所能执行的操作。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>补充：2008-12-31</p>
<p>首先将oracle改为口令认证模式；</p>
<p>sqlnet.ora路径C:\oracle\ora92\network\admin</p>
<p>SQL&gt; conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#97;&#108;&#108;&#118;&#105;&#101;&#119;&#64;&#97;&#108;&#108;&#118;&#105;&#101;&#119;">sys/allview@allview</a> as sysdba;<br>已连接。<br>SQL&gt; alter user sys identified by sys;</p>
<p>用户已更改。</p>
<p>//首先确认新口令为sys&nbsp; 更改sys口令后可能需要重启服务</p>
<p>&nbsp;</p>
<p>D:\Documents and Settings\LMing&gt;sqlplus /nolog</p>
<p>SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 12月 31 10:58:39 2008</p>
<p>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.</p>
<p>SQL&gt; conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#115;&#121;&#115;&#64;&#97;&#108;&#108;&#118;&#105;&#101;&#119;">sys/sys@allview</a> as sysdba;<br>已连接。<br>SQL&gt; exit</p>
<p>//验证效果通过</p>
<p>&nbsp;</p>
<p>D:\Documents and Settings\LMing&gt;move C:\oracle\ora92\database\PWDAllView.ora C:\<br>oracle\ora92\database\PWDAV.ora</p>
<p>D:\Documents and Settings\LMing&gt;sqlplus /nolog</p>
<p>SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 12月 31 11:05:00 2008</p>
<p>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.</p>
<p>SQL&gt; conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#115;&#121;&#115;&#64;&#97;&#108;&#108;&#118;&#105;&#101;&#119;">sys/sys@allview</a> as sysdba;<br>ERROR:<br>ORA-01031: insufficient privileges</p>
<p>//由于口令文件被修改而无法登陆<br>SQL&gt; exit</p>
<p>D:\Documents and Settings\LMing&gt;orapwd file=C:\oracle\ora92\database\PWDAllView.<br>ora password=allview entries=4;</p>
<p>D:\Documents and Settings\LMing&gt;sqlplus /nolog</p>
<p>SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 12月 31 11:07:14 2008</p>
<p>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.</p>
<p>SQL&gt; conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#97;&#108;&#108;&#118;&#105;&#101;&#119;&#64;&#97;&#108;&#108;&#118;&#105;&#101;&#119;">sys/allview@allview</a> as sysdba;<br>ERROR:<br>ORA-01031: insufficient privileges</p>
<p>//重新创建密码文件后需要重启服务后生效<br>SQL&gt; shutdown immediate;<br>ORA-01012: not logged on<br>SQL&gt; exit</p>
<p>D:\Documents and Settings\LMing&gt;sqlplus /nolog</p>
<p>SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 12月 31 11:08:27 2008</p>
<p>Copyright (c) 1982, 2002, Oracle Corporation.&nbsp; All rights reserved.</p>
<p>SQL&gt; conn <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#47;&#97;&#108;&#108;&#118;&#105;&#101;&#119;&#64;&#97;&#108;&#108;&#118;&#105;&#101;&#119;">sys/allview@allview</a> as sysdba;<br>已连接。</p>
<p>//测试成功</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/64908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2010-03-29 18:07 <a href="http://www.cnitblog.com/stomic/archive/2010/03/29/64908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原）无法启动OracleOraDb10g_home1TNSListener</title><link>http://www.cnitblog.com/stomic/archive/2009/11/22/62765.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 22 Nov 2009 14:10:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/11/22/62765.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/62765.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/11/22/62765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/62765.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/62765.html</trackback:ping><description><![CDATA[<p><strong>问题：</strong><br>以前安装过10.1.0的数据库，删除10.1.0的数据库后，重新安装了10.2.0的数据库后，启动OracleOraDb10g_home1TNSListener报错<br><br><strong>错误：</strong><br>---------------------------<br>Services<br>---------------------------<br>Could not start the OracleOraDb10g_home1TNSListener service on Local Computer.</p>
<p>&nbsp;</p>
<p>Error 1067: The process terminated unexpectedly.</p>
<p><br>---------------------------<br>OK&nbsp;&nbsp; <br>---------------------------<br><br><strong>解决方法：</strong><br>进入注册表<br>HKEY_LOCAL_MACHINE&nbsp; -&gt; SYSTEM-&gt;CurrentControlSet-&gt;Services-&gt; <br>oracleOraDb10g_home1TNSListener -&gt; ImagePath : C:\oracle\product\10.1.0\db_1\BIN\tnslsnr.exe<br>发现监听服务的地址还是指向10.1.0的<br>1.把ImagePath路径改成10.2.0<br>ImagePath : C:\oracle\product\10.2.0\db_1\BIN\tnslsnr.exe<br>2.重新启动OracleOraDb10g_home1TNSListener服务，成功。<br></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/62765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-11-22 22:10 <a href="http://www.cnitblog.com/stomic/archive/2009/11/22/62765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Error:ORA-01033:ORACLE initialization or shutdown in progress错误解决</title><link>http://www.cnitblog.com/stomic/archive/2009/11/13/62581.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 13 Nov 2009 15:23:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/11/13/62581.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/62581.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/11/13/62581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/62581.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/62581.html</trackback:ping><description><![CDATA[<p>因为晚上就要进行数据库的考试了,所以今中午开始就努力奋斗,争取把没复习完的东西搞完,结果就遇见了很久以前遇见的一个错误,想想,这个错误当初在同学当中比较常见,所以写出,希望对有这个问题的朋友有所帮助.</p>
<p>01033, 00000, "ORACLE initialization or shutdown in progress"<br>// *Cause: An attempt was made to log on while Oracle is being started up<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or shutdown.<br>// *Action: Wait a few minutes. Then retry the operation.<br><br>所以在<a href="http://www.sou3w.com/database16/database254111.htm"><u><font color=#0000ff>http://www.sou3w.com/database16/database254111.htm</font></u></a>就有网友建议重启,效果如何.我不知道,有兴趣可以自己去试.下面是我的解决的步骤.其实主要参考自下面的文章.</p>
<p><a href="http://www.helpdiy.com/bbs/redirect.php?tid=208&amp;goto=lastpost&amp;fpage=1&amp;sid=t2VqoX"><u><font color=#0000ff>http://www.helpdiy.com/bbs/redirect.php?tid=208&amp;goto=lastpost&amp;fpage=1&amp;sid=t2VqoX</font></u></a>当然我的电脑没有断电,起因是我在做表空间练习的时候删除了我所创建的数据文件,</p>
<p>以sys登录为sysdba<br>sqlplus /NOLOG<br>SQL&gt;connect sys/用户口令as sysdba<br>SQL&gt;shutdown normal<br>SQL&gt;startup mount<br>SQL&gt;alter database open<br>SQL&gt;shutdown normal<br>SQL&gt;startup</p>
<p>结果出现<br>SQL&gt; alter database open<br>&nbsp; 2&nbsp; ;<br>alter database open<br>*<br>第 1 行出现错误:<br>ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件<br>ORA-01110: 数据文件 5: 'F:\ORACLE\TEST01.DBF'</p>
<p>由此可得出是我刚才的数据文件删除操作引起的,怎么办呢?</p>
<p>下面是我的命令行的贴图,希望不是太乱.</p>
<p>ORA-01157: 无法标识/锁定数据文件 5 - 请参阅 DBWR 跟踪文件<br>ORA-01110: 数据文件 5: 'F:\ORACLE\TEST01.DBF'</p>
<p><br>SQL&gt; alter database create datafile 5;</p>
<p>数据库已更改。</p>
<p>SQL&gt; conn scott/tiger<br>ERROR:<br>ORA-01033: ORACLE initialization or shutdown in progress</p>
<p><br>警告: 您不再连接到 ORACLE。<br>SQL&gt; alter database datafile 5 offline drop;<br>SP2-0640: 未连接<br>SQL&gt; conn sys/oracle<br>ERROR:<br>ORA-01033: ORACLE initialization or shutdown in progress</p>
<p><br>SQL&gt; conn sys/oracle as sysdba;<br>已连接。<br>SQL&gt; alter database datafile 5 offline drop;</p>
<p>数据库已更改。</p>
<p>SQL&gt; conn scott/tiger<br>ERROR:<br>ORA-01033: ORACLE initialization or shutdown in progres</p>
<p>怎么还回出现相同的错误呢?重复上面的步骤,你会发现</p>
<p>&#160;</p>
<p>ORA-01157: 无法标识/锁定数据文件 6- 请参阅 DBWR 跟踪文件<br>ORA-01110: 数据文件 6: 'F:\ORACLE\TEST01.DBF'</p>
<p>和上面出现同一个错误,不过,看清楚哦,,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是数据文件6&nbsp;&nbsp; 而不是数据文件5,</p>
<p>那么的话,继续吧SQL&gt; alter database create datafile&nbsp; 6;</p>
<p>知道你重复上面的步骤,发现能用scott登陆为止,其实你删除了几个数据文件，你就要重复删除几次.</p>
<p>呵呵,抓紧时间,马上复习.希望考个好成绩!</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/62581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-11-13 23:23 <a href="http://www.cnitblog.com/stomic/archive/2009/11/13/62581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于IMP由拥有DBA权限的用户EXP数据时，数据存放表空间的几种情况(IMP-00013) </title><link>http://www.cnitblog.com/stomic/archive/2009/08/27/61026.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Aug 2009 01:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/08/27/61026.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61026.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/08/27/61026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61026.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61026.html</trackback:ping><description><![CDATA[<h3 class=title>关于IMP由拥有DBA权限的用户EXP数据时，数据存放表空间的几种情况(IMP-00013) -1</h3>
<div twffan="done"><font size=2><span lang=EN-US twffan="done"><font face="Times New Roman">ORACLE</font></span><span style="FONT-FAMILY: 宋体" twffan="done">公司来培训</span><span lang=EN-US twffan="done"><font face="Times New Roman">BIEE</font></span><span style="FONT-FAMILY: 宋体" twffan="done">，带了一个</span><span lang=EN-US twffan="done"><font face="Times New Roman">DEMO</font></span><span style="FONT-FAMILY: 宋体" twffan="done">的</span><span lang=EN-US twffan="done"><font face="Times New Roman">DMP</font></span><span style="FONT-FAMILY: 宋体" twffan="done">文件，其导出用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBO</font></span><span style="FONT-FAMILY: 宋体" twffan="done">具有</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-FAMILY: 宋体" twffan="done">权限，缺省表空间是</span><span lang=EN-US twffan="done"><font face="Times New Roman">USERS</font></span><span style="FONT-FAMILY: 宋体" twffan="done">。</span></font></div>
<div twffan="done"></div>
<div twffan="done"><font size=2><span style="FONT-FAMILY: 宋体" twffan="done">我做导入时，另外创建了一个用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">BIEE</font></span><span style="FONT-FAMILY: 宋体" twffan="done">，其缺省表空间是</span><span lang=EN-US twffan="done"><font face="Times New Roman">TS_BIEE </font></span><span style="FONT-FAMILY: 宋体" twffan="done">，授予</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-FAMILY: 宋体" twffan="done">权限，结果数据没有按预期导入到表空间</span><span lang=EN-US twffan="done"><font face="Times New Roman">TS_BIEE</font></span><span style="FONT-FAMILY: 宋体" twffan="done">中，而是导入到了表空间</span><span lang=EN-US twffan="done"><font face="Times New Roman">USERS</font></span><span style="FONT-FAMILY: 宋体" twffan="done">中，当然这是因为忘了</span><span lang=EN-US twffan="done"><font face="Times New Roman">revoke unlimited tablespace </font></span><span style="FONT-FAMILY: 宋体" twffan="done">的权限造成的。</span></font></div>
<div twffan="done"></div>
<div twffan="done"><font size=2><span style="FONT-FAMILY: 宋体" twffan="done">对</span><span lang=EN-US twffan="done"><font face="Times New Roman">IMP </font></span><span style="FONT-FAMILY: 宋体" twffan="done">由拥有</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-FAMILY: 宋体" twffan="done">权限的用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">EXP</font></span><span style="FONT-FAMILY: 宋体" twffan="done">的数据时，数据存放表空间有两种情况，现在花点时间来做个整理吧。</span></font></div>
<div twffan="done"></div>
<div twffan="done"><font size=2><span style="FONT-FAMILY: 宋体" twffan="done">以下测试数据库均为</span><span lang=EN-US twffan="done"><font face="Times New Roman"> ORACLE 9.2.0.4</font></span></font></div>
<br>
<h4 class=TextColor1 id=subjcns!F89A582091130912!358 style="MARGIN-BOTTOM: 0px">
<div id=msgcns!F89A582091130912!358 twffan="done">
<div twffan="done">
<div twffan="done"><font size=2><span lang=EN-US twffan="done"><font face="Times New Roman"></font></span></font></div>
</div>
<div twffan="done"><font size=2><strong><span style="FONT-SIZE: 12pt; COLOR: navy; FONT-FAMILY: 宋体" twffan="done">第一种情况：</span></strong></font></div>
<div twffan="done"><font size=2><span style="FONT-FAMILY: 宋体" twffan="done">目标数据库中存在与导出用户的缺省表空间同名的表空间，此时，一定要将导入用户的</span><span lang=EN-US twffan="done"><font face="Times New Roman"><span twffan="done"> </span>unlimited tablespace </font></span><span style="FONT-FAMILY: 宋体" twffan="done">权限</span><span lang=EN-US twffan="done"><font face="Times New Roman"> revoke </font></span><span style="FONT-FAMILY: 宋体" twffan="done">掉，否则，数据将全部被导入到那个同名的表空间中，而不是导入用户的缺省表空间中。</span></font></div>
<div twffan="done"><strong><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>1、</font><span twffan="done"> </span></font></span></span></strong><strong><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">从源数据库中导出数据</span></font></strong></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(1)</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">授予导出用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">权限</span></u></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; connect system@njgajhpt</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Connected to Oracle9i Enterprise Edition Release 9.2.0.4.0 </font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Connected as system</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; grant dba to sh;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Grant succeeded</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><font size=3><span lang=EN-US twffan="done"><font face="Times New Roman">SH</font></span><span style="FONT-FAMILY: 宋体" twffan="done">的缺省表空间是</span><span lang=EN-US twffan="done"><font face="Times New Roman">EXAMPLE</font></span></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; select username,default_tablespace from dba_users</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>where username = 'SH';</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">USERNAME<span twffan="done"> </span>DEFAULT_TABLESPACE</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------ ------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SH<span twffan="done"> </span>EXAMPLE</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><font size=3><span lang=EN-US twffan="done"><font face="Times New Roman">(2)</font></span><span style="FONT-FAMILY: 宋体" twffan="done">、<u><span twffan="done">导出数据</span></u></span></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;exp sh/sh@njgajhpt file='d:tempsh.dmp' tables=customers direct=y</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Export: Release 9.2.0.1.0 - Production on </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">星期四</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> 11</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">月</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> 16 16:36:31 2006</font></span></div>
<div twffan="done"><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">即将导出指定的表通过直接路径</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><font face="Times New Roman"> ...</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><font face="Times New Roman">. . </font></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">正在导出表</span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><span twffan="done"> </span><span twffan="done"></span>CUSTOMERS<span twffan="done"> </span></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: maroon; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done">50000</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"> </span></font><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">行被导出</span></div>
<div twffan="done"><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">在没有警告的情况下成功终止导出。</span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><strong><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>2、</font><span twffan="done"> </span></font></span></span></strong><strong><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">导入目标数据库</span></font></strong></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(1)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">创建表空间</span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; create tablespace ts_qcui</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>datafile 'D:ORACLEORADATAJWPTZJKts_qcui.ora'</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>3<span twffan="done"> </span>size 20M autoextend on next 8M maxsize 1024M;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Tablespace created</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(2)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">创建用户</span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; create user qcui identified by qcui</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>default tablespace ts_qcui;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">User created</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; grant connect,resource to qcui;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Grant succeeded</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(3)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">导入数据</span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Import: Release 9.2.0.1.0 - Production on </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">星期四</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> 11</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">月</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> 16 16:43:00 2006</font></span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">经由直接路径导出由</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">EXPORT:V09.02.00</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">创建的导出文件</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">IMP-00013: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">只有</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> DBA </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">才能导入由其它</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> DBA </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">导出的文件</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">IMP-00000: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">未成功终止导入</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(4)</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">授予导入用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">权限</span></u></font></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>SQL&gt; grant dba to qcui;</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>Grant succeeded</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(5)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">授权后重新导入</span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n</font></span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">经由直接路径导出由</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">EXPORT:V09.02.00</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">创建的导出文件</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">警告</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">此对象由</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> <span lang=EN-US twffan="done">SH </span></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">导出</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">, </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">而不是当前用户</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">. . </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">正在导入表</span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><span twffan="done"> </span>"CUSTOMERS"<span twffan="done"> </span></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: maroon; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done">50000</span></font><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">行被导入</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">成功终止导入，但出现警告。</span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(6)</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">检查数据存放的表空间。数据没有按预期存放在</span><span lang=EN-US twffan="done"><font face="Times New Roman">QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">的缺省表空间</span><span lang=EN-US twffan="done"><font face="Times New Roman">TS_QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">中</span></u></font></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>SQL&gt; select table_name,tablespace_name from dba_tables</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font size=3><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>where owner = 'QCUI';</font></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">TABLE_NAME<span twffan="done"> </span>TABLESPACE_NAME</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------ ------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">CUSTOMERS<span twffan="done"> </span><span twffan="done"></span>EXAMPLE</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(7)</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">回收</span><span lang=EN-US twffan="done"><font face="Times New Roman">QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">的</span><span lang=EN-US twffan="done"><font face="Times New Roman">unlimited tablespace</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">权限</span></u></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; revoke unlimited tablespace from qcui;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Revoke succeeded</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; alter user qcui quota unlimited on ts_qcui;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">User altered</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(8)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">回收权限后重新导入</span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt;<span twffan="done"> </span>drop table qcui.customers;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Table dropped</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;imp qcui/qcui@jwptzjk fromuser=sh touser=qcui file='d:tempsh.dmp' constraints=n</font></span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">经由直接路径导出由</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">EXPORT:V09.02.00</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">创建的导出文件</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">警告</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">此对象由</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> <span lang=EN-US twffan="done">SH </span></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">导出</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">, </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">而不是当前用户</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">. . </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">正在导入表</span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><span twffan="done"> </span>"CUSTOMERS"<span twffan="done"> </span></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: maroon; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done">50000</span></font><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">行被导入</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">成功终止导入，但出现警告。</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">(9) </font></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">检查数据存放的表空间。数据存放在</span><span lang=EN-US twffan="done"><font face="Times New Roman">QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">的缺省表空间</span><span lang=EN-US twffan="done"><font face="Times New Roman">TS_QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">中</span></u></font></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>SQL&gt; select table_name,tablespace_name from dba_tables</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font size=3><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>where owner = 'QCUI';</font></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">TABLE_NAME<span twffan="done"> </span>TABLESPACE_NAME</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------ ------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">CUSTOMERS<span twffan="done"> </span><span twffan="done"></span>TS_QCUI</font></span></div>
</div>
<table cellSpacing=0 border=0>
    <tbody>
    </tbody>
</table>
<div class=footerLinks twffan="done"><nobr><a title=单击以显示此类别的所有项。 href="http://qcui.spaces.live.com/?_c11_BlogPart_blogpart=blogview&amp;_c=BlogPart&amp;partqs=cat%3d%25e8%25a5%25bf%25e6%25b8%25b8%25e6%258a%2580"><font color=#a94e36></font></a></nobr></div>
<div class=footer twffan="done"></div>
<div class="fixedTable bvEntry" id=entrycns!F89A582091130912!357 twffan="done">
<h4 class=TextColor1 id=subjcns!F89A582091130912!357 style="MARGIN-BOTTOM: 0px">关于IMP由拥有DBA权限的用户EXP数据时，数据存放表空间的几种情况(IMP-00013) -2</h4>
<div id=msgcns!F89A582091130912!357 twffan="done">
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><strong><span style="FONT-SIZE: 12pt; COLOR: navy; FONT-FAMILY: 宋体" twffan="done">第二种情况：</span></strong></div>
<div twffan="done"><font size=2><span style="FONT-FAMILY: 宋体" twffan="done">目标数据库中没有与导出用户的缺省表空间同名的表空间，这种情况下，并不需要将导入用户的</span><span lang=EN-US twffan="done"><font face="Times New Roman"><span twffan="done"> </span>unlimited tablespace </font></span><span style="FONT-FAMILY: 宋体" twffan="done">权限</span><span lang=EN-US twffan="done"><font face="Times New Roman"> revoke </font></span><span style="FONT-FAMILY: 宋体" twffan="done">掉。</span></font></div>
<div twffan="done"><font size=3><strong><span lang=EN-US twffan="done"><font face="Times New Roman">1</font></span></strong><strong><span style="FONT-FAMILY: 宋体" twffan="done">、从源数据库中导出数据</span></strong></font></div>
<div twffan="done"><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">（</span><span lang=EN-US twffan="done"><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体" twffan="done">）创建表空间</span></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; create tablespace ts_candy</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>datafile 'D:ORACLEORADATANJGAJHPTts_candy.ora'</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>3<span twffan="done"> </span>size 20M autoextend on next 8M maxsize 1024M;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Tablespace created</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(2)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">创建用户，缺省表空间是</span><span lang=EN-US twffan="done"><font face="Times New Roman"> ts_candy</font></span></font></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; create user candy identified by candy</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>default tablespace ts_candy;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">User created</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; grant dba to candy;</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">Grant succeeded</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(3)</font><span twffan="done"> </span></font></span></span><u><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">创建表</span></font></u></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>SQL&gt; connect candy/candy@njgajhpt</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>SQL&gt; create table candy_tables</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font size=3><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>as</font></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font size=3><font face="Times New Roman"><span twffan="done"></span>3<span twffan="done"> </span>select * from all_tables;</font></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3>Table created</font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>(4)</font><span twffan="done"> </span></font></span></span><u><span style="FONT-FAMILY: 宋体" twffan="done"><font size=3>导出数据</font></span></u></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;exp candy/candy@njgajhpt file='d:tempcandy.dmp' direct=y</font></span></div>
<div twffan="done"><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">即将导出指定的表通过直接路径</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><font face="Times New Roman"> ...</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><font face="Times New Roman">. . </font></span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">正在导出表</span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"><span twffan="done"> </span>CANDY_TABLES<span twffan="done"> </span></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: maroon; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done">991</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done"> </span></font><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">行被导出</span></div>
<div twffan="done"><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体" twffan="done">在没有警告的情况下成功终止导出。</span></div>
<div twffan="done"><span lang=EN-US twffan="done"><font face="Times New Roman" size=3></font></span></div>
<div twffan="done"><strong><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>2、</font><span twffan="done"> </span></font></span></span></strong><strong><font size=3><span style="FONT-FAMILY: 宋体" twffan="done">导入目标数据库</span></font></strong></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>（1）</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">目标数据库中没有与</span><span lang=EN-US twffan="done"><font face="Times New Roman"> ts_candy</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">同名的表空间</span></u></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; select tablespace_name from dba_tablespaces</font></span></div>
<div twffan="done"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><span twffan="done">2<span twffan="done"> </span></span></span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done">where tablespace_name = 'TS_CANDY';</span></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">TABLESPACE_NAME</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US twffan="done"><span twffan="done"><font face="Times New Roman"><font size=3>（2）</font><span twffan="done"> </span></font></span></span><font size=3><u><span style="FONT-FAMILY: 宋体" twffan="done">导入数据（导入用户</span><span lang=EN-US twffan="done"><font face="Times New Roman">qcui </font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">已授予</span><span lang=EN-US twffan="done"><font face="Times New Roman">DBA</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">权限，并且具有</span><span lang=EN-US twffan="done"><font face="Times New Roman"> unlimited tablespace</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">权限）</span></u></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; select grantee,privilege from dba_sys_privs</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>where grantee = 'QCUI';</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">GRANTEE<span twffan="done"> </span>PRIVILEGE</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------ ----------------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">QCUI<span twffan="done"> </span>UNLIMITED TABLESPACE</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">C:Documents and Settingscuiqing&gt;imp qcui/qcui@jwptzjk fromuser=candy touser=qcui file='d:tempcandy.dmp' constraints=n</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">经由直接路径导出由</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">EXPORT:V09.02.00</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">创建的导出文件</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">警告</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">此对象由</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> <span lang=EN-US twffan="done">CANDY </span></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">导出</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">, </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">而不是当前用户</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">已经完成</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">ZHS16GBK</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">字符集和</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">AL16UTF16 NCHAR </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">字符集中的导入</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">. . </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">正在导入表</span><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><span twffan="done"> </span>"CANDY_TABLES"<span twffan="done"> </span></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: maroon; FONT-FAMILY: &#203;&#206;&#204;&#229;" twffan="done">919</span></font><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">行被导入</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">成功终止导入，但出现警告。</span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><font size=3><u><span lang=EN-US twffan="done"><font face="Times New Roman">(3) </font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">检查数据存放的表空间。数据存放在</span><span lang=EN-US twffan="done"><font face="Times New Roman">QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">的缺省表空间</span><span lang=EN-US twffan="done"><font face="Times New Roman">TS_QCUI</font></span></u><u><span style="FONT-FAMILY: 宋体" twffan="done">中</span></u></font></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">SQL&gt; select table_name,tablespace_name from dba_tables</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"><span twffan="done"></span>2<span twffan="done"> </span>where owner = 'QCUI';</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">TABLE_NAME<span twffan="done"> </span>TABLESPACE_NAME</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">------------------------------ ------------------------------</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">CUSTOMERS<span twffan="done"> </span><span twffan="done"></span>TS_QCUI</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">CANDY_TABLES<span twffan="done"> </span><span twffan="done"></span>TS_QCUI</font></span></div>
<div twffan="done"><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"></font></span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">小结：当拿到由拥有</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">权限的用户导出的数据时，最好问清楚其缺省表空间，如果目标数据库中存在与导出数据库同名的表空间时，这种情况需要特别注意。</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">我们往往在一看到&#8220;</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">IMP-00013: </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">只有</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> DBA </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">才能导入由其它</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> DBA </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">导出的文件&#8221;</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">这个错误信息后，就立刻给导入用户授予</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">权限，但却忽略了</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">DBA</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">的角色是拥有对数据库中所有表空间</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">unlimit</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">的权限，造成花费很长时间</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">import</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">结束后，却发现没有导入到预期的表空间中。</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">简而言之，如果有同名表空间存在的话，必须将导入用户的</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> <span lang=EN-US twffan="done">unlimited tablespace</span></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">的权限</span><span style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> <span lang=EN-US twffan="done">revoke </span></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">掉，否则数据将被直接存放到了那个同名表空间中，而不是导入用户缺省的表空间中；如果没有同名表空间，则无需进行</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman"> revoke</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">，</span><span lang=EN-US style="FONT-SIZE: 9pt" twffan="done"><font face="Times New Roman">oracle </font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">会自动将数据存放在导入用户的缺省表空间中。</span></div>
<div twffan="done"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">最后一个需要注意的问题就是</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">DBA</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">授权问题，个人建议，一个数据库中除了</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">system</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">和</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">sys</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">用户以外，最好严格控制</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">DBA</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">权限的授予，尤其是不要随便赋予应用系统</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">schema的owner</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">以这个权限。目前国内的软件开发以及项目管理的能力还很薄弱，绝大多数项目中，不会设立专门的数据库管理角色，又为了图方便，往往赋予应用系统schema的owner以DBA权限，这样一来，在一个几十人或者上百人的团队中，其中任何一个开发人员或是运维人员一个随意的对</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">DB的</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">操作，对DB而言也许将</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">会是灾难性的。因此，当导入数据后，应及时</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done">revoke</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">掉</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'" twffan="done"> <span lang=EN-US twffan="done">DBA </span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" twffan="done">权限。</span></div>
</div>
</div>
</h4>
<img src ="http://www.cnitblog.com/stomic/aggbug/61026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-08-27 09:50 <a href="http://www.cnitblog.com/stomic/archive/2009/08/27/61026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把数据导入不同的表空间?</title><link>http://www.cnitblog.com/stomic/archive/2009/08/27/61024.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Aug 2009 01:27:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/08/27/61024.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61024.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/08/27/61024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61024.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61024.html</trackback:ping><description><![CDATA[很多人在进行数据迁移时，希望把数据导入不同于原系统的表空间，在导入之后却往往发现，数据被导入了原表空间。<br>本例举例说明解决这个问题:<br>1.如果缺省的用户具有DBA权限<br>那么导入时会按照原来的位置导入数据，即导入到原表空间<br><br>$ imp bjbbs/passwd file=bj_bbs.dmp fromuser=jive touser=bjbbs grants=n<br><br>Import: Release 8.1.7.4.0 - Production on Mon Sep 22 11:49:41 2003<br><br>(c) Copyright 2000 Oracle Corporation.&nbsp; All rights reserved.<br><br>Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production<br>With the Partitioning option<br>JServer Release 8.1.7.4.0 - 64bit Production<br><br>Export file created by EXPORT:V08.01.07 via conventional path<br><br>Warning: the objects were exported by JIVE, not by you<br><br>import done in ZHS16GBK character set and ZHS16GBK NCHAR character set<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HS_ALBUMINBOX"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HS_ALBUM_INFO"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HS_CATALOG"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 13 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HS_CATALOGAUTHORITY"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HS_CATEGORYAUTHORITY"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 rows imported<br>....<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "JIVEUSERPROP"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "JIVEWATCH"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "PLAN_TABLE"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TMZOLDUSER"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 rows imported<br>. . importing table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "TMZOLDUSER2"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 rows imported<br>About to enable constraints...<br>Import terminated successfully without warnings.<br><br>查询发现仍然导入了USER表空间<br>
<div id=a000242more>
<div id=more>
<pre>$ sqlplus bjbbs/passwd
SQL*Plus: Release 8.1.7.0.0 - Production on Mon Sep 22 11:50:03 2003
(c) Copyright 2000 Oracle Corporation.  All rights reserved.
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.4.0 - 64bit Production
SQL&gt; select table_name,tablespace_name from user_tables;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
HS_ALBUMINBOX                  USERS
HS_ALBUM_INFO                  USERS
HS_CATALOG                     USERS
HS_CATALOGAUTHORITY            USERS
HS_CATEGORYAUTHORITY           USERS
HS_CATEGORYINFO                USERS
HS_DLF_DOWNLOG                 USERS
...
JIVEWATCH                      USERS
PLAN_TABLE                     USERS
TMZOLDUSER                     USERS
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TMZOLDUSER2                    USERS
45 rows selected.
</pre>
2.回收用户unlimited tablespace权限<br>这样就可以导入到用户缺省表空间<br>
<pre>SQL&gt; create user bjbbs identified by passwd
2  default tablespace bjbbs
3  temporary tablespace temp
4  /
User created.
SQL&gt; grant connect,resource to bjbbs;
Grant succeeded.
SQL&gt; grant dba to bjbbs;
Grant succeeded.
SQL&gt; revoke unlimited tablespace from bjbbs;
Revoke succeeded.
SQL&gt; alter user bjbbs quota 0 on users;
User altered.
SQL&gt; alter user bjbbs quota unlimited on bjbbs;
User altered.
SQL&gt; exit
Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.4.0 - 64bit Production
</pre>
<br>重新导入数据<br>
<pre>$ imp bjbbs/passwd file=bj_bbs.dmp fromuser=jive touser=bjbbs grants=n
Import: Release 8.1.7.4.0 - Production on Mon Sep 22 12:00:51 2003
(c) Copyright 2000 Oracle Corporation.  All rights reserved.
Connected to: Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.4.0 - 64bit Production
Export file created by EXPORT:V08.01.07 via conventional path
Warning: the objects were exported by JIVE, not by you
import done in ZHS16GBK character set and ZHS16GBK NCHAR character set
. . importing table                "HS_ALBUMINBOX"         12 rows imported
. . importing table                "HS_ALBUM_INFO"         47 rows imported
. . importing table                   "HS_CATALOG"         13 rows imported
. . importing table          "HS_CATALOGAUTHORITY"          5 rows imported
. . importing table         "HS_CATEGORYAUTHORITY"          0 rows imported
. . importing table              "HS_CATEGORYINFO"          9 rows imported
. . importing table               "HS_DLF_DOWNLOG"          0 rows imported
....
. . importing table                     "JIVEUSER"        102 rows imported
. . importing table                 "JIVEUSERPERM"         81 rows imported
. . importing table                 "JIVEUSERPROP"          4 rows imported
. . importing table                    "JIVEWATCH"          0 rows imported
. . importing table                   "PLAN_TABLE"          0 rows imported
. . importing table                   "TMZOLDUSER"          3 rows imported
. . importing table                  "TMZOLDUSER2"          3 rows imported
About to enable constraints...
Import terminated successfully without warnings.
SQL&gt; select table_name,tablespace_name from user_tables;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
HS_ALBUMINBOX                  BJBBS
HS_ALBUM_INFO                  BJBBS
HS_CATALOG                     BJBBS
HS_CATALOGAUTHORITY            BJBBS
....
JIVETHREAD                     BJBBS
JIVETHREADPROP                 BJBBS
JIVEUSER                       BJBBS
JIVEUSERPERM                   BJBBS
JIVEUSERPROP                   BJBBS
JIVEWATCH                      BJBBS
PLAN_TABLE                     BJBBS
TMZOLDUSER                     BJBBS
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TMZOLDUSER2                    BJBBS
45 rows selected.
</pre>
<br>现在数据被导入到正确的用户表空间中. </div>
</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/61024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-08-27 09:27 <a href="http://www.cnitblog.com/stomic/archive/2009/08/27/61024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle imp 关于fromuser 和 touser的用法</title><link>http://www.cnitblog.com/stomic/archive/2009/08/27/61023.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Aug 2009 01:17:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/08/27/61023.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61023.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/08/27/61023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61023.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61023.html</trackback:ping><description><![CDATA[fromuser就是把当前的dmp文件中的某一个用户下的数据取出。<br>touser就是把现在dmp文件中的数据导入到目标库的指定user下。<br>具体命令这样。<br>exp userid=system/manager owner=username1 file=expfile.dmp <br><br>imp userid=system/manager fromuser=username1 touser=username2 ignore=y file=expfile.dmp full=y
<img src ="http://www.cnitblog.com/stomic/aggbug/61023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-08-27 09:17 <a href="http://www.cnitblog.com/stomic/archive/2009/08/27/61023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle exp/imp导出导入工具的使用 </title><link>http://www.cnitblog.com/stomic/archive/2009/08/27/61022.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Aug 2009 01:15:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/08/27/61022.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61022.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/08/27/61022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61022.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61022.html</trackback:ping><description><![CDATA[<p><strong><font color=#0000ff>一. 导出工具 exp<br><br></font></strong>1. 它是操作系统下一个可执行的文件<strong> 存放目录/ORACLE_HOME/bin</strong><br><br>&nbsp;&nbsp; exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; 它有三种模式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 用户模式： 导出用户所有对象以及对象中的数据；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 表模式： 导出用户所有表或者指定的表；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 整个数据库： 导出数据库中所有对象。<br><br><strong>2. 导出工具exp交互式命令行方式的使用的例子</strong><br>$<font color=#0000ff>exp </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#101;&#114;"><u><font color=#0000ff>oa1/123@</font></u></a>oracle<br>连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br>With the Partitioning, OLAP and Data Mining options<br>输入数组提取缓冲区大小: 4096 &gt;</p>
<p>&nbsp;导出文件: EXPDAT.DMP &gt; D:/a.dmp</p>
<p>(2)U(用户), 或 (3)T(表): (2)U &gt; 3</p>
<p>导出表数据 (yes/no): yes &gt; yes</p>
<p>压缩区 (yes/no): yes &gt;</p>
<p>已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集</p>
<p>即将导出指定的表通过常规路径...<br>要导出的表 (T) 或分区 (T: P): (按 RETURN 退出) &gt; pfdept</p>
<p>. . 正在导出表&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; PFDEPT导出了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 83 行<br>要导出的表 (T) 或分区 (T: P): (按 RETURN 退出) &gt;return<br>导出成功终止, 但出现警告。<br><br><strong>3. 导出工具exp非交互式命令行方式的例子<br></strong>$<font color=#0000ff>exp </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><u><font color=#0000ff>oa1/123@oracle</font></u></a><font color=#0000ff> file=D:/all.dmp grants=y</font><br><br>说明:把oa1用户的所有表导出到文件D:/all.dmp<br><br>$<font color=#0000ff>exp </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><u><font color=#0000ff>oa1/123@oracle</font></u></a><font color=#0000ff>&nbsp;tables=(pfdept,pfuser) file=D:/all.dmp&nbsp; grants=y</font><br><br>说明:把<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><u><font color=#0000ff>oa1</font></u></a>用户里两个表emp,dept导出到文件<font color=#0000ff>D:/all.dmp </font><br><br>$<font color=#0000ff>exp </font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#97;&#49;&#47;&#49;&#50;&#51;&#64;&#111;&#114;&#97;&#99;&#108;&#101;"><u><font color=#0000ff>oa1/123@oracle</font></u></a><font color=#0000ff> tables=pfdept query=\"where predeptid=0745\" file=D:/all.dmp<br></font><br>说明:在exp里面加上导出<font color=#0000ff>pfdept </font>的查询条件<font color=#0000ff>predeptid=0745</font><br><br>$<font color=#0000ff>exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log</font><br><br>参数文件username.par内容<br>userid=username/userpassword<br>buffer=8192000<br>compress=n<br>grants=y<br><br>说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改<br><br>&nbsp;&nbsp;&nbsp;&nbsp; filesize指定生成的二进制备份文件的最大字节数<br><strong><font color=#0000ff>二.导入工具 imp<br><br></font></strong>1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin<br><br>imp导入工具将EXP形成的二进制系统文件导入到数据库中.<br><br>&nbsp;&nbsp; 它有三种模式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.&nbsp; 用户模式： 导出用户所有对象以及对象中的数据；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.&nbsp; 表模式： 导出用户所有表或者指定的表；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.&nbsp; 整个数据库： 导出数据库中所有对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; 只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; imp步骤：<br>&nbsp;&nbsp; (1) create table&nbsp; (2) insert data&nbsp; (3) create index (4) create triggers,constraints<br><br><strong>2.导入工具imp交互式命令行方式的例子</strong><br>$<font color=#0000ff> imp</font><br><font color=#0000ff>Import: Release 10.1.0.2.0 - Production on 星期一 9月 3 08:21:32 2007</font><br><font color=#0000ff>Copyright (c) 1982, 2004, Oracle.&nbsp; All rights reserved.</font><br>用户名:&nbsp; <font color=#0000ff>system</font><br>口令:<font color=#0000ff>****</font><br><font color=#0000ff>连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br>With the Partitioning, OLAP and Data Mining options</font><br>导入文件: expdat.dmp&gt; <font color=#0000ff>D:/all.dmp</font><br>输入插入缓冲区大小（最小为 8192 ) 30720&gt;<br>经由常规路径导出由EXPORT:V08.01.06创建的文件<br>警告: 此对象由 TEST 导出, 而不是当前用户<br>已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br>只列出导入文件的内容(yes/no)：no&gt;<br>由于对象已存在, 忽略创建错误(yes/no)：no&gt; <font color=#0000ff>yes</font><br>导入权限(yes/no)：yes&gt;<br>导入表数据(yes/no)：yes&gt;<br>导入整个导出文件(yes/no)：no&gt; <font color=#0000ff>yes</font><br>. 正在将TEST的对象导入到 SCOTT<br>. . 正在导入表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "CMAMENU"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4336行被导入<br>成功终止导入，但出现警告。 <br><strong>3.导入工具imp非交互式命令行方式的例子<br><br></strong>$ imp system/oracle fromuser=oa1 tables=(pfdept) <br>$ imp system/oracle fromuser=oa1 tables=(pfdept,pfuser) <br>$ imp system/oracle fromuser=oa1 touser=system<br>$ imp oa1/123 file = all.dmp full=y <br>$ imp oa1/123 file = all.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=D:/.log<br>$ imp&nbsp;oa1/123 parfile=params.dat <br>params.dat 内容 <br>file=dba.dmp show=n ignore=n grants=y fromuser=oa1 tables=(pfdept,pfuser) <br><br><strong>4.导入工具imp可能出现的问题</strong><br><br>(1) 数据库对象已经存在<br>一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等;&nbsp; <br>数据库对象已经存在, 按缺省的imp参数, 则会导入失败<br>如果用了参数ignore=y, 会把exp文件内的数据内容导入<br>如果表有唯一关键字的约束条件, 不合条件将不被导入<br>如果表没有唯一关键字的约束条件, 将引起记录重复<br><br>(2) 数据库对象有主外键约束<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不符合主外键约束时, 数据会导入失败 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决办法: 先导入主表, 再导入依存表<br>disable目标导入对象的主外键约束, 导入数据后, 再enable它们<br>(3)&nbsp; 权限不够<br>如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限<br><br>(4)&nbsp; 导入大表( 大于80M ) 时, 存储分配失败<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入时, 如果不存在连续一个大数据块, 则会导入失败.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.<br><br>(5) imp和exp使用的字符集不同<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入完成后再改回来.<br><br>(6) imp和exp版本不能往上兼容<br>imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件<br>根据情况我们可以用<br></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/61022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-08-27 09:15 <a href="http://www.cnitblog.com/stomic/archive/2009/08/27/61022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>导入表空间问题</title><link>http://www.cnitblog.com/stomic/archive/2009/08/27/61020.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 27 Aug 2009 00:37:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/08/27/61020.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61020.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/08/27/61020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61020.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61020.html</trackback:ping><description><![CDATA[<p>导入表空间问题<br>&nbsp; <br>问题：<br>在Oracle中建一个用户rfiduser 默认的表空间设置为rfiduser <br>但我导入数据时，数据的表空间怎么还是user！ </p>
<p>SQLplus rfiduser/jky_rfid_123 as sysdba <br>一: <br>create directory rfidnew as 'd:\rfidnew'; <br>二: <br>grant read,wrITe on directory rfidnew to rfiduser; <br>三 <br>impdp rfiduser/jky_rfid_123 directory=rfidnew dumpfile=myusertab1.dmp logfile=myusertab1.log tables=cc_info1,cc_info2,cc_car,cc_caifen,cc_recinfo,cc_accountinfo,cc_recinfo1,cc_user,road_info,managedep_info,ownerdep_info,tollstation_info,markstation_info,pikerate,vehicleregister,accountfreeze,accountthaw,tagreplace,ownerchange,vehiclelogout,vehiclecorrect,devicevindicate,devicelog,devicecontrol,enterrecord,markrecord,exitrecord,trafficrecord,pikerecord,pikesplitrecord,invoiceprintrecord,blacklist,userinfo,temprec_info,milesplit_info,costsplIT_info,InvalidTagRecord,BankAccount,deductRecord,tempmarkrec_info,synchronousrecord,delayexportrecord,feerate,accountrecharge,personuser,alarmlog,handiwork,systemlog,carchargeback,carbackout,transactionfaile,monthbalance </p>
<p><br>回答： 参考 <br><a href="http://www.cnblogs.com/KissKnife/archive/2007/09/17/896459.HTML">http://www.cnblogs.com/KissKnife/archive/2007/09/17/896459.HTML</a> </p>
<p><br>IMP数据到指定的表空间 </p>
<p>一直以来，我都认为只要指定用户的默认表空间，向该用户导入数据时，会自动进入到默认表空间。后来发现从System导出的dmp文件在导入时，即使指定新用户的默认表空间，还是要往System表空间中导数据。 </p>
<p>上网搜了一下，还是有解决方法的，常见的方法如下： </p>
<p>SQL&gt; create user myhuang identified by myhuang default tablespace myhuang; </p>
<p>SQL&gt; grant resource,connect to myhuang; </p>
<p>SQL&gt; grant dba to myhuang;//赋DBA权限 </p>
<p>SQL&gt; revoke unlimITed tablespace from myhuang;//撤销此权限 </p>
<p>SQL&gt; alter user myhuang quota 0 on system;//将用户在System表空间的配额置为0 </p>
<p>SQL&gt; alter user myhuang quota unlimITed on myhuang;//设置在用户在myhuang表空间配额不受限。 </p>
<p>&nbsp;</p>
<p>经过上述设置后，就可以用imp导入数据，数据将会进入指定的myhuang表空间： </p>
<p>C:\Documents and Settings\myhuang&gt;imp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#49;&#50;&#51;&#52;&#53;&#54;&#64;&#118;&#100;&#98;">system/123456@vdb</a> fromuser=lnxh tous </p>
<p>er=myhuang file=G:\myhuang\lnxh.dmp ignore=y grants=n</p>
<p><br>欢迎转载，但请保留出处，本文章转自[华软网] 原文链接：<a href="http://www.huarw.com/db/Oracle/200901/1655142.html">http://www.huarw.com/db/Oracle/200901/1655142.html</a></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/61020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-08-27 08:37 <a href="http://www.cnitblog.com/stomic/archive/2009/08/27/61020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在oracle中导入dmp数据库文件</title><link>http://www.cnitblog.com/stomic/archive/2009/07/21/60271.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 21 Jul 2009 15:13:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/07/21/60271.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/60271.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/07/21/60271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/60271.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/60271.html</trackback:ping><description><![CDATA[<p>&nbsp;Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件，imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库，一个用来测试，一个用来正式使用。<br>&nbsp;<br>执行环境：可以在SQLPLUS.EXE或者DOS（命令行）中执行，<br>&nbsp;DOS中可以执行时由于 在oracle 8i 中&nbsp; 安装目录\ora81\BIN被设置为全局路径，<br>&nbsp;该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。<br>&nbsp;oracle用java编写，SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包装后的类文件。<br>&nbsp;SQLPLUS.EXE调用EXP.EXE、IMP.EXE所包裹的类，完成导入导出功能。<br>&nbsp;<br>下面介绍的是导入导出的实例。<br>数据导出：<br>&nbsp;1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中<br>&nbsp;&nbsp; exp system/manager@TEST file=d:\daochu.dmp full=y</p>
<p>&nbsp;2 将数据库中system用户与sys用户的表导出<br>&nbsp;&nbsp; exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)</p>
<p>&nbsp;3 将数据库中的表inner_notify、notify_staff_relat导出<br>&nbsp;&nbsp;&nbsp; exp aichannel/aichannel@TESTDB2 file= d:\data\newsmgnt.dmp tables=(inner_notify,notify_staff_relat) </p>
<p>&nbsp;4 将数据库中的表table1中的字段filed1以"00"打头的数据导出<br>&nbsp;&nbsp; exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"<br>&nbsp; <br>&nbsp; 上面是常用的导出，对于压缩，既用winzip把dmp文件可以很好的压缩。<br>&nbsp; 也可以在上面命令后面 加上 compress=y 来实现。 <br>数据的导入<br>&nbsp;1 将D:\daochu.dmp 中的数据导入 TEST数据库中。<br>&nbsp;&nbsp; imp system/manager@TEST&nbsp; file=d:\daochu.dmp<br>&nbsp;&nbsp; imp aichannel/aichannel@HUST full=y&nbsp; file=file= d:\data\newsmgnt.dmp ignore=y <br>&nbsp;&nbsp; 上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。<br>&nbsp;&nbsp; 在后面加上 ignore=y 就可以了。</p>
<p>&nbsp;2 将d:\daochu.dmp中的表table1 导入<br>&nbsp;imp system/manager@TEST&nbsp; file=d:\daochu.dmp&nbsp; tables=(table1) <br>&nbsp;<br>&nbsp;基本上上面的导入导出够用了。不少情况要先是将表彻底删除，然后导入。<br>&nbsp;<br>注意：<br>&nbsp;操作者要有足够的权限，权限不够它会提示。<br>&nbsp;数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。 </p>
<p>附录一：<br>&nbsp;给用户增加导入数据权限的操作<br>&nbsp;第一,启动sql*puls<br>&nbsp;第二，以system/manager登陆<br>&nbsp;第三，create user 用户名 IDENTIFIED BY 密码 （如果已经创建过用户，这步可以省略）<br>&nbsp;第四，GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,<br>&nbsp;&nbsp; DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBA,CONNECT,RESOURCE,CREATE SESSION&nbsp; TO 用户名字 <br>&nbsp;第五, 运行-cmd-进入dmp文件所在的目录, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imp userid=system/manager full=y file=*.dmp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者 imp userid=system/manager full=y file=filename.dmp </p>
<p>&nbsp;执行示例:<br>&nbsp;F:\Work\Oracle_Data\backup&gt;imp userid=test/test full=y file=inner_notify.dmp </p>
<p>屏幕显示<br>Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006<br>(c) Copyright 2000 Oracle Corporation.&nbsp; All rights reserved. </p>
<p>连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production<br>With the Partitioning option<br>JServer Release 8.1.7.0.0 - Production </p>
<p>经由常规路径导出由EXPORT:V08.01.07创建的文件<br>已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br>导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)<br>. 正在将AICHANNEL的对象导入到 AICHANNEL<br>. . 正在导入表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "INNER_NOTIFY"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4行被导入<br>准备启用约束条件...<br>成功终止导入，但出现警告。 </p>
<p><br>附录二：<br>&nbsp;Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.<br>&nbsp; 先建立import9.par,<br>&nbsp; 然后，使用时命令如下：imp parfile=/filepath/import9.par<br>&nbsp; 例 import9.par 内容如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROMUSER=TGPMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOUSER=TGPMS2&nbsp;&nbsp;&nbsp;&nbsp; （注：把表的拥有者由FROMUSER改为TOUSER，FROMUSER和TOUSER的用户可以不同）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWS=Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEXES=Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GRANTS=Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONSTRAINTS=Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUFFER=409600<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file==/backup/ctgpc_20030623.dmp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log==/backup/import_20030623.log</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/60271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-07-21 23:13 <a href="http://www.cnitblog.com/stomic/archive/2009/07/21/60271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle创建帐号及赋予权限</title><link>http://www.cnitblog.com/stomic/archive/2009/07/21/60269.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 21 Jul 2009 14:54:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/07/21/60269.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/60269.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/07/21/60269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/60269.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/60269.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>1 创建用户 create user userName identified by password; 创建用户 userName,密码为 password <br>2 给用户授权 grant dba to userName; --授予DBA权限 grant unlimited tablespace to userName;--授予不限制的表空间 grant select any table to userName; --授予查询任何表 grant select any dictionary to userName;--授予 查询 任何字典</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/60269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-07-21 22:54 <a href="http://www.cnitblog.com/stomic/archive/2009/07/21/60269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle sqlplus 常用命令大全</title><link>http://www.cnitblog.com/stomic/archive/2009/07/10/59992.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 10 Jul 2009 03:11:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/07/10/59992.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/59992.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/07/10/59992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/59992.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/59992.html</trackback:ping><description><![CDATA[<p>SQL&gt; show all --查看所有68个系统变量值 <br>SQL&gt; show user --显示当前连接用户 <br>SQL&gt; show error　　 --显示错误 <br>SQL&gt; set heading off --禁止输出列标题，默认值为ON <br>SQL&gt; set feedback off --禁止显示最后一行的计数反馈信息，默认值为"对6个或更多的记录，回送ON" <br>SQL&gt; set timing on --默认为OFF，设置查询耗时，可用来估计SQL语句的执行时间，测试性能 <br>SQL&gt; set sqlprompt "SQL&gt; " --设置默认提示符，默认值就是"SQL&gt; " <br>SQL&gt; set linesize 1000 --设置屏幕显示行宽，默认100 <br>SQL&gt; set autocommit ON --设置是否自动提交，默认为OFF <br>SQL&gt; set pause on --默认为OFF，设置暂停，会使屏幕显示停止，等待按下ENTER键，再显示下一页 <br>SQL&gt; set arraysize 1 --默认为15 <br>SQL&gt; set long 1000 --默认为80 <br>说明： <br>long值默认为80，设置1000是为了显示更多的内容，因为很多数据字典视图中用到了long数据类型，如： <br>SQL&gt; desc user_views <br>列名 可空值否 类型 <br>------------------------------- -------- ---- <br>VIEW_NAME NOT NULL VARCHAR2(30) <br>TEXT_LENGTH NUMBER <br>TEXT LONG <br>SQL&gt; define a = '''20000101 12:01:01''' --定义局部变量，如果想用一个类似在各种显示中所包括的回车那样的常量， <br>--可以用define命令来设置 <br>SQL&gt; select &amp;a from dual; <br>原值 1: select &amp;a from dual <br>新值 1: select '20000101 12:01:01' from dual <br>'2000010112:01:01 <br>----------------- <br>20000101 12:01:01 <br>问题提出： <br>1、用户需要对数据库用户下的每一张表都执行一个相同的SQL操作，这时，一遍、一遍的键入SQL语句是很麻烦的 <br>实现方法： <br>SQL&gt; set heading off --禁止输出列标题 <br>SQL&gt; set feedback off --禁止显示最后一行的计数反馈信息 <br>列出当前用户下所有同义词的定义，可用来测试同义词的真实存在性 <br>select 'desc '||tname from tab where tabtype='SYNONYM'; <br>查询当前用户下所有表的记录数 <br>select 'select '''||tname||''',count(*) from '||tname||';' from tab where tabtype='TABLE'; <br>把所有符合条件的表的select权限授予为public <br>select 'grant select on '||table_name||' to public;' from user_tables where 《条件》; <br>删除用户下各种对象 <br>select 'drop '||tabtype||' '||tname from tab; <br>删除符合条件用户 <br>select 'drop user '||username||' cascade;' from all_users where user_id&gt;25; <br>快速编译所有视图 <br>----当在把数据库倒入到新的服务器上后(数据库重建)，需要将视图重新编译一遍， <br>----因为该表空间视图到其它表空间的表的连接会出现问题，可以利用PL/SQL的语言特性，快速编译。 <br>SQL&gt; SPOOL ON.SQL <br>SQL&gt; SELECT'ALTER VIEW '||TNAME||' COMPILE;' FROM TAB; <br>SQL&gt; SPOOL OFF <br>然后执行ON.SQL即可。 <br>SQL&gt; @ON.SQL <br>当然，授权和创建同义词也可以快速进行，如： <br>SQL&gt; SELECT 'GRANT SELECT ON '||TNAME||' TO 用户名;' FROM TAB; <br>SQL&gt; SELECT 'CREATE SYNONYM '||TNAME||' FOR 用户名.'||TNAME||';' FROM TAB; <br>命令列表： <br>假设当前执行命令为：select * from tab; <br>(a)ppend　　　　 添加文本到缓冲区当前行尾　　　　a order by tname　结果：select * from tab order by tname; <br>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（注：a后面跟2个空格） <br>(c)hange/old/new 在当前行用新的文本替换旧的文本　c/*/tname　　　　　结果：select tname from tab; <br>(c)hange/text　　从当前行删除文本　　　　　　　　c/tab　　　　　　　结果：select tname from ; <br>del　　　　　　　删除当前行 <br>del n　　　　　　删除第n行 <br>(i)nput 文本　　 在当前行之后添加一行 <br>(l)ist　　　　　 显示缓冲区中所有行 <br>(l)ist n　　　　 显示缓冲区中第 n 行 <br>(l)ist m n　　　 显示缓冲区中 m 到 n 行 <br>run　　　　　　　执行当前缓冲区的命令 <br>/　　　　　　　　执行当前缓冲区的命令 <br>r　　　　　　　　执行当前缓冲区的命令 <br>@文件名　　　　　运行调入内存的sql文件，如： <br>SQL&gt; edit s&lt;回车&gt; <br>如果当前目录下不存在s.sql文件，则系统自动生成s.sql文件， <br>在其中输入"select * from tab;"，存盘退出。 <br>SQL&gt; @s&lt;回车&gt; <br>系统会自动查询当前用户下的所有表、视图、同义词。 <br>@@文件名　　　　 在.sql文件中调用令一个.sql文件时使用 <br>save 文件名　　　将缓冲区的命令以文件方式存盘，缺省文件扩展名为.sql <br>get 文件名　　　 调入存盘的sql文件 <br>start 文件名　　 运行调入内存的sql文件 <br>spool 文件名　　 把这之后的各种操作及执行结果"假脱机"即存盘到磁盘文件上，默认文件扩展名为.lst <br>spool　　　　　　显示当前的"假脱机"状态 <br>spool off　　　　停止输出 <br>例： <br>SQL&gt; spool a <br>SQL&gt; spool <br>正假脱机到 A.LST <br>SQL&gt; spool off <br>SQL&gt; spool <br>当前无假脱机 <br>exit　　　　　　 退出SQL*PLUS <br>desc 表名　　　　显示表的结构 <br>show user　　　　显示当前连接用户 <br>show error　　　 显示错误 <br>show all　　　　 显示所有68个系统变量值 <br>edit　　　　　　 打开默认编辑器，Windows系统中默认是notepad.exe，把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑 <br>edit 文件名　　　把当前目录中指定的.sql文件调入编辑器进行编辑 <br>clear screen　　 清空当前屏幕显示 <br>二．Oracle sqlplus语句编辑命令 <br>首先我们输入这样一条指令： <br>SELECT emp_id, emp_name <br>FROM Employees <br>input 命令可以接着上一条指令的后面添加语句，比如在上述语句运行后输入： <br>input WHERE emp_age &gt; 30 <br>便可得到如下指令： <br>SELECT emp_id, emp_name <br>FROM Employees <br>WHERE emp_age &gt; 30 <br>ln 命令用于指定对以输入的第n行语句进行操作，比如在上述语句运行后输入： <br>l1则当前选中的语句行即为 <br>SELECT emp_id, emp_name <br>（语句前有"*"表示） <br>a 命令用于直接在当前行的末尾加上字符，比如在上述语句运行后输入： <br>a , emp_dept <br>则执行的指令变为： <br>SELECT emp_id, emp_name, emp_dept <br>FROM Employees <br>WHERE emp_age &gt; 30 <br>c 命令用于修改当前语句中的字符，比如在上述语句运行后输入： <br>c /emp_name/emp_age/则执行的指令变为： <br>SELECT emp_id, emp_age, emp_dept <br>FROM Employees <br>WHERE emp_age &gt; 30 <br>del n 命令用于删除第n行指令，比如在上述语句运行后输入： <br>DEL 3 <br>则执行的指令变为： <br>SELECT emp_id, emp_age, emp_dept <br>FROM Employees </p>
<p>本文来自: 脚本之家(<a href="http://www.jb51.net/">www.jb51.net</a>) 详细出处参考：<a href="http://www.jb51.net/article/18251.htm">http://www.jb51.net/article/18251.htm</a></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/59992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-07-10 11:11 <a href="http://www.cnitblog.com/stomic/archive/2009/07/10/59992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库连接池介绍</title><link>http://www.cnitblog.com/stomic/archive/2008/10/29/50845.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 29 Oct 2008 15:30:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/10/29/50845.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/50845.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/10/29/50845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/50845.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/50845.html</trackback:ping><description><![CDATA[<span id=Label4>&nbsp;
<p><a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong>数据库</strong></u></a>连接池概述：</p>
<p><a name=27534516>数据库连接的建立及关闭对系统而言是耗费系统资源的操作，在多层结构的应用环境中，这种耗费资源的动作对系统的性能影响尤为明显。在传统的数据库连接方式</a> （指通过DriverManager）中，一个数据库连接对象均对应一个物理数据库连接，每次操作都打开一个物理连接，使用完都关闭连接，这样造成系统的 性能低下。 <br>数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接，并讲这些连接组成一个连接池(<a name=27541561>简单说：在一个&#8220;</a>池&#8221;里放了好多半成品的数据库联接对象)，由应用程序动态地对池中的连接进行申请、使用和释放。对于 多于连接池中连接数的并发请求，应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率，动态增加或减少池中的连接数。 <br>连接池<a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="javascript:;" target=_self><u><strong>技术</strong></u></a>尽可能多地重用了消耗内存地资源，大大节省了内存，提高了服务器地服务效率，能够支持更多的客户服务。通过使用连接池，将大大提高程序运行效率，同时，我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。</p>
<p><br>数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。</p>
<p><br>数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。 <br>数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：</p>
<p><br>1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费；</p>
<p><br>2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。</p>
<p><br>3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。</span></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/50845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-10-29 23:30 <a href="http://www.cnitblog.com/stomic/archive/2008/10/29/50845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>