<?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/"
	>

<channel>
	<title>OurMySQL</title>
	<atom:link href="http://ourmysql.com/feed" rel="self" type="application/rss+xml" />
	<link>http://ourmysql.com</link>
	<description>我们致力于一个MySQL知识的分享网站</description>
	<pubDate>Mon, 30 Aug 2010 08:14:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>InnoDB主键设计</title>
		<link>http://ourmysql.com/archives/845</link>
		<comments>http://ourmysql.com/archives/845#comments</comments>
		<pubDate>Wed, 04 Aug 2010 05:57:29 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL优化设计]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[主键]]></category>

		<guid isPermaLink="false">http://ourmysql.com/?p=845</guid>
		<description><![CDATA[众所周知，InnoDB是clustered-index table，因此对于InnoDB而言，主键具有特殊意义。可以通过主键直接定位到对应的某一数据行记录的物理位置，主键索引指向对应行记录，其他索引则都指向主键索引；因此，可以这么说，InnoDB其实就是一个 B-树索引，这棵B-树的索引就是主键，它的值则是对应的行记录。]]></description>
			<content:encoded><![CDATA[<p>众所周知，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>是clustered-index table，因此对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>而言，主键具有特殊意义。可以通过主键直接定位到对应的某一数据行记录的物理位置，主键索引指向对应行记录，其他索引则都指向主键索引；因此，可以这么说，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>其实就是一个 B-树索引，这棵B-树的索引就是主键，它的值则是对应的行记录。<br />
在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>数据表设计中，我们需要注意几点：</p>
<ul>
<li>1. 显式的定义一个 INT 类型自增字段的主键，这个字段可以仅用于做主键，不做其他用途</li>
<li>2. 如果不显式定义主键的话，可能会导致<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>每次都需要对新数据行进行排序，严重损害性能</li>
<li>3. 尽量保证不对主键字段进行更新修改，防止主键字段发生变化，引发数据存储碎片，降低IO性能</li>
<li>4. 如果需要对主键字段进行更新，请将该字段转变成一个唯一索引约束字段，另外创建一个没有其他业务意义的自增字段做主键</li>
<li>5. 主键字段类型尽可能小，能用SMALLINT就不用INT，能用INT就不用BIGINT</li>
<li>6. 主键字段放在数据表的第一顺序</li>
</ul>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/optimize" title="MySQL优化设计" rel="tag">MySQL优化设计</a>, <a href="http://ourmysql.com/archives/tag/%e4%b8%bb%e9%94%ae" title="主键" rel="tag">主键</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/845/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Query Cache 小结</title>
		<link>http://ourmysql.com/archives/843</link>
		<comments>http://ourmysql.com/archives/843#comments</comments>
		<pubDate>Mon, 05 Jul 2010 02:07:46 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL优化设计]]></category>

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

		<category><![CDATA[字符集]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=834</guid>
		<description><![CDATA[老版网站系统的mysql数据库dnname采用默认的latin1字符集，系统升级需要将所有数据转换成utf-8格式，目标数据库为newdbname(建库时使用utf8)]]></description>
			<content:encoded><![CDATA[<p>老版网站系统的mysql数据库dnname采用默认的latin1字符集，系统升级需要将所有数据转换成utf-8格式，目标数据库为newdbname(建库时使用utf8)</p>
<p>方法一：</p>
<p>步骤一 命令行执行：<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a> &#8211;<a href="http://ourmysql.com/archives/tag/opt" class="st_tag internal_tag" rel="tag" title="标签 opt 下的日志">opt</a> -hlocalhost -uroot -p*** &#8211;default-character-set=latin1 dbname &gt; /usr/local/dbname.sql</p>
<p>步骤二 将 dbname.sql文件中的create table语句的CHARSET=latin1改为CHARSET=utf8</p>
<p>步骤三 在dbname.sql文件中的insert语句之前加一条&#8217;set names utf8;&#8217;</p>
<p>步骤四 将dbname.sql转码为utf-8格式，建议使用UltraEditor，可以直接使用该编辑器的&#8217;转换-&gt;ASCII到UTF-8(Unicode编辑)&#8217;，或者将文件另存为UTF-8(无BOM)格式</p>
<p>步骤五 命令行执行：mysql -hlocalhost -uroot -p*** &#8211;default-character-set=utf8 new_dbname &lt; /usr/local/dbname.sql</p>
<p>总结：这种方法有个致命之处就是当数据中有大量中文字符和其他特殊符号字符时，很有可能导致在[步骤五]时报错导致无法正常导入数据，如果数据库比较大可以分别对每张表执行上述步骤</p>
<p>方法二（推荐大家使用）：</p>
<p>为了解决第一种方法中总结时说到的问题，在网上苦苦查找了一天资料才东拼西凑的搞出一个比较稳妥的解决方法</p>
<p>步骤一 将待导出的数据表的表结构导出（可以用Phpmyadmin、<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>等，很简单就不说了），然后将导出的create table语句的CHARSET=latin1改为CHARSET=utf8，在目标库newdbname中执行该create table语句把表结构建好，接下来开始导出-导入数据</p>
<p>步骤二 命令行：进入mysql命令行下，mysql -hlocalhost -uroot -p*** dbname</p>
<p>步骤三 执行SQL select * from tbname into outfile &#8216;/usr/local/tbname.sql&#8217;;</p>
<p>步骤四 将tbname.sql转码为utf-8格式，建议使用UltraEditor，可以直接使用该编辑器的&#8217;转换-&gt;ASCII到UTF-8(Unicode编辑)&#8217;，或者将文件另存为UTF-8(无BOM)格式</p>
<p>步骤五 在mysql命令行下执行语句 set character_set_database=utf8;  注：设置mysql的环境变量，这样mysql在下一步读取sql文件时将以utf8的形式去解释该文件内容</p>
<p>步骤六 在mysql命令行下执行语句 load data infile &#8216;tbname.sql&#8217; into table newdbname.tbname;</p>
<p>注意：千万不要忘了第四步</p>
<p>采用第二种方法，所有数据均正常导入，且格式转换成功没有乱码</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-02-07 -- <a href="http://ourmysql.com/archives/808" title="MySQL库目录下db.opt文件的作用">MySQL库目录下db.opt文件的作用</a></li><li>2009-07-15 -- <a href="http://ourmysql.com/archives/625" title="数据库字符集修改">数据库字符集修改</a></li><li>2008-12-15 -- <a href="http://ourmysql.com/archives/342" title="调用存储过程时报错:Illegal mix of collations">调用存储过程时报错:Illegal mix of collations</a></li><li>2008-12-03 -- <a href="http://ourmysql.com/archives/314" title="深入Mysql字符集设置">深入Mysql字符集设置</a></li><li>2008-09-21 -- <a href="http://ourmysql.com/archives/53" title="如何更改MySQL的默认字符集">如何更改MySQL的默认字符集</a></li><li>2008-09-21 -- <a href="http://ourmysql.com/archives/49" title="小谈MySQL字符集">小谈MySQL字符集</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/44" title="mysql连接通道中的字符集和校验规则">mysql连接通道中的字符集和校验规则</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/41" title="mysql字符集与校验规则的设置">mysql字符集与校验规则的设置</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/38" title="mysql的字符集与校验规则概念小介">mysql的字符集与校验规则概念小介</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/category/debug" title="MySQL解错方案" rel="tag">MySQL解错方案</a>, <a href="http://ourmysql.com/archives/tag/%e5%ad%97%e7%ac%a6%e9%9b%86" title="字符集" rel="tag">字符集</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/834/feed</wfw:commentRss>
		</item>
		<item>
		<title>一个 mysql server 上的小技巧</title>
		<link>http://ourmysql.com/archives/832</link>
		<comments>http://ourmysql.com/archives/832#comments</comments>
		<pubDate>Tue, 01 Jun 2010 02:41:15 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[技巧]]></category>

		<category><![CDATA[误操作]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=832</guid>
		<description><![CDATA[如上所示我们可以在mysql命令行下显示当前的mysql 用户，所在主机，时间和所用的数据库。这个在关键时刻可以让我们避免很多误操作。]]></description>
			<content:encoded><![CDATA[<p>在my.cnf 的 mysql 端 添加如下设置</p>
<div class="wp_syntax">
<div class="code">
<pre class="bash"><span>[</span>mysql<span>]</span>
<span>#no-auto-rehash # faster start of mysql but no tab completition</span>
<span>prompt</span>=<span>"(\u:mysql1@linuxbyte.org <span>\R</span>:\m)[\d]: "</span></pre>
</div>
</div>
<p>会产生如下效果:</p>
<div class="wp_syntax">
<div class="code">
<pre class="bash">root<span>@</span>ubuntu:<span>/</span>home<span>/</span>hew<span># mysql -u hew -p</span>
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection <span>id</span> is <span>320</span>
Server version: 5.1.41-3ubuntu12.1 <span>(</span>Ubuntu<span>)</span>
Type <span>'help;'</span> or <span>'\h'</span> <span>for</span> help. Type <span>'\c'</span> to <span>clear</span> the current input statement.

<span>(</span>hew:mysql1<span>@</span>linuxbyte.org <span>21</span>:<span>12</span><span>)</span><span>[</span><span>(</span>none<span>)</span><span>]</span>: use linuxbyte  <span>#注意这里</span>

Database changed

<span>(</span>hew:mysql1<span>@</span>linuxbyte.org <span>21</span>:<span>13</span><span>)</span><span>[</span>linuxbyte<span>]</span>: use linuxsky; <span>#这里</span>

Reading table information <span>for</span> completion of table and column names
You can turn off this feature to get a quicker startup with <span>-A</span>
Database changed

<span>(</span>hew:mysql1<span>@</span>linuxbyte.org <span>21</span>:<span>13</span><span>)</span><span>[</span>linuxsky<span>]</span>: <span>#这里</span></pre>
</div>
</div>
<p>如上所示我们可以在mysql命令行下显示当前的mysql 用户，所在主机，时间和所用的数据库。<br />
这个在关键时刻可以让我们避免很多误操作。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/%e6%8a%80%e5%b7%a7" title="技巧" rel="tag">技巧</a>, <a href="http://ourmysql.com/archives/tag/%e8%af%af%e6%93%8d%e4%bd%9c" title="误操作" rel="tag">误操作</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/832/feed</wfw:commentRss>
		</item>
		<item>
		<title>DBA工作初体验之心惊胆战</title>
		<link>http://ourmysql.com/archives/829</link>
		<comments>http://ourmysql.com/archives/829#comments</comments>
		<pubDate>Tue, 01 Jun 2010 02:39:56 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<category><![CDATA[DBA]]></category>

		<category><![CDATA[工作]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=829</guid>
		<description><![CDATA[前端时间刚换了工作，从5月16日开始，我正式成为了一名专职MySQL DBA（还在试用期），开始一段全新的体验。新就意味着有很多很多的工作要做，规范行为，整理思路，协调工作。回头一看一个月已经过去了，从之前没有写过SQL语句到现在平凡的数据统计、客服查询，一次次惊奇sql还可以这样那样，知道有那么多统计&#124;时间&#124;字符等各种有用的函数，开始一点点体会书本上学的索引在实际语句中的使用，是用表连接还是子查询，执行时间的快慢等等。]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;">前端时间刚换了工作，从5月16日开始，我正式成为了一名专职MySQL <a href="http://ourmysql.com/archives/tag/dba" class="st_tag internal_tag" rel="tag" title="标签 DBA 下的日志">DBA</a>（还在试用期），开始一段全新的体验。新就意味着有很多很多的工作要做，规范行为，整理思路，协调工作。回头一看一个月已经过去了，从之前没有写过SQL语句到现在平凡的数据统计、客服查询，一次次惊奇sql还可以这样那样，知道有那么多统计|时间|字符等各种有用的函数，开始一点点体会书本上学的索引在实际语句中的使用，是用表连接还是子查询，执行时间的快慢等等。</span></p>
<p><span><span style="font-size: x-small;">突然发现一个问题，感觉很明显，就是很多之前从书上学过了解到的知识，工作中并不会很自然地主动地被想起，而是每次就跟新东西一样，都是在同事的提示后，才恍然大悟，“哦，原来这样，其实，很早就知道这个东西的…..”，基本功不扎实呀！好比，渴了自然就会想到喝水。开始的自信与张扬已是消失殆尽，现在的心态就是：踏实、诚恳、谦虚地去学习，努力做好每件事情。</span></span></p>
<p><span><span style="font-size: x-small;">这一个月无论是工作的压力还是心情的波动，都让我体会颇多。第一次感觉到原来工作是有压力的，以及所背负的责任。我是一个很在意别人看法的人，我希望被每个人所认可，所以每次任务都积极去完成，但由于天生性格的急躁，还是总会弄出些岔子来。尽管开始成熟，但还是缺乏稳重。</span></span></p>
<p><span><span style="font-size: x-small;">下面就和大家抖露抖露我这一个月的“风花雪月”。</span></span></p>
<p><span><span style="font-size: x-small;">1. 头疼的SQL</span></span></p>
<p><span><span style="font-size: x-small;">任务：第一周领导就分配了统计需求的任务。将近20条语句以及数据导出弄了一周。说实话，现在对Tarot库还是一知半解，依然需要现查现看结构注释。</span></span></p>
<p><span><span style="font-size: x-small;">体会：SQL语句的组织并不是很难，刚开始一直被GROUP BY、COUNT()弄的很晕，写SQL是个熟练活，该用什么怎么实现也都很讲究技巧；而重要的是你需要对统计的这个系统本身有更多的了解，也就是业务流是什么，数据在各个表中是一个什么状态，是字典表、业务表还是日志型表，每个字段的确切含义。SQL对我来说几乎就是“零”，功能的实现目前来说都很吃力了，至于执行的性能，更是心有余而力不足，只能后期实际中遇到了再加以改进了。</span></span></p>
<p><span><span style="font-size: x-small;">2. 不小的事故</span></span></p>
<p><span><span style="font-size: x-small;">任务：每周二系统例行维护。对于数据库需要做的是，主库清除前一个月一周内的日志型表中的数据，并在从库进行全备。</span></span></p>
<p><span><span style="font-size: x-small;">体会：由于备份结束后，没有对北方区dump文件进行检查，dump文件只有4K，显然<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>出了问题（事实上，dump是正常结束的，困惑？），导致之前主库删除的数据丢失（因为我们的从库开启了log_slave_updates，binlog会记录同步过来所执行的sql语句）。在备份测试机上通过恢复4月的dump文件，将被清除的那一周数据导出，然后用从新做的新dump文件恢复后，将之前导出的数据重新导入到库中，最后在重新做一次全备，得到4.5G的dump文件，tail -n 1 dbname.sql结尾行正常“Dump Completed on …”（感谢realzyy提供的简单快捷的检查方法）。当初觉得，这些历史数据对应用本身并没有影响，只是为运营团队提供后期数据分析，反正已经成功回复，也没有太当回事，之后也没及时向领导汇报，后来领导找我谈话，我才深刻认识到问题的严重性，对于数据一定一定要格外加倍小心，无论是做什么用的，必须保证安全。经过这次风波后，做任何操作我都变得格外小心。做事情的条例很重要，开始的时候，哪怕慢点也要力求稳，不知道不清楚绝对不能操作；我们要知道获得一份信任需要很长的时间，但是让别人放弃你那是瞬间的事情。The first time is also the last time…Keep in mind…Be careful….Fish….我现在时刻背负着被开的风险，只能靠以后积极努力的工作去挽回失去的信任。</span></span></p>
<p><span><span style="font-size: x-small;">3. 完善备份</span></span></p>
<p><span><span style="font-size: x-small;">任务：定期全备与每日增量备份脚本的测试与修改。</span></span></p>
<p><span><span style="font-size: x-small;">体会：一周都在修改shell脚本，有脚本帮我们去完成重复性的操作既方便又可靠，但是脚本不是能实现你的工能就可以了，事实上，我们更想知道执行的结果正常与否，这就需要脚本能够收集这些信息并反馈给我们，所以要生成日志文件便于我们查看，或以邮件方式将报告发给我们。</span></span></p>
<p><span><span style="font-size: x-small;">关于<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>的参数选择，我最近体会颇深。之前写过一篇</span><a href="http://www.mysqlsystems.com/2009/05/mysql-backup_recovery.html"><strong><span style="color: #666666; font-size: x-small;">MySQL企业级备份与恢复</span></strong></a><span style="font-size: x-small;">，现在想下就是标题当，什么狗屁。 <a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>什么参数都不加，一看就不专业。突然想起来之前去飞信面试，周师傅问我，<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>备份的时候加什么参数吗，我很自豪的回答，什么都不加呀，那个默认<a href="http://ourmysql.com/archives/tag/opt" class="st_tag internal_tag" rel="tag" title="标签 opt 下的日志">opt</a>就很好了，现在想想脸红呀，差的不是一点。</span></span></p>
<p><a rel="attachment wp-att-1754" href="http://www.ourmysql.com/?attachment_id=1754"><span style="font-size: x-small;"><img class="alignleft size-full wp-image-1754" title="mysqldump" src="http://www.mysqlsystems.com/wp-content/uploads/2010/05/mysqldump.jpg" alt="mysqldump" width="791" height="302" /></span></a></p>
<p><span><span style="font-size: x-small;">4. 语句分析</span></span></p>
<p><span><span style="font-size: x-small;">任务：开发人员反应客服系统中一条SQL语句执行过长，导致系统超时报错，同时呢，还会导致主从复制不一致（Seconds_Behind_Master超过300秒nagios会报警）。</span></span></p>
<p><span><span style="font-size: x-small;">体会：这条语句是做分页的，每次显示50条记录，同时按时间排序，3个表(record_goods,goods,characters)做关联，其中一个是物品交易表(record_goods)，有千万条记录，每次执行该条语句时，我在从库的服务器端show processlist\G去查看该条语句的执行状态，发现stat是locked，被锁住了，同时发现slave中的sql_thread线程也同时有一条update语句locked在那里，但是，惊奇的发现这个被锁的表，却是那3个表中的其中物品信息表(goods)，然后我又show table status goods\G，发现该表竟是MyISAM的，而且那个update time时间在不停的更新。这下明白了，从库保持同步主库上goods表的update操作，这样就会对goods表叫锁，它又是MySIAM表，自然表级锁，当我们在执行那条查询语句时，如果执行时间过长，update操作就会被锁住，导致从库同步落后时长增加，导致nagois报警。之前提到，物品交易表非常庞大，后来我们采用自查询，先对record_goods表和characters表做表联接，查出符合条件间的50条记录，然后再将产生的结果集与goods表做关联查出最后系统所需的结果，执行时间不到1秒。我要从新更新我脑子里面之前那些经验性的总结，至于是表联接性能好，还是子查询性能好，实际中怎么好就怎么来吧。</span></span></p>
<p><span><span style="font-size: x-small;">这一个月的体会就是这么多了，下次再继续分享我的<a href="http://ourmysql.com/archives/tag/dba" class="st_tag internal_tag" rel="tag" title="标签 DBA 下的日志">DBA</a>初体验。</span></span></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009-03-30 -- <a href="http://ourmysql.com/archives/503" title="DBA未来的发展方向">DBA未来的发展方向</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/dba" title="DBA" rel="tag">DBA</a>, <a href="http://ourmysql.com/archives/tag/%e5%b7%a5%e4%bd%9c" title="工作" rel="tag">工作</a>, <a href="http://ourmysql.com/archives/category/uncategorized" title="未分类" rel="tag">未分类</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/829/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL server has gone away解决办法</title>
		<link>http://ourmysql.com/archives/827</link>
		<comments>http://ourmysql.com/archives/827#comments</comments>
		<pubDate>Wed, 12 May 2010 08:18:54 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL解错方案]]></category>

		<category><![CDATA[goneaway]]></category>

		<category><![CDATA[采集]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=827</guid>
		<description><![CDATA[1、应用程序（比如PHP）长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。
2、执行一个SQL，但SQL语句过大或者语句中含有BLOB或者longblob字段。比如，图片数据的处理]]></description>
			<content:encoded><![CDATA[<p>1、应用程序（比如PHP）长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。<br />
解决方案：<br />
在my.cnf文件中添加或者修改以下两个变量：<br />
wait_timeout=2880000<br />
interactive_timeout = 2880000<br />
关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf，则可以在连接数据库的时候设置CLIENT_INTERACTIVE，比如：<br />
sql = &#8220;set interactive_timeout=24*3600&#8243;;<br />
mysql_real_query(&#8230;)</p>
<p>2、执行一个SQL，但SQL语句过大或者语句中含有BLOB或者longblob字段。比如，图片数据的处理<br />
解决方案：<br />
在my.cnf文件中添加或者修改以下变量：<br />
max_allowed_packet = 10M(也可以设置自己需要的大小)<br />
max_allowed_packet 参数的作用是，用来控制其通信缓冲区的最大长度。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2008-09-14 -- <a href="http://ourmysql.com/archives/3" title="MySQL server has gone away问题及其解决">MySQL server has gone away问题及其解决</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/goneaway" title="goneaway" rel="tag">goneaway</a>, <a href="http://ourmysql.com/archives/category/debug" title="MySQL解错方案" rel="tag">MySQL解错方案</a>, <a href="http://ourmysql.com/archives/tag/%e9%87%87%e9%9b%86" title="采集" rel="tag">采集</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/827/feed</wfw:commentRss>
		</item>
		<item>
		<title>InnoDB Double write</title>
		<link>http://ourmysql.com/archives/825</link>
		<comments>http://ourmysql.com/archives/825#comments</comments>
		<pubDate>Tue, 13 Apr 2010 05:20:34 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL初级应用]]></category>

		<category><![CDATA[DoubleWrite]]></category>

		<category><![CDATA[InnoDB]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=825</guid>
		<description><![CDATA[在InnoDB将BP中的Dirty Page刷（flush）到磁盘上时，首先会将Page刷到InnoDB tablespace的一个区域中，我们称该区域为Double write Buffer。在向Double write Buffer写入成功后，再择机将数据拷贝到正在的数据文件对应的位置。]]></description>
			<content:encoded><![CDATA[<p>记得刚开始看<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>文档的时候，<a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-disk-io.html"><span style="color: #0082ff;">Double Write一节</span></a>（其实只有一小段）就让我很困惑。无奈当时内力太浅，纠缠了很久也没弄明白。时隔几个月，重新来整理一下。</p>
<p>涉及到的概念：<a href="http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/"><span style="color: #0082ff;">Buffer Pool</span></a>简称BP，<a href="http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/"><span style="color: #0082ff;">Dirty Page</span></a>，<a href="http://www.orczhou.com/index.php/2009/08/innodb-dirty-page-redo-log-2/"><span style="color: #0082ff;">Log file</span></a>，<a href="http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/"><span style="color: #0082ff;">Flush</span></a>，<a href="http://www.orczhou.com/index.php/2009/08/image-innodb-tablespace/"><span style="color: #0082ff;">innodb tablespace</span></a>。</p>
<p><span style="color: red;">1. 什么是Double Write</span></p>
<p>在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>将BP中的Dirty Page刷（flush）到磁盘上时，首先会将Page刷到<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> tablespace的一个区域中，我们称该区域为Double write Buffer。在向Double write Buffer写入成功后，再择机将数据拷贝到正在的数据文件对应的位置。</p>
<p>咋一看，这个过程有些多余</p>
<p><span style="color: red;">2. 为什么需要Double Write</span></p>
<p><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>中有记录（Row）被更新时，先将其在Buffer Pool（简称<strong>BP</strong>）中的page更新，并将这次更新记录到Log file中，这时候BP中的该page就是被标记为Dirty。在适当的时候（BP不够、系统闲置等），这些Dirty Page会被flush到磁盘上。</p>
<p>试想，在某个Dirty Page（一般是16K）flush的过程中，发生了系统断电（或者OS崩溃），<strong>16K</strong>的数据只有<strong>8K</strong>被写到磁盘上，这种现象被称为（partial page writes、torn pages、fractured writes）。一旦partial page writes发生，那么在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>恢复时就很尴尬：在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>的Log file中虽然知道这个数据页被修改了，但是却无法知道这个页被修改到什么程度，和这个页面相关的redo也就无法应用了。</p>
<p>举个例子：在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>的log file中有如下Log：</p>
<blockquote><p>Log sequence number 0 4285149977<br />
Log sequence number 0 4287355447<br />
Log sequence number 0 4289260680<br />
Log sequence number 0 4291279900<br />
Log sequence number 0 4293359020</p></blockquote>
<p>其中第1、3个Log修改了该page，但是在断电时，BP中该page只被flush了一部分。那么<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>是无法决定上面的Log是否应该被应用的。这时，数据就出现了不一致。</p>
<p>所以，Log file的有效应用，前提是<strong><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>的数据文件中的Page是一致</strong>的。</p>
<p>简而言之，Double write就是为了避免Partial page writes而设计的。</p>
<p><span style="color: red;">3. Double Write对性能的影响</span></p>
<p>系统需要将数据写两份，一般认为，Double Write是会降低系统性能的。<a href="http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/"><span style="color: #0082ff;">peter</span></a>猜测可能会有5-10%的性能损失，但是因为实现了数据的一致，是值得的。<a href="http://www.facebook.com/note.php?note_id=107329775932"><span style="color: #0082ff;">Mark Callaghan</span></a>认为这应该是存储层面应该解决的问题，放在数据库层面无疑是牺牲了很多性能的。</p>
<p>事实上，Double Write对性能影响并没有你想象（写两遍性能应该降低了50%吧？）的那么大。在BP中一次性往往会有很多的Dirty Page同时被flush，Double Write则把这些写操作，由随机写转化为了顺序写。而在Double Write的第二个阶段，因为Double Write Buffer中积累了很多Dirty Page，所以向真正的数据文件中写数据的时候，可能有很多写操作可以合并，这样有可能会降低Fsync的调用次数。</p>
<p>基于上面的原因，Double Write并没有想象的那么糟。另外，Dimitri在<a href="http://dimitrik.free.fr/blog/archives/2009/08/entry_86.html"><span style="color: #0082ff;">测试</span></a>后，发现打开和关闭Double Write对效率的影响并不大。</p>
<p><span style="color: red;">4. 相关参数与状态</span></p>
<p>是否打开了double write:</p>
<pre>
<div class="mycode">
root@(none) 07:16:16&gt;show variables like "%double%";
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+</div>
</pre>
<p>Double write的使用情况：</p>
<pre>
<div class="mycode">
root@(none) 07:15:50&gt;SHOW STATUS LIKE "%innodb_dblwr%";
+----------------------------+-----------+
| Variable_name              | Value     |
+----------------------------+-----------+
| Innodb_dblwr_pages_written | 145373349 |
| Innodb_dblwr_writes        | 2249336   |
+----------------------------+-----------+</div>
</pre>
<p>上面可以看到，从BP共Flush了145373349个Pages到double write buffer中；一共调用了2249336次write写到真正的数据文件。可见，相当于每次write合并了 145373349 / 2249336 = 64.6次Flush。（这就是为什么double write buffer为什么并不会对效率有很大影响的原因）</p>
<p><span style="color: red;">5. 我的看法</span></p>
<p>在某些文件系统（<a href="http://dev.mysql.com/tech-resources/articles/mysql-zfs.html"><span style="color: #0082ff;">ZFS</span></a>等）层面能够保证不出现Partial page writes时，可以关闭Double Write。因为它对性能影响并不大，一般情况都建议打开，毕竟带来的数据安全性保障可能是我们更关心的。</p>
<p>参考文献：</p>
<p>[0]. <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-disk-io.html"><span style="color: #0082ff;">Manual about Double Write</span></a></p>
<p>[1]. <a href="http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/"><span style="color: #0082ff;">Innodb Double Write</span></a></p>
<p>[2]. <a href="http://www.facebook.com/note.php?note_id=107329775932"><span style="color: #0082ff;">Do you need the InnoDB doublewrite buffer</span></a></p>
<p>[3]. <a href="http://dimitrik.free.fr/blog/archives/2009/08/entry_86.html"><span style="color: #0082ff;">MySQL Performance: InnoDB Doublewrite Buffer Impact</span></a></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/doublewrite" title="DoubleWrite" rel="tag">DoubleWrite</a>, <a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/primary" title="MySQL初级应用" rel="tag">MySQL初级应用</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/825/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL半同步存在的问题</title>
		<link>http://ourmysql.com/archives/822</link>
		<comments>http://ourmysql.com/archives/822#comments</comments>
		<pubDate>Mon, 12 Apr 2010 09:03:28 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL解错方案]]></category>

		<category><![CDATA[半同步]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=822</guid>
		<description><![CDATA[在开启MySQL半同步的时候，需要至少一个开启了半同步的slave。在master提交一个写事务之后，master会block这个事务，直到至少一个slave确认已经接受到了该复制事件，这时master才想应用程序确认提交成功。否则超时中断半同步，直到重新满足条件开启。]]></description>
			<content:encoded><![CDATA[<p>去年提到过我做的一个<a href="http://www.mysqlab.net/blog/2009/04/mysql-ha-%E7%9B%B8%E5%AF%B9%E5%AE%8C%E6%95%B4%E7%9A%84%E6%96%B9%E6%A1%88%E5%BF%AB%E8%A6%81%E9%9D%A2%E4%B8%96%E4%BA%86/">MySQL HA高可用方案</a>，就是利用了Google的半同步补丁来加以实现的。而现在MySQL5.5中已经集成了semi-sync replication的功能，那么我们可以放心用它和其他组件及服务判断程序来实现我们的高可用解决方案。但是这里还存在一点瑕疵，需要注意。 By ivan@mysqlab.net</p>
<div id="attachment_375" class="wp-caption alignnone"><a href="http://www.mysqlab.net/blog/wp-content/uploads/2009/12/semisync1.png"><img class="size-medium wp-image-375" title="MySQL半同步流程设计图" src="http://www.mysqlab.net/blog/wp-content/uploads/2009/12/semisync1-300x287.png" alt="MySQL半同步流程设计图" width="300" height="287" /></a></p>
<p class="wp-caption-text">MySQL半同步流程设计图</p>
</div>
<p>在开启MySQL半同步的时候，需要至少一个开启了半同步的slave。在master提交一个写事务之后，master会block这个事务，直到至少一个slave确认已经接受到了该复制事件，这时master才想应用程序确认提交成功。否则超时中断半同步，直到重新满足条件开启。</p>
<p>在master提交事务之后，而slave未来得及接收复制事件，这时候master crash的话，应用程序会切换到slave上，并重新发起事务，这正好是我们所需要的，满足高可用的初衷。但是这里存在一个缺陷，那就是在master恢复之后，原来的事务已经提交，这时候复制会出现问题。</p>
<p>解决办法：在原来的master恢复之后数据重做(推荐)，或者跳过重复数据错误。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/debug" title="MySQL解错方案" rel="tag">MySQL解错方案</a>, <a href="http://ourmysql.com/archives/tag/%e5%8d%8a%e5%90%8c%e6%ad%a5" title="半同步" rel="tag">半同步</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/822/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL也能并发导入数据</title>
		<link>http://ourmysql.com/archives/820</link>
		<comments>http://ourmysql.com/archives/820#comments</comments>
		<pubDate>Mon, 12 Apr 2010 09:01:22 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL初级应用]]></category>

		<category><![CDATA[导入]]></category>

		<category><![CDATA[并发]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=820</guid>
		<description><![CDATA[ 对MySQL的用户而言，备受诟病的一个问题就是导入SQL备份文件时不能并发，使得导入的效率很低。今天，我们就来改变下思路，尝试一下并发导入的方法，供大家参考。1、问题分析想要实现并发导入，其实没那么难，最简单的思路就是：将完整的文件切分成多份，然后并发导入即可。在这里，我自己的做法是这样的：1) 首先，假设只有一个库；多个库的情况也是类似，无非就是循环2) 计算SQL文件总行数3) 计算SQL文件总大小4) 设定每个切分文...]]></description>
			<content:encoded><![CDATA[<p>对MySQL的用户而言，备受诟病的一个问题就是导入SQL备份文件时不能并发，使得导入的效率很低。<br />
今天，我们就来改变下思路，尝试一下并发导入的方法，供大家参考。<br />
1、问题分析<br />
想要实现并发导入，其实没那么难，最简单的思路就是：将完整的文件切分成多份，然后并发导入即可。<br />
在这里，我自己的做法是这样的：</p>
<pre class="plaintext_pre">1) 首先，假设只有一个库；多个库的情况也是类似，无非就是循环
2) 计算SQL文件总行数
3) 计算SQL文件总大小
4) 设定每个切分文件最大尺寸
5) 初始化表结构
6) 循环处理SQL，按照切分文件最大尺寸切分成多个小文件
7) 并发导入多个小文件</pre>
<p>上述方法中，如果数据表是 MyISAM 表，则并发导入没有问题，但如果是 <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 表，则会有表级锁 AUOT-INC 导致并发效率不高的麻烦，尽管如此，那也比单个文件串行导入来的快一些。想要避免这个麻烦，就得采用 MySQL 5.1 版本了，因为在 5.1 中，改进了 AUTO-INC 的处理方式，规避了表级锁，很大程度提高了并发效率。<br />
2、实际测试<br />
事先设定：最大并大导入线程是16个。<br />
2.1 MySQL 5.0.67 版本</p>
<pre class="plaintext_pre">innodb_flush_log_at_trx_commit = 1
串行导入：01:51:34
并行导入：01:25:05
innodb_flush_log_at_trx_commit = 0
串行导入：01:49:36
并行导入：01:11:29</pre>
<p>2.2 MySQL 5.1版本</p>
<pre class="plaintext_pre">innodb_flush_log_at_trx_commit = 1, innodb_autoinc_lock_mode = 0
串行导入：01:52:28
并行导入：01:38:13
innodb_flush_log_at_trx_commit = 1, innodb_autoinc_lock_mode = 1
串行导入：01:54:55
并行导入：01:26:24
innodb_autoinc_lock_mode = 0
并行导入：01:38:13
innodb_autoinc_lock_mode = 1
并行导入：01:05:51</pre>
<p>更加详细的测试就不再做了。<br />
3、小结<br />
从上面的测试结果可以看到，MySQL 5.1在AUTO-INC锁方面的改进还是非常大的，对于想要提升并发性能，同时应用相对不是太复杂，并且不担心会碰到bug的童鞋可以多多尝试下。<br />
由于众所周知的缘故，相关的脚本就不发布了，有需要的童鞋请加入MSN群讨论。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/primary" title="MySQL初级应用" rel="tag">MySQL初级应用</a>, <a href="http://ourmysql.com/archives/tag/%e5%af%bc%e5%85%a5" title="导入" rel="tag">导入</a>, <a href="http://ourmysql.com/archives/tag/%e5%b9%b6%e5%8f%91" title="并发" rel="tag">并发</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/820/feed</wfw:commentRss>
		</item>
		<item>
		<title>Innodb 表和索引结构</title>
		<link>http://ourmysql.com/archives/817</link>
		<comments>http://ourmysql.com/archives/817#comments</comments>
		<pubDate>Tue, 09 Mar 2010 01:25:42 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[索引]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=817</guid>
		<description><![CDATA[    因为Innodb表的数据是依赖于聚集索引顺序存放，同时聚集索引和数据一块存储，普通索引也需要存放一份聚集索引。所以对于聚集索引的设计尽量按顺序写入，必免数据分页，行迁移等对性能影响的现象。另外聚集索引要设计的尽可能短。从设计上必须锁的时间，大量随机IO的出现。]]></description>
			<content:encoded><![CDATA[<p>    <strong>表的结构：</strong></p>
<p>    对于MySQL把有的存储引擎都是把表结构的定义存放到.frm文件中。但对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>表同时有一个内部的字典存放到表空间中。所以对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>表不能单纯的移动.frm在不同的MySQL事例下。对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>引擎的表，如果MySQL 删除相应的表或数据库，同时会删除相应的.frm及在表空间的相应的字典信息。在.frm文件只是用来定义表的结构，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>把数据和索引都存放到了表空间中。</p>
<p>    <strong>聚集索引和次要索引：</strong></p>
<p>    每一个<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>表都有一个聚集索引，这个聚信索引和行数据存在一起。</p>
<p>    可以用来做聚集索引的列：</p>
<p>如果有声明了主建(primary key)，则这个列可以做为表的主建。 如果没有声明主建，MySQL会用一个唯一索引(UNIQUE)而且是不为空的列做为主建，成为该表的聚信索引。 如果没声明主建，同时也没合适的唯一的索引，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>内部会产生一个隐藏的聚集索引:RowID。这个RowID在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>的多版本中曾提到过。这个RowID是在插入时产生，并且是自增的增加。所以也是按顺序增长存放。</p>
<p>    由于聚集索引和行数据存放一起(在同一个数据页中)，所以利用聚集索引访问数据行时，非常的快，同一个数据页在访问索引时，已经把页加载到Buffer中，在访问数据时，等于了一个顺序IO的访问（内存中完成）。大多数情况下索引和数据都不在一块（MyISAM，数据和索引存到不同的文件中），而聚集索引是有结构的通常是按顺序存放，同时和数据存放在一起，利用索引索引访问大表的数据可以节省许多IO。</p>
<p>    对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>次要的索引会包含聚信索引，查询在使用次要索引时，找到聚集索引信息，然后利用聚集索引信息访问行。所以，如果聚集索引过长，会造成空间浪费严重。另外，如果对表或是区间进行Count操作的话，大多数情况较短的次要索引比基于聚集索引快。对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>的聚集索引选择，尽量选择比较短的列做为聚集索引列，是一个好的设计习惯。</p>
<p>    <strong>索引的物理结构：</strong></p>
<p>    <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>的索引以B-tree的形式存到各个叶点上。索引叶点页的大小默认为16K，当有什么的索引插入叶点时，该叶点至少会保留1/16的空闲空间，用于将来该叶点的索引更新或是插入。</p>
<p>    对于顺序写入的索引（无论是递增或是递减，顺序的就行），索引叶点可以达到15/16满。如果是随机的索引写入行为，叶点只会达到1/2到15/16满。当叶点填充在1/2以下满，或是被删除到1/2下满时，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>会缩短索引树，试图释放该叶点，该叶点可以被继续写入数据。</p>
<p align="left"><strong>设计中的Tips：</strong></p>
<p>    因为<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>表的数据是依赖于聚集索引顺序存放，同时聚集索引和数据一块存储，普通索引也需要存放一份聚集索引。所以对于聚集索引的设计尽量按顺序写入，必免数据分页，行迁移等对性能影响的现象。另外聚集索引要设计的尽可能短。从设计上必须锁的时间，大量随机IO的出现。</p>
<p>    如对于监控（或是股票类的信息）可以利用时间和类型构成聚集索引，让相关性高的数据尽可能位到一块。以便读取时可以利用顺序IO读取到相应的数据。最好的情况，相关性高的数据在一个Page上，这样读取的效果更好。基于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>聚集索引的特性，在设计上也需要考虑利用一下优势，必免其不好的一方面从而达到最佳性能。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2008-11-18 -- <a href="http://ourmysql.com/archives/284" title="Innodb 索引结构了解 - Innodb Index Structure">Innodb 索引结构了解 - Innodb Index Structure</a></li><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-11-18 -- <a href="http://ourmysql.com/archives/783" title="Memory &#038; MyISAM 引擎小注意！">Memory &#038; MyISAM 引擎小注意！</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-13 -- <a href="http://ourmysql.com/archives/737" title="Mysql combine index">Mysql combine index</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/%e7%b4%a2%e5%bc%95" title="索引" rel="tag">索引</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/817/feed</wfw:commentRss>
		</item>
		<item>
		<title>InnoDB线程并发检查机制</title>
		<link>http://ourmysql.com/archives/811</link>
		<comments>http://ourmysql.com/archives/811#comments</comments>
		<pubDate>Tue, 09 Mar 2010 01:22:23 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[检查]]></category>

		<category><![CDATA[线程]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=811</guid>
		<description><![CDATA[InnoDB在接受MySQL线程调用时，有一个并发线程的检查机制，通过innodb_thread_concurrency参数进行控制。如果参数设置大于0，则表示检查机制开启，允许进入的线程数就是参数的值。等于0则禁用并发检查。]]></description>
			<content:encoded><![CDATA[<p><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a>在接受MySQL线程调用时，有一个并发线程的检查机制，通过<strong>innodb_thread_concurrency</strong>参数进行控制。如果参数设置大于0，则表示检查机制开启，允许进入的线程数就是参数的值。等于0则禁用并发检查。</p>
<p>在新的MySQL线程调用<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>接口前，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>会检查已经接受的请求线程数，如已经超过innodb_thread_concurrency设置的限制，则该请求线程会等待<strong>innodb_thread_sleep_delay</strong>微秒后尝试重新请求，如果第二次请求还是无法获得，则该线程会进入线程队列休眠。重试两次的机制是为了减少CPU的上下文切换的次数，以降低CPU消耗，这和Oracle中latch的spin机制是同样的道理。如果请求被<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>接受，则会获得一个次数为<strong>innodb_concurrency_tickets</strong>(默认500次)的通行证，在次数用完之前，该线程重新请求时无须再进行前面所说innodb_thread_concurrency的检查。</p>
<p>上述检查逻辑在源码<strong>storage/innobase/srv/srv0srv.c</strong>(<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>很多参数都可以在该文件中找到定义)的<strong>srv_conc_enter_innodb</strong>函数中，有兴趣的可以仔细阅读一下，代码比较浅显，不难理解。另外，如果是一个已经持有lock的线程，则通过调用<strong>srv_conc_force_enter_innodb</strong>函数可以无视该检查，这是为了避免线程长时间持有锁影响性能，且可能增加死锁的机率。除此之外，slave线程也是有无视检查直接通行的权限。</p>
<p>简单思考一下上述机制，可以得出一个初步的推论：在数据库并发请求较小的情况下，从性能上来说禁用检查机制应该是更好的，毕竟执行检查机制本身也需要加锁(Mutex)。当并发线程很高的情况下，则开启检查机制对性能更有利。至于具体innodb_thread_concurrency设置为多少，可能就需要在不同的条件下实际的做一下测试了，不同的硬件环境，不同的MySQL版本和<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>版本，应该都会有一些区别。</p>
<p>源代码中对于innodb_thread_concurrency参数的注释如下：</p>
<pre>/* The following controls how many threads we let inside <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> concurrently:
threads waiting for locks are not counted into the number because otherwise
we could get a deadlock. MySQL creates a thread for each user session, and
semaphore contention and convoy problems can occur withput this restriction.
Value 10 should be good if there are less than 4 processors + 4 disks in the
computer. Bigger computers need bigger values. Value 0 will disable the
concurrency check. */

ulong   srv_thread_concurrency  = 0;</pre>
<p>因为检查机制需要Mutex保护(Mutex-based Model)，所以开启检查本身也有性能消耗，并且扩展性也会受到限制，在MySQL5.4版本中引入了一种新的机制（Timer-based Model），这里就不讨论了，有兴趣的可以参考<a href="http://mikaelronstrom.blogspot.com/2009/05/mysql-54-patches-innodb-thread.html"><span style="color: #0082ff;">这里</span></a>(需要翻墙)，实际上<a href="http://www.ningoo.net/html/2009/xtradb_storage_engine.html"><span style="color: #0082ff;">XtraDB存储引擎</span></a>里已经包含Timer-based Model，通过参数<strong>innodb_thread_concurrency_timer_based</strong>可以开启，默认为OFF。在MySQL5.4的srv0srv.c的源代码中的注释中，可以看到Google和Percona的版权声明，看来MySQL5.4中吸引了很多第三方的改进代码，值得期待。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/%e6%a3%80%e6%9f%a5" title="检查" rel="tag">检查</a>, <a href="http://ourmysql.com/archives/tag/%e7%ba%bf%e7%a8%8b" title="线程" rel="tag">线程</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/811/feed</wfw:commentRss>
		</item>
		<item>
		<title>mysqldump意外终止的原因以及解决方法</title>
		<link>http://ourmysql.com/archives/813</link>
		<comments>http://ourmysql.com/archives/813#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:58:08 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL解错方案]]></category>

		<category><![CDATA[mysqldump]]></category>

		<category><![CDATA[net_write_timeout]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=813</guid>
		<description><![CDATA[mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中，TAOBAO多次出现了因mysqldump意外终止而导致备份失败的情况。
以下是我们经常遇到的问题：
1、Lost connection to MySQL server at ‘reading initial communication packet’：
这个主要是因为DNS不稳定导致的。如果做了网络隔离，MySQL处于一个相对安全的网络环境，那么开启skip-name-resolve选项将会最大程度避免这个问题。
2、Lost connection to MySQL server at ‘reading authorization packet’：
从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中，网络波动会导致握手失败。增加connect_timeout可以解决这个问题；然而增加connect_timeout并不能防止网络故障的发生，反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请求。
3、Lost connection to MySQL server during query：
这个问题具备随机性，而淘宝MySQL的应用场景决定了我们无法多次备份数据以便重现问题。
然而我们注意到这个问题一般会在两种情况下会发生。一种是mysqldump **** &#124; gzip ****；另外一种是mysqldump **** &#62; /nfs-file
注意，不管是gzip还是nfs都有一种特点，那就是它们影响了mysqldump的速度。从这个角度思考，是不是mysqldump从MySQL接受数据包的速度不够快导致Lost connection to MySQL server during query错误呢？
为了定位到问题，我搭建了一个测试环境：
test@192.168.0.1：3306
CREATE TABLE `test` (
`id` bigint(20) NOT NULL auto_increment,
`b` varchar(2000) default NULL,
`c` varchar(2000) default NULL,
`d` varchar(2000) default NULL,
`e` varchar(2000) default [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>是非常重要的MySQL备份工具。然而在长年累月的使用过程中，TAOBAO多次出现了因<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>意外终止而导致备份失败的情况。<br />
以下是我们经常遇到的问题：</p>
<p>1、Lost connection to MySQL server at ‘reading initial communication packet’：<br />
这个主要是因为DNS不稳定导致的。如果做了网络隔离，MySQL处于一个相对安全的网络环境，那么开启skip-name-resolve选项将会最大程度避免这个问题。</p>
<p>2、Lost connection to MySQL server at ‘reading authorization packet’：<br />
从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中，网络波动会导致握手失败。增加connect_timeout可以解决这个问题；然而增加connect_timeout并不能防止网络故障的发生，反而会引起MySQL线程占用。最好的解决办法是让<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>重新发起连接请求。</p>
<p>3、Lost connection to MySQL server during query：<br />
这个问题具备随机性，而淘宝MySQL的应用场景决定了我们无法多次备份数据以便重现问题。<br />
然而我们注意到这个问题一般会在两种情况下会发生。一种是<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a> **** | gzip ****；另外一种是<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a> **** &gt; /nfs-file<br />
注意，不管是gzip还是nfs都有一种特点，那就是它们影响了<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>的速度。从这个角度思考，是不是<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>从MySQL接受数据包的速度不够快导致Lost connection to MySQL server during query错误呢？</p>
<p>为了定位到问题，我搭建了一个测试环境：<br />
test@192.168.0.1：3306<br />
CREATE TABLE `test` (<br />
`id` bigint(20) NOT NULL <a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a>,<br />
`b` varchar(2000) default NULL,<br />
`c` varchar(2000) default NULL,<br />
`d` varchar(2000) default NULL,<br />
`e` varchar(2000) default NULL,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p>insert into test(b,c,d,e) values (lpad(’a&#8217;,1900,’b&#8217;), lpad(’a&#8217;,1900,’b&#8217;), lpad(’a&#8217;,1900,’b&#8217;), lpad(’a&#8217;,1900,’b&#8217;));<br />
多次复制数据使测试环境达到一定数据量。</p>
<p>192.168.0.2：<br />
编写一个c++程序<br />
#include &lt;stdio.h&gt;<br />
#include &lt;mysql.h&gt;</p>
<p>using namespace std;</p>
<p>int main()<br />
{<br />
MYSQL conn;<br />
MYSQL_RES *result;<br />
MYSQL_ROW row;<br />
my_bool reconnect = 0;</p>
<p>mysql_init(&amp;conn);<br />
mysql_options(&amp;conn, MYSQL_OPT_RECONNECT, &amp;reconnect);</p>
<p>if(!mysql_real_connect(&amp;conn, “192.168.0.1″, “test”, “test”, “test”, 3306, NULL, 0))<br />
{<br />
fprintf(stderr, “Failed to connect to database: %s\n”, mysql_error(&amp;conn));<br />
exit(0);<br />
}<br />
else<br />
{<br />
fprintf(stdout, “Success to connect\n”);<br />
}</p>
<p>mysql_query(&amp;conn, “show variables like ‘%timeout%’”);<br />
result = mysql_use_result(&amp;conn);<br />
while(row=mysql_fetch_row(result))<br />
{<br />
fprintf(stdout, “%-10s: %s\n”, row[0], row[1]);<br />
}<br />
mysql_free_result(result);<br />
fprintf(stderr, “\n”);</p>
<p>mysql_query(&amp;conn, “select SQL_NO_CACHE * from test.test”);<br />
result = mysql_use_result(&amp;conn);<br />
while((row=mysql_fetch_row(result))!=NULL)<br />
{<br />
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&amp;conn), mysql_error(&amp;conn));<br />
fprintf(stdout, “%s\n”, row[0]);<br />
sleep(100);<br />
}<br />
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&amp;conn), mysql_error(&amp;conn));<br />
mysql_free_result(result);<br />
mysql_close(&amp;conn);<br />
return 1;<br />
}</p>
<p>在这段代码里，sleep函数用来模拟NFS的网络延迟和gzip的运算时间。执行一段时间之后，Lost connection to MySQL server during query出现了，程序意外终止。在数据处理足够快的情况下，又会是怎样的结果？</p>
<p>将sleep的时间改为1，重新编译后发现程序能够完整跑完。根据<a href="http://www.ourmysql.com/archives/810" target="_blank"><span style="color: #0082ff;">《MySQL Timeout解析》</span></a>上对net_write_timeout的解释，我们可以发现，<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>处理数据过慢（NFS、gzip引起）会导致MySQL主动断开连接，此时<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>就会报Lost connection to MySQL server during query错误。经过多次测试，确定这个错误是由于net_write_timeout设置过短引起。</p>
<p><!-- Generated by Simple Tags 1.2.4 - http://wordpress.org/extend/plugins/simple-tags --></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009-08-11 -- <a href="http://ourmysql.com/archives/687" title="source sql文件报错">source sql文件报错</a></li><li>2009-06-07 -- <a href="http://ourmysql.com/archives/570" title="mysqldump 导出触发器遇到的问题">mysqldump 导出触发器遇到的问题</a></li><li>2009-02-23 -- <a href="http://ourmysql.com/archives/463" title="改良版本mysqldump来备份MYSQL数据库">改良版本mysqldump来备份MYSQL数据库</a></li><li>2008-10-24 -- <a href="http://ourmysql.com/archives/181" title="mysqldump的几个主要选项探究">mysqldump的几个主要选项探究</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/mysqldump" title="mysqldump" rel="tag">mysqldump</a>, <a href="http://ourmysql.com/archives/category/debug" title="MySQL解错方案" rel="tag">MySQL解错方案</a>, <a href="http://ourmysql.com/archives/tag/net_write_timeout" title="net_write_timeout" rel="tag">net_write_timeout</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/813/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Timeout解析</title>
		<link>http://ourmysql.com/archives/810</link>
		<comments>http://ourmysql.com/archives/810#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:54:24 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[Timeout]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=810</guid>
		<description><![CDATA[“And God said, Let there be network: and there was timeout”
在使用MySQL的过程中，你是否遇到了众多让人百思不得其解的Timeout？
那么这些Timeout之后，到底是代码问题，还是不为人知的匠心独具？]]></description>
			<content:encoded><![CDATA[<p><strong>“And God said, Let there be network: and there was timeout”</strong><br />
在使用MySQL的过程中，你是否遇到了众多让人百思不得其解的Timeout？<br />
那么这些Timeout之后，到底是代码问题，还是不为人知的匠心独具？<br />
本期Out-man，讲述咱们MySQL <a href="http://ourmysql.com/archives/tag/dba" class="st_tag internal_tag" rel="tag" title="标签 DBA 下的日志">DBA</a>自己的Timeout。</p>
<p>先看一下比较常见的Timeout参数和相关解释：<br />
<strong>connect_timeout</strong><br />
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.<br />
<strong>interactive_timeout</strong><br />
The number of seconds the server waits for activity on an interactive connection before closing it.<br />
<strong>wait_timeout</strong><br />
The number of seconds the server waits for activity on a noninteractive connection before closing it.<br />
<strong>net_read_timeout</strong><br />
The number of seconds to wait for more data from a connection before aborting the read.<br />
<strong>net_write_timeout</strong><br />
The number of seconds to wait for a block to be written to a connection before aborting the write.</p>
<p>从以上解释可以看出，connect_timeout在获取连接阶段（authenticate）起作用，interactive_timeout和wait_timeout在连接空闲阶段（sleep）起作用，而net_read_timeout和net_write_timeout则是在连接繁忙阶段（query）起作用。</p>
<p>获取MySQL连接是多次握手的结果，除了用户名和密码的匹配校验外，还有IP-&gt;HOST-&gt;DNS-&gt;IP验证，任何一步都可能因为网络问题导致线程阻塞。为了防止线程浪费在不必要的校验等待上，超过connect_timeout的连接请求将会被拒绝。</p>
<p>即使没有网络问题，也不能允许客户端一直占用连接。对于保持sleep状态超过了wait_timeout（或interactive_timeout，取决于CLIENT_INTERACTIVE标志）的客户端，MySQL会主动断开连接。</p>
<p>即使连接没有处于sleep状态，即客户端忙于计算或者存储数据，MySQL也选择了有条件的等待。在数据包的分发过程中，客户端可能来不及响应（发送、接收、或者处理数据包太慢）。为了保证连接不被浪费在无尽的等待中，MySQL也会选择有条件（net_read_timeout和net_write_timeout）地主动断开连接。</p>
<p>这么多Timeout足以证明MySQL是多么乐于断开连接。而乐于断开连接的背后，主要是为了防止服务端共享资源被某客户端（mysql、<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>、页面程序等）一直占用。</p>
<p><!-- Generated by Simple Tags 1.2.4 - http://wordpress.org/extend/plugins/simple-tags --></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/timeout" title="Timeout" rel="tag">Timeout</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/810/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL库目录下db.opt文件的作用</title>
		<link>http://ourmysql.com/archives/808</link>
		<comments>http://ourmysql.com/archives/808#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:49:31 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[opt]]></category>

		<category><![CDATA[字符集]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=808</guid>
		<description><![CDATA[细心的朋友可能会发现有时候在某些库目录下有个 db.opt 文件，那这个文件是干什么用的呢？如果你用vi等编辑器打开看的话，内容很简单，是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则，那么后续创建的表如果没有指定字符集和排序规则，那么该新建的表将采用db.opt文件中指定的属性。]]></description>
			<content:encoded><![CDATA[<p>　　细心的朋友可能会发现有时候在某些库目录下有个 db.<a href="http://ourmysql.com/archives/tag/opt" class="st_tag internal_tag" rel="tag" title="标签 opt 下的日志">opt</a> 文件，那这个文件是干什么用的呢？如果你用vi等编辑器打开看的话，内容很简单，是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则，那么后续创建的表如果没有指定字符集和排序规则，那么该新建的表将采用db.<a href="http://ourmysql.com/archives/tag/opt" class="st_tag internal_tag" rel="tag" title="标签 opt 下的日志">opt</a>文件中指定的属性。</p>
<div class="dean_ch">
<p><span class="coMULTI"><span style="color: #808080;">/*<br />
  Set table default charset, if not set</span></span></p>
<p>  SYNOPSIS<br />
    set_table_default_charset()<br />
    create_info        Table create information</p>
<p>  DESCRIPTION<br />
    If the table character set was not given explicitely,<br />
    let’s fetch the database default character set and<br />
    apply it to the table.<br />
*/</p>
<p><span class="kw4"><span style="color: #f63333;">static</span></span> <span class="kw4"><span style="color: #f63333;">void</span></span> set_table_default_charset<span class="br0"><span style="color: #66cc66;">(</span></span>THD *thd,<br />
                                      HA_CREATE_INFO *create_info, <span class="kw4"><span style="color: #f63333;">char</span></span> *db<span style="color: #66cc66;"><span class="br0">)</span><br />
<span class="br0">{</span><br />
</span>  <span style="color: #808080;"><span class="coMULTI">/*<br />
    If the table character set was not given explicitly,<br />
    let’s fetch the database default character set and<br />
    apply it to the table.<br />
  */</span><br />
</span>  <span class="kw1"><span style="color: #a1a100;">if</span></span> <span class="br0"><span style="color: #66cc66;">(</span></span>!create_info-&gt;default_table_charset<span style="color: #66cc66;"><span class="br0">)</span><br />
</span>  <span style="color: #66cc66;"><span class="br0">{</span><br />
</span>    HA_CREATE_INFO db_info;</p>
<p>    load_db_opt_by_name<span class="br0"><span style="color: #66cc66;">(</span></span>thd, db, &amp;db_info<span class="br0"><span style="color: #66cc66;">)</span></span>;</p>
<p>    create_info-&gt;default_table_charset= db_info.<span class="me1">default_table_charset</span>;<br />
  <span style="color: #66cc66;"><span class="br0">}</span><br />
<span class="br0">}</span></span></div>
<p>另外要说明的是，如果你是通过alter databases(schema) 命令更改的数据库默认属性，那么现有的表的默认字符集和排序规则不受影响。</p>
<p>通过创建数据库指定数据库的默认字符集和排序规则：</p>
<div class="dean_ch"><span class="kw1"><span style="color: #a1a100;">CREATE</span></span> <span class="br0"><span style="color: #66cc66;">{</span></span><span class="kw1"><span style="color: #a1a100;">DATABASE</span></span> | SCHEMA<span class="br0"><span style="color: #66cc66;">}</span></span> <span class="br0"><span style="color: #66cc66;">[</span></span><span class="kw1"><span style="color: #a1a100;">IF</span></span> <span class="kw1"><span style="color: #a1a100;">NOT</span></span> <span class="kw1"><span style="color: #a1a100;">EXISTS</span></span><span class="br0"><span style="color: #66cc66;">]</span></span> db_name<br />
    <span class="br0"><span style="color: #66cc66;">[</span></span>create_specification<span class="br0"><span style="color: #66cc66;">]</span></span> … </p>
<p>create_specification:<br />
    <span class="br0"><span style="color: #66cc66;">[</span></span><span class="kw1"><span style="color: #a1a100;">DEFAULT</span></span><span class="br0"><span style="color: #66cc66;">]</span></span> CHARACTER <span class="kw1"><span style="color: #a1a100;">SET</span></span> <span class="br0"><span style="color: #66cc66;">[</span></span>=<span class="br0"><span style="color: #66cc66;">]</span></span> charset_name<br />
  | <span class="br0"><span style="color: #66cc66;">[</span></span><span class="kw1"><span style="color: #a1a100;">DEFAULT</span></span><span class="br0"><span style="color: #66cc66;">]</span></span> COLLATE <span class="br0"><span style="color: #66cc66;">[</span></span>=<span class="br0"><span style="color: #66cc66;">]</span></span> collation_name</div>
<p>也可以通过alter database修改</p>
<div class="dean_ch"><span class="kw1"><span style="color: #a1a100;">ALTER</span></span> <span class="br0"><span style="color: #66cc66;">{</span></span><span class="kw1"><span style="color: #a1a100;">DATABASE</span></span> | SCHEMA<span class="br0"><span style="color: #66cc66;">}</span></span> <span class="br0"><span style="color: #66cc66;">[</span></span>db_name<span style="color: #66cc66;"><span class="br0">]</span><br />
</span>    alter_specification …<br />
<span class="kw1"><span style="color: #a1a100;">ALTER</span></span> <span class="br0"><span style="color: #66cc66;">{</span></span><span class="kw1"><span style="color: #a1a100;">DATABASE</span></span> | SCHEMA<span class="br0"><span style="color: #66cc66;">}</span></span> db_name<br />
    UPGRADE <span class="kw1"><span style="color: #a1a100;">DATA</span></span> DIRECTORY NAME </p>
<p>alter_specification:<br />
    <span class="br0"><span style="color: #66cc66;">[</span></span><span class="kw1"><span style="color: #a1a100;">DEFAULT</span></span><span class="br0"><span style="color: #66cc66;">]</span></span> CHARACTER <span class="kw1"><span style="color: #a1a100;">SET</span></span> <span class="br0"><span style="color: #66cc66;">[</span></span>=<span class="br0"><span style="color: #66cc66;">]</span></span> charset_name<br />
  | <span class="br0"><span style="color: #66cc66;">[</span></span><span class="kw1"><span style="color: #a1a100;">DEFAULT</span></span><span class="br0"><span style="color: #66cc66;">]</span></span> COLLATE <span class="br0"><span style="color: #66cc66;">[</span></span>=<span class="br0"><span style="color: #66cc66;">]</span></span> collation_name</div>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-06-01 -- <a href="http://ourmysql.com/archives/834" title="mysql latin1转utf8 的两种方法">mysql latin1转utf8 的两种方法</a></li><li>2009-07-15 -- <a href="http://ourmysql.com/archives/625" title="数据库字符集修改">数据库字符集修改</a></li><li>2008-12-15 -- <a href="http://ourmysql.com/archives/342" title="调用存储过程时报错:Illegal mix of collations">调用存储过程时报错:Illegal mix of collations</a></li><li>2008-12-03 -- <a href="http://ourmysql.com/archives/314" title="深入Mysql字符集设置">深入Mysql字符集设置</a></li><li>2008-09-21 -- <a href="http://ourmysql.com/archives/53" title="如何更改MySQL的默认字符集">如何更改MySQL的默认字符集</a></li><li>2008-09-21 -- <a href="http://ourmysql.com/archives/49" title="小谈MySQL字符集">小谈MySQL字符集</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/44" title="mysql连接通道中的字符集和校验规则">mysql连接通道中的字符集和校验规则</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/41" title="mysql字符集与校验规则的设置">mysql字符集与校验规则的设置</a></li><li>2008-09-18 -- <a href="http://ourmysql.com/archives/38" title="mysql的字符集与校验规则概念小介">mysql的字符集与校验规则概念小介</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/opt" title="opt" rel="tag">opt</a>, <a href="http://ourmysql.com/archives/tag/%e5%ad%97%e7%ac%a6%e9%9b%86" title="字符集" rel="tag">字符集</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/808/feed</wfw:commentRss>
		</item>
		<item>
		<title>Innodb如何使用内存</title>
		<link>http://ourmysql.com/archives/805</link>
		<comments>http://ourmysql.com/archives/805#comments</comments>
		<pubDate>Sun, 20 Dec 2009 08:36:41 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL优化设计]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[内存]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=805</guid>
		<description><![CDATA[最近经常被问起Innodb是如何使用内存的。该问题早已被原MySQL公司的Vadim论证过。我这里译一下他的文章供大家参考。
]]></description>
			<content:encoded><![CDATA[<p>    来源：<a href="http://www.mysqlperformanceblog.com/2006/05/30/innodb-memory-usage/">http://www.mysqlperformanceblog.com/2006/05/30/innodb-memory-usage/</a></p>
<p>    译这个文章的目的：</p>
<p>    　　最近经常被问起<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>是如何使用内存的。该问题早已被原MySQL公司的Vadim论证过。我这里译一下他的文章供大家参考。</p>
<p>    开始：</p>
<p>    　　这里有许多关于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>如何使用内存的问题。我这里将会以<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a>启动时的分配情况做一个解释。一些重要的概念：</p>
<p>    　　NBLOCKS＝Innodb_buffer_pool有多个页(block)＝innodb_buffer_pool_size/16384(16k)</p>
<p>     　OS_THREADS= if ( innodb_buffer_pool_size &gt;= 1000Mb) = 50000</p>
<p>     　　else if (innodb_buffer_pool_size &gt;= 8Mb) = 10000</p>
<p>    　　 else = 1000 (该值只用在*nixes系统上，对于Windows有一点小的区别计算OS_THREADS)</p>
<p>    所以<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a> 使用的内存包括：</p>
<p>    　innodb_buffer_pool_size</p>
<p>     innodb_additional_mem_pool_size</p>
<p>     innodb_log_buffer_size</p>
<p>     adaptive index hash ,size (<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a> buffer 索引管理区)= innodb_buffer_pool_size/64</p>
<p>     system dictionary hash,size(<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a>内部字典区) = 6 * innodb_buffer_pool_size/512</p>
<p>     memory for sync_array,size(用于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>内部syncronzation的开销)=OS_THREAD * 512</p>
<p>     memory for os_event,size(用于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a>内存的syncronzation的开销)=OS_THREAD * 216</p>
<p>     memory for locking system(内存的锁管理系统),size = 5 * 4 *NBBLOCKS</p>
<p>     最终得到<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a>内存使用的计算公式为：</p>
<p>     Innodb_buffer_pool_size + innodb_log_buffer_size + innodb_additional_mem_pool_size + 812/16384 * innodb_buffer_pool_size + OS_THREADS * 368</p>
<p>     对于812/16384 * Innodb_buffer_pool_size 可以简单的用 innodb_buffer_pool_size / 20　计算，</p>
<p>    对于OS_THREADS * 368　　</p>
<p>     OS_THREADS * 368 = 17.5 MB if innodb_buffer_pool_size &gt; 1000MB</p>
<p>     OS_THREADS * 368 = 3.5 MB if innodb_buffer_pool_size &gt; 8MB</p>
<p>    举一个例子：</p>
<p>    　　 如果你的innodb_buffer_pool_size有1500MB,innodb_additional_mem_pool_size =20 MB,innodb_log_buffer_size = 8M,</p>
<p>     　　<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a> 将会向系统申请内存为= 1500M + 20M + 8M + 1500/20 M +17.5 = 1620.5M</p>
<p>    　　根据以上的条件可以算出<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>最根本最需要多少内存，这样对于服务器的内存使用也可以有一个规划了。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/optimize" title="MySQL优化设计" rel="tag">MySQL优化设计</a>, <a href="http://ourmysql.com/archives/tag/%e5%86%85%e5%ad%98" title="内存" rel="tag">内存</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/805/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL中的定时执行</title>
		<link>http://ourmysql.com/archives/803</link>
		<comments>http://ourmysql.com/archives/803#comments</comments>
		<pubDate>Sun, 20 Dec 2009 08:34:48 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[定时]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=803</guid>
		<description><![CDATA[MySQL中的定时执行]]></description>
			<content:encoded><![CDATA[<p>    查看event是否开启</p>
<p>    show variables like \&#8217;%sche%\&#8217;;</p>
<p>    将事件计划开启</p>
<p>    set global event_scheduler =1;</p>
<p>    创建存储过程test</p>
<p>     CREATE PROCEDURE test ()</p>
<p>     BEGIN</p>
<p>     update examinfo SET endtime = now() WHERE id = 14;</p>
<p>     END;</p>
<p>     创建event e_test</p>
<p>     create event if not exists e_test</p>
<p>     on schedule every 30 second</p>
<p>     on completion preserve</p>
<p>     do call test();</p>
<p>     每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去.</p>
<p>    </p>
<p>     关闭事件任务</p>
<p>     alter event e_test ON</p>
<p>     COMPLETION PRESERVE DISABLE;</p>
<p>     开户事件任务</p>
<p>     alter event e_test ON</p>
<p>     COMPLETION PRESERVE ENABLE;</p>
<p>     以上测试均成功,测试环境为mysql 5.4.2-beta-community mysql community server(GPL)</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/%e5%ae%9a%e6%97%b6" title="定时" rel="tag">定时</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/803/feed</wfw:commentRss>
		</item>
		<item>
		<title>Innodb文件表空间结构</title>
		<link>http://ourmysql.com/archives/801</link>
		<comments>http://ourmysql.com/archives/801#comments</comments>
		<pubDate>Sun, 20 Dec 2009 08:33:06 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[表空间]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=801</guid>
		<description><![CDATA[表空间是在配置文件中定义的几个文件简单的耦合起来，在使用中互不可少（少一个就面临DB完蛋的危险）。对于共享表空间无法确定表所在的表空间上。]]></description>
			<content:encoded><![CDATA[<p>     <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>的表空间是在配置文件中定义（说是表空间有时觉的有点羞愧，和Oracle比真的差太远了），这里简单列一下表空间里的基本概念及表的分配情况。</p>
<p>     表空间是在配置文件中定义的几个文件简单的耦合起来，在使用中互不可少（少一个就面临DB完蛋的危险）。对于共享表空间无法确定表所在的表空间上。</p>
<p>     独立表空间可以做到每个表有自已的表空间（羞一下）。</p>
<p>     针对共享表空间，表空间中包括：回滚段,段（segment），区域（extent),数据页(page size)在表空间的体现为：</p>
<p>     表空间由默认16k的数据页面（page)组成，每64个连续的页面组成一个区域（extent,Oracle里熟悉的一个东东）。对于表空间的“文件(file)”在<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>中被称为段(segment)。 回滚段(rollback segment）是一个特殊的例子，实际上rollback segment包含了多个段。对于<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a>表的索引都被分配成两个段：一个是为了 B-tree 的无叶结点(non-leaf nodes)，另一个是为了叶结点(leaf nodes)。</p>
<p>     这是为了达到包含数据的叶结点的更好的顺序(sequentiality for the leaf nodes)。</p>
<p>     当表空间中的一个段增长时，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 为它个别地分配最初的 32 个页面。之后 <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 再分配段的整个区域(extents)。<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 会以每次 4 个区域(extents)来增加一个大段以确保数据的良好顺序。</p>
<p>     表空间中的某些页面包含其它页面的位图(bitmaps)，所以在 <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 表空间内的一些区域(extents)不能以一个整体分配给段，而只能作为个体页面。</p>
<p>     当发出一个查询 SHOW TABLE STATUS FROM … LIKE … 来询问表空间的剩余空间时，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 将报告表空间中所有空闲区域(extents)中确实可用的部分。<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 通常会保留一些区域用于 clean-up 和其它的内部目的；这些保留的区域并不包含在剩余可用空间中。</p>
<p>     当从一个表中删除数据时，<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> 将收缩 B-tree 中相应的索引。这是依赖于释放个别的页面或区域(extents)以让其他用户使用剩余空间的删除模式。 移除(drop)一个表或删除所有记录可以保证释放空间给其他用户，但是删除记录行只有在事务回滚或 consistent read 后并不需要时才会被物理的移除</p>
<p>     对于独立表空间也是存一样的概念和行为，唯一区别就是每个表的数据存到指定的表空间中，rollback segment不和数据的segment在一个竞争。使用独立表空间的一个好处就是可以使数据分布相对于磁盘上更连续一点。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-12 -- <a href="http://ourmysql.com/archives/796" title="InnoDB的”替代品”：Percona XtraDB">InnoDB的”替代品”：Percona XtraDB</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/%e8%a1%a8%e7%a9%ba%e9%97%b4" title="表空间" rel="tag">表空间</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/801/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL修改库名</title>
		<link>http://ourmysql.com/archives/799</link>
		<comments>http://ourmysql.com/archives/799#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:29:53 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL初级应用]]></category>

		<category><![CDATA[库名]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=799</guid>
		<description><![CDATA[如果是MyISAM的话.只要修改DATA目录下面的那个库名的文件夹的名字就OK了
如果是INNODB的话.其实是无法修改库名的.网上瞎咧咧的什么RENAME DATABASE或者ALTER DATABASE都是不行的]]></description>
			<content:encoded><![CDATA[<p>    如果是MyISAM的话.只要修改DATA目录下面的那个库名的文件夹的名字就OK了</p>
<p>    如果是<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">INNODB</a>的话.其实是无法修改库名的.网上瞎咧咧的什么RENAME DATABASE或者ALTER DATABASE都是不行的</p>
<p>    一种方法是比较保守的.直接把老库的内容<a href="http://ourmysql.com/archives/tag/mysqldump" class="st_tag internal_tag" rel="tag" title="标签 mysqldump 下的日志">mysqldump</a>到新库里面</p>
<p>    还有一种类似上面方法.先alter table 的存储引擎到MyISAM,然后改了库目录的名字,然后再改回来<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">INNODB</a>.</p>
<p>    最后一种方法还是比较好的.这边详细写一下.</p>
<p>    假设源库名是’srcdb’,目标库名是’trgdb’</p>
<p>    首先创建目标库</p>
<p>    create database trgdb;</p>
<p>    获取所有源库的表名</p>
<p>    use information_schema;</p>
<p>    select table_name from TABLES where TABLE_SCHEMA=’srcdb’;</p>
<p>    然后按照以下命令一个个修改</p>
<p>    rename table srcdb.[tablename] to trgdb.[tablename];</p>
<p>    一个个执行下来之后表就转到新的库里面了.</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/category/primary" title="MySQL初级应用" rel="tag">MySQL初级应用</a>, <a href="http://ourmysql.com/archives/tag/%e5%ba%93%e5%90%8d" title="库名" rel="tag">库名</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/799/feed</wfw:commentRss>
		</item>
		<item>
		<title>InnoDB的”替代品”：Percona XtraDB</title>
		<link>http://ourmysql.com/archives/796</link>
		<comments>http://ourmysql.com/archives/796#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:27:39 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL优化设计]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[XtraDB]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=796</guid>
		<description><![CDATA[XtraDB是Percona Team在InnoDB的基础上开发出来的一个更加强大的存储引擎，它百分百的兼容InnoDB，我们可以用XtraDB来替代为MySQL的发展做出历史性贡献的InnoDB，新的XtraDB引擎将具有更加强大的性能优势，以及良好的扩展性和一些新特性。]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 14pt; line-height: 115%; font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';" lang="ZH-CN">关于</span></strong></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">是</span><span style="font-family: 'Arial','sans-serif';">Percona Team</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">在</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的基础上开发出来的一个更加强大的存储引擎，它百分百的兼容</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">，我们可以用</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">来替代为</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的发展做出历史性贡献的</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">，新的</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">引擎将具有更加强大的性能优势，以及良好的扩展性和一些新特性。</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">Percona</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">于</span><span style="font-family: 'Arial','sans-serif';">2008</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">年</span><span style="font-family: 'Arial','sans-serif';">12</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">月</span><span style="font-family: 'Arial','sans-serif';">16</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">日正式对外公布</span><span style="font-family: 'Arial','sans-serif';">Percona XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">存储引擎，当时版本为</span><span style="font-family: 'Arial','sans-serif';">1.0.2-1</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">。在</span><span style="font-family: 'Arial','sans-serif';">09</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">年有相继发布了</span><span style="font-family: 'Arial','sans-serif';">release 3/4/5/8</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">，目前最新的版本为</span><span style="font-family: 'Arial','sans-serif';">Percona-XtraDB 1.0.4-8</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">。</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 14pt; line-height: 115%; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast;" lang="ZH-CN">安装</span></strong><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 14pt; line-height: 115%; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast;">XtraDB<span lang="ZH-CN"><span style="font-size: large; font-family: 宋体;">存储引擎</span></span></span></strong></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的安装有这么几种：一是现成的</span><span style="font-family: 'Arial','sans-serif';"><a href="http://www.percona.com/mysql/5.1.30/RPM/"><strong><span style="color: #ff9900;"><span style="font-family: Arial;">RPMS</span></span></strong></a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">包安装，不过这些包仅限于</span><span style="font-family: 'Arial','sans-serif';">x86_64</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">位</span><span style="font-family: 'Arial','sans-serif';">RedHat/CentOS 4/5</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">系统下，而且</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的版本为</span><span style="font-family: 'Arial','sans-serif';">5.1.30</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">；还有就是通过整体编译MySQL源码包的安装,即将新的</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">引擎的代码整合到</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的源码中，进行重新编译。前面这两种都需要重新搭建</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">数据库，例外还有一种，就是动态的将</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">加载进正在运行</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">中，这个看上去很符合生产的要求。</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">下面我们就来介绍</span><span style="font-family: 'Arial','sans-serif';">Linux</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">系统下，源码包的安装方法，具体步骤如下：</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN"></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">1.</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">下载</span><span style="font-family: 'Arial','sans-serif';">MySQL</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的源码安装包。</span><span style="font-family: 'Arial','sans-serif';"><a href="http://dev.mysql.com/downloads/mysql/5.1.html%23source"><span style="color: #0000ff;"><strong><span style="font-family: Arial;">http://dev.mysql.com/downloads/mysql/5.1.html#source</span></strong></span></a></span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">2.</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">下载</span><span style="font-family: 'Arial','sans-serif';">Percona XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的源码安装包。</span><span style="font-family: 'Arial','sans-serif';"><a href="https://launchpad.net/percona-xtradb/+download"><span style="color: #0000ff;"><strong><span style="font-family: Arial;">https://launchpad.net/percona-xtradb/+download</span></strong></span></a></span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">3.</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">编译安装</span><span style="font-family: 'Arial','sans-serif';">MySQL</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;tar -xvf mysql-5.1.35.tar.gz</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;cd mysql-5.1.35/storage</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;tar -xvf percona-xtradb-1.0.4-8.tar.gz</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;rm -rf innobase</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;mv percona-xtradb-1.0.4-8 innobase</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;cd ..</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif';"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt;./configure -prefix=/usr/local/mysql -with-plugins=innobase &amp;&amp; make &amp;&amp; make install</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; cp support-files/my-medium.cnf /etc/my.cnf</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; cd /usr/local/mysql</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; chown -R mysql.mysql .</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; bin/mysql_install_db -user=mysql</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; chown -R root .</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; chown -R mysql var</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">shell&gt; bin/mysqld_safe -user=mysql &amp;</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"></span> </p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">4.</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">验证</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">引擎的</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">100%</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">兼容</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">Innodb</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">。</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">shell&gt; mysql -uroot -p &lt; eiken_uat_backup.090803230101<span style="mso-spacerun: yes;"><span style="font-family: Arial;">  </span></span>(</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">将生产数据库导入新的</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">MySQL)</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">mysql&gt; show create table user_role\G</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">*************************** 1. row ***************************</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">       </span>Table: user_role</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">Create Table: CREATE TABLE `user_role` (</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">  </span>`user_name` varchar(100) NOT NULL,</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">  </span>`role_name` varchar(25) NOT NULL,</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">…omit….</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">) ENGINE=<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> DEFAULT CHARSET=latin1</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">1 row in set (0.00 sec)</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">(</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">经测试，所有应用一切正常。</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">)</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">mysql&gt; create table xtradb_tb(id int(3),engine_name char(120)) engine=<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a>; </span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">（创建一个使用</span><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-ansi-language: EN;" lang="ZH-CN">引擎的表）</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">Query OK, 0 rows affected (0.00 sec)</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">mysql&gt; show create table xtradb_tb\G</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">*************************** 1. row ***************************</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">       </span>Table: xtradb_tb</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">Create Table: CREATE TABLE `xtradb_tb` (</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">  </span>`id` int(3) DEFAULT NULL,</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Arial;"><span style="mso-spacerun: yes;">  </span>`engine_name` char(120) DEFAULT NULL</span></span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">) ENGINE=<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> DEFAULT CHARSET=latin1</span></span></span></p>
<p class="MsoNormal" style="background: #d9d9d9; margin: 0in 0in 10pt; mso-background-themecolor: background1; mso-background-themeshade: 217;"><span style="font-family: 'Arial','sans-serif'; mso-ansi-language: EN;" lang="EN"><span style="font-size: small;"><span style="font-size: x-small; font-family: Arial;">1 row in set (0.00 sec)</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="color: red; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">（</span><span style="color: red; font-family: 'Arial','sans-serif';">NOTE</span><span style="color: red; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">：如果你要使用</span><span style="color: red; font-family: 'Arial','sans-serif';">XtraDB</span><span style="color: red; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">这个引擎，</span><span style="color: red; font-family: 'Arial','sans-serif';">engine</span><span style="color: red; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的值依然要设置成</span><span style="color: red; font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="color: red; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">。）</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><strong style="mso-bidi-font-weight: normal;"><span style="font-size: 14pt; line-height: 115%; font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">比较</span></strong><strong style="mso-bidi-font-weight: normal;"></strong></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">最后，我们简要比较一下</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">与</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">之间都有哪些变化。分别连上配有不同引擎的数据库服务。比较如下：</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">1.INFORMATION_SCHEMA</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">中的表数量发生明显变化。</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';">XtraDB </span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">：</span><span style="font-family: 'Arial','sans-serif';">42</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">个（增加了</span><span style="font-family: 'Arial','sans-serif';">13</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">项</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">INNODB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">开头的表和一个</span><span style="font-family: 'Arial','sans-serif';">XTRADB_ENHANCEMENTS</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">表，改表中记录逐一介绍了新的</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">对</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">所做的各项改进）</span></span></span></p>
<p class="MsoNormal" style="background: white; margin: 0in 0in 10pt; mso-background-themecolor: background1;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a> </span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">：</span><span style="font-family: 'Arial','sans-serif';">28</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">个</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: Calibri;">2. </span><span style="font-family: 'Arial','sans-serif';">SHOW <a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">INNODB</a> STATUS</span><span style="font-family: SimSun; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;" lang="ZH-CN">命令的输出内容的增加。</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: SimSun; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;" lang="ZH-CN">其中，</span><span style="font-family: 'Arial','sans-serif';">BUFFER POOL AND MEMORY</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的内容变得更加丰富。</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">同时，在输出中，我们还会发现，</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">在线程的投入上也有很大提高，在</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">中</span><span style="font-family: 'Arial','sans-serif';">FILE I/O</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的线程仅为</span><span style="font-family: 'Arial','sans-serif';">4</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">个，而在</span><span style="font-family: 'Arial','sans-serif';">XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">中你会发现为</span><span style="font-family: 'Arial','sans-serif';">10</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">个，分别是读、写的线程数都各自增加为</span><span style="font-family: 'Arial','sans-serif';">4</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">个，这对于性能会有很大提升。</span></span></span></p>
<p class="MsoNormal" style="margin: 0in 0in 10pt;"><span style="font-size: small;"><span style="font-size: x-small;"><strong style="mso-bidi-font-weight: normal;"><span style="color: #ffc000; font-family: 'Arial','sans-serif';">P.S.:</span></strong><span style="font-family: 'Arial','sans-serif';"> </span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">其实，第一次听到</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">的替代引擎，实在最近的一次面试的时候，当时，一听傻了，在想“</span><span style="font-family: 'Arial','sans-serif';"><a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">InnoDB</a></span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">”什么时候除了替代品啦，我真的太孤陋寡闻了（</span><span style="font-family: 'Arial','sans-serif';">Hiro</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">听到后一定有要鄙视我了，</span><span style="font-family: 'Arial','sans-serif';">LOL:&gt;</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">）。后来，查了一下，是真地——</span><span style="font-family: 'Arial','sans-serif';">Percona XtraDB</span><span style="font-family: SimSun; mso-bidi-font-family: Arial; mso-fareast-font-family: SimSun; mso-fareast-theme-font: minor-fareast; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;" lang="ZH-CN">，出来了！</span></span></span></p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2010-08-04 -- <a href="http://ourmysql.com/archives/845" title="InnoDB主键设计">InnoDB主键设计</a></li><li>2010-04-13 -- <a href="http://ourmysql.com/archives/825" title="InnoDB Double write">InnoDB Double write</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/817" title="Innodb 表和索引结构">Innodb 表和索引结构</a></li><li>2010-03-09 -- <a href="http://ourmysql.com/archives/811" title="InnoDB线程并发检查机制">InnoDB线程并发检查机制</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/805" title="Innodb如何使用内存">Innodb如何使用内存</a></li><li>2009-12-20 -- <a href="http://ourmysql.com/archives/801" title="Innodb文件表空间结构">Innodb文件表空间结构</a></li><li>2009-09-25 -- <a href="http://ourmysql.com/archives/743" title="Innodb表空间page size的选择">Innodb表空间page size的选择</a></li><li>2009-09-03 -- <a href="http://ourmysql.com/archives/732" title="MySQL InnoDB性能调整的一点实践">MySQL InnoDB性能调整的一点实践</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/711" title="随机主键对InnoDB插入性能的影响">随机主键对InnoDB插入性能的影响</a></li><li>2009-08-18 -- <a href="http://ourmysql.com/archives/707" title="InnoDB之Dirty Page、Redo log">InnoDB之Dirty Page、Redo log</a></li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/innodb" title="InnoDB" rel="tag">InnoDB</a>, <a href="http://ourmysql.com/archives/category/optimize" title="MySQL优化设计" rel="tag">MySQL优化设计</a>, <a href="http://ourmysql.com/archives/tag/xtradb" title="XtraDB" rel="tag">XtraDB</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/796/feed</wfw:commentRss>
		</item>
		<item>
		<title>mysql的partition与auto_increment</title>
		<link>http://ourmysql.com/archives/794</link>
		<comments>http://ourmysql.com/archives/794#comments</comments>
		<pubDate>Sat, 12 Dec 2009 15:25:40 +0000</pubDate>
		<dc:creator>OurMySQL</dc:creator>
		
		<category><![CDATA[MySQL基础知识]]></category>

		<category><![CDATA[auto_increment]]></category>

		<category><![CDATA[partition]]></category>

		<guid isPermaLink="false">http://www.ourmysql.com/?p=794</guid>
		<description><![CDATA[mysql 5.1之后，开始新增了partition功能，可以做到对代码透明的情况下进行数据分区。但是从实际使用中来看，限制颇多。]]></description>
			<content:encoded><![CDATA[<p>    <a href="http://www.ourmysql.com/?tag=mysql">mysql</a> 5.1之后，开始新增了<a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">partition</a>功能，可以做到对代码透明的情况下进行数据分区。但是从实际使用中来看，限制颇多：</p>
<p>    如果用来分区的字段和主键不是同一个，则不能分区见很早前的一篇译文<a href="http://www.ooso.net/archives/217">mysql 5.1新功能 －－ 按日期分区</a>，如果查询条件中没有正确利用到分区的字段，那么<a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">partition</a>的效果为零mysql 5.1.31之前的<a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">partition</a>功能有较大的bug，会导致自增字段不能正常自增，怎么个不正常法？<a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a>值会非正常增长，突然比当前的最大id小很多，插入数据时导致duplicate key错误。</p>
<p>    这些问题都能凑合着对付过去，但是<a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">partition</a>功能和<a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a>似乎是天生的敌人。从使用习惯上来说，我们会把<a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a>字段设置为主键，这个字段要是unique的才比较稳妥，这个情况下如果希望用其它字段来进行分区的话，几乎就成了不可能的任务。以这张表为例：</p>
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
CREATE TABLE user (  <br />
  id int <a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a> PRIMARY KEY,<br />
  uid int,<br />
  foo varchar(32)<br />
) engine=myisam; </td>
</tr>
</tbody>
</table>
<p>    这个时候试图以uid进行分区会怎么样？是以怎样的惨淡结局收场？变通的办法是对自增字段做一些调整，从mysql的手册来看，自增字段不一定要设置成主键，仅仅是普通的index也可以，那么把表结构换成下面这个样子，就可以分区成功。</p>
<div class="igBar">
<table style="table-layout: fixed; border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td style="word-wrap: break-word;" bgcolor="#fdfddf"><span style="font-weight: bold;">以下是代码片段：</span><br />
CREATE TABLE user (  <br />
  id int <a href="http://ourmysql.com/archives/tag/auto_increment" class="st_tag internal_tag" rel="tag" title="标签 auto_increment 下的日志">auto_increment</a>,<br />
  uid int,<br />
  foo varchar(32),<br />
  index (id)<br />
) engine=<a href="http://ourmysql.com/archives/tag/innodb" class="st_tag internal_tag" rel="tag" title="标签 InnoDB 下的日志">innodb</a> <a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">PARTITION</a> BY HASH (uid) PARTITIONS 4; </td>
</tr>
</tbody>
</table>
</div>
<p>    我在实际环境中有一张表达到了几亿条数据，如果要用时下流行的sharding策略，必须在代码上做一些改动，当时偷了点懒直接使用<a href="http://ourmysql.com/archives/tag/partition" class="st_tag internal_tag" rel="tag" title="标签 partition 下的日志">partition</a>功能，用了大半年倒也相安无事。只是分区表占用内存相当的大，如果有其它的表经常出现慢查询耗费服务器资源，那么雪崩效应就出现了，所有的查询都会堵塞变得非常慢。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>目前没有相关的文章</li></ul>
	标签：<a href="http://ourmysql.com/archives/tag/auto_increment" title="auto_increment" rel="tag">auto_increment</a>, <a href="http://ourmysql.com/archives/category/basic" title="MySQL基础知识" rel="tag">MySQL基础知识</a>, <a href="http://ourmysql.com/archives/tag/partition" title="partition" rel="tag">partition</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourmysql.com/archives/794/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
