<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[sclife - Mysql数据管理]]></title>
<link>sclife.com.cn/blog/</link>
<description><![CDATA[记录网上的点点滴滴！ 熟称笔记本 !]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[hoifish_010@163.om(hotfish)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>sclife</title>
	<url>sclife.com.cn/blog/images/logos.gif</url>
	<link>sclife.com.cn/blog/</link>
	<description>sclife</description>
</image>

			<item>
			<link>sclife.com.cn/blog/article.asp?id=591</link>
			<title><![CDATA[MyISAM和InnoDB的一些记录]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Tue,11 May 2010 16:27:49 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=591</guid>
		<description><![CDATA[MyISAM和InnoDB的一些记录<br/>key_buffer_size - 这对MyISAM表来说非常重要。如果只是使用MyISAM表，可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载。<br/>记住，MyISAM表会使用操作系统的缓存来缓存数据，因此需要留出部分内存给它们，很多情况下数据比索引大多了。尽管如此，需要总是检查是否所有的 key_buffer 都被利用了。<br/>.MYI 文件只有 1GB，而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表，那么也保留低于 16-32MB 的 key_buffer_size 以适应给予磁盘的临时表索引所需。<br/><br/>innodb_buffer_pool_size - 这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以，然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来，无需留给操作系统太多的内存，因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。如果你的数据量不大，并且不会暴增，那么无需把 innodb_buffer_pool_size 设置的太大了。<br/><br/><br/>innodb_additional_pool_size - 这个选项对性能影响并不太多，至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大)，因此就需要看一下Innodb其他需要分配的内存有多少。<br/><br/>innodb_log_file_size 在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高，但是要注意到可能会增加恢复时间。我经常设置为 64-512MB，跟据服务器大小而异。innodb_log_buffer_size 默认的设置在中等强度写入负载以及较短事务的情况下，服务器性能还可以。如果存在更新操作峰值或者负载较大，就应该考虑加大它的值了。如果它的值设置太高了，可能会浪费内存。它每秒都会刷新一次，因此无需设置超过1秒所需的内存空间。通常 8-16MB 就足够了。越小的系统它的值越小。<br/><br/>innodb_flush_logs_at_trx_commit 是否为Innodb比MyISAM慢1000倍而头大？看来也许你忘了修改这个参数了。默认值是 1，这意味着每次提交的更新事务（或者每个事务之外的语句）都会刷新到磁盘中，而这相当耗费资源，尤其是没有电池备用缓存时。很多应用程序，尤其是从 MyISAM转变过来的那些，把它的值设置为 2 就可以了，也就是不把日志刷新到磁盘上，而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去，因此通常不会丢失每秒1-2次更新的消耗。如果设置为 0 就快很多了，不过也相对不安全了。MySQL服务器崩溃时就会丢失一些事务。设置为 2 指挥丢失刷新到操作系统缓存的那部分事务。<br/><br/>table_cache - 打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁，所以通常要加大缓存数量，使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存，对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话，那么设置为 1024 也许比较合适（每个线程都需要打开表），如果连接数比较大那么就加大它的值。我曾经见过设置为 100,000 的情况。<br/><br/>thread_cache - 线程的创建和销毁的开销可能很大，因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Cr&#101;ated 的值也比较大，那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。<br/><br/>query_cache - 如果你的应用程序有大量读，而且没有应用程序级别的缓存，那么这很有用。不要把它设置太大了，因为想要维护它也需要不少开销，这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间，查看是否运行良好。在一定的负载压力下，如果缓存命中率太低了，就启用它。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=590</link>
			<title><![CDATA[开始mysql的慢查询]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Tue,11 May 2010 16:03:55 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=590</guid>
		<description><![CDATA[<a href="http://faq.comsenz.com/viewnews-58" target="_blank" rel="external">http://faq.comsenz.com/viewnews-58</a><br/><br/>在运营网站的过程中，可能会遇到网站突然变慢的问题，一般情况下和 MySQL 慢有关系，可以通过开启慢查询，找到影响效率的 SQL ，然后采取相应的措施。下面介绍一下如何开启慢查询：<br/><br/>1、开启慢查询 <br/><br/>找到 MySQL 的配置文件 ，my.cnf （Windows 为 my.ini ），在 MySQL 下增加下面几行：<br/><br/>long_query_time=2<br/>log-slow-queries= /usr/var/slowquery.log<br/>上面的 2 是查询的时间，即当一条 SQL 执行时间超过2秒的时候才记录，/usr/var/slowquery.log 是日志记录的位置。<br/><br/>然后重新启动MySQL服务<br/><br/><br/>一步通过：cat /usr/local/mysql51/tmp/mysql_slow.log| grep Query_time: | awk &#39;{print $3}&#39; | sort|uniq -c|sort -rn <br/>(对数据的查询时间排序)<br/>二步通过：然后vi /usr/local/mysql51/tmp/mysql_slow.log 通过时间 找到问题的语句<br/><br/><br/>mysql 5.1的方法<br/><br/>slow_query_log<br/>long_query_time=2<br/>slow_query_log_file=/usr/local/mysql51/tmp/mysql_slow.log <br/><br/>==============================================================<br/>MYSQL记录慢速查询SQL语句2009-08-05 13:28在一个 SQL 服务器中，数据表都是保存在磁盘上的。索引为服务器提供了一种在表中查找特定数据行的方法，而不用搜索整个表。当必须要搜索整个表时，就称为表扫描。通常来说，您可能只希望获得表中数据的一个子集，因此全表扫描会浪费大量的磁盘 I/O，因此也就会浪费大量时间。当必须对数据进行连接时，这个问题就更加复杂了，因为必须要对连接两端的多行数据进行比较。<br/><br/>当然，表扫描并不总是会带来问题；有时读取整个表反而会比从中挑选出一部分数据更加有效（服务器进程中查询规划器用来作出这些决定）。如果索引的使用效率很低，或者根本就不能使用索引，则会减慢查询速度，而且随着服务器上的负载和表大小的增加，这个问题会变得更加显著。执行时间超过给定时间范围的查询就称为慢速查询。<br/><br/>您可以配置 mysqld 将这些慢速查询记录到适当命名的慢速查询日志中。管理员然后会查看这个日志来帮助他们确定应用程序中有哪些部分需要进一步调查。清单 1 给出了要启用慢速查询日志需要在 my.cnf 中所做的配置。<br/><br/><br/>清单 1. 启用 MySQL 慢速查询日志<br/>[mysqld]<br/>; enable the slow query log, default 10 seconds<br/>log-slow-queries<br/>; log queries taking longer than 5 seconds<br/>long_query_time = 5<br/>; log queries that don&#39;t use indexes even if they take less than long_query_time<br/>; MySQL 4.1 and newer only<br/>log-queries-not-using-indexes<br/> <br/><br/><br/>这三个设置一起使用，可以记录执行时间超过 5 秒和没有使用索引的查询。请注意有关 log-queries-not-using-indexes 的警告：您必须使用 MySQL 4.1 或更高版本。慢速查询日志都保存在 MySQL 数据目录中，名为 hostname-slow.log。如果希望使用一个不同的名字或路径，可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 实现此目的。<br/><br/>阅读慢速查询日志最好是通过 mysqldumpslow 命令进行。指定日志文件的路径，就可以看到一个慢速查询的排序后的列表，并且还显示了它们在日志文件中出现的次数。一个非常有用的特性是 mysqldumpslow 在比较结果之前，会删除任何用户指定的数据，因此对同一个查询的不同调用被计为一次；这可以帮助找出需要工作量最多的查询。<br/> <br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=589</link>
			<title><![CDATA[MySQL Show命令的使用]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Tue,11 May 2010 13:54:03 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=589</guid>
		<description><![CDATA[<a href="http://www.ccvita.com/356.html" target="_blank" rel="external">http://www.ccvita.com/356.html</a><br/>show tables或show tables from database_name;<br/>解释：显示当前数据库中所有表的名称<br/><br/>show databases;<br/>解释：显示mysql中所有数据库的名称<br/><br/>show processlist;<br/>解释：显示系统中正在运行的所有进程，也就是当前正在执行的查询。大多数用户可以查看<br/>他们自己的进程，但是如果他们拥有process权限，就可以查看所有人的进程，包括密码。<br/><br/>show table status;<br/>解释：显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间<br/><br/><br/>show columns from table_name from database_name; 或show columns from database_name.table_name;<br/>解释：显示表中列名称<br/><br/>show grants for user_name@localhost;<br/>解释：显示一个用户的权限，显示结果类似于grant 命令<br/><br/>show index from table_name;<br/>解释：显示表的索引<br/><br/>show status;<br/>解释：显示一些系统特定资源的信息，例如，正在运行的线程数量<br/><br/>show variables;<br/>解释：显示系统变量的名称和值<br/><br/>show privileges;<br/>解释：显示服务器所支持的不同权限<br/><br/>show cr&#101;ate database database_name;<br/>解释：显示cr&#101;ate database 语句是否能够创建指定的数据库<br/><br/>show cr&#101;ate table table_name;<br/>解释：显示cr&#101;ate database 语句是否能够创建指定的数据库<br/><br/>show engies;<br/>解释：显示安装以后可用的存储引擎和默认引擎。<br/><br/>show innodb status;<br/>解释：显示innoDB存储引擎的状态<br/><br/>show logs;<br/>解释：显示BDB存储引擎的日志<br/><br/>show warnings;<br/>解释：显示最后一个执行的语句所产生的错误、警告和通知<br/><br/>show errors;<br/>解释：只显示最后一个执行语句所产生的错误<br/><br/>Tag: MySQL, 分析 <br/><br/>kimi at 2009-10-14 12:09:00 in MySQL <br/><br/>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=564</link>
			<title><![CDATA[mysql 缓存设置优化]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Mon,02 Nov 2009 14:37:07 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=564</guid>
		<description><![CDATA[<p><font color="#333333"><a href="http://database.jzxue.com/mysql/200910/20-2982.html">http://database.jzxue.com/mysql/200910/20-2982.html</a></font></p>
<p>&nbsp;</p>
<p><a target="_blank" href="http://database.jzxue.com/mysql/"><font color="#333333">MySQL</font></a> 支持超过 100 个的可调节设置；但是幸运的是，掌握少数几个就可以满足大部分需要。查找这些设置的正确值可以通过 <code><font face="NSimsun">SHOW STATUS</font></code> 命令查看状态变量，从中可以确定 <code><font face="NSimsun">mysqld</font></code> 的运作情况是否符合我们的预期。给缓冲区和缓存分配的内存不能超过系统中的现有内存，因此调优通常都需要进行一些妥协。</p>
<p>MySQL 可调节设置可以应用于整个 <code><font face="NSimsun">mysqld</font></code> 进程，也可以应用于单个客户机会话。</p>
<p><a name="N101FF"></a><a target="_blank" href="http://server.jzxue.com/"><font color="#333333">服务器</font></a>端的设置</p>
<p>每个表都可以表示为磁盘上的一个文件，必须先打开，后读取。为了加快从文件中读取数据的过程，<code><font face="NSimsun">mysqld</font></code> 对这些打开文件进行了缓存，其最大数目由 /etc/mysqld.conf 中的 <code><font face="NSimsun">table_cache</font></code> 指定。清单 4 给出了显示与打开表有关的活动的方式。</p>
<p><br />
<a name="listing4"><strong><font color="#333333">清单 4. 显示打开表的活动</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; SHOW STATUS LIKE 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 5000  |
| Opened_tables | 195   |
+---------------+-------+
2 rows in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p>清单 4 说明目前有 5,000 个表是打开的，有 195 个表需要打开，因为现在缓存中已经没有可用文件描述符了（由于统计信息在前面已经清除了，因此可能会存在 5,000 个打开表中只有 195 个打开记录的情况）。如果 <code><font face="NSimsun">Opened_tables</font></code> 随着重新运行 <code><font face="NSimsun">SHOW STATUS</font></code> 命令快速增加，就说明缓存命中率不够。如果 <code><font face="NSimsun">Open_tables</font></code> 比 <code><font face="NSimsun">table_cache</font></code> 设置小很多，就说明该值太大了（不过有空间可以增长总不是什么坏事）。例如，使用 <code><font face="NSimsun">table_cache = 5000</font></code> 可以调整表的缓存。</p>
<p>与表的缓存类似，对于线程来说也有一个缓存。 <code><font face="NSimsun">mysqld</font></code> 在接收连接时会根据需要生成线程。在一个连接变化很快的繁忙服务器上，对线程进行缓存便于以后使用可以加快最初的连接。</p>
<p>清单 5 显示如何确定是否缓存了足够的线程。</p>
<p><br />
<a name="listing5"><strong><font color="#333333">清单 5. 显示线程使用统计信息</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; SHOW STATUS LIKE 'threads%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Threads_cached    | 27     |
| Threads_connected | 15     |
| Threads_created   | 838610 |
| Threads_running   | 3      |
+-------------------+--------+
4 rows in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p>此处重要的值是 <code><font face="NSimsun">Threads_created</font></code>，每次 <code><font face="NSimsun">mysqld</font></code> 需要创建一个新线程时，这个值都会增加。如果这个数字在连续执行 <code><font face="NSimsun">SHOW STATUS</font></code> 命令时快速增加，就应该尝试增大线程缓存。例如，可以在 my.cnf 中使用 <code><font face="NSimsun">thread_cache = 40</font></code> 来实现此目的。</p>
<p>关键字缓冲区保存了 MyISAM 表的索引块。理想情况下，对于这些块的请求应该来自于内存，而不是来自于磁盘。清单 6 显示了如何确定有多少块是从磁盘中读取的，以及有多少块是从内存中读取的。</p>
<p><br />
<a name="listing6"><strong><font color="#333333">清单 6. 确定关键字效率</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; show status like '%key_read%';
+-------------------+-----------+
| Variable_name     | Value     |
+-------------------+-----------+
| Key_read_requests | 163554268 |
| Key_reads         | 98247     |
+-------------------+-----------+
2 rows in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p><code><font face="NSimsun">Key_reads</font></code> 代表命中磁盘的请求个数， <code><font face="NSimsun">Key_read_requests</font></code> 是总数。命中磁盘的读请求数除以读请求总数就是不中比率 &mdash;&mdash; 在本例中每 1,000 个请求，大约有 0.6 个没有命中内存。如果每 1,000 个请求中命中磁盘的数目超过 1 个，就应该考虑增大关键字缓冲区了。例如，<code><font face="NSimsun">key_buffer = 384M</font></code> 会将缓冲区设置为 384MB。</p>
<p>临时表可以在更高级的查询中使用，其中数据在进一步进行处理（例如 <code><font face="NSimsun">GROUP BY</font></code> 字句）之前，都必须先保存到临时表中；理想情况下，在内存中创建临时表。但是如果临时表变得太大，就需要写入磁盘中。清单 7 给出了与临时表创建有关的统计信息。</p>
<p><br />
<a name="listing7"><strong><font color="#333333">清单 7. 确定临时表的使用</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; SHOW STATUS LIKE 'created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 30660 |
| Created_tmp_files       | 2     |
| Created_tmp_tables      | 32912 |
+-------------------------+-------+
3 rows in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p>每次使用临时表都会增大 <code><font face="NSimsun">Created_tmp_tables</font></code>；基于磁盘的表也会增大 <code><font face="NSimsun">Created_tmp_disk_tables</font></code>。对于这个比率，并没有什么严格的规则，因为这依赖于所涉及的查询。长时间观察 <code><font face="NSimsun">Created_tmp_disk_tables</font></code> 会显示所创建的磁盘表的比率，您可以确定设置的效率。 <code><font face="NSimsun">tmp_table_size</font></code> 和 <code><font face="NSimsun">max_heap_table_size</font></code> 都可以控制临时表的最大大小，因此请确保在 my.cnf 中对这两个值都进行了设置。</p>
<p><a name="N1029C"><span class="smalltitle"><strong><font color="#333333" size="3">每个会话的设置</font></strong></span></a></p>
<p>下面这些设置针对于每个会话。在设置这些数字时要十分谨慎，因为它们在乘以可能存在的连接数时候，这些选项表示大量的内存！您可以通过代码修改会话中的这些数字，或者在 my.cnf 中为所有会话修改这些设置。</p>
<p>当 MySQL 必须要进行排序时，就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大，那么数据就必须保存到磁盘上的临时文件中，并再次进行排序。如果 <code><font face="NSimsun">sort_merge_passes</font></code> 状态变量很大，这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。</p>
<p><br />
<a name="listing8"><strong><font color="#333333">清单 8. 显示排序统计信息</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; SHOW STATUS LIKE &quot;sort%&quot;;
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Sort_merge_passes | 1       |
| Sort_range        | 79192   |
| Sort_rows         | 2066532 |
| Sort_scan         | 44006   |
+-------------------+---------+
4 rows in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p>如果 <code><font face="NSimsun">sort_merge_passes</font></code> 很大，就表示需要注意 <code><font face="NSimsun">sort_buffer_size</font></code>。例如， <code><font face="NSimsun">sort_buffer_size = 4M</font></code> 将排序缓冲区设置为 4MB。</p>
<p>MySQL 也会分配一些内存来读取表。理想情况下，索引提供了足够多的信息，可以只读入所需要的行，但是有时候查询（设计不佳或数据本性使然）需要读取表中大量数据。要理解这种行为，需要知道运行了多少个 <code><font face="NSimsun">Select</font></code> 语句，以及需要读取表中的下一行数据的次数（而不是通过索引直接访问）。实现这种功能的命令如清单 9 所示。</p>
<p><br />
<a name="listing9"><strong><font color="#333333">清单 9. 确定表扫描比率</font></strong></a><br />
<table cellspacing="0" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
mysql&gt; SHOW STATUS LIKE &quot;com_select&quot;;
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Com_select    | 318243 |
+---------------+--------+
1 row in set (0.00 sec)

mysql&gt; SHOW STATUS LIKE &quot;handler_read_rnd_next&quot;;
+-----------------------+-----------+
| Variable_name         | Value     |
+-----------------------+-----------+
| Handler_read_rnd_next | 165959471 |
+-----------------------+-----------+
1 row in set (0.00 sec)</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;</p>
<p><code><font face="NSimsun">Handler_read_rnd_next</font></code> / <code><font face="NSimsun">Com_select</font></code> 得出了表扫描比率 &mdash;&mdash; 在本例中是 521:1。如果该值超过 4000，就应该查看 <code><font face="NSimsun">read_buffer_size</font></code>，例如 <code><font face="NSimsun">read_buffer_size = 4M</font></code>。如果这个数字超过了 8M，就应该与开发人员讨论一下对这些查询进行调优了</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在<a href="http://server.jzxue.com/http-iis-apache/" target="_blank"><font color="#333333">Apache</font></a>, <a href="http://webdevelop.jzxue.com/php/" target="_blank"><font color="#333333">PHP</font></a>, <a href="http://database.jzxue.com/mysql/" target="_blank"><font color="#333333">MySQL</font></a>的体系架构中，MySQL对于性能的影响最大，也是关键的核心部分。对于Discuz!论坛程序也是如此，MySQL的设置是否合理<a href="http://siteguide.jzxue.com/seo/" target="_blank"><font color="#333333">优化</font></a>，直接影响到论坛的速度和承载量！同时，MySQL也是优化难度最大的一个部分，不但需要理解一些MySQL专业知识，同时还需要长时间的观察统计并且根据经验进行判断，然后设置合理的参数。</p>
<p>下面我们了解一下MySQL优化的一些基础，MySQL的优化我分为两个部分，一是<a href="http://server.jzxue.com/" target="_blank"><font color="#333333">服务器</font></a>物理硬件的优化；二是MySQL编译安装时的优化和自身(my.cnf)配置文件的优化。</p>
<p>(1) 服务器硬件对MySQL性能的影响</p>
<p>a) 磁盘寻道能力（磁盘I/O）,以目前高转速SCSI硬盘(7200转/秒)为例，这种硬盘理论上每秒寻道7200次，这是物理特性决定的，没有办法改变。MySQL每秒钟都在进行大量、复杂的查询操作，对磁盘的读写量可想而知。所以，通常认为磁盘I/O是制约MySQL性能的最大因素之一，对于日均访问量在100万PV以上的Discuz!论坛，由于磁盘I/O的制约，MySQL的性能会非常低下！解决这一制约因素可以考虑以下几种解决方案：</p>
<p>使用RAID-0+1磁盘阵列，注意不要尝试使用RAID-5，MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快； 抛弃传统的硬盘，使用速度更快的闪存式存储设备。经过Discuz!公司技术工程的测试，使用闪存式存储设备可比传统硬盘速度高出6－10倍左右。</p>
<p>b) CPU 对于MySQL应用，推荐使用S.M.P.架构的多路对称CPU，例如：可以使用两颗Intel Xeon 3.6GHz的CPU。</p>
<p>c) 物理内存对于一台使用MySQL的Database Server来说，服务器内存建议不要小于2GB，推荐使用4GB以上的物理内存。</p>
<p>(2) MySQL自身因素当解决了上述服务器硬件制约因素后，让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其源码编译和配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。</p>
<p>a)mysql源码编译时的优化:</p>
<p>1. -static 13% <br />
&nbsp;&nbsp; --with-client-ldflags=-all-static<br />
&nbsp;&nbsp; --with-mysqld-ldflags=-all-static<br />
静态链接提高13%性能</p>
<p>2. -pgcc 1%<br />
&nbsp;&nbsp; CFLAGS=&quot;-O3 -mpentiumpro -mstack-align-double&quot; CXX=gcc \<br />
&nbsp;&nbsp;&nbsp; CXXFLAGS=&quot;-O3 -mpentiumpro -mstack-align-double \<br />
&nbsp;&nbsp;&nbsp; -felide-constructors -fno-exceptions -fno-rtti&quot;<br />
如果是Inter处理器，使用pgcc提高1%性能</p>
<p>3. Unix Socket 7.5%<br />
&nbsp;&nbsp; --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock<br />
使用unix套接字链接提高7.5%性能，所以在windows下mysql性能肯定不如unix下面</p>
<p>4. --enable-assembler <br />
允许使用汇编模式(优化性能)</p>
<p>编译代码:<br />
CFLAGS=&quot;-O3&quot; CXX=gcc CXXFLAGS=&quot;-O3 -felide-constructors -fno-exceptions -fno-rtti -fomit-frame-pointer -ffixed-ebp&quot; ./configure --prefix=/usr/local/mysql --enable-assembler --with-innodb --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charsets=all</p>
<p>b)由于my.cnf文件的优化设置是与服务器硬件配置息息相关的，因而我们指定一个假想的服务器硬件环境：</p>
<p>CPU: 2颗Intel Xeon 2.4GHz</p>
<p>内存: 4GB DDR</p>
<p>硬盘: SCSI 73GB</p>
<p>下面，我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明：</p>
<p># vi /etc/my.cnf<br />
以下只列出my.cnf文件中[mysqld]段落中的内容，其他段落内容对MySQL运行性能影响甚微，因而姑且忽略。</p>
<p>[mysqld]<br />
port = 3306<br />
serverid = 1 <br />
socket = /tmp/mysql.sock<br />
skip-locking<br />
# 避免MySQL的外部锁定，减少出错几率增强稳定性。<br />
skip-name-resolve<br />
#禁止MySQL对外部连接进行DNS解析，使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意，如果开启该选项，则所有远程主机连接授权都要使用IP地址方式，否则MySQL将无法正常处理连接请求！</p>
<p>back_log = 384<br />
指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求，该参数生效，主线程花费很短的时间检查连接并且启动一个新线程。 back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。 如果系统在一个短时间内有很多连接，则需要增大该参数的值，该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。</p>
<p>key_buffer_size = 32M<br />
# key_buffer_size这对MyISAM表来说非常重要。如果只是使用MyISAM表，可以把它设置为可用内存的 30-40%。合理的值取决于索引大小、数据量以及负载 -- 记住，MyISAM表会使用操作系统的缓存来缓存数据，因此需要留出部分内存给它们，很多情况下数据比索引大多了。尽管如此，需要总是检查是否所有的 key_buffer 都被利用了 -- .MYI 文件只有 1GB，而 key_buffer 却设置为 4GB 的情况是非常少的。这么做太浪费了。如果你很少使用MyISAM表，那么也保留低于 16-32MB 的key_buffer_size 以适应给予磁盘的临时表索引所需。</p>
<p>innodb_buffer_pool_size = 2.4G <br />
#这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以，然而Innodb在默认的innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来，无需留给操作系统太多的内存，因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。-- 如果你的数据量不大，并且不会暴增，那么无需把innodb_buffer_pool_size 设置的太大了。</p>
<p>innodb_additional_pool_size = 20M<br />
#这个选项对性能影响并不太多，至少在有差不多足够内存可分配的操作系统上是这样。不过如果你仍然想设置为 20MB(或者更大)，因此就需要看一下Innodb其他需要分配的内存有多少。</p>
<p>innodb_log_file_size = 512M<br />
#在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高，但是要注意到可能会增加恢复时间。我经常设置为64-512MB，根据服务器大小而异。</p>
<p>innodb_log_buffer_size =16M<br />
#默认的设置在中等强度写入负载以及较短事务的情况下，服务器性能还可以。如果存在更新操作峰值或者负载较大，就应该考虑加大它的值了。如果它的值设置太高了，可能会浪费内存 -- 它每秒都会刷新一次，因此无需设置超过1秒所需的内存空间。通常8-16MB就足够了。越小的系统它的值越小。</p>
<p>innodb_flush_logs_at_trx_commit = 2<br />
#是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1，这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中，而这相当耗费资源，尤其是没有电池备用缓存时。很多应用程序，尤其是从 MyISAM转变过来的那些，把它的值设置为 2 就可以了，也就是不把日志刷新到磁盘上，而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去，因此通常不会丢失每秒1-2次更新的消耗。如果设置为0就快很多了，不过也相对不安全了 -- MySQL服务器崩溃时就会丢失一些事务。设置为2指挥丢失刷新到操作系统缓存的那部分事务。<br />
<br />
max_allowed_packet = 4M<br />
thread_stack = 256K<br />
table_cache = 128K<br />
sort_buffer_size = 6M<br />
#查询排序时所能使用的缓冲区大小。注意：该参数对应的分配内存是每连接独占！如果有100个连接，那么实际分配的总共排序缓冲区大小为100 &times; 6 ＝ 600MB。所以，对于内存在4GB左右的服务器推荐设置为6-8M。</p>
<p>read_buffer_size = 4M<br />
#读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！</p>
<p>join_buffer_size = 8M<br />
#联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！</p>
<p>myisam_sort_buffer_size = 64M<br />
table_cache = 512<br />
#打开一个表的开销可能很大。例如MyISAM把MYI文件头标志该表正在使用中。你肯定不希望这种操作太频繁，所以通常要加大缓存数量，使得足以最大限度地缓存打开的表。它需要用到操作系统的资源以及内存，对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话，那么设置为 1024 也许比较合适(每个线程都需要打开表)，如果连接数比较大那么就加大它的值。我曾经见过设置为100,000的情况。</p>
<p>thread_cache_size = 64<br />
#线程的创建和销毁的开销可能很大，因为每个线程的连接/断开都需要。我通常至少设置为 16。如果应用程序中有大量的跳跃并发连接并且 Threads_Created 的值也比较大，那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程。</p>
<p>query_cache_size = 64M<br />
#指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察：</p>
<p># &gt; SHOW VARIABLES LIKE '%query_cache%';<br />
# &gt; SHOW STATUS LIKE 'Qcache%';<br />
# 如果Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况；如果Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，如果该值较小反而会影响效率，那么可以考虑不用查询缓冲；Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多。</p>
<p>tmp_table_size = 256M<br />
max_connections = 768<br />
#指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示，则需要增大该参数值。</p>
<p>max_connect_errors = 10000000<br />
wait_timeout = 10<br />
#指定一个请求的最大连接时间，对于4GB左右内存的服务器可以设置为5-10。</p>
<p>thread_concurrency = 8<br />
#该参数取值为服务器逻辑CPU数量&times;2，在本例中，服务器有2颗物理CPU，而每颗物理CPU又支持H.T超线程，所以实际取值为4 &times; 2 ＝ 8</p>
<p>skip-networking<br />
#开启该选项可以彻底关闭MySQL的TCP/IP连接方式，如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项！否则将无法正常连接！</p>
<p>show status 命令<br />
含义如下:<br />
aborted_clients 客户端非法中断连接次数<br />
aborted_connects 连接mysql失败次数<br />
com_xxx xxx命令执行次数,有很多条<br />
connections 连接mysql的数量<br />
Created_tmp_disk_tables 在磁盘上创建的临时表<br />
Created_tmp_tables 在内存里创建的临时表<br />
Created_tmp_files 临时文件数<br />
Key_read_requests The number of requests to read a key block from the cache<br />
Key_reads The number of physical reads of a key block from disk<br />
Max_used_connections 同时使用的连接数<br />
Open_tables 开放的表<br />
Open_files 开放的文件<br />
Opened_tables 打开的表<br />
Questions 提交到server的查询数<br />
Sort_merge_passes 如果这个值很大,应该增加my.cnf中的sort_buffer值<br />
Uptime 服务器已经工作的秒数<br />
<br />
提升性能的建议:<br />
1.如果opened_tables太大,应该把my.cnf中的table_cache变大<br />
2.如果Key_reads太大,则应该把my.cnf中key_buffer_size变大.可以用Key_reads/Key_read_requests计算出cache失败率<br />
3.如果Handler_read_rnd太大,则你写的SQL语句里很多查询都是要扫描整个表,而没有发挥索引的键的作用<br />
4.如果Threads_created太大,就要增加my.cnf中thread_cache_size的值.可以用Threads_created/Connections计算cache命中率<br />
5.如果Created_tmp_disk_tables太大,就要增加my.cnf中tmp_table_size的值,用基于内存的临时表代替基于磁盘的</p>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=558</link>
			<title><![CDATA[mysql 将查询结果输出到文件]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Wed,19 Aug 2009 16:15:39 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=558</guid>
		<description><![CDATA[sel&#101;ct * INTO OUTFILE &#39;/tmp/dd.txt&#39; from tabOrderItems limit 2;<br/><br/>如果您使用INTO DUMPFILE代替INTO OUTFILE，则MySQL只把一行写入到文件中，不对任何列或行进行终止，也不执行任何转义处理。如果您想要把一个BLOB值存储到文件中，则这个语句是有用的。<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注释：任何由INTO OUTFILE或INTO DUMPFILE创建的文件都可以被服务器主机上的所有用户编写。原因是，MySQL服务器不能创建这样的文件，即文件的所有者不是该文件运行时所属的用户（任何时候，您都不能出于此原因或出于其它原因把mysqld作为根段运行）。该文件必须是全局可写的，这样您就可以操作其中的内容。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=555</link>
			<title><![CDATA[MySQL 备份和恢复策略]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Wed,12 Aug 2009 14:10:20 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=555</guid>
		<description><![CDATA[MySQL 备份和恢复策略<br/><br/>转发原文地址：<a href="http://blog.sina.com.cn/s/blog_4e424e2101000c1x.html" target="_blank" rel="external">http://blog.sina.com.cn/s/blog_4e424e2101000c1x.html</a><br/><br/>在数据库表丢失或损坏的情况下，备份你的数据库是很重要的。如果发生系统崩溃，你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。 <br/> <br/><br/>备份策略一：直接拷贝数据库文件（不推荐）<br/><br/>备份策略二：使用mysqlhotcopy备份数据库（完全备份，适合小型数据库备份）<br/><br/>备份策略三：使用mysqldump备份数据库（完全+增量备份，适合中型数据库备份）<br/><br/>备份策略四：使用主从复制机制(replication)（实现数据库实时备份）<br/><br/> <br/><br/>脚本下载地址：点击下载脚本<br/><br/> <br/><br/>备份策略一、直接拷贝数据库文件<br/><br/>直接拷贝数据文件最为直接、快速、方便，但缺点是基本上不能实现增量备份。为了保证数据的一致性，需要在备份文件前，执行以下 SQL 语句：<br/><br/>FLUSH TABLES WITH READ LOCK;<br/><br/>也就是把内存中的数据都刷新到磁盘中，同时锁定数据表，以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单，直接拷贝回原来的数据库目录下即可。<br/><br/> <br/><br/>备份策略二、使用mysqlhotcopy备份数据库<br/><br/>mysqlhotcopy 是一个 PERL 程序，最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径，但它只能运行在数据库文件（包括数据表定义文件、数据文件、索引文件）所在的机器上，并且mysqlhotcopy 只能用于备份 MyISAM表。<br/><br/>本备份策略适合于小型数据库的备份，数据量不大，可以采用mysqlhotcopy程序每天进行一次完全备份。<br/><br/>备份策略布置：<br/><br/>（1）、安装DBD-mysql perl模块，支持mysqlhotcopy脚本连接到MySQL数据库。<br/><br/>shell&gt; tar -xzvf&nbsp;&nbsp;DBD-mysql-4.005.tar.gz<br/><br/>shell&gt; cd DBD-mysql-4.005<br/><br/>shell&gt; unset LANG<br/><br/>shell&gt; perl Makefile.PL -mysql_config=/usr/local/mysql/bin/mysql_config -testuser=root -testpassword=UserPWD<br/><br/>shell&gt; make<br/><br/>shell&gt; make test<br/><br/>shell&gt; make install<br/><br/>（2）、设置crontab任务，每天执行备份脚本<br/><br/>shell&gt; crontab -e<br/><br/>0 3 * * * /root/MySQLBackup/mysqlbackup.sh &gt;/dev/null 2&gt;&amp;1<br/><br/>每天凌晨3:00执行备份脚本。<br/><br/> <br/><br/>mysqlbackup.sh注释：<br/><br/>#!/bin/sh<br/><br/># Name:mysqlbackup.sh<br/><br/># PS:MySQL DataBase Backup,Use mysqlhotcopy script.<br/><br/># Write by:i.Stone<br/><br/># Last Modify:2007-11-15<br/><br/>#<br/><br/># 定义变量，请根据具体情况修改<br/><br/># 定义脚本所在目录<br/><br/>scriptsDir=`pwd`<br/><br/># 数据库的数据目录<br/><br/>dataDir=/usr/local/mysql/data/<br/><br/># 数据备份目录<br/><br/>tmpBackupDir=/tmp/tmpbackup/<br/><br/>backupDir=/tmp/mysqlbackup/<br/><br/># 用来备份数据库的用户名和密码<br/><br/>mysqlUser=root<br/><br/>mysqlPWD=111111<br/><br/># 定义eMail地址<br/><br/>eMail=alt&#101;r@somode.com<br/><br/><br/># 如果临时备份目录存在，清空它，如果不存在则创建它<br/><br/>if [[ -e $tmpBackupDir ]]; then<br/><br/>&nbsp;&nbsp;rm -rf $tmpBackupDir/*<br/><br/>else<br/><br/>&nbsp;&nbsp;mkdir $tmpBackupDir<br/><br/>fi<br/><br/># 如果备份目录不存在则创建它<br/><br/>if [[ ! -e $backupDir ]];then<br/><br/>&nbsp;&nbsp;mkdir $backupDir<br/><br/>fi<br/><br/><br/># 清空MySQLBackup.log<br/><br/>if [[ -s MySQLBackup.log ]]; then<br/><br/>&nbsp;&nbsp;cat /dev/null &gt;MySQLBackup.log<br/><br/>fi<br/><br/><br/># 得到数据库备份列表，在此可以过滤不想备份的数据库<br/><br/>for databases in `find $dataDir -type d | \<br/><br/>&nbsp;&nbsp;sed -e &#34;s/\/usr\/local\/mysql\/data\///&#34; | \<br/><br/>&nbsp;&nbsp;sed -e &#34;s/test//&#34;`; do<br/><br/><br/>&nbsp;&nbsp;if [[ $databases == &#34;&#34; ]]; then<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;continue<br/><br/>&nbsp;&nbsp;else<br/><br/># 备份数据库<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/bin/mysqlhotcopy --user=$mysqlUser --password=$mysqlPWD -q &#34;$databases&#34; $tmpBackupDir<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;dateTime=`date &#34;+%Y.%m.%d %H:%M:%S&#34;`<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;$dateTime Database:$databases backup success!&#34; &gt;&gt;MySQLBackup.log<br/><br/>&nbsp;&nbsp;fi<br/><br/>done<br/><br/><br/># 压缩备份文件<br/><br/>date=`date -I`<br/><br/>cd $tmpBackupDir<br/><br/>tar czf $backupDir/mysql-$date.tar.gz ./<br/><br/><br/># 发送邮件通知<br/><br/>if [[ -s MySQLBackup.log ]]; then<br/><br/>&nbsp;&nbsp;cat MySQLBackup.log | mail -s &#34;MySQL Backup&#34; $eMail<br/><br/>fi<br/><br/><br/># 使用smbclientmv.sh脚本上传数据库备份到备份服务器<br/><br/># $scriptsDir/smbclientmv.sh<br/><br/> <br/><br/>smbclientmv.sh注释<br/><br/>#!/bin/sh<br/><br/># Name:smbclientmv.sh<br/><br/># PS:Move the data to Backup Server.<br/><br/># Write by:i.Stone<br/><br/># Last Modify:2007-11-15<br/><br/>#<br/><br/># 定义变量<br/><br/># 备份服务器名<br/><br/>BackupServer=&#34;BackupServerName&#34;<br/><br/># 共享文件夹名<br/><br/>BackupShare=&#34;ShareName&#34;<br/><br/># 备份服务器的访问用户名和密码<br/><br/>BackupUser=&#34;SMBUser&#34;<br/><br/>BackupPW=&#34;SMBPassword&#34;<br/><br/># 定义备份目录<br/><br/>BackupDir=/tmp/mysqlbackup<br/><br/>date=`date -I`<br/><br/><br/># Move the data to BackupServer<br/><br/>smbclient //$BackupServer/$BackupShare \<br/><br/>$BackupPW -d0 -W WORKGROUP -U $BackupUser \<br/><br/>-c &#34;put $BackupDir/mysql-$date.tar.gz \<br/><br/>mysql-$date.tar.gz&#34;<br/><br/><br/># Del&#101;te temp files<br/><br/>rm -f $BackupDir/mysql-$date.tar.gz<br/><br/><br/>(3)、恢复数据库到备份时的状态<br/>mysqlhotcopy 备份出来的是整个数据库目录，使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可，同时要注意权限的问题，如下例：<br/>shell&gt; cp -rf db_name /usr/local/mysql/data/<br/>shell&gt; chown -R mysql:mysql /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)<br/>本套备份策略只能恢复数据库到最后一次备份时的状态，要想在崩溃时丢失的数据尽量少应该更频繁的进行备份，要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。<br/>备份策略三、使用mysqldump备份数据库<br/><br/>mysqldump 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。mysqldump 比直接拷贝要慢些。关于mysqldump的更详细解释见最后的附录。<br/><br/>对于中等级别业务量的系统来说，备份策略可以这么定：第一次完全备份，每天一次增量备份，每周再做一次完全备份，如此一直重复。而对于重要的且繁忙的系统来说，则可能需要每天一次全量备份，每小时一次增量备份，甚至更频繁。为了不影响线上业务，实现在线备份，并且能增量备份，最好的办法就是采用主从复制机制(replication)，在 slave 机器上做备份。<br/><br/>备份策略布置：<br/><br/>（1）、创建备份目录<br/><br/>Shell&gt; mkdir /tmp/mysqlbackup<br/><br/>Shell&gt; mkdir /tmp/mysqlbackup/daily<br/><br/>（2）、启用二进制日志<br/><br/>采用 binlog 的方法相对来说更灵活，省心省力，而且还可以支持增量备份。<br/><br/>启用 binlog 时必须要重启 mysqld。首先，关闭 mysqld，打开 /etc/my.cnf，加入以下几行：<br/><br/>[mysqld]<br/><br/>log-bin<br/><br/>然后启动 mysqld 就可以了。运行过程中会产生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index，前面的文件是 mysqld 记录所有对数据的更新操作，后面的文件则是所有 binlog 的索引，都不能轻易删除。关于 binlog 的更详细信息请查看手册。<br/><br/>（3）、配置SSH密钥登录，用于将MySQL备份传送到备份服务器（如果备份服务器为Windows，请跳过此部）。<br/><br/>1）、在MySQL所在服务器（192.168.0.20）生成SSH密钥<br/><br/>[root@lab ~]# ssh-keygen -t rsa<br/><br/>Generating public/private rsa key pair.<br/><br/>Enter file in which to save the key (/root/.ssh/id_rsa):&nbsp;&nbsp;//直接回车<br/><br/>Enter passphrase (empty for no passphrase):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //直接回车，不使用密码<br/><br/>Enter same passphrase again:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //直接回车，不使用密码<br/><br/>Your identification has been saved in /root/.ssh/id_rsa.<br/><br/>Your public key has been saved in /root/.ssh/id_rsa.pub.<br/><br/>The key fingerprint is:<br/><br/>c2:96:9f:2d:5a:8e:08:42:43:35:2f:85:5e:72:f8:1c root@lab<br/><br/> <br/><br/>2）、在备份服务器（192.168.0.200）上创建目录，修改权限，并传送公钥。<br/><br/>[root@lab ~]# ssh 192.168.0.200 &#34;mkdir .ssh;chmod 0700 .ssh&#34;<br/><br/>The authenticity of host &#39;192.168.0.200 (192.168.0.200)&#39; can&#39;t be established.<br/><br/>RSA key fingerprint is 37:57:55:c1:32:f1:dd:bb:1b:8a:13:6f:89:fb:b8:9d.<br/><br/>Are you sure you want to continue connecting (yes/no)? yes<br/><br/>Warning: Permanently added &#39;192.168.0.200&#39; (RSA) to the list of known hosts.<br/><br/>root@192.168.0.200&#39;s password:&nbsp;&nbsp;&nbsp;&nbsp; //输入备份服务器的root密码<br/><br/>[root@lab ~]# scp .ssh/id_rsa.pub 192.168.0.200:.ssh/authorized_keys2<br/><br/>root@192.168.0.200&#39;s password: <br/><br/>id_rsa.pub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100%&nbsp;&nbsp;218&nbsp;&nbsp;&nbsp;&nbsp; 0.2KB/s&nbsp;&nbsp; 00:00&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>3）、测试SSH登录<br/><br/>[root@lab ~]# ssh 192.168.0.200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //测试SSH登录<br/><br/>Last login: Fri Nov 16 10:34:02 2007 from 192.168.0.20<br/><br/>[root@lib ~]# <br/><br/> <br/><br/>（4）、设置crontab任务，每天执行备份脚本<br/><br/>shell&gt; crontab -e<br/><br/>#每个星期日凌晨3:00执行完全备份脚本<br/><br/>0 3 * * 0 /root/MySQLBackup/mysqlFullBackup.sh &gt;/dev/null 2&gt;&amp;1<br/><br/>#周一到周六凌晨3:00做增量备份<br/><br/>0 3 * * 1-6 /root/MySQLBackup/mysqlDailyBackup.sh &gt;/dev/null 2&gt;&amp;1<br/><br/> <br/><br/>mysqlFullBackup.sh注释：<br/><br/>#!/bin/sh<br/><br/># Name:mysqlFullBackup.sh<br/><br/># PS:MySQL DataBase Full Backup.<br/><br/># Write by:i.Stone<br/><br/># Last Modify:2007-11-17<br/><br/>#<br/><br/># Use mysqldump --help get more detail.<br/><br/>#<br/><br/># 定义变量，请根据具体情况修改<br/><br/># 定义脚本目录<br/><br/>scriptsDir=`pwd`<br/><br/># 定义数据库目录<br/><br/>mysqlDir=/usr/local/mysql<br/><br/># 定义用于备份数据库的用户名和密码<br/><br/>user=root<br/><br/>userPWD=111111<br/><br/># 定义备份目录<br/><br/>dataBackupDir=/tmp/mysqlbackup<br/><br/># 定义邮件正文文件<br/><br/>eMailFile=$dataBackupDir/email.txt<br/><br/># 定义邮件地址<br/><br/>eMail=alt&#101;r@somode.com<br/><br/># 定义备份日志文件<br/><br/>logFile=$dataBackupDir/mysqlbackup.log<br/><br/>DATE=`date -I`<br/><br/><br/>echo &#34;&#34; &gt; $eMailFile<br/><br/>echo $(date +&#34;%y-%m-%d %H:%M:%S&#34;) &gt;&gt; $eMailFile<br/><br/>cd $dataBackupDir<br/><br/># 定义备份文件名<br/><br/>dumpFile=mysql_$DATE.sql<br/><br/>GZDumpFile=mysql_$DATE.sql.tar.gz<br/><br/><br/># 使用mysqldump备份数据库，请根据具体情况设置参数<br/><br/>$mysqlDir/bin/mysqldump -u$user -p$userPWD \<br/><br/>--opt --default-character-set=utf8 --extended-ins&#101;rt=false \<br/><br/>--triggers -R --hex-blob --all-databases \<br/><br/>--flush-logs --del&#101;te-master-logs \<br/><br/>--del&#101;te-master-logs \<br/><br/>-x &gt; $dumpFile<br/><br/><br/># 压缩备份文件<br/><br/>if [[ $? == 0 ]]; then<br/><br/>&nbsp;&nbsp;tar czf $GZDumpFile $dumpFile &gt;&gt; $eMailFile 2&gt;&amp;1<br/><br/>&nbsp;&nbsp;echo &#34;BackupFileName:$GZDumpFile&#34; &gt;&gt; $eMailFile<br/><br/>&nbsp;&nbsp;echo &#34;DataBase Backup Success!&#34; &gt;&gt; $eMailFile<br/><br/>&nbsp;&nbsp;rm -f $dumpFile<br/><br/><br/># Del&#101;te daily backup files.<br/><br/>&nbsp;&nbsp;cd $dataBackupDir/daily<br/><br/>&nbsp;&nbsp;rm -f *<br/><br/><br/># Del&#101;te old backup files(mtime&gt;2).<br/><br/>&nbsp;&nbsp;$scriptsDir/rmBackup.sh<br/><br/><br/># 如果不需要将备份传送到备份服务器或备份服务器为Windows，请将标绿的行注释掉<br/><br/># Move Backup Files To Backup Server.<br/><br/>#适合Linux（MySQL服务器）到Linux（备份服务器）<br/><br/>&nbsp;&nbsp;$scriptsDir/rsyncBackup.sh<br/><br/>&nbsp;&nbsp;if (( !$? )); then<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Move Backup Files To Backup Server Success!&#34; &gt;&gt; $eMailFile<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Move Backup Files To Backup Server Fail!&#34; &gt;&gt; $eMailFile<br/><br/>&nbsp;&nbsp;fi<br/><br/><br/>else<br/><br/>&nbsp;&nbsp;echo &#34;DataBase Backup Fail!&#34; &gt;&gt; $emailFile<br/><br/>fi<br/><br/># 写日志文件<br/><br/>echo &#34;--------------------------------------------------------&#34; &gt;&gt; $logFile<br/><br/>cat $eMailFile &gt;&gt; $logFile<br/><br/># 发送邮件通知<br/><br/>cat $eMailFile | mail -s &#34;MySQL Backup&#34; $eMail<br/><br/>mysqlDailyBackup.sh注释： <br/>#!/bin/sh<br/># Name:mysqlDailyBackup.sh<br/># PS:MySQL DataBase Daily Backup.<br/># Write by:i.Stone<br/># Last Modify:2007-11-17<br/>#<br/># 定义变量，请根据具体情况修改<br/># 定义数据库目录和数据目录<br/>scriptsDir=`pwd`<br/>mysqlDir=/usr/local/mysql<br/>dataDir=$mysqlDir/data<br/># 定义用于备份数据库的用户名和密码<br/>user=root<br/>userPWD=111111<br/># 定义备份目录，每日备份文件备份到$dataBackupDir/daily<br/>dataBackupDir=/tmp/mysqlbackup<br/>dailyBackupDir=$dataBackupDir/daily<br/># 定义邮件正文文件<br/>eMailFile=$dataBackupDir/email.txt<br/># 定义邮件地址<br/>eMail=alt&#101;r@somode.com<br/># 定义日志文件<br/>logFile=$dataBackupDir/mysqlbackup.log<br/># 得到数据库所在主机的主机名<br/>HOSTNAME=`uname -n`<br/>#<br/>echo &#34;&#34; &gt; $eMailFile<br/>echo $(date +&#34;%y-%m-%d %H:%M:%S&#34;) &gt;&gt; $eMailFile<br/>#<br/># 刷新日志，使数据库使用新的二进制日志文件<br/>$mysqlDir/bin/mysqladmin -u$user -p$userPWD flush-logs<br/>cd $dataDir<br/># 得到二进制日志列表<br/>fileList=`cat $HOSTNAME-bin.index`<br/>iCounter=0<br/>for file in $fileList<br/>do<br/>&nbsp;&nbsp;iCounter=`expr $iCounter + 1`<br/>done<br/>nextNum=0<br/>iFile=0<br/>for file in $fileList<br/>do<br/>&nbsp;&nbsp;binLogName=`basename $file`<br/>&nbsp;&nbsp;nextNum=`expr $nextNum + 1`<br/># 跳过最后一个二进制日志（数据库当前使用的二进制日志文件）<br/>&nbsp;&nbsp;if [[ $nextNum == $iCounter ]]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Skip lastest!&#34; &gt; /dev/null<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;dest=$dailyBackupDir/$binLogName<br/># 跳过已经备份的二进制日志文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;if [[ -e $dest ]]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Skip exist $binLogName!&#34; &gt; /dev/null<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/># 备份日志文件到备份目录<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp $binLogName $dailyBackupDir<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if [[ $? == 0 ]]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iFile=`expr $iFile + 1`<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;$binLogName Backup Success!&#34; &gt;&gt; $eMailFile<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;fi<br/>done<br/>if [[ $iFile == 0 ]];then<br/>&nbsp;&nbsp;echo &#34;No Binlog Backup!&#34; &gt;&gt; $eMailFile<br/>else<br/>&nbsp;&nbsp;echo &#34;Backup $iFile File(s).&#34; &gt;&gt; $eMailFile<br/>&nbsp;&nbsp;echo &#34;Backup MySQL Binlog OK!&#34; &gt;&gt; $eMailFile<br/><br/># 如果不需要将备份传送到备份服务器或备份服务器为Windows，请将标绿的行注释掉<br/># Move Backup Files To Backup Server.<br/>#适合Linux（MySQL服务器）到Linux（备份服务器）<br/><br/>&nbsp;&nbsp;$scriptsDir/rsyncBackup.sh<br/>&nbsp;&nbsp;if [[ $? == 0 ]]; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Move Backup Files To Backup Server Success!&#34; &gt;&gt; $eMailFile<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &#34;Move Backup Files To Backup Server Fail!&#34; &gt;&gt; $eMailFile<br/>&nbsp;&nbsp;fi<br/>fi<br/># 发送邮件通知<br/>cat $eMailFile | mail -s &#34;MySQL Backup&#34; $eMail<br/># 写日志文件<br/>echo &#34;--------------------------------------------------------&#34; &gt;&gt; $logFile<br/>cat $eMailFile &gt;&gt; $logFile<br/><br/> <br/><br/>rsyncBackup.sh注释：<br/><br/>#!/bin/sh<br/># Name:rsyncBackup.sh<br/># PS:Move Backup Files To Backup Server.<br/># Write by:i.Stone<br/># Last Modify:2007-11-17<br/>#<br/># 请根据具体情况修改，注意最后有“/”<br/># 定义数据库备份目录<br/>dataBackupDir=/tmp/mysqlbackup/<br/># 定义备份服务器上存放备份数据的目录<br/>backupServerDir=/root/mysqlbackup/<br/># 定义备份服务器<br/>backupServer=192.168.0.200<br/>#<br/># 同步备份文件到备份服务器<br/>rsync -a --del&#101;te $dataBackupDir -e ssh $backupServer:$backupServerDir &gt; /dev/null 2&gt;&amp;1<br/><br/><br/>rmBackup.sh注释：<br/><br/>#!/bin/sh<br/># Name:rmBackup.sh<br/># PS:Del&#101;te old Backup.<br/># Write by:i.Stone<br/># Last Modify:2007-11-15<br/>#<br/># 定义备份目录<br/>dataBackupDir=/tmp/mysqlbackup<br/># 删除mtime&gt;2的日志备份文件<br/>find $dataBackupDir -name &#34;mysql_*.gz&#34; -type f -mtime +2 -exec rm {} \; &gt; /dev/null 2&gt;&amp;1<br/><br/><br/>（5） 、恢复数据库到备份时的状态<br/><br/>用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,直接用 mysql 客户端导入就可以了。 <br/><br/>/usr/local/mysql/bin/mysql -uroot -pUserPWD db_name &lt; db_name.sql<br/><br/>对于任何可适用的更新日志，将它们作为 mysql 的输入： <br/><br/>　　% ls -t -r -1 HOSTNAME-bin* | xargs mysqlbinlog | mysql -uUser -pUserPWD <br/><br/>ls 命令生成更新日志文件的一个单列列表，根据服务器产生它们的次序排序（注意：如果你修改任何一个文件，你将改变排序次序，这将导致更新日志以错误的次序被运用。）<br/><br/>本套备份策略只能恢复数据库到最后一次备份时的状态，要想在崩溃时丢失的数据尽量少应该更频繁的进行备份，要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。如果使用本套备份脚本，将日志文件和数据文件放到不同的磁盘上是一个不错的主义，这样不仅可以提高数据写入速度，还能使数据更安全<br/>备份策略四、使用主从复制机制(replication)<br/>]]></description>
		</item>
		
			<item>
			<link>sclife.com.cn/blog/article.asp?id=549</link>
			<title><![CDATA[MySQL性能优化的参数简介]]></title>
			<author>hoifish_010@163.om(hotfish)</author>
			<category><![CDATA[Mysql数据管理]]></category>
			<pubDate>Thu,09 Jul 2009 10:50:25 +0800</pubDate>
			<guid>sclife.com.cn/blog/default.asp?id=549</guid>
		<description><![CDATA[本文来自: IT运维专家网 作者: NetSeek 日期: 2008-9-2 19:22 阅读: 806 人 打印 收藏 <br/>mysql, 性能优化<br/>公司网站访问量越来越大，MySQL自然成为瓶颈，因此最近我一直在研究 MySQL 的优化，第一步自然想到的是 MySQL 系统参数的优化，作为一个访问量很大的网站（日20万人次以上）的数据库系统，不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。<br/>通过在网络上查找资料和自己的尝试，我认为以下系统参数是比较关键的：<br/>(1)、back_log：<br/><br/>要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。<br/><br/>back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。 <br/><br/>当你观察你的主机进程列表，发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。<br/>(2)、interactive_timeout：<br/><br/>服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。<br/>(3)、key_buffer_size：<br/><br/>索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为402649088(400MB)。<br/>(4)、max_connections：<br/><br/>允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。<br/>(5)、record_buffer：<br/><br/>每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M)<br/>(6)、sort_buffer：<br/><br/>每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。<br/>(7)、table_cache：<br/><br/>为所有线程打开表的数量。增加该值能增加mysql要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。<br/>(8)、thread_cache_size： <br/><br/>可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_cr&#101;ated 状态的变量，可以看到这个变量的作用。我把它设置为 80。<br/>(10)、wait_timeout：<br/><br/>服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。<br/>注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。asp?id=482&#34; width=1 border=0&gt;<br/><br/>来自:<a href="http://rq2-79.javaeye.com/blog/142035" target="_blank" rel="external">http://rq2-79.javaeye.com/blog/142035</a> <br/>]]></description>
		</item>
		
</channel>
</rss>
