﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-奇葛格的BLOG-随笔分类-数据库|Oracle,Mysql</title><link>http://www.blogjava.net/onlykeke/category/14494.html</link><description>红尘最可笑，我自乐逍遥</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 02:50:17 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 02:50:17 GMT</pubDate><ttl>60</ttl><item><title>Speed up random selecting in MySql[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/12/08/86370.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Fri, 08 Dec 2006 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/12/08/86370.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/86370.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/12/08/86370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/86370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/86370.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://jack.lifegoo.com/?p=27">http://jack.lifegoo.com/?p=27</a>
				<a href="http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html" target="_blank">
						<font color="#59708c">
								<br />
								<br />RAND()</font>
				</a>是MySql的一个内嵌函数，主要用来生成随机数。</p>
		<blockquote>
				<p>
						<strong>RAND()/RAND(N)</strong> returns a random floating-point value <em class="replaceable"><code><font color="#666666">v</font></code></em> between <code class="literal"><font color="#666666">0</font></code> and <code class="literal"><font color="#666666">1</font></code> inclusive (that is, in the range <code class="literal"><font color="#666666">0</font></code> &lt;= <em class="replaceable"><code><font color="#666666">v</font></code></em> &lt;= <code class="literal"><font color="#666666">1.0</font></code>). If an integer argument <em class="replaceable"><code><font color="#666666">N</font></code></em> is specified, it is used as the seed value, which produces a repeatable sequence of column values.</p>
		</blockquote>
		<p>MySql的文档说”把 ORDER BY RAND()和LIMIT联合使用，那么就可以来随机选择行(<code class="literal"><font color="#666666">ORDER BY RAND()</font></code> combined with <code class="literal"><font color="#666666">LIMIT</font></code> is useful for selecting a random sample from a set of rows)”, 例如:</p>
		<blockquote>
				<p>SELECT * FROM random ORDER BY RAND() LIMIT 1</p>
		</blockquote>
		<p>当上述SQL运行时，RAND()必须每次都被解释以便获得新的随机数。同时从explain sql的extra信息我们大致可以推出上面SQL的工作流程:</p>
		<ol>
				<li>MySql用结果集创建一个temporary table(Using temporary). 
</li>
				<li>给结果集的每一行赋予一个随机有序的索引. 
</li>
				<li>进行排序然后返回结果 (Using filesort). </li>
		</ol>
		<p>这个过程对于少量数据(具体见后面的benchmarks report)是可行的，但是对于大数据集是很浪费时间的。换而言之，ORDER BY RAND()对于随机选取的scalibility是很差的。</p>
		<p>
				<a id="more-27">
				</a>
		</p>
		<p>现在回到问题的最初，前天钱斌在察看MySql服务器性能时发现ORDER BY RAND()这个SQL语句非常慢(数据库表内有近200,000的数据，以后还要增加)，然后他提出自己的一个解决方案 ——- 数据插入前随机排序，选取时顺序读取。这是一个可行的办法，成本是必须修改程序。另一方面我也不愿意放弃MySql提供的RAND()函数。</p>
		<p>重新看ORDER BY RAND()的工作流程，可以找出优化的途径(序列号对应上面的工作流程顺序):</p>
		<ol>
				<li>结果集能不能缩到最小? 能不能做到和外部数据无关，而是一种常数的关系? 能不能在结果集的选取上就是随机的? 
</li>
				<li>对表结构里面的一些属性做索引。 
</li>
				<li>对结果集按照某个属性来做排序然后返回结果。 
</li>
				<li>RAND()不能出现在WHERE后面以保证RAND()是只运行一次的。 </li>
		</ol>
		<p>按照这些想法，下面就是设计其实现。</p>
		<ol>
				<li>首先想到的方案很简单，类似内存访问。table里数据都是从第一条开始读取，其访问偏移量可以做到随机。<br /><blockquote><p>SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM random;<br />SELECT * FROM random LIMIT offset, 1;</p></blockquote><p>唯一的问题是，上面是两句独立的SELECT语句，所以可以用存储过程或者MySql函数来实现。 </p></li>
				<li>下面的方案主要集中力量在缩小结果方面。假设最简单的一种场景: random table里面有一个bigint型的主键(记作id)，那么选取出一个 id &gt;= FLOOR(max(id) * RAND()) 会怎么样呢?<br /><blockquote><p>SELECT * FROM random<br />WHERE id &gt;= (SELECT FLOOR(MAX(id) * RAND()) FROM random )<br />ORDER BY id ASC LIMIT 1;</p></blockquote><p>可以分析出来，因为RAND()是在[0, 1]区间，所以结果集数目是在[0, max(id)]之间。这样就说明结果集是不稳定的，换句话说它可能受外部数据的变化而振动。更致命的缺陷是RAND()是在WHERE后面的，这样每选择一行，RAND()都要被解释一次。 </p></li>
				<li>尝试改善上述方案的缺陷，我们得到这样的实现:<br /><blockquote><p>SELECT *<br />FROM random AS r JOIN (SELECT FLOOR(RAND() * SELECT MAX(id) FROM random) AS id ) AS r0<br />WHERE r.id &gt;= r0.id<br />ORDER BY r.id ASC LIMIT 1;</p></blockquote><p>第二种方案里面嵌套SELECT我们用INNER JOIN来取代。这种取代使得RAND()只需要解释运行一次。当然它的结果集数目还是停留在[0, max(id)]区间。 </p></li>
		</ol>
		<p>最后是benchmarks的一些数据:</p>
		<p>第1种解决方案: SELECT * FROM random ORDER BY RAND() LIMIT 1<br />第2种解决方案: SELECT * FROM random WHERE id &gt;= (SELECT FLOOR(MAX(id) * RAND()) FROM random ) ORDER BY id ASC LIMIT 1;<br />第3种解决方案: SELECT * FROM random AS r JOIN (SELECT FLOOR(RAND() * SELECT MAX(id) FROM random) AS id ) AS r0 WHERE r.id &gt;= r0.id ORDER BY r.id ASC LIMIT 1;<br />上述三种方案都分别独立运行100次。</p>
		<table style="HEIGHT: 112px" width="464" border="1">
				<tbody>
						<tr>
								<td>random数据大小</td>
								<td>第1种解决方案</td>
								<td>第2种解决方案</td>
								<td>第3种解决方案</td>
						</tr>
						<tr>
								<td>100</td>
								<td align="right">0.08s</td>
								<td align="right">0.08s</td>
								<td align="right">0.02s</td>
						</tr>
						<tr>
								<td>500</td>
								<td align="right">0.08s</td>
								<td align="right">0.80s</td>
								<td align="right">0.00-0.01s</td>
						</tr>
						<tr>
								<td>1000</td>
								<td align="right">0.14s</td>
								<td align="right">2.00s</td>
								<td align="right">0.02s</td>
						</tr>
						<tr>
								<td>10000</td>
								<td align="right">1.53s</td>
								<td align="right">65.02s</td>
								<td align="right">0.00-0.02s</td>
						</tr>
						<tr>
								<td>100000</td>
								<td align="right">15.83s</td>
								<td align="right"> </td>
								<td align="right">0.00-0.02s</td>
						</tr>
				</tbody>
		</table>
		<p>
				<img id="image29" height="353" alt="rand100.png" src="http://jack.lifegoo.com/wp-content/uploads/2006/09/rand100.png" width="467" />
		</p>
