<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GzV8.com &#187; Mysql</title>
	<atom:link href="http://www.gzv8.com/archives/category/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gzv8.com</link>
	<description>互联网引擎</description>
	<lastBuildDate>Thu, 06 Jan 2011 04:08:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MariaDB VS MySQL 性能小测。</title>
		<link>http://www.gzv8.com/archives/378</link>
		<comments>http://www.gzv8.com/archives/378#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:08:28 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=378</guid>
		<description><![CDATA[我使用的是 MySQL 自带的性能测试工具 mysqlslap，200 并发，25次循环，
运行5次取平均数值所得。
测试数据库所用的版本是 MariaDB 5.2.0 Beta &#38; MySQL 5.1.36 使用相同的 my.ini 配置
下边是测试结果：
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 36.261 seconds
Minimum number of seconds to run all queries: 36.162 seconds
Maximum number of seconds to run all queries: 36.336 seconds
以上是 MariaDB  ，MyISAM 引擎的测试结果
Benchmark
Running for engine myisam
Average number of seconds to run [...]]]></description>
			<content:encoded><![CDATA[<p>我使用的是 MySQL 自带的性能测试工具 mysqlslap，200 并发，25次循环，<br />
运行5次取平均数值所得。</p>
<p>测试数据库所用的版本是 MariaDB 5.2.0 Beta &amp; MySQL 5.1.36 使用相同的 my.ini 配置</p>
<p>下边是测试结果：</p>
<p>Benchmark<br />
Running for engine myisam<br />
Average number of seconds to run all queries: 36.261 seconds<br />
Minimum number of seconds to run all queries: 36.162 seconds<br />
Maximum number of seconds to run all queries: 36.336 seconds</p>
<p>以上是 MariaDB  ，MyISAM 引擎的测试结果</p>
<p>Benchmark<br />
Running for engine myisam<br />
Average number of seconds to run all queries: 35.774 seconds<br />
Minimum number of seconds to run all queries: 35.438 seconds<br />
Maximum number of seconds to run all queries: 36.130 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MySQL  ，MyISAM 引擎的测试结果<br />
MariaDB 与 MySQL 在 MyISAM 引擎的性能上存在差别，MySql 快了一个小身位。<br />
InnoDB 的情况也一样麽？</p>
<p>Benchmark<br />
Running for engine innodb<br />
Average number of seconds to run all queries: 36.113 seconds<br />
Minimum number of seconds to run all queries: 36.025 seconds<br />
Maximum number of seconds to run all queries: 36.233 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MariaDB  ，InnoDB 引擎的测试结果</p>
<p>Benchmark<br />
Running for engine innodb<br />
Average number of seconds to run all queries: 36.412 seconds<br />
Minimum number of seconds to run all queries: 36.208 seconds<br />
Maximum number of seconds to run all queries: 36.663 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MySQL  ，InnoDB 引擎的测试结果<br />
测试所得，使用 InnoDB 引擎时，情况就扭转了，MariaDB 要比 MySQL 快上了好几毫秒。<br />
看来2位虽然同宗同源，但所侧重的方面不不一样啊。<br />
将继续留意他们的发展。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/378/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql 升级到 5.5 GA 时，PHP 5.2.6 编译出错！已解决！</title>
		<link>http://www.gzv8.com/archives/356</link>
		<comments>http://www.gzv8.com/archives/356#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:54:47 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=356</guid>
		<description><![CDATA[最近经常有人问我 MySQL Query Cache 相关的问题，就整理一点 MySQL Query Cache 的内容，以供参考。
顾名思义，MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说，Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲，就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。
在大部分的 MySQL 分发版本中，Query Cache 功能默认都是打开的，我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成：

query_cache_limit：允许 Cache 的单条 Query 结果集的最大容量，默认是1MB，超过此参数设置的 Query 结果集将不会被 Cache
query_cache_min_res_unit：设置 Query Cache 中每次分配内存的最小空间大小，也就是每个 Query 的 Cache 最小占用的内存空间大小
query_cache_size：设置 Query Cache 所使用的内存大小，默认值为0，大小必须是1024的整数倍，如果不是整数倍，MySQL 会自动调整降低最小量以达到1024的倍数
query_cache_type：控制 Query Cache 功能的开关，可以设置为0(OFF),1(ON)和2(DEMAND)三种，意义分别如下：

0(OFF)：关闭 Query Cache 功能，任何情况下都不会使用 [...]]]></description>
			<content:encoded><![CDATA[<p>最近经常有人问我 MySQL Query Cache 相关的问题，就整理一点 MySQL Query Cache 的内容，以供参考。</p>
<p>顾名思义，MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说，Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲，就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。</p>
<p>在大部分的 MySQL 分发版本中，Query Cache 功能默认都是打开的，我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成：</p>
<ul>
<li>query_cache_limit：允许 Cache 的单条 Query 结果集的最大容量，默认是1MB，超过此参数设置的 Query 结果集将不会被 Cache</li>
<li>query_cache_min_res_unit：设置 Query Cache 中每次分配内存的最小空间大小，也就是每个 Query 的 Cache 最小占用的内存空间大小</li>
<li>query_cache_size：设置 Query Cache 所使用的内存大小，默认值为0，大小必须是1024的整数倍，如果不是整数倍，MySQL 会自动调整降低最小量以达到1024的倍数</li>
<li>query_cache_type：控制 Query Cache 功能的开关，可以设置为0(OFF),1(ON)和2(DEMAND)三种，意义分别如下：
<ul>
<li>0(OFF)：关闭 Query Cache 功能，任何情况下都不会使用 Query Cache</li>
<li>1(ON)：开启 Query Cache 功能，但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后，将不使用Query Cache</li>
<li>2(DEMAND)：开启 Query Cache 功能，但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后，才使用 Query Cache</li>
</ul>
</li>
<li>query_cache_wlock_invalidate：控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache，如果设置为 1(TRUE)，则在写锁定的同时将失效该表相关的所有 Query Cache，如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。</li>
</ul>
<p><strong>Query Cache 如何处理子查询的？</strong><br />
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的，只要客户端请求的是一个 Query，无论这个 Query 是一个简单的单表查询还是多表 Join，亦或者是带有子查询的复杂 SQL，都被当作成一个 Query，不会被分拆成多个 Query 来进行 Cache。所以，存在子查询的复杂 Query 也只会产生一个Cache对象，子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。</p>
<p><strong>Query Cache 是以 block 的方式存储的数据块吗？</strong><br />
不是，Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据，是结果集。当然，并不仅仅只是结果数据，还包含与该结果相关的其他信息，比如产生该 Cache 的客户端连接的字符集，数据的字符集，客户端连接的 Default Database等。</p>
<p><strong>Query Cache 为什么效率会非常高，即使所有数据都可以 Cache 进内存的情况下，有些时候也不如使用 Query Cache 的效率高？</strong><br />
Query Cache 的查找，是在 MySQL 接受到客户端请求后在对 Query 进行权限验证之后，SQL 解析之前。也就是说，当 MySQL 接受到客户端的SQL后，仅仅只需要对其进行相应的权限验证后就会通过 Query Cache 来查找结果，甚至都不需要经过 Optimizer 模块进行执行计划的分析优化，更不许要发生任何存储引擎的交互，减少了大量的磁盘 IO 和 CPU 运算，所以效率非常高。</p>
<p><strong>客户端提交的 SQL 语句大小写对 Query Cache 有影响吗？</strong><br />
有，由于 Query Cache 在内存中是以 HASH 结构来进行映射，HASH 算法基础就是组成 SQL 语句的字符，所以必须要整个 SQL 语句在字符级别完全一致，才能在 Query Cache 中命中，即使多一个空格也不行。</p>
<p><strong>一个 SQL 语句在 Query Cache 中的内容，在什么情况下会失效？</strong><br />
为了保证 Query Cache 中的内容与是实际数据绝对一致，当表中的数据有任何变化，包括新增，修改，删除等，都会使所有引用到该表的 SQL 的 Query Cache 失效。</p>
<p><strong>为什么我的系统在开启了 Query Cache 之后整体性能反而下降了？</strong><br />
当开启了 Query Cache 之后，尤其是当我们的 query_cache_type 参数设置为 1 以后，MySQL 会对每个 SELECT 语句都进行 Query Cache 查找，查找操作虽然比较简单，但仍然也是要消耗一些 CPU 运算资源的。而由于 Query Cache 的失效机制的特性，可能由于表上的数据变化比较频繁，大量的 Query Cache 频繁的被失效，所以 Query Cache 的命中率就可能比较低下。所以有些场景下，Query Cache 不仅不能提高效率，反而可能造成负面影响。</p>
<p><strong>如何确认一个系统的 Query Cache 的运行是否健康，命中率如何，设置量是否足够？</strong><br />
MySQL 提供了一系列的 Global Status 来记录 Query Cache 的当前状态，具体如下：</p>
<p>mysql&gt; SHOW VARIABLES LIKE &#8216;%query_cache%&#8217;;</p>
<ul>
<li>Qcache_free_blocks：目前还处于空闲状态的 Query Cache 中内存 Block 数目</li>
<li>Qcache_free_memory：目前还处于空闲状态的 Query Cache 内存总量</li>
<li>Qcache_hits：Query Cache 命中次数</li>
<li>Qcache_inserts：向 Query Cache 中插入新的 Query Cache 的次数，也就是没有命中的次数</li>
<li>Qcache_lowmem_prunes：当 Query Cache 内存容量不够，需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数</li>
<li>Qcache_not_cached：没有被 Cache 的 SQL 数，包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL</li>
<li>Qcache_queries_in_cache：目前在 Query Cache 中的 SQL 数量</li>
<li>Qcache_total_blocks：Query Cache 中总的 Block 数量</li>
</ul>
<p>可以根据这几个状态计算出 Cache 命中率，计算出 Query Cache 大小设置是否足够，总的来说，我个人不建议将 Query Cache 的大小设置超过256MB，这也是业界比较常用的做法。<br />
<strong><br />
MySQL Cluster 是否可以使用 Query Cache？</strong><br />
其实在我们的生产环境中也没有使用 MySQL Cluster，所以我也没有在 MySQL Cluster 环境中使用 Query Cache 的实际经验，只是 MySQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。从 MySQL Cluster 的原理来分析，也觉得应该可以使用，毕竟 SQL 节点和数据节点比较独立，各司其职，只是 Cache 的失效机制会要稍微复杂一点。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql的查询缓存区的优化</title>
		<link>http://www.gzv8.com/archives/354</link>
		<comments>http://www.gzv8.com/archives/354#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:53:46 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=354</guid>
		<description><![CDATA[查看查询缓存区的相关变量：
mysql&#62; SHOW VARIABLES LIKE &#8216;%query_cache%&#8217;;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+
&#124; Variable_name                &#124; Value    &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+
&#124; have_query_cache             &#124; YES      &#124;
&#124; query_cache_limit            &#124; 1048576  &#124;
&#124; query_cache_min_res_unit     &#124; 4096     &#124;
&#124; query_cache_size             &#124; 33554432 &#124;
&#124; query_cache_type             &#124; ON       &#124;
&#124; query_cache_wlock_invalidate &#124; OFF      &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+
6 rows in set (0.00 sec)
have_query_cache 
是否支持查询缓存区 “YES”表是支持查询缓存区
query_cache_limit 可缓存的Select查询结果的最大值 1048576 byte /1024 = 1024kB 即最大可缓存的select查询结果必须小于1024KB
query_cache_min_res_unit 每次给query cache结果分配内存的大小 默认是 4096 byte 也即 4kB
在这里，我延伸三点重要的东西
1.当查询进行的时候，Mysql把查询结果保存在qurey cache中，但是有时候要保存的结果比较大，超过了query_cache_min_res_unit的值 ，这时候mysql将一边检索结果，一边进行慢慢保存结果，所以，有时候并不是
把所有结果全部得到后再进行一次性保存，而是每次分配一块query_cache_min_res_unit 大小的内存空间保存结果集，
使用完后，接着再分配一个这样的块，如果还不不够，接着再分配一个块，依此类推，也就是说，有可能在一次查询中，
mysql要进行多次内存分配的操作，而我们应该知道，频繁操作内存都是要耗费时间的。
2. 内存碎片的产生。当一块分配的内存没有完全使用时，MySQL会把这块内存Trim掉，把没有使用的那部分归还以重复利用。比如，第一次分配4KB,只用了3KB，剩1KB，第二次连续操作，分配4KB，用了2KB，剩2KB，这两次连续操作共剩下的1KB+2KB=3KB，不足以做个一个内存单元分配，这时候，内存碎片便产生了。
3.内存块的概念，先看下这个：
mysql&#62; show status like [...]]]></description>
			<content:encoded><![CDATA[<p>查看查询缓存区的相关变量：</p>
<p>mysql&gt; SHOW VARIABLES LIKE &#8216;%query_cache%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| Variable_name                | Value    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| have_query_cache             | YES      |<br />
| query_cache_limit            | 1048576  |<br />
| query_cache_min_res_unit     | 4096     |<br />
| query_cache_size             | 33554432 |<br />
| query_cache_type             | ON       |<br />
| query_cache_wlock_invalidate | OFF      |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
6 rows in set (0.00 sec)</p>
<p><strong>have_query_cache </strong><br />
是否支持查询缓存区 “YES”表是支持查询缓存区</p>
<p><strong>query_cache_limit </strong>可缓存的Select查询结果的最大值 1048576 byte /1024 = 1024kB 即最大可缓存的select查询结果必须小于1024KB</p>
<p><strong>query_cache_min_res_unit </strong>每次给query cache结果分配内存的大小 默认是 4096 byte 也即 4kB</p>
<p>在这里，我延伸三点重要的东西</p>
<p>1.当查询进行的时候，Mysql把查询结果保存在qurey cache中，但是有时候要保存的结果比较大，超过了query_cache_min_res_unit的值 ，这时候mysql将一边检索结果，一边进行慢慢保存结果，所以，有时候并不是<br />
把所有结果全部得到后再进行一次性保存，而是每次分配一块query_cache_min_res_unit 大小的内存空间保存结果集，<br />
使用完后，接着再分配一个这样的块，如果还不不够，接着再分配一个块，依此类推，也就是说，有可能在一次查询中，<br />
mysql要进行多次内存分配的操作，而我们应该知道，频繁操作内存都是要耗费时间的。</p>
<p>2. 内存碎片的产生。当一块分配的内存没有完全使用时，MySQL会把这块内存Trim掉，把没有使用的那部分归还以重复利用。比如，第一次分配4KB,只用了3KB，剩1KB，第二次连续操作，分配4KB，用了2KB，剩2KB，这两次连续操作共剩下的1KB+2KB=3KB，不足以做个一个内存单元分配，这时候，内存碎片便产生了。</p>
<p>3.内存块的概念，先看下这个：</p>
<p>mysql&gt; show status like &#8216;qcache%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Variable_name           | Value    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Qcache_free_blocks      | 5096     |<br />
| Qcache_free_memory      | 18964096 |<br />
| Qcache_hits             | 12192192 |<br />
| Qcache_inserts          | 3560370  |<br />
| Qcache_lowmem_prunes    | 17326    |<br />
| Qcache_not_cached       | 303599   |<br />
| Qcache_queries_in_cache | 10201    |<br />
| Qcache_total_blocks     | 25937    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
8 rows in set (0.00 sec)</p>
<p><strong>Qcache_total_blocks </strong>表示所有的块</p>
<p><strong>Qcache_free_blocks </strong>表示未使用的块 这个值比较大，那意味着，内存碎片比较多，用flush query cache清理后，<br />
为被使用的块其值应该为1或0 ，因为这时候所有的内存都做为一个连续的快在一起了：</p>
<p>mysql&gt; show status like &#8216;qcache%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Variable_name           | Value    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Qcache_free_blocks      | 1        |<br />
| Qcache_free_memory      | 18539240 |<br />
| Qcache_hits             | 12192502 |<br />
| Qcache_inserts          | 3560515  |<br />
| Qcache_lowmem_prunes    | 17326    |<br />
| Qcache_not_cached       | 303607   |<br />
| Qcache_queries_in_cache | 10318    |<br />
| Qcache_total_blocks     | 21081    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
8 rows in set (0.00 sec)</p>
<p>其他几个状态变量的意义：</p>
<p><strong>Qcache_free_memory </strong> 表示查询缓存区现在还有多少的可用内存<br />
<strong>Qcache_hits </strong> 表示查询缓存区的命中个数，也就是直接从查询缓存区作出响应处理的查询个数<br />
<strong>Qcache_inserts </strong> 表示查询缓存区此前总过缓存过多少条查询命令的结果<br />
<strong>Qcache_lowmem_prunes</strong> 表示查询缓存区已满而从其中溢出和删除的查询结果的个数<br />
<strong>Qcache_not_cached </strong> 表示没有进入查询缓存区的查询命令个数<br />
<strong>Qcache_queries_in_cache</strong> 查询缓存区当前缓存着多少条查询命令的结果</p>
<p><strong>优化提示：</strong><br />
如果Qcache_lowmem_prunes 值比较大，表示查询缓存区大小设置太小，需要增大。<br />
如果Qcache_free_blocks 较多，表示内存碎片较多，需要清理，flush query cache<br />
根据我看的 《High Performance MySQL》中所述，关于query_cache_min_res_unit大小的调优<br />
，书中给出了一个计算公式，可以供调优设置参考：<br />
<strong>query_cache_min_res_unit = (query_cache_size &#8211; Qcache_free_memory) / Qcache_queries_in_cache</strong></p>
<p>还要注意一点的是，FLUSH QUERY CACHE 命令可以用来整理查询缓存区的碎片，改善内存使用状况，<br />
但不会清理查询缓存区的内容，这个要和RESET QUERY CACHE相区别，不要混淆，后者才是清除查询缓存区中<br />
的所有的内容。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/354/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mariadb</title>
		<link>http://www.gzv8.com/archives/307</link>
		<comments>http://www.gzv8.com/archives/307#comments</comments>
		<pubDate>Mon, 26 Apr 2010 00:59:25 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=307</guid>
		<description><![CDATA[瑪利亞資料庫 (Maria) 是 MySQL 創辦人離開 Sun 後又開的公司所開發的資料庫系統，很多操作和觀念和原來的 MySQL 相同。
官方網站 : 瑪利亞資料庫 (Maria)
http://askmonty.org/wiki/index.php/MariaDB
安装方法：
下载页面： http://askmonty.org/wiki/MariaDB:Download 

# tar zxvf  mariadb-5.1.42-Linux-i686.tar.gz 
# mv mariadb-5.2.0-beta-Linux-i686 /usr/local/mysql
# groupadd mysql                     增加 mysql 属组
# useradd -g mysql mysql     增加 mysql 用户并归于mysql 属组
# chown mysql:mysql -Rf  /usr/local/mysql     设置 mysql 目录的用户及用户组归属。
# chmod +x -Rf /usr/local/mysql    赐予可执行权限
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf     复制默认mysql配置文件到/etc 目录
# scripts/mysql_install_db &#8211;user=mysql   初始化数据库
# cp  /usr/local/mysql/support-files/mysql.server   /etc/init.d/mysql   复制mysql服务程序到系统目录
# chkconfig  [...]]]></description>
			<content:encoded><![CDATA[<p>瑪利亞資料庫 (Maria) 是 MySQL 創辦人離開 Sun 後又開的公司所開發的資料庫系統，很多操作和觀念和原來的 MySQL 相同。<br />
官方網站 : 瑪利亞資料庫 (Maria)<br />
<!-- m --><a href="http://askmonty.org/wiki/index.php/MariaDB">http://askmonty.org/wiki/index.php/MariaDB</a></p>
<div>安装方法：</div>
<div>下载页面： <a href="http://askmonty.org/wiki/MariaDB:Download">http://askmonty.org/wiki/MariaDB:Download</a> </div>
<div>
# tar zxvf  mariadb-5.1.42-Linux-i686.tar.gz </div>
<div># mv mariadb-5.2.0-beta-Linux-i686 /usr/local/mysql<br />
# groupadd mysql                     增加 mysql 属组<br />
# useradd -g mysql mysql     增加 mysql 用户并归于mysql 属组<br />
# chown mysql:mysql -Rf  /usr/local/mysql     设置 mysql 目录的用户及用户组归属。<br />
# chmod +x -Rf /usr/local/mysql    赐予可执行权限<br />
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf     复制默认mysql配置文件到/etc 目录</div>
<div># scripts/mysql_install_db &#8211;user=mysql   初始化数据库<br />
# cp  /usr/local/mysql/support-files/mysql.server   /etc/init.d/mysql   复制mysql服务程序到系统目录<br />
# chkconfig  mysql on   添加mysql 至系统服务并设置为开机启动<br />
# service  mysql  start  启动mysql<br />
或<br />
bin/mysqld_safe &#8211;user=mysql &amp;</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/307/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>检查 TCMalloc 是否生效的方法的问题</title>
		<link>http://www.gzv8.com/archives/303</link>
		<comments>http://www.gzv8.com/archives/303#comments</comments>
		<pubDate>Tue, 20 Apr 2010 03:24:29 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=303</guid>
		<description><![CDATA[TCMalloc (google-perftools) 是用于优化C++写的多线程应用，比glibc 2.3的malloc快。这个模块可以用来让MySQL在高并发下内存占用更加稳定。
安装方法请看：http://www.oschina.net/bbs/thread/4467
一般装完这个东东后，可以通过下面的方法来检测是否生效
/usr/sbin/lsof -n &#124; grep tcmalloc
如果安装生效，那么会显示如下信息
mysqld 25580 mysql  mem       REG        3,1  1477689    1655725 /usr/local/lib/libtcmalloc.so.0.0.0
以上方法仅用于 X32 位。 
而，X64 位系统必须安装 libunwind ，(其实在X64 OS下使用TCMalloc，必须安装libunwind) 而版本推荐是 0.99
然后，需要创建软连接 ln -s /usr/local/lib/libunwind.so.7 /usr/lib64/
跟着，编辑 mysqld_safe  ，确认在最上一行添加有 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
最后，重新启动 mysql 并再次用 /usr/sbin/lsof -n &#124; grep tcmalloc 命令检测。
得出结果：
mysqld    27683     mysql  mem       REG                8,1    1675447    9830428 /usr/local/lib/libtcmalloc.so.0.0.0
]]></description>
			<content:encoded><![CDATA[<p>TCMalloc (<a href="http://code.google.com/p/google-perftools/">google-perftools</a>) 是用于优化C++写的多线程应用，比glibc 2.3的malloc快。这个模块可以用来让MySQL在高并发下内存占用更加稳定。</p>
<p>安装方法请看：<a href="http://www.oschina.net/bbs/thread/4467">http://www.oschina.net/bbs/thread/4467</a></p>
<p>一般装完这个东东后，可以通过下面的方法来检测是否生效</p>
<p>/usr/sbin/lsof -n | grep tcmalloc</p>
<p>如果安装生效，那么会显示如下信息</p>
<p>mysqld 25580 mysql  mem       REG        3,1  1477689    1655725 /usr/local/lib/libtcmalloc.so.0.0.0</p>
<p>以上方法仅用于 X32 位。 </p>
<p>而，X64 位系统必须安装 libunwind ，(其实在X64 OS下使用TCMalloc，必须安装libunwind) 而版本推荐是 0.99</p>
<p>然后，需要创建软连接 ln -s /usr/local/lib/libunwind.so.7 /usr/lib64/</p>
<p>跟着，编辑 mysqld_safe  ，确认在最上一行添加有 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so</p>
<p>最后，重新启动 mysql 并再次用 /usr/sbin/lsof -n | grep tcmalloc 命令检测。</p>
<p>得出结果：</p>
<p>mysqld    27683     mysql  mem       REG                8,1    1675447    9830428 /usr/local/lib/libtcmalloc.so.0.0.0</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/303/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 命令 “ls ” 的用法</title>
		<link>http://www.gzv8.com/archives/267</link>
		<comments>http://www.gzv8.com/archives/267#comments</comments>
		<pubDate>Mon, 15 Mar 2010 06:38:45 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=267</guid>
		<description><![CDATA[ls
　　ls 命令可以说是linux下最常用的命令之一。它有众多的选项，其中有很多是很有用的，你是否熟悉呢？下面列出了 ls 命令的绝大多数选项。
　　-a 列出目录下的所有文件，包括以 . 开头的隐含文件。
　　-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
　　-c 输出文件的 i 节点的修改时间，并以此排序。
　　-d 将目录象文件一样显示，而不是显示其下的文件。
　　-e 输出时间的全部信息，而不是输出简略信息。
　　-f -U 对输出的文件不排序。
　　-g 无用。
　　-i 输出文件的 i 节点的索引信息。
　　-k 以 k 字节的形式表示文件的大小。
　　-l 列出文件的详细信息。
　　-m 横向输出文件名，并以“，”作分格符。
　　-n 用数字的 UID,GID 代替名称。
　　-o 显示文件的除组信息外的详细信息。
　　-p -F 在每个文件名后附上一个字符以说明该文件的类型，“*”表示可执行的普通
　　文件；“/”表示目录；“@”表示符号链接；“&#124;”表示FIFOs；“=”表示套
　　接字(sockets)。
　　-q 用?代替不可输出的字符。
　　-r 对目录反向排序。
　　-s 在每个文件名后输出该文件的大小。
　　-t 以时间排序。
　　-u 以文件上次被访问的时间排序。
　　-x 按列输出，横向排序。
　　-A 显示除 “.”和“..”外的所有文件。
　　-B 不输出以 “~”结尾的备份文件。
　　-C 按列输出，纵向排序。
　　-G 输出文件的组的信息。
　　-L 列出链接文件名而不是链接到的文件。
　　-N 不限制文件长度。
　　-Q 把输出的文件名用双引号括起来。
　　-R 列出所有子目录下的文件。
　　-S 以文件大小排序。
　　-X 以文件的扩展名(最后一个 . 后的字符)排序。
　　-1 一行只输出一个文件。
　　&#8211;color=no 不显示彩色文件名
　　&#8211;help 在标准输出上显示帮助信息。
　　&#8211;version 在标准输出上输出版本信息并退出。
　　只列出子目录
　　1. ls [...]]]></description>
			<content:encoded><![CDATA[<p>ls</p>
<p>　　ls 命令可以说是linux下最常用的命令之一。它有众多的选项，其中有很多是很有用的，你是否熟悉呢？下面列出了 ls 命令的绝大多数选项。</p>
<p>　　-a 列出目录下的所有文件，包括以 . 开头的隐含文件。</p>
<p>　　-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。</p>
<p>　　-c 输出文件的 i 节点的修改时间，并以此排序。</p>
<p>　　-d 将目录象文件一样显示，而不是显示其下的文件。</p>
<p>　　-e 输出时间的全部信息，而不是输出简略信息。</p>
<p>　　-f -U 对输出的文件不排序。</p>
<p>　　-g 无用。</p>
<p>　　-i 输出文件的 i 节点的索引信息。</p>
<p>　　-k 以 k 字节的形式表示文件的大小。</p>
<p>　　-l 列出文件的详细信息。</p>
<p>　　-m 横向输出文件名，并以“，”作分格符。</p>
<p>　　-n 用数字的 UID,GID 代替名称。</p>
<p>　　-o 显示文件的除组信息外的详细信息。</p>
<p>　　-p -F 在每个文件名后附上一个字符以说明该文件的类型，“*”表示可执行的普通</p>
<p>　　文件；“/”表示目录；“@”表示符号链接；“|”表示FIFOs；“=”表示套</p>
<p>　　接字(sockets)。</p>
<p>　　-q 用?代替不可输出的字符。</p>
<p>　　-r 对目录反向排序。</p>
<p>　　-s 在每个文件名后输出该文件的大小。</p>
<p>　　-t 以时间排序。</p>
<p>　　-u 以文件上次被访问的时间排序。</p>
<p>　　-x 按列输出，横向排序。</p>
<p>　　-A 显示除 “.”和“..”外的所有文件。</p>
<p>　　-B 不输出以 “~”结尾的备份文件。</p>
<p>　　-C 按列输出，纵向排序。</p>
<p>　　-G 输出文件的组的信息。</p>
<p>　　-L 列出链接文件名而不是链接到的文件。</p>
<p>　　-N 不限制文件长度。</p>
<p>　　-Q 把输出的文件名用双引号括起来。</p>
<p>　　-R 列出所有子目录下的文件。</p>
<p>　　-S 以文件大小排序。</p>
<p>　　-X 以文件的扩展名(最后一个 . 后的字符)排序。</p>
<p>　　-1 一行只输出一个文件。</p>
<p>　　&#8211;color=no 不显示彩色文件名</p>
<p>　　&#8211;help 在标准输出上显示帮助信息。</p>
<p>　　&#8211;version 在标准输出上输出版本信息并退出。</p>
<p>　　只列出子目录</p>
<p>　　1. ls -F | grep /$ 或者 alias sub = &#8220;ls -F | grep /$&#8221;(linux)</p>
<p>　　2. ls -l | grep &#8220;^d&#8221; 或者 ls -lL | grep &#8220;^d&#8221; (Solaris)</p>
<p>　　计算当前目录下的文件数和目录数</p>
<p>　　下面命令可以分别计算当前目录下的文件和目录个数：</p>
<p>　　# ls -l * |grep &#8220;^-&#8221;|wc -l &#8212;- to count files</p>
<p>　　# ls -l * |grep &#8220;^d&#8221;|wc -l &#8212;&#8211; to count dir</p>
<p>　　显示彩色目录列表</p>
<p>　　打开/etc/bashrc, 加入如下一行:</p>
<p>　　alias ls=&#8221;ls &#8211;color&#8221;</p>
<p>　　下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:</p>
<p>　　1. 蓝色&#8211;&gt;目录</p>
<p>　　2. 绿色&#8211;&gt;可执行文件</p>
<p>　　3. 红色&#8211;&gt;压缩文件</p>
<p>　　4. 浅蓝色&#8211;&gt;链接文件</p>
<p>　　5. 灰色&#8211;&gt;其他文件</p>
<p>　　ls -tl &#8211;time-style=full-iso sshd</p>
<p>　　ls -ctl &#8211;time-style=long-iso</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/267/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql 常用查询语句的笔记 2010.3.15 更新</title>
		<link>http://www.gzv8.com/archives/260</link>
		<comments>http://www.gzv8.com/archives/260#comments</comments>
		<pubDate>Mon, 15 Mar 2010 03:09:23 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[默认分类]]></category>
		<category><![CDATA[select count]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=260</guid>
		<description><![CDATA[一些常用的查询语句：
例一：查询某个表的记录数，以及特定时间内的记录数。(XXX=表)
select count(*) from XXX;  
select count(*) from XXX where stat_date&#62;&#8217;2009-12-15&#8242;;
例子二：替换某个表中特定的字符 (XXX=表，替换字符AAA -&#62; BBB)
update test_tbl set XXX=replace(XXX,&#8217;AAA&#8217;,'BBB&#8217;);
例子三：查询某表，某字段中重复的数据 (XXX=表，XOXO=字段)
Select XOXO,Count(*) From XXX Group By XOXO Having Count(*) &#62; 1
例子四：获取数据库类型，如 InnoDB，MyISAM 等
show variables like &#8216;table_type&#8217;;
############################################
Mysql 常用命令：
select version();
查看版本号
查看支持的表类型
&#62;show variables like &#8216;have%&#8217;;
一、启动与退出
1、进入MySQL：启动MySQL Command Line Client（MySQL的DOS界面），直接输入安装时的密码即可。此时的提示符是：mysql&#62;
2、退出MySQL：quit或exit
二、库操作
1、、创建数据库
命令：create database &#60;数据库名&#62;
例如：建立一个名为xhkdb的数据库
mysql&#62; create database xhkdb;
2、显示所有的数据库
命令：show databases （注意：最后有个s）
mysql&#62; show databases;
3、删除数据库
命令：drop database &#60;数据库名&#62;
例如：删除名为 xhkdb的数据库
mysql&#62; drop database xhkdb;
4、连接数据库
命令： use &#60;数据库名&#62;
例如：如果xhkdb数据库存在，尝试存取它：
mysql&#62; use [...]]]></description>
			<content:encoded><![CDATA[<p><strong>一些常用的查询语句：</strong></p>
<p>例一：查询某个表的记录数，以及特定时间内的记录数。(XXX=表)<br />
select count(*) from XXX;  <br />
select count(*) from XXX where stat_date&gt;&#8217;2009-12-15&#8242;;</p>
<p>例子二：替换某个表中特定的字符 (XXX=表，替换字符AAA -&gt; BBB)<br />
update test_tbl set XXX=replace(XXX,&#8217;AAA&#8217;,'BBB&#8217;);</p>
<p>例子三：查询某表，某字段中重复的数据 (XXX=表，XOXO=字段)<br />
Select XOXO,Count(*) From XXX Group By XOXO Having Count(*) &gt; 1</p>
<p>例子四：获取数据库类型，如 InnoDB，MyISAM 等<br />
show variables like &#8216;table_type&#8217;;</p>
<p>############################################</p>
<p><strong>Mysql 常用命令：</strong></p>
<p>select version();<br />
查看版本号</p>
<p>查看支持的表类型<br />
&gt;show variables like &#8216;have%&#8217;;</p>
<p>一、启动与退出<br />
1、进入MySQL：启动MySQL Command Line Client（MySQL的DOS界面），直接输入安装时的密码即可。此时的提示符是：mysql&gt;<br />
2、退出MySQL：quit或exit<br />
二、库操作<br />
1、、创建数据库<br />
命令：create database &lt;数据库名&gt;<br />
例如：建立一个名为xhkdb的数据库<br />
mysql&gt; create database xhkdb;<br />
2、显示所有的数据库<br />
命令：show databases （注意：最后有个s）<br />
mysql&gt; show databases;<br />
3、删除数据库<br />
命令：drop database &lt;数据库名&gt;<br />
例如：删除名为 xhkdb的数据库<br />
mysql&gt; drop database xhkdb;<br />
4、连接数据库<br />
命令： use &lt;数据库名&gt;<br />
例如：如果xhkdb数据库存在，尝试存取它：<br />
mysql&gt; use xhkdb;<br />
屏幕提示：Database changed<br />
5、当前选择（连接）的数据库<br />
mysql&gt; select database();<br />
6、当前数据库包含的表信息：<br />
mysql&gt; show tables; （注意：最后有个s）<br />
三、表操作，操作之前应连接某个数据库<br />
1、建表<br />
命令：create table &lt;表名&gt; ( &lt;字段名1&gt; &lt;类型1&gt; [,..&lt;字段名n&gt; &lt;类型n&gt;]);<br />
例如，建立一个名为MyClass的表，<br />
字段名 数字类型 数据宽度 是否为空 是否主键 自动增加 默认值<br />
id int 4 否 primary key auto_increment  <br />
name char 20 否      <br />
sex int 4 否     0<br />
degree double 16 是      </p>
<p>mysql&gt; create table MyClass(<br />
&gt; id int(4) not null primary key auto_increment,<br />
&gt; name char(20) not null,<br />
&gt; sex int(4) not null default &#8216;0&#8242;,<br />
&gt; degree double(16,2));<br />
2、获取表结构<br />
命令： desc 表名，或者show columns from 表名<br />
 <br />
mysql&gt; desc MyClass;<br />
mysql&gt; show columns from MyClass;<br />
3、删除表<br />
命令：drop table &lt;表名&gt;<br />
例如：删除表名为 MyClass 的表<br />
mysql&gt; drop table MyClass;<br />
4、插入数据<br />
命令：insert into &lt;表名&gt; [( &lt;字段名1&gt;[,..&lt;字段名n &gt; ])] values ( 值1 )[, ( 值n )]<br />
例如，往表 MyClass中插入二条记录, 这二条记录表示：编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99， 编号为3 的名为Wang 的成绩为96.5.<br />
mysql&gt; insert into MyClass values(1,&#8217;Tom&#8217;,96.45),(2,&#8217;Joan&#8217;,82.99), (2,&#8217;Wang&#8217;, 96.59);<br />
5、查询表中的数据<br />
1)、查询所有行<br />
命令： select &lt;字段1，字段2，&#8230;&gt; from &lt; 表名 &gt; where &lt; 表达式 &gt;<br />
例如：查看表 MyClass 中所有数据<br />
mysql&gt; select * from MyClass;<br />
2）、查询前几行数据<br />
例如：查看表 MyClass 中前2行数据<br />
mysql&gt; select * from MyClass order by id limit 0,2;<br />
6、删除表中数据<br />
命令：delete from 表名 where 表达式<br />
例如：删除表 MyClass中编号为1 的记录<br />
mysql&gt; delete from MyClass where id=1;<br />
7、修改表中数据：update 表名 set 字段=新值,… where 条件<br />
mysql&gt; update MyClass set name=&#8217;Mary&#8217; where id=1;<br />
7、在表中增加字段：<br />
命令：alter table 表名 add字段 类型 其他;<br />
例如：在表MyClass中添加了一个字段passtest，类型为int(4)，默认值为0<br />
mysql&gt; alter table MyClass add passtest int(4) default &#8216;0&#8242;<br />
8、更改表名：<br />
命令：rename table 原表名 to 新表名;<br />
例如：在表MyClass名字更改为YouClass<br />
mysql&gt; rename table MyClass to YouClass;<br />
9、<br />
 <br />
字段类型<br />
1．INT[(M)] 型： 正常大小整数类型<br />
2．DOUBLE[(M,D)] [ZEROFILL] 型： 正常大小(双精密)浮点数字类型<br />
3．DATE 日期类型：支持的范围是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式来显示DATE值，但是允许你使用字符串或数字把值赋给DATE列<br />
4．CHAR(M) 型：定长字符串类型，当存储时，总是是用空格填满右边到指定的长度<br />
5．BLOB TEXT类型，最大长度为65535(2^16-1)个字符。<br />
6．VARCHAR型：变长字符串类型</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/260/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让 Cacti 为的 Mysql 提供专业的性能监控支持。</title>
		<link>http://www.gzv8.com/archives/235</link>
		<comments>http://www.gzv8.com/archives/235#comments</comments>
		<pubDate>Thu, 11 Mar 2010 07:38:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Better Cacti Templates]]></category>
		<category><![CDATA[图表]]></category>
		<category><![CDATA[监控]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=235</guid>
		<description><![CDATA[如果说 Mysql Enterprise 跟普通“民用”版有啥不一样？
细节的可能也会有一堆，但最明显的，莫过于其内置有专门性能监控页面。
让你洞悉每次调整后对性能的影响，或者当前数据库的压力情况。
“民用”版本一直都无法享受到这番待遇。直到 Better Cacti Templates 的出现。
呼，我写了好几篇关于 Cacti 的文章，也有好多朋友为此资讯了我很多问题。
第一次看到本文的朋友们可能对 Cacti 还不大了解。它是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。它通过snmpget来获取数据，并使用 RRDtool绘画图形。详细可参阅：http://www.oschina.net/p/cacti
但其运行的环境依赖 Apache + php + Mysql + Snmp 所以如果如果单是为了这个监控工具来搭建运行环境的话可有点心理准备。Linux 下 LAMP 环境的搭建可真会难道不少新手。而且如果是纯粹为了Cacti而搭建php环境，也有点浪费系统资源，不大合乎实际。
但当然了，如果你使用 Cacti 来监控数十数百计的服务器。这点操劳可完全值得！
下边入正题，在已经正常运作的 Cacti 系统上增加《Better Cacti Templates》包含的Mysql 监控模块。
可让Cacti立即变成一个专业的Mysql监控器。让“民用”版本的Mysql也能有完整的性能数值图表系统。
安装方法如下：
1，首先到该地址下载最新版：http://code.google.com/p/mysql-cacti-templates/downloads/list 
2，下载到服务器后解压：# tar zxvf better-cacti-templates-1.1.6.tar.gz
3，解压后进入目录：# cd better-cacti-templates-1.1.6
4，复制 # better-cacti-templates-1.1.6/scripts 目录中所有文件到Cacti安装目录中的scripts 下(举例)：
# cp ./scripts/* /data/web_server/admin/cacti/scripts/
5，复制完毕后，再进入 # better-cacti-templates-1.1.6/templates 目录，把里边的
# cacti_host_template_x_mysql_server_ht_0.8.6i-sver1.1.6.xml 下载到本地。
6，打开并登陆 cacti 管理界面 ，然后在理面板中导入刚才下载的xml文件。
当出现以下信息时代表模板导入已经建造成功：
Cacti has imported the following [...]]]></description>
			<content:encoded><![CDATA[<p>如果说 Mysql Enterprise 跟普通“民用”版有啥不一样？<br />
细节的可能也会有一堆，但最明显的，莫过于其内置有专门性能监控页面。<br />
让你洞悉每次调整后对性能的影响，或者当前数据库的压力情况。<br />
“民用”版本一直都无法享受到这番待遇。直到 Better Cacti Templates 的出现。</p>
<p>呼，我写了好几篇关于 Cacti 的文章，也有好多朋友为此资讯了我很多问题。<br />
第一次看到本文的朋友们可能对 Cacti 还不大了解。它是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。它通过snmpget来获取数据，并使用 RRDtool绘画图形。详细可参阅：<a href="http://www.oschina.net/p/cacti">http://www.oschina.net/p/cacti</a><br />
但其运行的环境依赖 Apache + php + Mysql + Snmp 所以如果如果单是为了这个监控工具来搭建运行环境的话可有点心理准备。Linux 下 LAMP 环境的搭建可真会难道不少新手。而且如果是纯粹为了Cacti而搭建php环境，也有点浪费系统资源，不大合乎实际。</p>
<p>但当然了，如果你使用 Cacti 来监控数十数百计的服务器。这点操劳可完全值得！</p>
<p>下边入正题，在已经正常运作的 Cacti 系统上增加《Better Cacti Templates》包含的Mysql 监控模块。<br />
可让Cacti立即变成一个专业的Mysql监控器。让“民用”版本的Mysql也能有完整的性能数值图表系统。</p>
<p>安装方法如下：</p>
<p>1，首先到该地址下载最新版：<a href="http://code.google.com/p/mysql-cacti-templates/downloads/list">http://code.google.com/p/mysql-cacti-templates/downloads/list</a> <br />
2，下载到服务器后解压：# tar zxvf better-cacti-templates-1.1.6.tar.gz<br />
3，解压后进入目录：# cd better-cacti-templates-1.1.6<br />
4，复制 # better-cacti-templates-1.1.6/scripts 目录中所有文件到Cacti安装目录中的scripts 下(举例)：<br />
# cp ./scripts/* /data/web_server/admin/cacti/scripts/</p>
<p>5，复制完毕后，再进入 # better-cacti-templates-1.1.6/templates 目录，把里边的<br />
# cacti_host_template_x_mysql_server_ht_0.8.6i-sver1.1.6.xml 下载到本地。</p>
<p>6，打开并登陆 cacti 管理界面 ，然后在理面板中导入刚才下载的xml文件。<br />
当出现以下信息时代表模板导入已经建造成功：</p>
<p>Cacti has imported the following items: <br />
 <br />
CDEF <br />
[success] X Negate CDEF [new] <br />
 <br />
GPRINT Preset <br />
[success] X MySQL Server Version t1.1.4:s1.1.4 [new] <br />
[success] X Normal [new] <br />
 <br />
Data Input Method <br />
[success] X Get MySQL Stats/MyISAM Indexes IM [new] <br />
&#8230; snip &#8230; <br />
 <br />
Data Template <br />
[success] X MyISAM Indexes DT [new] <br />
&#8230; snip &#8230; <br />
 <br />
Graph Template <br />
[success] X MyISAM Indexes GT [new] <br />
&#8230; snip &#8230; <br />
 <br />
Host Template <br />
[success] X MySQL Server HT [new]</p>
<p>然后就可以到Cacti中所需监控 Mysql 备中添加 Mysql 计量模板</p>
<p>步骤跟之前写的一篇关于 Cacti 增加 <strong>NginxStatus</strong>  监控的方式差不多。这里我就不周章篇幅了。<br />
大家可以参阅：<a href="http://www.oschina.net/bbs/thread/279">http://www.oschina.net/bbs/thread/279</a><br />
而且还有好几十个数据计量模板可供选择。</p>
<p>图形效果：</p>
<p> <img src="http://www.oschina.net/uploads/bbs/2010/0305/123025_QyKe_0.jpg" alt="" /></p>
<p><img src="http://www.oschina.net/uploads/bbs/2010/0305/123041_ySWX_0.jpg" alt="" /></p>
<p><img src="http://www.oschina.net/uploads/bbs/2010/0305/123053_rGWD_0.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/235/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solaris 10 下安装 MySQL 5.1.x</title>
		<link>http://www.gzv8.com/archives/135</link>
		<comments>http://www.gzv8.com/archives/135#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:53:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux & Unix]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[Solaris]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=135</guid>
		<description><![CDATA[Solaris版本：Sun OS 5.11 snv_50 64bit
MySQL版本：5.1.37
1. 下载MySQL
下载页面：http://dev.mysql.com/downloads/mysql/5.1.html#solaris-pgadd
选择对应的Solaris版本，我的是 Solaris 10 (SPARC, 64-bit)
或者直接访问找下载镜像：http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.37-solaris10-sparc-64bit.pkg.gz/from/http://gd.tuwien.ac.at/db/mysql/
2. 解包MySQL
转到下载目录
# gunzip -d mysql-standard-5.0.27-solaris10-x86_64.pkg.gz
3. 创建mysql的用户组和用户
# groupadd mysql
# useradd -G mysql mysql
4. 使用pkgadd安装MySQL包
# pkgadd -d mysql-standard-5.0.27-solaris10-x86_64.pkg
安装后的MySQL位于/opt/mysql/mysql目录下
5. 在目录/etc下创建文件my.cnf文件，内容如下
[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data
6. 运行MySQL的post-install文件，创建数据库repository
# cd /opt/mysql/mysql
# ./scripts/mysql_install_db &#8211;defaults-file=/etc/my.cnf &#8211;user=mysql
7. 启动MySQL
# cd /opt/mysql/mysql
# ./bin/mysqld_safe &#8211;defaults-file=/etc/my.cnf &#8211;user=mysql
也可以使用如下的方法来启动MySQL
# /etc/init.d/mysql start
8. 更改MySQL root用户的口令
# /opt/mysql/mysql/bin/mysqladmin -u root password &#8216;new-password&#8217;
# /opt/mysql/mysql/bin/mysqladmin -u root -h 机器名称 password &#8216;new-password&#8217;
9. 登录MySQL命令行
# [...]]]></description>
			<content:encoded><![CDATA[<p>Solaris版本：Sun OS 5.11 snv_50 64bit<br />
MySQL版本：5.1.37</p>
<p>1. 下载MySQL<br />
下载页面：<a href="http://dev.mysql.com/downloads/mysql/5.1.html#solaris-pgadd">http://dev.mysql.com/downloads/mysql/5.1.html#solaris-pgadd</a><a href="http://dev.mysql.com/downloads/mysql/5.0.html#downloads"></a><br />
选择对应的Solaris版本，我的是 Solaris 10 (SPARC, 64-bit)<br />
或者直接访问找下载镜像：<a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.37-solaris10-sparc-64bit.pkg.gz/from/http://gd.tuwien.ac.at/db/mysql/">http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.37-solaris10-sparc-64bit.pkg.gz/from/http://gd.tuwien.ac.at/db/mysql/</a><a href="http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-standard-5.0.27-solaris10-x86_64.pkg.gz/from/pick"></a></p>
<p>2. 解包MySQL<br />
转到下载目录<br />
# gunzip -d mysql-standard-5.0.27-solaris10-x86_64.pkg.gz</p>
<p>3. 创建mysql的用户组和用户<br />
# groupadd mysql<br />
# useradd -G mysql mysql</p>
<p>4. 使用pkgadd安装MySQL包<br />
# pkgadd -d mysql-standard-5.0.27-solaris10-x86_64.pkg<br />
安装后的MySQL位于/opt/mysql/mysql目录下</p>
<p>5. 在目录/etc下创建文件my.cnf文件，内容如下<br />
[mysqld]<br />
basedir=/opt/mysql/mysql<br />
datadir=/opt/mysql/mysql/data</p>
<p>6. 运行MySQL的post-install文件，创建数据库repository<br />
# cd /opt/mysql/mysql<br />
# ./scripts/mysql_install_db &#8211;defaults-file=/etc/my.cnf &#8211;user=mysql</p>
<p>7. 启动MySQL<br />
# cd /opt/mysql/mysql<br />
# ./bin/mysqld_safe &#8211;defaults-file=/etc/my.cnf &#8211;user=mysql</p>
<p>也可以使用如下的方法来启动MySQL<br />
# /etc/init.d/mysql start</p>
<p>8. 更改MySQL root用户的口令<br />
# /opt/mysql/mysql/bin/mysqladmin -u root password &#8216;new-password&#8217;<br />
# /opt/mysql/mysql/bin/mysqladmin -u root -h 机器名称 password &#8216;new-password&#8217;</p>
<p>9. 登录MySQL命令行<br />
# mysql -p<br />
输入新的密码</p>
<p>9. 停止MySQL<br />
# /etc/init.d/mysql stop</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/135/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 的备份（mysqldump）</title>
		<link>http://www.gzv8.com/archives/74</link>
		<comments>http://www.gzv8.com/archives/74#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:10:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[mysqldump]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=74</guid>
		<description><![CDATA[本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：MyISAM 和 Innodb，文中设计的 MySQL 版本为 5.0.22。
目前 MySQL 支持的免费备份工具有：mysqldump、mysqlhotcopy，还可以用 SQL 语法进行备份：BACKUP TABLE 或者 SELECT INTO OUTFILE，又或者备份二进制日志（binlog），还可以是直接拷贝数据文件和相关的配置文件。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。Innodb 所有的表都保存在同一个数据文件 ibdata1 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是拷贝数据文件、备份 binlog，或者用 mysqldump。
1、mysqldump
1.1 备份
mysqldump 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。
现在来讲一下 mysqldump 的一些主要参数：

&#8211;compatible=name它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。
&#8211;complete-insert，-c导出的数据采用包含字段名的完整 INSERT 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。
&#8211;default-character-set=charset指定导出数据时采用何种字符集，如果数据表不是采用默认的 latin1 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。
&#8211;disable-keys告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 [...]]]></description>
			<content:encoded><![CDATA[<p>本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：<code>MyISAM</code> 和 <code>Innodb</code>，文中设计的 MySQL 版本为 5.0.22。</p>
<p>目前 MySQL 支持的免费备份工具有：<code>mysqldump、mysqlhotcopy</code>，还可以用 SQL 语法进行备份：<code>BACKUP TABLE</code> 或者 <code>SELECT INTO OUTFILE</code>，又或者备份<code>二进制日志（binlog）</code>，还可以是<code>直接拷贝数据文件和相关的配置文件</code>。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。<code>Innodb</code> 所有的表都保存在同一个数据文件 <code>ibdata1</code> 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是<code>拷贝数据文件</code>、<code>备份 binlog</code>，或者用 <code>mysqldump</code>。</p>
<h3>1、mysqldump</h3>
<h4>1.1 备份</h4>
<p><code>mysqldump</code> 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。<br />
现在来讲一下 <code>mysqldump</code> 的一些主要参数：</p>
<ul type="1">
<li>&#8211;compatible=name它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 <code>ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options</code> 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。</li>
<li>&#8211;complete-insert，-c导出的数据采用包含字段名的完整 <code>INSERT</code> 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 <code>max_allowed_packet</code> 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。</li>
<li>&#8211;default-character-set=charset指定导出数据时采用何种字符集，如果数据表不是采用默认的 <code>latin1</code> 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。</li>
<li>&#8211;disable-keys告诉 <code>mysqldump</code> 在 <code>INSERT</code> 语句的开头和结尾增加 <code>/*!40000 ALTER TABLE table DISABLE KEYS */;</code> 和 <code>/*!40000 ALTER TABLE table ENABLE KEYS */;</code> 语句，这能大大提高插入语句的速度，因为它是在插入完所有数据后才重建索引的。该选项只适合 <code>MyISAM</code> 表。</li>
<li>&#8211;extended-insert = true|false默认情况下，<code>mysqldump</code> 开启 <code>--complete-insert</code> 模式，因此不想用它的的话，就使用本选项，设定它的值为 <code>false</code> 即可。</li>
<li>&#8211;hex-blob使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 <code>BINARY、VARBINARY、BLOB</code>。</li>
<li>&#8211;lock-all-tables，-x在开始导出之前，提交请求锁定所有数据库中的所有表，以保证数据的一致性。这是一个全局读锁，并且自动关闭 <code>--single-transaction</code> 和 <code>--lock-tables</code> 选项。</li>
<li>&#8211;lock-tables它和 <code>--lock-all-tables</code> 类似，不过是锁定当前导出的数据表，而不是一下子锁定全部库下的表。本选项只适用于 <code>MyISAM</code> 表，如果是 <code>Innodb</code> 表可以用 <code>--single-transaction</code> 选项。</li>
<li>&#8211;no-create-info，-t只导出数据，而不添加 <code>CREATE TABLE</code> 语句。</li>
<li>&#8211;no-data，-d不导出任何数据，只导出数据库表结构。</li>
<li>&#8211;opt这只是一个快捷选项，等同于同时添加 <code>--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset</code> 选项。本选项能让 <code>mysqldump</code> 很快的导出数据，并且导出的数据能很快导回。该选项默认开启，但可以用 <code>--skip-opt</code> 禁用。注意，如果运行 <code>mysqldump</code> 没有指定 <code>--quick</code> 或 <code>--opt</code> 选项，则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。</li>
<li>&#8211;quick，-q该选项在导出大表时很有用，它强制 <code>mysqldump</code> 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。</li>
<li>&#8211;routines，-R导出存储过程以及自定义函数。</li>
<li>&#8211;single-transaction该选项在导出数据之前提交一个 <code>BEGIN</code> SQL语句，<code>BEGIN</code> 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表，例如 <code>InnoDB</code> 和 <code>BDB</code>。<br />
本选项和 <code>--lock-tables</code> 选项是互斥的，因为 <code>LOCK TABLES</code> 会使任何挂起的事务隐含提交。<br />
要想导出大表的话，应结合使用 <code>--quick</code> 选项。</li>
<li>&#8211;triggers同时导出触发器。该选项默认启用，用 <code>--skip-triggers</code> 禁用它。</li>
</ul>
<p>其他参数详情请参考手册，我通常使用以下 SQL 来备份 <code>MyISAM</code> 表：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name &gt; db_name.sql</pre>
<p>使用以下 SQL 来备份 <code>Innodb</code> 表：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name &gt; db_name.sql</pre>
<p>另外，如果想要实现在线备份，还可以使用 <code>--master-data</code> 参数来实现，如下：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --master-data=1 \
--single-transaction --flush-logs db_name &gt; db_name.sql</pre>
<p>它只是在一开始的瞬间请求锁表，然后就刷新binlog了，而后在导出的文件中加入<code>CHANGE MASTER</code> 语句来指定当前备份的binlog位置，如果要把这个文件恢复到slave里去，就可以采用这种方法来做。</p>
<h4>1.2 还原</h4>
<p>用 <code>mysqldump</code> 备份出来的文件是一个可以直接倒入的 SQL 脚本，有两种方法可以将数据导入。</p>
<ul type="1">
<li>直接用 <code>mysql</code> 客户端例如：
<pre>/usr/local/mysql/bin/mysql -uyejr -pyejr db_name &lt; db_name.sql</pre>
<p> </li>
<li>用 SOURCE 语法其实这不是标准的 SQL 语法，而是 <code>mysql</code> 客户端提供的功能，例如：
<pre>SOURCE /tmp/db_name.sql;</pre>
<p>这里需要指定文件的绝对路径，并且必须是 <code>mysqld</code> 运行用户(例如 nobody)有权限读取的文件。</li>
</ul>
<h3>2、 mysqlhotcopy</h3>
<h4>2.1 备份</h4>
<p><code>mysqlhotcopy</code> 是一个 PERL 程序，最初由Tim Bunce编写。它使用 <code>LOCK TABLES、FLUSH TABLES</code> 和 <code>cp</code> 或 <code>scp</code> 来快速备份数据库。它是备份数据库或单个表的最快的途径，但它只能运行在数据库文件（包括数据表定义文件、数据文件、索引文件）所在的机器上。<code>mysqlhotcopy</code> 只能用于备份 <code>MyISAM</code>，并且只能运行在 <code>类Unix</code> 和 <code>NetWare</code> 系统上。</p>
<p><code>mysqlhotcopy</code> 支持一次性拷贝多个数据库，同时还支持正则表达。以下是几个例子：</p>
<pre>root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name /tmp (把数据库目录 <tt>db_name</tt> 拷贝到 <tt>/tmp</tt> 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr \
db_name./regex/ /tmp</pre>
<p>更详细的使用方法请查看手册，或者调用下面的命令来查看 <code>mysqlhotcopy</code> 的帮助：</p>
<pre>perldoc /usr/local/mysql/bin/mysqlhotcopy</pre>
<p>注意，想要使用 <code>mysqlhotcopy</code>，必须要有 <code>SELECT、RELOAD(要执行 FLUSH TABLES)</code> 权限，并且还必须要能够有读取 <tt>datadir/db_name</tt> 目录的权限。</p>
<h4>2.2 还原</h4>
<p><code>mysqlhotcopy</code> 备份出来的是整个数据库目录，使用时可以直接拷贝到 <code>mysqld</code> 指定的 <tt>datadir</tt> (在这里是 <tt>/usr/local/mysql/data/</tt>)目录下即可，同时要注意权限的问题，如下例：</p>
<pre>root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 <code>mysqld</code> 运行用户)</pre>
<p> </p>
<h3>3、 SQL 语法备份</h3>
<h4>3.1 备份</h4>
<p><code>BACKUP TABLE</code> 语法其实和 <code>mysqlhotcopy</code> 的工作原理差不多，都是锁表，然后拷贝数据文件。它能实现在线备份，但是效果不理想，因此不推荐使用。它只拷贝表结构文件和数据文件，不同时拷贝索引文件，因此恢复时比较慢。<br />
例子：</p>
<pre>BACK TABLE tbl_name TO '/tmp/db_name/';</pre>
<p>注意，必须要有 <code>FILE</code> 权限才能执行本SQL，并且目录 <tt>/tmp/db_name/</tt> 必须能被 <code>mysqld</code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。</p>
<p><code>SELECT INTO OUTFILE</code> 则是把数据导出来成为普通的文本文件，可以自定义字段间隔的方式，方便处理这些数据。<br />
例子：</p>
<pre>SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;</pre>
<p>注意，必须要有 <code>FILE</code> 权限才能执行本SQL，并且文件 <tt>/tmp/db_name/tbl_name.txt</tt> 必须能被 <code>mysqld</code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。</p>
<h4>3.2 恢复</h4>
<p>用 <code>BACKUP TABLE</code> 方法备份出来的文件，可以运行 <code>RESTORE TABLE</code> 语句来恢复数据表。<br />
例子：</p>
<pre>RESTORE TABLE FROM '/tmp/db_name/';</pre>
<p>权限要求类似上面所述。</p>
<p>用 <code>SELECT INTO OUTFILE</code> 方法备份出来的文件，可以运行 <code>LOAD DATA INFILE</code> 语句来恢复数据表。<br />
例子：</p>
<pre>LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;</pre>
<p>权限要求类似上面所述。倒入数据之前，数据表要已经存在才行。如果担心数据会发生重复，可以增加 <code>REPLACE</code> 关键字来替换已有记录或者用 <code>IGNORE</code> 关键字来忽略他们。</p>
<h3>4、 启用二进制日志(binlog)</h3>
<p>采用 <code>binlog</code> 的方法相对来说更灵活，省心省力，而且还可以支持增量备份。</p>
<p>启用 <code>binlog</code> 时必须要重启 <code>mysqld</code>。首先，关闭 <code>mysqld</code>，打开 <code>my.cnf</code>，加入以下几行：</p>
<pre>server-id = 1
log-bin  = binlog
log-bin-index = binlog.index</pre>
<p>然后启动 <code>mysqld</code> 就可以了。运行过程中会产生 <code>binlog.000001</code> 以及 <code>binlog.index</code>，前面的文件是 <code>mysqld</code> 记录所有对数据的更新操作，后面的文件则是所有 <code>binlog</code> 的索引，都不能轻易删除。关于 <code>binlog</code> 的信息请查看手册。</p>
<p>需要备份时，可以先执行一下 SQL 语句，让 <code>mysqld</code> 终止对当前 <code>binlog</code> 的写入，就可以把文件直接备份，这样的话就能达到增量备份的目的了：</p>
<pre>FLUSH LOGS;</pre>
<p>如果是备份复制系统中的从服务器，还应该备份 <tt>master.info</tt> 和 <tt>relay-log.info</tt> 文件。</p>
<p>备份出来的 <code>binlog</code> 文件可以用 MySQL 提供的工具 <code>mysqlbinlog</code> 来查看，如：</p>
<pre>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001</pre>
<p>该工具允许你显示指定的数据库下的所有 SQL 语句，并且还可以限定时间范围，相当的方便，详细的请查看手册。</p>
<p>恢复时，可以采用类似以下语句来做到：</p>
<pre>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name</pre>
<p>把 <code>mysqlbinlog</code> 输出的 SQL 语句直接作为输入来执行它。</p>
<p>如果你有空闲的机器，不妨采用这种方式来备份。由于作为 <code>slave</code> 的机器性能要求相对不是那么高，因此成本低，用低成本就能实现增量备份而且还能分担一部分数据查询压力，何乐而不为呢？</p>
<h3>5、 直接备份数据文件</h3>
<p>相较前几种方法，备份数据文件最为直接、快速、方便，缺点是基本上不能实现增量备份。为了保证数据的一致性，需要在靠背文件前，执行以下 SQL 语句：</p>
<pre>FLUSH TABLES WITH READ LOCK;</pre>
<p>也就是把内存中的数据都刷新到磁盘中，同时锁定数据表，以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单，直接拷贝回原来的数据库目录下即可。</p>
<p>注意，对于 <code>Innodb</code> 类型表来说，还需要备份其日志文件，即 <code>ib_logfile*</code> 文件。因为当 <code>Innodb</code> 表损坏时，就可以依靠这些日志文件来恢复。</p>
<h3>6、 备份策略</h3>
<p>对于中等级别业务量的系统来说，备份策略可以这么定：第一次全量备份，每天一次增量备份，每周再做一次全量备份，如此一直重复。而对于重要的且繁忙的系统来说，则可能需要每天一次全量备份，每小时一次增量备份，甚至更频繁。为了不影响线上业务，实现在线备份，并且能增量备份，最好的办法就是采用主从复制机制(<code>replication</code>)，在 <code>slave</code> 机器上做备份。</p>
<h3>7、 数据维护和灾难恢复</h3>
<p>作为一名DBA(我目前还不是，呵呵)，最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此，需要定期维护你的数据表。以下 SQL 语句就很有用：</p>
<pre>CHECK TABLE 或 REPAIR TABLE，检查或维护 MyISAM 表
OPTIMIZE TABLE，优化 MyISAM 表
ANALYZE TABLE，分析 MyISAM 表</pre>
<p>当然了，上面这些命令起始都可以通过工具 <code>myisamchk</code> 来完成，在这里不作详述。</p>
<p><code>Innodb</code> 表则可以通过执行以下语句来整理碎片，提高索引速度：</p>
<pre>ALTER TABLE tbl_name ENGINE = Innodb;</pre>
<p>这其实是一个 <code>NULL</code> 操作，表面上看什么也不做，实际上重新整理碎片了。</p>
<p>通常使用的 <code>MyISAM</code> 表可以用上面提到的恢复方法来完成。如果是索引坏了，可以用 <code>myisamchk</code> 工具来重建索引。而对于 <code>Innodb</code> 表来说，就没这么直接了，因为它把所有的表都保存在一个表空间了。不过 <code>Innodb</code> 有一个检查机制叫 <code>模糊检查点</code>，只要保存了日志文件，就能根据日志文件来修复错误。可以在 <tt>my.cnf</tt> 文件中，增加以下参数，让 <code>mysqld</code> 在启动时自动检查日志文件：</p>
<pre>innodb_force_recovery = 4</pre>
<p>关于该参数的信息请查看手册。</p>
<h3>8、 总结</h3>
<p>做好数据备份，定只好合适的备份策略，这是一个DBA所做事情的一小部分，万事开头难，就从现在开始吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/74/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