<img src ="http://www.blogjava.net/onlykeke/aggbug/86370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-12-08 15:43 <a href="http://www.blogjava.net/onlykeke/archive/2006/12/08/86370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选出某一字段中持续递增的数据块(oracle)</title><link>http://www.blogjava.net/onlykeke/archive/2006/11/16/81584.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Thu, 16 Nov 2006 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/11/16/81584.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/81584.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/11/16/81584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/81584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/81584.html</trackback:ping><description><![CDATA[create table t1(no number);<br />insert into t1 values(133010);<br />insert into t1 values(133024);<br />insert into t1 values(133036);<br />insert into t1 values(133037);<br />insert into t1 values(133038);<br />insert into t1 values(133039);<br />insert into t1 values(133046);<br />insert into t1 values(133191);<br />insert into t1 values(133192);<br />insert into t1 values(133193);<br />insert into t1 values(133194);<br />insert into t1 values(133207);<br /><br />select no from (<br />    select no,lag(no,1,null) over(order by no) no1,no-lag(no,1,null) over(order by no) bal<br />    from t1)<br />where bal=1<br />union<br />select no1 from (<br />    select no,lag(no,1,null) over(order by no) no1,no-lag(no,1,null) over(order by no) bal<br />    from t1)<br />where bal=1;<br /><img src ="http://www.blogjava.net/onlykeke/aggbug/81584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-11-16 18:34 <a href="http://www.blogjava.net/onlykeke/archive/2006/11/16/81584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 4.1字符集支持[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/10/24/76918.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Tue, 24 Oct 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/10/24/76918.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/76918.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/10/24/76918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/76918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/76918.html</trackback:ping><description><![CDATA[
		<h3 class="entrytitle" id="post-51">注：<br /><div class="commenttext"><p>MySQL的官方手册关于字符集的介绍比较全面，可以通过<br />创建连接时指定<br />useUnicode true<br />characterEncoding UTF-8<br />characterSetResults UTF-8<br />这些选项，配合数据库默认的字符集实现支持中文。</p><p>因为字符从浏览器发送时为编码后的普通iso-8859-1文本。<br />经过PHP转换为gb2312或utf-8后再发送到数据库时如果再转换编码，<br />带来的性能浪费可想而知。</p></div><br /><br /><a href="http://blog.jjgod.org/2005/07/31/a-mysql-41-story/" rel="bookmark">A MySQL 4.1 Story </a></h3>
		<div class="entrybody">
				<p>下面要写的是一篇非常无聊的东西，充斥了大量各式各样的编码、转换、客户端、服务器端、连接……呃，我自己都不愿意去看它，但想一想，写下来还是有点意义的，原因有四：</p>
				<ol>
						<li>MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现)；</li>
						<li>尽管大部分的地方 (包括个人使用和主机提供商)，MySQL 3 仍然占主导地位；但 MySQL 4.1 是 MySQL 官方推荐的数据库，已经有主机提供商开始提供并将会越来越多；</li>
						<li>许多 PHP 程序以 MySQL 作为默认的数据库管理软件，但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别，笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了；</li>
						<li>因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集，成功的蒙蔽了许多 PHP 程序的开发者和用户，掩盖了在中文等语言环境下会出现的问题；</li>
				</ol>
				<p>简单的说，MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略，导致了问题的出现和复杂化，而由于大部分用户使用的是英文，使这种问题不被重视。这里提到的 PHP 程序，主要就 WordPress 而言。 <a id="more-51"></a></p>
				<h3>MySQL 4.1 字符集支持的原理</h3>
				<p>MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL，其中的一个数据库，其中的一张表，其中的一栏，应该用什么字符集。但是，传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置，它们用的是默认的配置，那么，默认的配置从何而来呢？</p>
				<ol>
						<li>编译 MySQL 时，指定了一个默认的字符集，这个字符集是 latin1；</li>
						<li>安装 MySQL 时，可以在配置文件 (my.ini) 中指定一个默认的的字符集，如果没指定，这个值继承自编译时指定的；</li>
						<li>启动 mysqld 时，可以在命令行参数中指定一个默认的的字符集，如果没指定，这个值继承自配置文件中的；</li>
						<li>此时 <code>character_set_server</code> 被设定为这个默认的字符集；</li>
						<li>当创建一个新的数据库时，除非明确指定，这个数据库的字符集被缺省设定为 <code>character_set_server</code>；</li>
						<li>当选定了一个数据库时，<code>character_set_database</code> 被设定为这个数据库默认的字符集；</li>
						<li>在这个数据库里创建一张表时，表默认的字符集被设定为 <code>character_set_database</code>，也就是这个数据库默认的字符集；</li>
						<li>当在表内设置一栏时，除非明确指定，否则此栏缺省的字符集就是表默认的字符集；</li>
						<li>这个字符集就是数据库中实际存储数据采用的字符集，mysqldump 出来的内容就是这个字符集下的；</li>
				</ol>
				<p>简单的总结一下，如果什么地方都不修改，那么所有的数据库的所有表的所有栏位的都用 latin1 存储，不过我们如果安装 MySQL，一般都会选择多语言支持，也就是说，安装程序会自动在配置文件中把 <code>default_character_set</code> 设置为 UTF-8，这保证了缺省情况下，所有的数据库的所有表的所有栏位的都用 UTF-8 存储。</p>
				<p>当一个 PHP 程序与 MySQL 建立连接后，这个程序发送给 MySQL 的数据采用的是什么字符集？MySQL 无从得知 (它最多只能猜测)，所以 MySQL 4.1 要求客户端必须指定这个字符集，也就是 <code>character_set_client</code>，MySQL 的怪异之处在于，得到的这个字符集并不立即转换为存储在数据库中的那个字符集，而是先转换为 <code>character_set_connection</code> 变量指定的一个字符集；这个 connection 层究竟有什么用我不大明白，但转换为 <code>character_set_connection</code> 的这个字符集之后，还要转换为数据库默认的字符集，也就是说要经过两次转换；当这个数据被输出时，又要由数据库默认的字符集转换为 <code>character_set_results</code> 指定的字符集。</p>
				<h3>一个典型的环境</h3>
				<p>典型的环境以我自己的电脑上安装的 MySQL 4.1 为例，我自己的电脑上安装着 Apache 2，PHP 5 和 WordPress 1.5.1.3，MySQL 配置文件中指定了 <code>default_character_set</code> 为 <code>utf8</code>。于是问题出现了：</p>
				<ol>
						<li>WordPress 按照默认情况安装，所以所有的表都用 UTF-8 存储数据；</li>
						<li>WordPress 默认采用的浏览字符集是 UTF-8 (Options-&gt;Reading 中设置)，因此所有 WP 页面的 meta 中会说明 charset 是 utf-8；</li>
						<li>所以浏览器会以 utf-8 方式显示所有的 WP 页面；这样一来 Write 的所有 Post，和 Comment 都会以 UTF-8 格式从浏览器发送给 Apache，再由 Apache 交给 PHP；</li>
						<li>所以 WP 从所有的表单中得到的数据都是 utf-8 编码的；WP 不加转换的直接把这些数据发送给 MySQL；</li>
						<li>MySQL 默认设置的 <code>character_set_client</code> 和 <code>character_set_connection</code> 都是 latin1，此时怪异的事情发生了，实际上是 utf-8 格式的数据，被“当作 latin1”转换成……居然还是转换成 latin1，然后再由这个 latin1 转换成 utf-8，这么两次转换，有一部分 utf-8 的字符就丢失了，变成 ??，最后输出的时候 <code>character_set_results</code> 默认是 latin1，也就输出为奇怪的东西了。</li>
				</ol>
				<p>最神奇的还不是这个，如果 WordPress 中设置以 GB2312 格式阅读，那么 WP 发送给 MySQL 的 GB2312 编码的数据，被“当作 latin1”转换后，存进数据库的是一种奇怪的格式 (真的是奇怪的格式，mysqldump 出来就能发现，无论当作 utf-8 还是当作 gb2312 来读都是乱码)，但如果这种格式以 latin1 输出出来，居然又能变回 GB2312！</p>
				<p>这会导致什么现象呢？WP 如果使用 MySQL 4.1 数据库，把编码改用 GB2312 就正常了，可惜，这种正常只是貌似正常。</p>
				<h3>如何解决问题</h3>
				<p>如果你已经不耐烦了 (几乎是肯定的)，google 一下，会发现绝大部分的解答是，query 之前先执行一下：<code>SET NAMES 'utf8'</code>，没错，这是解决方案，但本文的目的是说明，这为什么是解决方案。</p>
				<p>要保证结果正确，必须保证数据表采用的格式是正确的，也就是说，至少能够存放所有的汉字，那么我们只有两种选择，gbk 或者 utf-8，下面讨论 utf-8 的情况。</p>
				<p>因为配置文件设置的 <code>default_character_set</code> 是 utf8，数据表默认采用的就是 utf-8 建立的。这也应该是所有采用 MySQL 4.1 的主机提供商应该采用的配置。所以我们要保证的只是客户端与 MySQL 交互之间指定编码的正确。</p>
				<p>这只有两种可能，客户端以 gb2312 格式发送数据，或者以 utf-8 格式发送数据。</p>
				<p>如果以 gb2312 格式发送:</p>
				<pre>
						<code>SET character_set_client='gb2312'
SET character_set_connection='utf8' 或者 
SET character_set_connection='gb2312'
</code>
				</pre>
				<p>都是可以的，都能够保证数据在编码转换中不出现丢失，也就是保证存储入数据库的是正确的内容。</p>
				<p>怎么保证取出的是正确的内容呢？考虑到绝大部分客户端 (包括 WP)，发送数据的编码也就是它所希望收到数据的编码，所以:</p>
				<pre>
						<code>SET character_set_results='gb2312'
</code>
				</pre>
				<p>可以保证取出给浏览器显示的格式就是 gb2312。</p>
				<p>如果是第二种情况，客户端以 utf-8 格式发送 (WP 的默认情况)，可以采用下述配置:</p>
				<pre>
						<code>SET character_set_client='utf8'
SET character_set_connection='utf8'
SET character_set_results='utf8'
</code>
				</pre>
				<p>这个配置就等价于 <code>SET NAMES 'utf8'</code>。</p>
				<h3>WP 应该作什么修改</h3>
				<p>还是那句话，客户端要发给数据库什么编码的数据，数据库是不可能确切知道的，只能让客户端自己说明白，所以，WP 是必须发送正确的 <code>SET...</code> 给 MySQL 的。怎么发送最合适呢？台湾的 pLog 同仁给出了一些<a href="http://forum.plogworld.org.tw/viewtopic.php?t=47">建议</a>：</p>
				<ol>
						<li>首先，测试服务器是否 &gt;= 4.1，编译时是否加入了 UTF-8 支持；是则继续</li>
						<li>然后测试数据库以什么格式存储 (<code>$dbEncoding</code>)；</li>
						<li>
								<code>SET NAMES $dbEncoding</code>
						</li>
				</ol>
				<p>对于第二点，WP 的情况是不同的，按照上面的典型配置，只要用 WP，肯定数据库是用 UTF-8 存储的，所以要根据用户设置的以 GB2312 还是 UTF-8 浏览来判断 (<code>bloginfo('charset')</code>)，但这个值是要连接数据库以后才能得到的，所以效率最高的方式是连接数据库之后，根据这个配置设置一次 <code>SET NAMES</code>，而不必每次查询之前都设置一遍。</p>
				<p>我的修改方式是这样的，在 <code>wp_includes/wp-db.php</code> 中增加: </p>
				<pre>
						<code>function set_charset($charset)
{
    // check mysql version first.
    $serverVersion = mysql_get_server_info($this-&gt;dbh); 
    $version = explode('.', $serverVersion); 
    if ($version[0] &lt; 4) return; 

    // check if utf8 support was compiled in 
    $result = mysql_query("SHOW CHARACTER SET like 'utf8'", 
                          $this-&gt;dbh); 
    if (mysql_num_rows($result) &lt; = 0) return;

    if ($charset == 'utf-8' || $charset == 'UTF-8')
        $charset = 'utf8';
    @mysql_query("SET NAMES '$charset'", $this-&gt;dbh); 
}
</code>
				</pre>
				<p>在 <code>wp-settings.php</code> 的 <code>require (ABSPATH . WPINC . '/vars.php');</code> 后增加: </p>
				<pre>
						<code>$wpdb-&gt;set_charset(get_bloginfo('charset'));
</code>
				</pre>
				<div class="entrymeta">July 31st 2005 Posted to <a title="View all posts in Server-Side" href="http://blog.jjgod.org/category/server-side/" rel="category tag">Server-Side</a></div>
		</div>
<img src ="http://www.blogjava.net/onlykeke/aggbug/76918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-10-24 10:59 <a href="http://www.blogjava.net/onlykeke/archive/2006/10/24/76918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysqlimport的用法[引]</title><link>http://www.blogjava.net/onlykeke/archive/2006/09/22/71348.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Fri, 22 Sep 2006 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/09/22/71348.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/71348.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/09/22/71348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/71348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/71348.html</trackback:ping><description><![CDATA[注：当出现类似 mysqlimport: Error: Can't get stat of '/usr/t2.txt' (Errcode: 13), when using table: t2 这样的错误，检查文件权限。如果不行，加上 --local 选项。<br /><br />1）.MySQLimport的语法介绍：
<p>　　MySQLimport位于MySQL/bin目录中，是MySQL的一个载入（或者说导入）数据的一个非常有效的工具。这是一个命令行工具。有两个<br />参数以及大量的选项可供选择。这个工具把一个文本文件（text<br />file）导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表<br />Custermers中：</p><p>　　mysqlimport Meet_A_Geek Customers.txt</p><p>　　注意：这里Customers.txt是我们要导入数据的文本文件，而Meet_A_Geek是我们要操作的数据库，数据库中的表名是Customers，这里文本文件的数据格式必须与Customers表中的记录格式一致，否则MySQLimport命令将会出错。</p><p>　　其中表的名字是导入文件的第一个句号（.）前面文件字符串，另外一个例子：MySQLimport Meet_A_Geek Cus.to.mers.txt</p><p>　　那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。</p><p>　　上面的例子中，都只用到两个参数，并没有用到更多的选项，下面介绍MySQLimport的选项</p><p>　　2）.MySQLimport的常用选项介绍:</p><p>　　选项 功能</p><p>　　-d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息</p><p>　　-f or --force 不管是否遇到错误，MySQLimport将强制继续插入数据</p><p>　　-i or --ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行， 导入文件中的数据将被忽略。</p><p>　　-l or -lock-tables 数据被插入之前锁住表，这样就防止了，你在更新数据库时，用户的查询和更新受到影响。</p><p>　　-r or -replace 这个选项与－i选项的作用相反；此选项将替代表中有相同唯一关键字的记录。</p><p>　　--fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的， 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。</p><p>　　--fields-terminated- by=char 指定各个数据的值之间的分隔符，在句号分隔的文件中，分隔符是句号。您可以用此选项指定数据之间的分隔符。</p><p>　　默认的分隔符是跳格符（Tab）</p><p>　　--lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。</p><p>　　您可以选择用一个字符串来替代一个单个的字符：</p><p>　　一个新行或者一个回车。</p><p>　　MySQLimport命令常用的选项还有-v 显示版本（version），-p 提示输入密码（password）等。</p><p>　　3）.例子：导入一个以逗号为分隔符的文件</p><p>　　文件中行的记录格式是这样的：</p><p>　　"1", "ORD89876", "1 Dozen Roses", "19991226"</p><p>　　我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中，我们使用这个命令:</p><p>　　bin/MySQLimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt</p><p>　　这个命令可能看起来很不爽，不过当你熟悉了之后，这是非常简单的。第一部分，bin/MySQLimport<br />,告诉操作系统你要运行的命令是MySQL/bin目录下的MySQLimport，选项p是要求输入密码，这样就要求你在改动数据库之前输入密码，操作<br />起来会更安全。我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的，需<br />要用文件中的数据去更新，因而就用r这个选项，替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表，这样就阻止了用户在我们更新表的时<br />候对表进行查询或者更改的操作。</p><p>批处理是一种非交互式运行MySQL程序的方法，如同您在MySQL中使用的命令一样，你仍然将使用这些命令。</p><p>　　为了实现批处理，您重定向一个文件到MySQL程序中，首先我们需要一个文本文件，这个文本文件包含有与我们在MySQL中输入的命令相同的文本。</p><p>　　比如我们要插入一些数据，使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字，并不一定要以后缀sql结尾)：</p><p>　　USE Meet_A_Geek;</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");</p><p>　　注意上面的这些句子的语法都必须是正确的，并且每个句子以分号结束。</p><p>　　上面的USE命令选择数据库，INSERT命令插入数据。</p><p>　　下面我们要把上面的文件导入到数据库中，导入之前要确认数据库已经在运行，即是MySQLd进程（或者说服务，Windows NT下面称为”服务“，unix下面为”进程“）已经在运行。</p><p>　　然后运行下面的命令：</p><p>　　bin/MySQL –p </p><p>　　接着按提示输入密码，如果上面的文件中的语句没有错误，那么这些数据就被导入到了数据库中。</p><p>　　命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库:</p><p>　　现在您可能会问自己，"究竟为什么我要输入所有的这些SQL语句到文件中，然后通过程序运行它们呢？”</p><p>这样看起来好像需要大量的工作。很好，你这样想很可能就对了。但是假如你有从所有这些命令中产生的log记录呢？现在这样就很棒，嗯，大多数数据库都会自<br />动产生数据库中的事件记录的<br />log。而大部分log都包含有用过的原始的SQL命令。因此，如果您不能从您现在的数据库中导出数据到新的MySQL数据库中使用，那么您可以使用<br />log和MySQL的批处理特性，来快速且方便地导入您地数据。当然，这样就省去了打字的麻烦。</p><p>　　LOAD DATA INFILE</p><p>　　这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与MySQLimport非常相似，但这个方法可以在MySQL命令行中使用。也就是说您可以在所有使用API的程序中使用这个命令。使用这种方法，您就可以在应用程序中导入您想要导入的数据。</p><p>　　使用这个命令之前，MySQLd进程（服务）必须已经在运行。</p><p>　　启动MySQL命令行：</p><p>　　bin/MySQL –p</p><p>　　按提示输入密码，成功进入MySQL命令行之后，输入下面的命令：</p><p>　　USE Meet_A_Geek;</p><p>　　LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;</p><p>　　简单的讲，这样将会把文件data.sql中的内容导入到表Orders中，如MySQLimport工具一样，这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中，您可以使用下面的命令：</p><p>　　LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders; </p><p>上面的LOCAL参数表示文件是本地的文件，服务器是您所登陆的服务器。</p><p>　　这样就省去了使用ftp来上传文件到服务器，MySQL替你完成了.</p><p>　　您也可以设置插入语句的优先级，如果您要把它标记为低优先级（LOW_PRIORITY），那么MySQL将会等到没有其他人读这个表的时候，才把插入数据。可以使用如下的命令：</p><p>　　LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;</p><p>　　您也可以指定是否在插入数据的时候，取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法：</p><p>　　LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;</p><p>　　上面的句子看起来有点笨拙，但却把关键字放在了让您的剖析器可以理解的地方。</p><p>　　下面的一对选项描述了文件的记录格式，这些选项也是在MySQLimport工具中可以用的。他们在这里看起来有点不同。首先，要用到FIELDS关键字，如果用到这个关键字，MySQL剖析器希望看到至少有下面的一个选项：</p><p>　　TERMINATED BY character</p><p>　　ENCLOSED BY character</p><p>　　ESCAPED BY character</p><p>　　这些关键字与它们的参数跟MySQLimport中的用法是一样的. The</p><p>　　TERMINATED BY 描述字段的分隔符，默认情况下是tab字符（\t）</p><p>　　ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。</p><p>　　ESCAPED BY 描述的转义字符。默认的是反些杠（backslash：\ ）.</p><p>　　下面仍然使用前面的MySQLimport命令的例子，用LOAD DATA INFILE语句把同样的文件导入到数据库中:</p><p>　　LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ',' 　　ENCLOSED BY '"';</p><p>　　LOAD DATA INFILE语句中有一个MySQLimport工具中没有特点：</p><p>　　LOAD DATA INFILE 可以按指定的列把文件导入到数据库中。</p><p>　　当我们要把数据的一部分内容导入的时候，这个特点就很重要。比方说，我们要从Access数据库升级到MySQL数据库的时候，需要加入一些栏目（列/字段/field）到MySQL数据库中，以适应一些额外的需要。</p><p>　　这个时候，我们的Access数据库中的数据仍然是可用的，但是因为这些数据的栏目(field)与MySQL中的不再匹配，因此而无法再使用<br />MySQLimport工具。尽管如此，我们仍然可以使用LOAD DATA<br />INFILE，下面的例子显示了如何向指定的栏目(field)中导入数据：</p><p>　　LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID);</p><p>　　如您所见，我们可以指定需要的栏目（fields）。这些指定的字段依然是以括号括起，由逗号分隔的，如果您遗漏了其中任何一个，MySQL将会提醒您^_^</p><p>　　Importing Data from Microsoft Access （从Access中导入数据，略）</p><p>　　您可以看到MySQL有很多可以导入数据的方法，然而这些只是数据传输中的一半。另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导<br />出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的，需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失；另外一个原因是，也许您希<br />望导出数据来共享。 在这个信息技术不断成长的世界中，共享数据变得越来越常见。</p><p>　　比方说Macmillan<br />USA维护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享，这样他们就知道哪些书将会很快出版。医院越来越走向采用无纸病历记录，这<br />样这些病历可以随时跟着你。世界变得越来越小，信息也被共享得越来越多。有很多中导出数据得方法，它们都跟导入数据很相似。因为，毕竟，这些都只是一种透<br />视得方式。从数据库导出的数据就是从另一端导入的数据。这里我们并不讨论其他的数据库各种各样的导出数据的方法，您将学会如何用MySQL来实现数据导<br />出。 </p><p>使用MySQLdump:</p><p>　　MySQLdump命令位于MySQL/bin/目录中</p><p>　　MySQLdump工具很多方面类似相反作用的工具MySQLimport。它们有一些同样的选项。但MySQLdump能够做更多的事情。它可以把<br />整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式（Schema，后面有解释）并且<br />将其转换成DDL语法（CREATE语句，即数据库定义语句），取得所有的数据，并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设<br />计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信<br />地简单而快速。决不会有半点让人头疼地地方。</p><p>　　因此，如果您像装载整个数据库Meet_A_Geek的内容到一个文件中，可以使用下面的命令：</p><p>　　bin/MySQLdump –p Meet_A_Geek &gt; MeetAGeek_Dump_File.txt</p><p>　　这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件，可以使用下面的命令：</p><p>　　bin/MySQLdump –p Meet_A_Geek Orders &gt;MeetAGeek_Orders.txt</p><p>　　这个非常的灵活，您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。要达到这样的目的，可以使用类似于下面的命令：</p><p>　　bin/MySQLdump –p –where="Order_ID &gt; 2000" Meet_A_Geek Orders &gt; Special_Dump.txt</p><p>　　MySQLdump工具有大量的选项，部分选项如下表：</p><p>　　选项/Option 作用/Action Performed</p><p>　　--add-drop-table</p><p>　　这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句，这样可以保证导回MySQL数据库的时候不会出错，因为每次导回的时候，都会首先检查表是否存在，存在就删除</p><p>　　--add-locks</p><p>　　这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作</p><p>　　-c or - complete_insert</p><p>　　这个选项使得MySQLdump命令给每一个产生INSERT语句加上列（field）的名字。当把数据导出导另外一个数据库时这个选项很有用。</p><p>　　--delayed-insert 在INSERT命令中加入DELAY选项</p><p>　　-F or -flush-logs 使用这个选项，在执行导出之前将会刷新MySQL服务器的log.</p><p>　　-f or -force 使用这个选项，即使有错误发生，仍然继续导出</p><p>　　--full 这个选项把附加信息也加到CREATE TABLE的语句中</p><p>　　-l or -lock-tables 使用这个选项，导出表的时候服务器将会给表加锁。</p><p>　　-t or -no-create- info</p><p>　　这个选项使的MySQLdump命令不创建CREATE TABLE语句，这个选项在您只需要数据而不需要DDL（数据库定义语句）时很方便。</p><p>　　-d or -no-data 这个选项使的MySQLdump命令不创建INSERT语句。</p><p>　　在您只需要DDL语句时，可以使用这个选项。</p><p>　　--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。</p><p>　　-q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出，而是在读到的时候就写入导文件中。</p><p>　　-T path or -tab = path<br />这个选项将会创建两个文件，一个文件包含DDL语句或者表创建语句，另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命<br />名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在，并且命令的使用者有对文件的特权。</p><p>　　-w "WHERE Clause" or -where = "Where clause "</p><p>　　如前面所讲的，您可以使用这一选项来过筛选将要放到导出文件的数据。</p><p>　　假定您需要为一个表单中要用到的帐号建立一个文件，经理要看今年（2004年）所有的订单（Orders），它们并不对DDL感兴趣，并且需要文件有逗号分隔，因为这样就很容易导入到Excel中。 为了完成这个人物，您可以使用下面的句子：</p><p>　　bin/MySQLdump –p –where "Order_Date &gt;='2000-01-01'"</p><p>　　–tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders</p><p>　　这将会得到您想要的结果。</p><p>　　schema：模式The set of statements, expressed in data definition language, that completely describe the structure of a data base.</p><p>　　一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。 </p><p>SELECT INTO OUTFILE ：</p><p>　　如果您觉得MySQLdump工具不够酷，就使用SELECT INTO OUTFILE吧, MySQL同样提供一个跟LOAD DATA<br />INFILE命令有相反作用的命令，这就是SELECT INTO OUTFILE<br />命令，这两个命令有很多的相似之处。首先，它们有所有的选项几乎相同。现在您需要完成前面用MySQLdump完成的功能，可以依照下面的步骤进行操作：</p><p>　　1. 确保MySQLd进程（服务）已经在运行</p><p>　　2. cd /usr/local/MySQL</p><p>　　3. bin/MySQLadmin ping ；// 如果这个句子通不过，可以用这个：MySQLadmin -u root -p ping</p><p>MySQLadmin ping用于检测MySQLd的状态，is alive说明正在运行，出错则可能需要用户名和密码。</p><p>　　4. 启动MySQL 监听程序.</p><p>　　5. bin/MySQL –p Meet_A_Geek；// 进入MySQL命令行，并且打开数据库Meet_A_Geek,需要输入密码</p><p>　　6. 在命令行中，输入一下命令:</p><p>　　SELECT * INTO OUTFILE '/home/mark/Orders.txt'</p><p>　　FIELDS</p><p>　　TERMINATED BY = ','</p><p>　　FROM Orders</p><p>　　WHERE Order_Date &gt;= '2000-01-01'</p><p>　　在你按了Return（回车）之后，文件就创建了。这个句子就像一个规则的SELECT语句，只是把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特点也可以被用作一个报表产生器。</p><p>　　比方说，您可以组合这一章中讨论的方法来产生一个非常有趣的查询，试试这个：</p><p>　　在MySQL目录建立一个名为Report_G.rpt 的文本文件，加入下面的行：</p><p>　　USE Meet_A_Geek;</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p><p>　　VALUES (NULL, "Kinnard", "Vicky");</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p><p>　　VALUES (NULL, "Kinnard", "Steven");</p><p>　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name)</p><p>　　VALUES (NULL, "Brown", "Sam");</p><p>　　SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt'</p><p>　　FROM Customers WHERE Customer_ID &gt; 1;</p><p>　　然后确认 MySQL进程在运行，并且您在MySQL目录中， 输入下面的命令：</p><p>　　bin/MySQL </p><img src ="http://www.blogjava.net/onlykeke/aggbug/71348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-09-22 16:45 <a href="http://www.blogjava.net/onlykeke/archive/2006/09/22/71348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle的数据库链接 database link[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/08/25/65835.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Fri, 25 Aug 2006 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/08/25/65835.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/65835.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/08/25/65835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/65835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/65835.html</trackback:ping><description><![CDATA[    数据库链接定义从一个Oracle数据库到另一个数据库的单行通信通道。<br />    <br />    建立链接前要先有到远程数据库的命名服务（连接字符串），就是tnsnames.ora中描述的那个，如'oradxp'<br />    先测试一下：$tnsping oradxp<br />    Attemping to contact(...) OK(30毫秒).<br />    说明对远程数据库oradxp可访问。<br />    <br />    创建数据库链接的语法为：<br />    CREATE PUBLIC DATABASE LINK oradxp.cug.edu.cn USING 'oradxp';<br />    其中 oradxp.cug.edu.cn 必须是远程数据库的全局名(SID),'oradxp'就是到远程的连接字符串。远程数据库的全局名可以通过登陆远程机，<br />    SELECT * FROM global_name;<br />    得到。<br />    <br />    现在你就可以用链接oradxp.cug.edu.cn访问远程数据库了<br />    如<br />    SELECT * FROM <a href="mailto:global_name@oradxp.cug.edu.cn">global_name@oradxp.cug.edu.cn</a>;<br />    看看得到的是不是远程机的全局名。<br />    所有SELECT 语句后面跟上链接名都是对远程机的访问。<br />    <br />    注意：登陆名口令就是当前登陆本机的用户名和口令。也就是如果你用的是public链接，那么在远程就要有一个和本机相同的用户/口令才行。如：你以aaa/aaa登录本机，然后执行<br />    SELECT * FROM <a href="mailto:BBB.bbb@oradxp.cug.edu.cn">BBB.bbb@oradxp.cug.edu.cn</a>;<br />    那么对远程数据BBB.bbb的访问用户为aaa口令为aaa<br />    也就是在本机和远程机上都有用户aaa口令都为aaa才能执行成功！<br />    <br />    关于私有链接：<br />    CREATE DATABASE LINK oradxp.cug.edu.cn CONNECT TO system IDENTIFIED BY aaa;<br />    这就建立了system的私有链接。<br />    私有链接和public链接的差别就是登录名口令的限制。也就是<br />    你不管用什么用户登录本机，执行<br />    SELECT * FROM <a href="mailto:BBB.bbb@oradxp.cug.edu.cn">BBB.bbb@oradxp.cug.edu.cn</a>;<br />    访问远程机数据BBB.bbb的用户和口令都为system/aaa<br />    <br />    建好的数据链接放在系统表SYS.link$表中<br />    通过OEM控制台的 分布-〉数据库链接可以查看所有的链接。<br />    <br />    要删除public link 可以<br />    drop public database link linkname;<br />    <br />    对于私有链接先以相应用户登陆，如上述system/aaa<br />    然后drop database link linkname;  <br />    <br />    当然，直接删除SYS.link$表中的记录一样可行。<img src ="http://www.blogjava.net/onlykeke/aggbug/65835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-08-25 17:29 <a href="http://www.blogjava.net/onlykeke/archive/2006/08/25/65835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库名、实例名和ORACLE_SID[转]</title><link>http://www.blogjava.net/onlykeke/archive/2006/08/25/65827.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Fri, 25 Aug 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/08/25/65827.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/65827.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/08/25/65827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/65827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/65827.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://oracle.itpub.net/post/20957/146513">http://oracle.itpub.net/post/20957/146513</a>
		</p>
		<p>    最近因看到论坛有人问起这方面的东西，将自己的理解加上查阅相关资料整理如下，如果不全或不当的地方，望指正并补全它。 </p>
		<p>    数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID) </p>
		<p>    在ORACLE7、8数据库中只有数据库名(db_name)和数据库实例名(instance_name)。在ORACLE8i、9i中出现了新的参数，即数据库域名(db_domain)、服务名(service_name)、以及操作系统环境变量(ORACLE_SID)。这些都存在于同一个数据库中的标识，用于区分不同数据库的参数。 </p>
		<p>    一、什么是数据库名(db_name) </p>
		<p>    数据库名是用于区分数据的内部标识，是以二进制方式存储于数据库控制文件中的参数，在数据安装或创建之后将不得修改。数据库安装完成后，该参数被写入数据库参数文件pfile中，格式如下： <br />    .........<br />    db_name="orcl" #(不允许修改)<br />    db_domain=dbcenter.toys.com<br />    instance_name=orcl<br />    service_names=orcl.dbcenter.toys.com<br />    control_file=(...............<br />    ......... </p>
		<p>
				<br />    在每一个运行的ORACLE8i数据库中都有一个数据库名(db_name),如果一个服务器程序中创建了两个数据库，则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库。 </p>
		<p>    二、什么是数据库实例名(instance_name) </p>
		<p>    数据库实例名则用于和操作系统之间的联系，用于对外部连接时使用。在操作系统中要取得与数据库之间的交互，必须使用数据库实例名。例如，要和某一个数据库server连接，就必须知道其数据库实例名，只知道数据库名是没有用的，与数据库名不同，在数据安装或创建数据库之后，实例名可以被修改。数据库安装完成后，该实例名被写入数据库参数文件pfile中，格式如下： <br />    db_name="orcl" #(不允许修改)<br />    db_domain=dbcenter.toys.com<br />    instance_name=orcl #(可以修改,可以与db_name相同也可不同)<br />    service_names=orcl.dbcenter.toys.com<br />    control_file=(...............<br />    .........</p>
		<p>
				<br />    数据库名与实例名之间的关系。</p>
		<p>    数据库名与实例名之间的关系一般是一一对应关系，有一个数据库名就有一个实例名，如果在一个服务器中创建两个数据库，则有两个数据库名，两个数据库实例名，用两个标识确定一个数据库，用户和实例相连接。 <br />    但在8i、9i的并行服务器结构中，数据库与实例之间不存在一一对应关系，而是一对多关系，一个数据库对应多个实例，同一时间内用户只一个实例相联系，当某一实例出现故障，其它实例自动服务，以保证数据库安全运行。 </p>
		<p>    三、操作系统环境变量(ORACLE_SID) </p>
		<p>    在实际中，对于数据库实例名的描述有时使用实例名(instance_name)参数，有时使用ORACLE_SID参数。这两个都是数据库实例名，它们有什么区别呢？(经常弄混)      </p>
		<p>    (ORACLE_SID) <br />    OS&lt;----------------&gt; ORACLE 数据库 &lt;--------(Instance_name(实例名)) </p>
		<p>    上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系，虽然这里列出的两个参数都是数据库实例名，但instance_name参数是ORACLE数据库的参数，此参数可以在参数文件中查询到，而ORACLE_SID参数则是操作系统环境变量。 <br />    操作系统环境变量ORACLE_SID用于和操作系统交互。也就是说，在操作系统中要想得到实例名，就必须使用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME等用法相同。在数据库安装之后，ORACLE_SID被用于定义数据库参数文件的名称。如：$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。</p>
		<p>    定义方法: <br />    export ORACLE_SID=orcl</p>
		<p>
				<br />    如果在同一服务器中创建了多个数据库，则必然同时存在多个数据库实例,这时可以重复上述定义过程，以选择不同实例。 </p>
		<p>    还可以用<br />[oracle@Datacent]$.oraenv </p>
		<p>
				<br />    来切换不同的ORACLE_SID来通过操作系统来启动不同的实例(instance) 。</p>
<img src ="http://www.blogjava.net/onlykeke/aggbug/65827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-08-25 16:59 <a href="http://www.blogjava.net/onlykeke/archive/2006/08/25/65827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库命令备忘[持续更新]</title><link>http://www.blogjava.net/onlykeke/archive/2006/07/25/60040.html</link><dc:creator>奇葛格</dc:creator><author>奇葛格</author><pubDate>Tue, 25 Jul 2006 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/onlykeke/archive/2006/07/25/60040.html</guid><wfw:comment>http://www.blogjava.net/onlykeke/comments/60040.html</wfw:comment><comments>http://www.blogjava.net/onlykeke/archive/2006/07/25/60040.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/onlykeke/comments/commentRss/60040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/onlykeke/services/trackbacks/60040.html</trackback:ping><description><![CDATA[一些常用的命令长时间不接触，可能遗忘，记于此，备忘。<br /><br /><b>mysql篇：</b><br />mysqladmin -u root -p oldpassword newpasswd<br />REPLACE INTO mysql.user (Host,User,Password) VALUES(\'%\',\'system\',PASSWORD(\'manager\'));<br />(FLUSH PRIVILEGES)<br />GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456" WITH GRANT OPTION;<br />(备注：某次总是提示权限不够，原来要在localhost后加上.localdomain)<br />show create table sms_report;<br />select * from table into outfile '/tmp/outdata.txt' fields terminated by ',';<br />mysqlimport -i --columns=userid,mobile,servicecataid,t --fields-terminated-by=, sms /tmp/tablename.txt --local<br /><br />如果一个表中有自增字段，使用TRUNCATE TABLE和没有WHERE子句的DELETE删除所有记录后，这个自增字段将起始值恢复成1.如果你不想这样做的话，可以在DELETE语句中加上永真的WHERE，如WHERE 1或WHERE true。<br /><br />replace into province_seg select * from province_seg_tmp;<br /><br /><b>Oracle篇：</b><br /><br /><img src ="http://www.blogjava.net/onlykeke/aggbug/60040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/onlykeke/" target="_blank">奇葛格</a> 2006-07-25 19:00 <a href="http://www.blogjava.net/onlykeke/archive/2006/07/25/60040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>