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

<channel>
	<title>淘宝数据库技术团队</title>
	<atom:link href="http://www.taobaodba.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.taobaodba.com</link>
	<description>数据库管理，数据库开发，数据库工具，数据库架构</description>
	<lastBuildDate>Thu, 27 Oct 2011 04:41:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>2011产品DBA北京团队招聘</title>
		<link>http://www.taobaodba.com/html/656_2011%e4%ba%a7%e5%93%81dba%e5%9b%a2%e9%98%9f%e5%8c%97%e4%ba%ac.html</link>
		<comments>http://www.taobaodba.com/html/656_2011%e4%ba%a7%e5%93%81dba%e5%9b%a2%e9%98%9f%e5%8c%97%e4%ba%ac.html#comments</comments>
		<pubDate>Thu, 20 Oct 2011 02:32:04 +0000</pubDate>
		<dc:creator>丹臣</dc:creator>
				<category><![CDATA[招聘]]></category>
		<category><![CDATA[淘宝DBA 招聘 丹臣 zhaolinjnu]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=656</guid>
		<description><![CDATA[为了进一步支持北京业务团队的项目开发，对业务开发团队提供数据库前期集群设计，开发支持，后期MySQL问题诊断服务支持，现面向社会招聘MySQL产品DBA，此岗位base在北京，招聘人数：2人，下面是岗位要求： 1、熟悉MySQL数据库体系结构与性能优化 2、熟悉关系数据库原理与设计，有大型项目的数据库设计和支持经验优先 3、精通/熟悉SQL调优 4、熟悉linux操作系统的使用 5、有一定的shell or perl编程经验 6、有一定的java or c or c++编程经验 如果你想参与淘宝MySQL分布式集群的设计，为开发人员提供高质量的MySQL数据存储服务支持，学习MySQL诊断问题的方法，欢迎加入淘宝产品DBA北京团队，请投递简历给我：danchen#taobao.com (将#换成@)]]></description>
			<content:encoded><![CDATA[<p>为了进一步支持北京业务团队的项目开发，对业务开发团队提供数据库前期集群设计，开发支持，后期MySQL问题诊断服务支持，现面向社会招聘MySQL产品DBA，此岗位base在北京，招聘人数：2人，下面是岗位要求：<br />
1、熟悉MySQL数据库体系结构与性能优化<br />
2、熟悉关系数据库原理与设计，有大型项目的数据库设计和支持经验优先<br />
3、精通/熟悉SQL调优<br />
4、熟悉linux操作系统的使用<br />
5、有一定的shell or perl编程经验<br />
6、有一定的java or c or c++编程经验 </p>
<p>如果你想参与淘宝MySQL分布式集群的设计，为开发人员提供高质量的MySQL数据存储服务支持，学习MySQL诊断问题的方法，欢迎加入淘宝产品DBA北京团队，请投递简历给我：danchen#taobao.com   (将#换成@)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/656_2011%e4%ba%a7%e5%93%81dba%e5%9b%a2%e9%98%9f%e5%8c%97%e4%ba%ac.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL-5.1.48升级评估: MySQL-5.1.x系列修复了哪些BUG</title>
		<link>http://www.taobaodba.com/html/637_mysql-5-1-48%e5%8d%87%e7%ba%a7%e8%af%84%e4%bc%b0-mysql-5-1-x%e7%b3%bb%e5%88%97%e4%bf%ae%e5%a4%8d%e4%ba%86%e5%93%aa%e4%ba%9bbug.html</link>
		<comments>http://www.taobaodba.com/html/637_mysql-5-1-48%e5%8d%87%e7%ba%a7%e8%af%84%e4%bc%b0-mysql-5-1-x%e7%b3%bb%e5%88%97%e4%bf%ae%e5%a4%8d%e4%ba%86%e5%93%aa%e4%ba%9bbug.html#comments</comments>
		<pubDate>Sun, 25 Sep 2011 12:32:35 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[mysql bug]]></category>
		<category><![CDATA[版本升级]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=637</guid>
		<description><![CDATA[由于线上主流MySQL数据库用的MySQL-5.1.48版本，这个版本运行近两年来，暴露的问题比较少，也是相对比较稳定的一个GA版本。最近研究升级到MySQL-5.1.x系列，发现没有找到能说服我自己的理由，除非是遇到了真的过不去的坎，或者特别想利用新的特性，因为从sysbench测性能试的结果看，不分伯仲。 mysql-5.1.48 mysql-5.1.56 OPR requests latency requests latency select 37331.96 37192.82 0.85 0.86 37396.46 37399.82 0.85 0.85 update-key 17305.59 17207.60 1.85 1.86 16855.06 16633.32 1.89 1.92 update-nokey 15517.05 15600.70 2.06 2.05 15258.13 14713.75 2.09 2.17 insert 9807.19 9892.62 3.26 3.23 11030.71 8748.67 2.90 3.65 delete 21095.04 21721.00 1.51 1.47 19690.32 22372.53 1.62 1.43 trx 19112.93 [...]]]></description>
			<content:encoded><![CDATA[<p>由于线上主流MySQL数据库用的MySQL-5.1.48版本，这个版本运行近两年来，暴露的问题比较少，也是相对比较稳定的一个GA版本。最近研究升级到MySQL-5.1.x系列，发现没有找到能说服我自己的理由，除非是遇到了真的过不去的坎，或者特别想利用新的特性，因为从sysbench测性能试的结果看，不分伯仲。</p>
<p><span id="more-637"></span></p>
<table width="441" border="0" cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="100"></td>
<td colspan="2" width="187">mysql-5.1.48</td>
<td colspan="2" width="155">mysql-5.1.56</td>
</tr>
<tr>
<td width="100"><strong>OPR</strong></td>
<td width="115"><strong>requests</strong></td>
<td width="72"><strong>latency</strong></td>
<td width="83"><strong>requests</strong></td>
<td width="72"><strong>latency</strong></td>
</tr>
<tr>
<td width="100">select</td>
<td width="115">37331.96<br />
37192.82</td>
<td width="72">0.85<br />
0.86</td>
<td width="83">37396.46<br />
37399.82</td>
<td width="72">0.85<br />
0.85</td>
</tr>
<tr>
<td width="100">update-key</td>
<td width="115">17305.59<br />
17207.60</td>
<td width="72">1.85<br />
1.86</td>
<td width="83">16855.06<br />
16633.32</td>
<td width="72">1.89<br />
1.92</td>
</tr>
<tr>
<td width="100">update-nokey</td>
<td width="115">15517.05<br />
15600.70</td>
<td width="72">2.06<br />
2.05</td>
<td width="83">15258.13<br />
14713.75</td>
<td width="72">2.09<br />
2.17</td>
</tr>
<tr>
<td width="100">insert</td>
<td width="115">9807.19<br />
9892.62</td>
<td width="72">3.26<br />
3.23</td>
<td width="83">11030.71<br />
8748.67</td>
<td width="72">2.90<br />
3.65</td>
</tr>
<tr>
<td width="100">delete</td>
<td width="115">21095.04<br />
21721.00</td>
<td width="72">1.51<br />
1.47</td>
<td width="83">19690.32<br />
22372.53</td>
<td width="72">1.62<br />
1.43</td>
</tr>
<tr>
<td width="100">trx</td>
<td width="115">19112.93<br />
20660.41</td>
<td width="72">31.8<br />
29.5</td>
<td width="83">24751.16<br />
20814.12</td>
<td width="72">24.57<br />
29.25</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>看看<a href="http://www.slideshare.net/slidethanks/my-sqlstrategyroadmap">Oracle对MySQL的规划</a>，你会更倾向MySQL-5.5。但对于仍然使用MySQL-5.1.48的应用，必须要关注当前版本存在哪些问题。</p>
<p>下面是所列的几大主要版本修复的我们所关心的BUG，如有遗漏，后续补充。</p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-49.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-49.html</a></p>
<p>暂无</p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-50.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-50.html</a></p>
<p>#45012 <strong>my_like_range_cp932 generates invalid string </strong><strong>（编码集，可以忽略）</strong></p>
<p>#54117 <strong>crash in thr_multi_unlock, temporary table (debug</strong><strong>版本存在</strong><strong>)</strong></p>
<p>#54465 <strong> </strong><strong>assert: field_types == 0 || field_types[field_pos] == MYSQL_TYPE_LONGLONG(testcase</strong><strong>好几个，但一直没有遇到</strong><strong>)</strong></p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-52.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-52.html</a></p>
<p>暂无</p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-52sp1.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-52sp1.html</a></p>
<p>新特性innodb_use_sys_malloc=0|1</p>
<p><a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-performance-use_sys_malloc.html">http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-performance-use_sys_malloc.html</a></p>
<p>#55421 <strong>Protocol::end_statement(): Assertion `0&#8242; on multi-table UPDATE IGNORE </strong><strong>（</strong><strong>trigger</strong><strong>执行时有活跃的</strong><strong>select</strong><strong>时会触发）</strong><strong> </strong></p>
<p>#55779 <strong>select does not work properly in mysql server Version &#8220;5.1.42 SUSE MySQL RPM&#8221;(</strong><strong>当时间不是</strong>&#8216;YYYY-MM-DD HH:MM:SS&#8217;<strong>格式时候，存在</strong><strong> &gt;=</strong><strong>只会查</strong><strong>&gt;</strong><strong>的结果</strong><strong>)</strong></p>
<p>#50402 <strong>Optimizer producing wrong results when using Index Merge on InnoDB</strong><strong>（</strong><strong>join</strong><strong>时可能存在，由于</strong><strong>innodb</strong><strong>在做</strong><strong>index merge</strong><strong>时逻辑错误导致）</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-53.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-53.html</a> <strong>(FIXED TOO MANY BUGS IN REPLICATION)</strong></p>
<p>#56982 <strong>Assertion Failure from ha_innobase::innobase_peek_autoinc() when auto_inc &gt; 0 </strong><strong>（</strong><strong>alter table</strong><strong>宕机后</strong><strong>show create table OR information</strong><strong>必然触发，当然前提是</strong><strong>alter table</strong><strong>后要宕机）</strong><strong> </strong></p>
<p>#55478 <strong>Row events wrongly apply on the temporary table of the same name (RBR</strong><strong>要注意了</strong><strong>)</strong></p>
<p>#55375 <strong>Transaction bigger than max_binlog_cache_size crashes slave</strong><strong>（仅仅在备库可能出现，因为备库的</strong><strong>IO</strong><strong>线程</strong><strong>rollback</strong><strong>所有事务，而不能仅仅</strong><strong>rollback</strong><strong>当前的</strong><strong>stmt</strong><strong>）</strong><strong> </strong></p>
<p>#55263 <strong>assert in check_binlog_magic (</strong><strong>通过</strong><strong>change master to</strong><strong>改变</strong><strong>relay log</strong><strong>的信息时触发，因为没有清空</strong><strong>IO_CACHE</strong><strong>中内容导致读陈旧的数据</strong><strong>)</strong></p>
<p>#38718 <strong>slave sql thread crashes when reading relay log </strong><strong>（</strong><strong>invalid</strong><strong>类型的</strong><strong>binlog event</strong><strong>导致备库</strong><strong>crash</strong><strong>）</strong><strong> </strong></p>
<p>#56423 <strong>Different count with SELECT and CREATE SELECT queries (create table … select</strong><strong>要小心了</strong><strong>)</strong></p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-54.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-54.html</a></p>
<p>几个不怎么关系的编译问题(Bug #57992, Bug #57993, Bug #57994, Bug #57995, Bug #57996, Bug #57997, Bug #58057)</p>
<p>#56228 <strong>The server could crash with an assertion error, if a stored procedure, stored function, or trigger modified one </strong><a title="13.6. The InnoDB Storage Engine" href="http://dev.mysql.com/doc/refman/5.1/en/innodb-storage-engine.html">InnoDB</a><strong> table containing an </strong><a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/glossary.html#glos_auto_increment" target="_top"><strong>auto-increment</strong></a><strong> column, and dropped another </strong><a title="13.6. The InnoDB Storage Engine" href="http://dev.mysql.com/doc/refman/5.1/en/innodb-storage-engine.html">InnoDB</a><strong> table containing an auto-increment column</strong><strong>（修改</strong><strong>autoinc</strong><strong>列的</strong><strong>DDL</strong><strong>还是可能出现，做</strong><strong>DDL</strong><strong>的不要</strong><strong>drop</strong><strong>另外一个含</strong><strong>autoinc</strong><strong>的表）</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-55.html">http://dev.mysql.com/doc/refman/5.1/en/news-5-1-55.html</a> (seems good)</p>
<p>#18274 <strong>InnoDB auto_increment field reset on OPTIMIZE TABLE</strong><strong>（</strong><strong>optimize table</strong><strong>要注意了</strong><strong>,</strong><strong>平常偶尔会用到）</strong><strong> </strong></p>
<p>#57288 <strong>binlog_tmp_table fails sporadically: &#8220;Failed to write the DROP statement &#8230;&#8221; </strong><strong>（临时表关闭可能导致</strong><strong>binlog</strong><strong>错误，还没有遇到过）</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/news-5-1-56.html"><strong><em>http://dev.mysql.com/doc/refman/5.1/en/news-5-1-56.html</em></strong></a><strong><em> </em></strong></p>
<p>&nbsp;</p>
<p>#59308 <strong>Incorrect result for SELECT DISTINCT &lt;col&gt;&#8230; ORDER BY &lt;col&gt; DESC </strong><strong>（线上还没有怎么注意到这个问题，重视下）</strong></p>
<p>#59338 <strong>Inconsistency in binlog for statements that don&#8217;t change any rows STATEMENT SBR </strong><strong>（对</strong><strong>InnoDB</strong><strong>来说，虽然</strong><strong>binlog</strong><strong>可能不一致，但对数据没有影响）</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/637_mysql-5-1-48%e5%8d%87%e7%ba%a7%e8%af%84%e4%bc%b0-mysql-5-1-x%e7%b3%bb%e5%88%97%e4%bf%ae%e5%a4%8d%e4%ba%86%e5%93%aa%e4%ba%9bbug.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>audit plugin:  在淘宝的应用</title>
		<link>http://www.taobaodba.com/html/633_audit-plugin-%e5%9c%a8%e6%b7%98%e5%ae%9d%e7%9a%84%e5%ba%94%e7%94%a8.html</link>
		<comments>http://www.taobaodba.com/html/633_audit-plugin-%e5%9c%a8%e6%b7%98%e5%ae%9d%e7%9a%84%e5%ba%94%e7%94%a8.html#comments</comments>
		<pubDate>Sun, 25 Sep 2011 12:28:59 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[数据库 审计]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=633</guid>
		<description><![CDATA[背景： 1. 库升级时，监测最近有哪些活跃用户访问此库 2. 某些场合下需要记录用户的对库表的修改 3. 需要对用户的特殊行为事后监控，出问题可查 4. 对需求3的实行监测控制，杜绝非规则之内SQL行为 &#160; 解决方案： 1. init_connect属性 目前线上运行的主流版本  MySQL-5.1.48在安全审计方面支持性较差，而在MySQL-5.5版本中得到很好改善。在老版本中有个init_connect属性，在用户连接时执行init_connect的内容。为支持用户行为监控，在init_connect内赋值MySQL内部API获取的值，典型的是IP/USER，自动地写入到临时表中。优点就是方便，即配即用，缺点是很难监测到用户干了些什么。 &#160; 这个属性粒度太粗，线上应用于白名单监测。 &#160; 2. binlog扩展 在MySQL-5.1.48中扩展binlog是init_connect的升级版，即在binlog中记录用户的行为。大家可能会想，为何不把slow_query设置到毫秒级，让slow_query记录详细信息。抛弃这种想法的理由是，slow_query会记录大量的信息，耗IO和DISK，完全没有必要。扩展binlog的思想很简单，就是修改binlog的存储协议格式，在头部加入IP/USER，额外空间是4+6（IP+USER)，对性能没有影响。不幸的是，目前binlog的协议头早已被用完，扩展性大大打折扣。修改后意味着生成的binlog不能被别的按原生态MySQL binlog协议解析的MySQL或工具所读取，修改后的MySQL不能读取之前生成的MySQL binlog。 &#160; binlog扩展应SQA环境下的部分业务。 &#160; 3. audit_plugin 在MySQL-5.5版本中，插件得到很好的支持，灵活的动态加载、卸载审计插件。API中可以得到THD指针，权利变得可以无限想象。如何做到对用户配置的规则灵活的支持，才是可用性的关键。 &#160; 1)  用户规则静态配置 典型的用户对库表的操作DDL，或是无条件的DELETE。 另外，基于安全方面需求的各种意想不到的的规则加入，例如SQL注入的预防。 &#160; 为此基于my.cnf中加入audit栏支持用户初始化的配置，在MySQL启动时读取。 &#160; 2)  用户规则的动态可配 用户的规则设置必须支持动态可配，可以有两种方法： * 通过扩展变量来设置，例如set rule=&#8221;add&#124;del $rule&#8221;。 这样做的坏处就是必须重在MySQL层hook部分代码新解析对应的handler * 通过修改my.cnf中audit栏，每次动态的读取，更新内存中历史规则。 每次判断文件修改时间，与上次读取时保存的时间不一样则读取。 &#160; 3)  审计handler 审计插件被触发时产生的事件(mysql_event_general)中记录了与SQL相关的非常丰富的信息，事件被传递到audit插件的notify函数参数中： static void audit_null_notify(MYSQL_THD [...]]]></description>
			<content:encoded><![CDATA[<p>背景：</p>
<p>1. 库升级时，监测最近有哪些活跃用户访问此库</p>
<p>2. 某些场合下需要记录用户的对库表的修改</p>
<p>3. 需要对用户的特殊行为事后监控，出问题可查</p>
<p>4. 对需求3的实行监测控制，杜绝非规则之内SQL行为</p>
<p>&nbsp;</p>
<p>解决方案：<span id="more-633"></span></p>
<p>1. init_connect属性</p>
<p>目前线上运行的主流版本  MySQL-5.1.48在安全审计方面支持性较差，而在MySQL-5.5版本中得到很好改善。在老版本中有个init_connect属性，在用户连接时执行init_connect的内容。为支持用户行为监控，在init_connect内赋值MySQL内部API获取的值，典型的是IP/USER，自动地写入到临时表中。优点就是方便，即配即用，缺点是很难监测到用户干了些什么。</p>
<p>&nbsp;</p>
<p>这个属性粒度太粗，线上应用于白名单监测。</p>
<p>&nbsp;</p>
<p>2. binlog扩展</p>
<p>在MySQL-5.1.48中扩展binlog是init_connect的升级版，即在binlog中记录用户的行为。大家可能会想，为何不把slow_query设置到毫秒级，让slow_query记录详细信息。抛弃这种想法的理由是，slow_query会记录大量的信息，耗IO和DISK，完全没有必要。扩展binlog的思想很简单，就是修改binlog的存储协议格式，在头部加入IP/USER，额外空间是4+6（IP+USER)，对性能没有影响。不幸的是，目前binlog的协议头早已被用完，扩展性大大打折扣。修改后意味着生成的binlog不能被别的按原生态MySQL binlog协议解析的MySQL或工具所读取，修改后的MySQL不能读取之前生成的MySQL binlog。</p>
<p>&nbsp;</p>
<p>binlog扩展应SQA环境下的部分业务。</p>
<p>&nbsp;</p>
<p>3. audit_plugin</p>
<p>在MySQL-5.5版本中，插件得到很好的支持，灵活的动态加载、卸载审计插件。API中可以得到THD指针，权利变得可以无限想象。如何做到对用户配置的规则灵活的支持，才是可用性的关键。</p>
<p>&nbsp;</p>
<p>1)  用户规则静态配置</p>
<p>典型的用户对库表的操作DDL，或是无条件的DELETE。</p>
<p>另外，基于安全方面需求的各种意想不到的的规则加入，例如SQL注入的预防。</p>
<p>&nbsp;</p>
<p>为此基于my.cnf中加入audit栏支持用户初始化的配置，在MySQL启动时读取。</p>
<p>&nbsp;</p>
<p>2)  用户规则的动态可配</p>
<p>用户的规则设置必须支持动态可配，可以有两种方法：</p>
<p>* 通过扩展变量来设置，例如set rule=&#8221;add|del $rule&#8221;。</p>
<p>这样做的坏处就是必须重在MySQL层hook部分代码新解析对应的handler</p>
<p>* 通过修改my.cnf中audit栏，每次动态的读取，更新内存中历史规则。</p>
<p>每次判断文件修改时间，与上次读取时保存的时间不一样则读取。</p>
<p>&nbsp;</p>
<p>3)  审计handler</p>
<p>审计插件被触发时产生的事件(mysql_event_general)中记录了与SQL相关的非常丰富的信息，事件被传递到audit插件的notify函数参数中：</p>
<p>static void audit_null_notify(MYSQL_THD thd,  unsigned int event_class, const void *event)</p>
<p>我们可以对event类型进行强制转换为mysql_event_genereal:</p>
<pre>if (event_class == MYSQL_AUDIT_GENERAL_CLASS) {
pEvent = (const struct mysql_event_general *) event;</pre>
<p>在头文件plugin_audit.h中，定义了该事件类型的结构体：</p>
<pre>struct mysql_event_general
{
unsigned int event_subclass;
int general_error_code;
unsigned long general_thread_id;
const char *general_user;
unsigned int general_user_length;
const char *general_command;
unsigned int general_command_length;
const char *general_query;
unsigned int general_query_length;
struct charset_info_st *general_charset;
unsigned long long general_time;
unsigned long long general_rows;
};</pre>
<p>从结构体中，我们可以看出事件中记录了包括用户名，线程id，执行的sql等信息，另外结合THD，还可以得到用户的主机名以及操作的数据库名，这些信息足以满足我们审计的需求。</p>
<p>对规则应用时重点是如何对众多的规则进行判断，即要考虑性能。目前的优化留给用户处理，即在配置文件中将粒度粗的，出现概率大的写在前。</p>
<p>扩展后的audit插件目前主要应用于安全需求方面。</p>
<p>&nbsp;</p>
<p>通过安全审计，做到事前监测触发，防患于未然。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/633_audit-plugin-%e5%9c%a8%e6%b7%98%e5%ae%9d%e7%9a%84%e5%ba%94%e7%94%a8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>语法分析利器：Bison介绍基础篇</title>
		<link>http://www.taobaodba.com/html/625_%e8%af%ad%e6%b3%95%e5%88%86%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9abison%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html</link>
		<comments>http://www.taobaodba.com/html/625_%e8%af%ad%e6%b3%95%e5%88%86%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9abison%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html#comments</comments>
		<pubDate>Thu, 22 Sep 2011 07:18:35 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=625</guid>
		<description><![CDATA[﻿]]></description>
			<content:encoded><![CDATA[<p>﻿<br />
<iframe src="http://www.slideshare.net/slideshow/embed_code/9370452" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br />
<span id="more-625"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/625_%e8%af%ad%e6%b3%95%e5%88%86%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9abison%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>词法分析利器：Flex介绍基础篇</title>
		<link>http://www.taobaodba.com/html/610_%e8%af%8d%e6%b3%95%e8%a7%a3%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9aflex%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html</link>
		<comments>http://www.taobaodba.com/html/610_%e8%af%8d%e6%b3%95%e8%a7%a3%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9aflex%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html#comments</comments>
		<pubDate>Thu, 22 Sep 2011 07:12:22 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=610</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://www.slideshare.net/slideshow/embed_code/9370206" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/610_%e8%af%8d%e6%b3%95%e8%a7%a3%e6%9e%90%e5%88%a9%e5%99%a8%ef%bc%9aflex%e4%bb%8b%e7%bb%8d%e5%9f%ba%e7%a1%80%e7%af%87.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysqld: Got error 514 from select</title>
		<link>http://www.taobaodba.com/html/595_mysqld-got-error-514-from-select.html</link>
		<comments>http://www.taobaodba.com/html/595_mysqld-got-error-514-from-select.html#comments</comments>
		<pubDate>Thu, 22 Sep 2011 01:14:59 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=595</guid>
		<description><![CDATA[在线上一台MySQL机器遇到这样的问题： MySQL无法连接，pstack 无法打印出MySQL的stack trace。在alert.log里仅有一条error： 110829 20:25:51 [ERROR] mysqld: Got error 514 from select 这条语句出现在监测到问题之前发生（精确的时间点我这没有拿到）。 查了下是select系统调用的一个bug。有这么一句解释：此错误是用户程序不应该看到的， 不幸被MySQL看到了： errno 514 is ERESTARTNOHAND (restart if no handler), and is in a section marked as &#8220;should never be seen by user programs&#8221;. 对于的OS和MySQL版本信息如下： $ uname -a Linux dev031033.sqa.cm4 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 [...]]]></description>
			<content:encoded><![CDATA[<p>在线上一台MySQL机器遇到这样的问题：</p>
<p>MySQL无法连接，pstack 无法打印出MySQL的stack trace。在alert.log里仅有一条error：</p>
<p>110829 20:25:51 [ERROR] mysqld: Got error 514 from select</p>
<p>这条语句出现在监测到问题之前发生（精确的时间点我这没有拿到）。</p>
<p>查了下是<a href="http://lkml.indiana.edu/hypermail/linux/kernel/0608.2/2081.html">select系统调用的一个bug</a>。有这么一句解释：此错误是用户程序不应该看到的， 不幸被MySQL看到了：<br />
errno 514 is ERESTARTNOHAND (restart if no handler), and is in a section marked as &#8220;should never be seen by user programs&#8221;.</p>
<p>对于的OS和MySQL版本信息如下：</p>
<p>$ uname -a<br />
Linux dev031033.sqa.cm4 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux<br />
$ mysql &#8211;version<br />
mysql Ver 14.14 Distrib 5.1.37, for unknown-linux-gnu (x86_64) using EditLine wrapper</p>
<p>那只能很不幸的说，在2.6.9版本中确实有这么一个bug，但这个bug在2.6.38中已经进行了处理，将ERESTARTNOHAND替换成EINTR：<span id="more-595"></span></p>
<pre>fs/select.c: poll_select_copy_remaining：
    if (ret == -ERESTARTNOHAND)
        ret = -EINTR;</pre>
<p>在此情况下，升级OS是一种方案，但周期较大，另外一种可行方案就是修复MySQL调用select之处的异常处理。</p>
<p>在MySQL中，有两处会使用select，除了监听网络连接使用select外，使用更多的是做sleep之用。</p>
<p>对于用作sleep功能的select，比较典型的用法，利用timeout机制来实现sleep，代码如下：</p>
<pre>void
os_thread_sleep(
/*============*/
    ulint   tm) /* in: time in microseconds */
{
#ifdef __WIN__
    Sleep((DWORD) tm / 1000);
#elif defined(__NETWARE__)
    delay(tm / 1000);
#else
    struct timeval  t;

    t.tv_sec = tm / 1000000;
    t.tv_usec = tm % 1000000;

    select(0, NULL, NULL, NULL, &amp;t);
#endif
}</pre>
<p>但这个返回值不影响程序的正常运行。</p>
<p>这里插个题外话，select和nanosleep，哪个更适合做sleep之用。<br />
对比usleep，nanosleep有线程安全、能接受信号量、可以大于1s的sleep等优势，虽然2.6已经解决了在2.4都存在SIGSTOP/STICONT导致stop时间不计的精确的问题，但还是存在可能最多1/HZ s的误差。那么，select是否也有此现象？答案是肯定有。两者都是基于ktime_t数据结构的内核定时器机制，均面临着实现上的精度问题：最坏情况下1/HZs，2.4之前是HZ是100，而后2.6设为1000，即精度改为1ms。替代select的nanosleep的代码为：</p>
<pre>while(nanosleep(&amp;req,&amp;req)==-1 &amp;&amp; errno == EINTR)

      continue;</pre>
<p>回到主题，另外一个可能出问题的就是select的本职工作：</p>
<pre>5050   while (!abort_loop)
5051   {
5052     readFDs=clientFDs;
5053 #ifdef HPUX10
5054     if (select(max_used_connection,(int*) &amp;readFDs,0,0,0) &lt; 0)
5055       continue;
5056 #else
5057     if (select((int) max_used_connection,&amp;readFDs,0,0,0) &lt; 0)
5058     {
5059       if (socket_errno != SOCKET_EINTR)
5060       {
5061     if (!select_errors++ &amp;&amp; !abort_loop)    /* purecov: inspected */
5062       sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */
5063       }
5064       MAYBE_BROKEN_SYSCALL
5065       continue;
5066     }
5067 #endif  /* HPUX10 */</pre>
<p>从 log看遇到一次514错误代码，但从监听网络连接逻辑看，新连接不能成功，说明select没有监听到读事件，即readFDs可能已经出问题。那么，这个问题说到底，还是select问题，之前线上遇到在超过1024的FD时候出错，在后续版本提供poll来取代select。当然，不用epoll又是另外一个话题。</p>
<p>到此，514错误代码，给了我们使用WITH_POLL编译使用poll的另外一个理由。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/595_mysqld-got-error-514-from-select.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql binlog的row模式数据解析</title>
		<link>http://www.taobaodba.com/html/585_mysql-binlog%e7%9a%84row%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e8%a7%a3%e6%9e%90.html</link>
		<comments>http://www.taobaodba.com/html/585_mysql-binlog%e7%9a%84row%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e8%a7%a3%e6%9e%90.html#comments</comments>
		<pubDate>Fri, 16 Sep 2011 11:48:05 +0000</pubDate>
		<dc:creator>yinfeng</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[binlog]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=585</guid>
		<description><![CDATA[drc-mysql是一种支持多master多slave的快速并行复制的解决方案，基于mysql的binlog，目前支持binlog的STATEMENT模式。为了实现drc-mysql对ROW模式的支持，本文对此展开研究，分析了binlog的事件格式，并针对不同的数据类型进行解析。 本文的目的是为了展示如何从row模式事件中解析数据，因此事件中一些记录其他信息的字节会直接略过，感兴趣的同学可以看看log_event.h以及log_event.cc两个文件。 &#160; 获取Binlog事件： Mysql对Binlog的处理是以事件为单位的，每一次DML操作可能会产生多次事件，例如对于innodb存储引擎，会额外产生一条QUERY_EVENT（事务的begin语句）以及XID_EVENT(事务提交)。 通过调用libmysql.so库中的cli_safe_read()函数可以获取一次binlog事件： cli_safe_read(mm);   // mm类型为MYSQL* net =  &#38;mm-&#62;net; buf = (const char*) net-&#62;read_pos + 1; Binlog的事件类型大约有27种，这里只介绍与ROW模式相关的事件 1)       QUERY_EVENT：与STATEMENT模式处理相同，存储的是SQL，主要是一些与数据无关的操作，eg: begin、drop table； 2)       TABLE_MAP_EVENT：记录了下一条事件所对应的表信息，在其中存储了数据库名和表名； 3)       WRITE_ROWS_EVENT：操作类型为insert； 4)       UPDATE_ROWS_EVENT：操作类型为update； 5)       DELETE_ROWS_EVENT：操作类型为delete； 6)       XID_EVENT， 用于标识事务提交。 在buf[EVENT_TYPE_OFFSET]中记录了事件的类型 (EVENT_TYPE_OFFSET = 4)，根据其中记录的整数，对比log_event.h中的Log_event_type，可以找到相应的事件类型。 以一条insert语句为例，包含4个事件： TABLE_MAP_EVENT QUERY_EVENT  (begin) WRITE_ROWS_EVENT XID_EVENT &#160; 事件时间戳： buf[0] ~ buf[3]的四个字节，存储了执行操作前的时间戳。 &#160; 事件长度： Buf[9]开始的四个字节构成的整数，可以使用如下的方式来进行整数转换： #define UCHAR(ptr) [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/repsync/">drc-mysql</a>是一种支持多master多slave的快速并行复制的解决方案，基于mysql的binlog，目前支持binlog的STATEMENT模式。为了实现drc-mysql对ROW模式的支持，本文对此展开研究，分析了binlog的事件格式，并针对不同的数据类型进行解析。</p>
<p>本文的目的是为了展示如何从row模式事件中解析数据，因此事件中一些记录其他信息的字节会直接略过，感兴趣的同学可以看看log_event.h以及log_event.cc两个文件。</p>
<p>&nbsp;</p>
<p><strong>获取Binlog</strong><strong>事件：</strong></p>
<p>Mysql对Binlog的处理是以事件为单位的，每一次DML操作可能会产生多次事件，例如对于innodb存储引擎，会额外产生一条QUERY_EVENT（事务的begin语句）以及XID_EVENT(事务提交)。</p>
<p>通过调用libmysql.so库中的cli_safe_read()函数可以获取一次binlog事件：</p>
<p>cli_safe_read(mm);   // mm类型为MYSQL*</p>
<p>net =  &amp;mm-&gt;net;</p>
<p>buf = (const char*) net-&gt;read_pos + 1;<span id="more-585"></span></p>
<p>Binlog的事件类型大约有27种，这里只介绍与ROW模式相关的事件</p>
<p>1)       QUERY_EVENT：与STATEMENT模式处理相同，存储的是SQL，主要是一些与数据无关的操作，eg: begin、drop table；</p>
<p>2)       TABLE_MAP_EVENT：记录了下一条事件所对应的表信息，在其中存储了数据库名和表名；</p>
<p>3)       WRITE_ROWS_EVENT：操作类型为insert；</p>
<p>4)       UPDATE_ROWS_EVENT：操作类型为update；</p>
<p>5)       DELETE_ROWS_EVENT：操作类型为delete；</p>
<p>6)       XID_EVENT， 用于标识事务提交。</p>
<p>在buf[EVENT_TYPE_OFFSET]中记录了事件的类型 (EVENT_TYPE_OFFSET = 4)，根据其中记录的整数，对比log_event.h中的Log_event_type，可以找到相应的事件类型。</p>
<p>以一条insert语句为例，包含4个事件：</p>
<p>TABLE_MAP_EVENT</p>
<p>QUERY_EVENT  (begin)</p>
<p>WRITE_ROWS_EVENT</p>
<p>XID_EVENT</p>
<p>&nbsp;</p>
<p><strong>事件时间戳：</strong></p>
<p>buf[0] ~ buf[3]的四个字节，存储了执行操作前的时间戳。</p>
<p>&nbsp;</p>
<p><strong>事件长度：</strong></p>
<p>Buf[9]开始的四个字节构成的整数，可以使用如下的方式来进行整数转换：</p>
<p>#define UCHAR(ptr) ((*(ptr)+256)%256)</p>
<p>const char *ptr = buf + 9;</p>
<p>unsigned int data_len = UCHAR(ptr) + (UCHAR(ptr+1)&lt;&lt;8) + (UCHAR(ptr+2)&lt;&lt;16)  + (UCHAR(ptr+3)&lt;&lt;24);</p>
<p>&nbsp;</p>
<p><strong>获取数据库和表名：</strong></p>
<p>由于在insert/delete/update事件中不记录表的相关信息，因此每次DML操作都会产生一个TABLE_MAP_EVENT事件，其中存储了获取数据库名和表名。</p>
<p>例如对于数据库名：tt0001；表名：x18，从buf[27]开始表示为如下格式：</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="42" valign="top">27</td>
<td width="42" valign="top">28</td>
<td width="42" valign="top">29</td>
<td width="42" valign="top">30</td>
<td width="42" valign="top">31</td>
<td width="42" valign="top">32</td>
<td width="42" valign="top">33</td>
<td width="42" valign="top">34</td>
<td width="42" valign="top">35</td>
<td width="42" valign="top">36</td>
<td width="38" valign="top">37</td>
<td width="38" valign="top">38</td>
<td width="29" valign="top">39</td>
</tr>
<tr>
<td width="42" valign="top">6</td>
<td width="42" valign="top">t</td>
<td width="42" valign="top">t</td>
<td width="42" valign="top">0</td>
<td width="42" valign="top">0</td>
<td width="42" valign="top">0</td>
<td width="42" valign="top">1</td>
<td width="42" valign="top">\0</td>
<td width="42" valign="top">3</td>
<td width="42" valign="top">x</td>
<td width="38" valign="top">1</td>
<td width="38" valign="top">8</td>
<td width="29" valign="top">\0</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong>解析数据：</strong></p>
<p>在buf中记录了很多信息，但我们的目的是为了解析出数据，因此可以跳过一些字节，直接到达我们的目标数据头部。</p>
<p>cols = buf[27]; //在insert/delete/update事件中,buf[27]表示列的个数</p>
<p>bits = (cols+7)/8</p>
<p>对于WRITE_ROWS_EVENT、DELETE_ROWS_EVENT： ptr  =  buf +28+bits</p>
<p>对于UPDATE_ROWS_EVENT：ptr  =  buf +28+bits * 2</p>
<p>从ptr开始，记录了我们需要解析的数据。</p>
<p>1)       UPDATE_ROWS_EVENT</p>
<div>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="86" valign="top">Old record</td>
<td width="92" valign="top">New record</td>
<td width="86" valign="top">Old record</td>
<td width="92" valign="top">New record</td>
<td width="86" valign="top">Old record</td>
<td width="54" valign="top">……</td>
</tr>
</tbody>
</table>
</div>
<p>每更新了多少行，就有多少对 old/new record，当一个事件包存储不下所有记录时，将会拆分成多个 UPDATE_ROWS_EVENT事件。</p>
<p>2)  WRITE_ROWS_EVENT</p>
<p>包含一条插入的数据record</p>
<p>3)  DELETE_ROWS_EVENT</p>
<p>包含被删除的数据record，格式为：</p>
<div>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="73" valign="top">record</td>
<td width="75" valign="top">record</td>
<td width="75" valign="top">record</td>
<td width="57" valign="top">……</td>
</tr>
</tbody>
</table>
</div>
<p>从上面的分析可以看出，要想从binlog中解析出数据，除了辅助信息外，关键是要从record中获取得到行数据，因为DML操作对应的事件类型，都以record为记录单位。</p>
<p>&nbsp;</p>
<p><strong>Record</strong><strong>结构：</strong></p>
<p>在Record的前几位，会用多个字节来表示值为NULL的列，record的结构可表示为</p>
<div>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="92" valign="top">bit_map</td>
<td width="91" valign="top">Col1</td>
<td width="91" valign="top">Col2</td>
<td width="91" valign="top">Col3</td>
<td width="89" valign="top">……</td>
</tr>
</tbody>
</table>
</div>
<p>其中bit_map的所占字节数为(cols+7)/8</p>
<p>例如，执行：insert into xx values(1, NULL, NULL, 15, &#8220;ssss&#8221;);</p>
<p>xx表有5列，需要(cols +7)/8 = 1 个字节就可以表示所有的列</p>
<p>bit_map = 230，230转换为二进制:1110 0110</p>
<p>其中，最低位表示第一列，第cols( = 5)位为最后一列，为1表示该列值为NULL，为0表示非NULL，在随后的数据记录中只会记录非NULL的值，例如这里跳过bit_map所占字节之后，只会记录1、15和‘ssss’</p>
<p>再比如，当执行如下语句时：insert into x14(a,b) values (NULL,&#8221;dsda&#8221;);</p>
<p><a href="http://www.taobaodba.com/wp-content/dbauploads/2011/09/4BCC746A-FC4A-4DB2-9414-813BEE90EFBD.jpg"><img class="size-full wp-image-586 alignnone" title="{4BCC746A-FC4A-4DB2-9414-813BEE90EFBD}" src="http://www.taobaodba.com/wp-content/dbauploads/2011/09/4BCC746A-FC4A-4DB2-9414-813BEE90EFBD.jpg" alt="" width="563" height="164" /></a></p>
<p>这里有9列，因此需要2个字节记：</p>
<p>ptr[0] = -4； ptr[1] = -1</p>
<p>转换为二进制  (ptr[1]）1111 1111  (ptr[0])1111 1100</p>
<p>注意，这里虽然在SQL语句中a值为NULL，但由于a列是自增类型，因此存储在binlog中的就是一个整数，而非NULL值.</p>
<p>对于值为NULL的列，我们可以通过表的定义得到该列的默认值。</p>
<p>&nbsp;</p>
<p><strong>解析不同的数据类型：</strong><strong> </strong></p>
<p>在record中bit_map之后的列数据中，针对不同的数据类型，可能在record中占用不同的字节，因此需要针对每种数据类型进行处理，为了获取到每一列的信息，我们可以调用MYSQL的接口函数mysql_fetch_field()。这里需要注意一种特殊情形，即对于set和enum类型，在调用该API时，会被转换为MYSQL_TYPE_STRING类型，可以调用show columns from 来得到这两种类型的定义。</p>
<p>这里列出了大部分常用数据类型的字节数和解析方法：</p>
<p>1. MYSQL_TYPE_LONG</p>
<p>Int类型，占用4个字节，sint4korr(ptr)</p>
<p>2.  MYSQL_TYPE_TINY</p>
<p>Tinyint类型 ，占用1个字节</p>
<p>3. MYSQL_TYPE_SHORT</p>
<p>smallint 类型， 2个字节, sint2korr(ptr)</p>
<p>4. MYSQL_TYPE_INT24</p>
<p>MEDIUMINT类型，3个字节, sint3korr(ptr)</p>
<p>5. MYSQL_TYPE_LONGLONG</p>
<p>Bigint 类型，8个字节, sint8korr(ptr)</p>
<p>6. MYSQL_TYPE_NEWDECIMAL</p>
<p>Decimal类型，精度限制为65， 字节数与该类型的定义相关，可以参考<a href="http://dev.mysql.com/doc/refman/5.1/zh/precision-math.html">用户手册</a> ，对该类型的解析主要是计算出其占用的字节数，调用libmysql.so库中的bin2decimal函数来实现解析。</p>
<p>7. MYSQL_TYPE_FLOAT、MYSQL_TYPE_DOUBLE</p>
<p>直接进行类型的强制转换，分别占4和8个字节，然后根据定义对输出进行精度控制。</p>
<p>8. MYSQL_TYPE_BIT</p>
<p>Bit类型，占用的字节数与其定义相关，计算方式：</p>
<p>byt_len = length%8==0? length/8 : (length/8 + 1);</p>
<p>例如，当定义为bit(M)时，length = M;将byt_len个字节中存储的数据转换为一个整数。</p>
<p>9.  MYSQL_TYPE_SET</p>
<p>SET类型，定义为SET(M)，M值为以下范围时：</p>
<p>1 ~8，1个字节</p>
<p>9~16，  2个字节</p>
<p>17~24， 3个字节</p>
<p>25~32， 4个字节</p>
<p>33~64， 8个字节</p>
<p>然后将相应字节内的数转换为整数即可</p>
<p>10.  MYSQL_TYPE_ENUM</p>
<p>Enum类型，当该类型内的元素超过255个时，使用2个字节，否则使用1个字节表示，相应字节内转换为整数M，表示在enum中的第M个元素。</p>
<p>11.  MYSQL_TYPE_STRING、MYSQL_TYPE_VAR_STRING、MYSQL_TYPE_BLOB</p>
<p>包括char()、varchar()以及text类型，其处理方式相同，在record中首先根据其定义的长度，例如:</p>
<p>对于varchar(10)，使用一个字节记录长度；而对于varchar(300)，则需要使用两个字节来记录字符串的长度；</p>
<p>字符串“abcdef”，在record中被记录为“6abcdef”。</p>
<p>12. MYSQL_TYPE_TIME</p>
<p>Time类型，3个字节，计算方法：</p>
<p>d_int = UCHAR(ptr) + (UCHAR(ptr+1)&lt;&lt;8) + (UCHAR(ptr+2)&lt;&lt;16);</p>
<p>例如对于‘12:01:22’，计算结果为120122</p>
<p>13. MYSQL_TYPE_TIMESTAMP</p>
<p>timestamp时间戳类型，4个字节，直接进行类型的强制转换为整数</p>
<p>14. MYSQL_TYPE_DATE</p>
<p>Date类型，3个字节，计算方法：</p>
<p>d_int = UCHAR(ptr) + (UCHAR(ptr+1)&lt;&lt;8) + (UCHAR(ptr+2)&lt;&lt;16)</p>
<p>例如：</p>
<p>00001111     10110111    00100001</p>
<p>其中，1-5位表示日期，6-9位表示月份，剩余的表示年份，因此上述date类型可转换为2011-09-01</p>
<p>15. MYSQL_TYPE_YEAR</p>
<p>Year类型，1个字节，记录年份，用一个字节记录，从1900年开始</p>
<p>例如，当值为112时，表示112+1900 = 2012年</p>
<p>16. MYSQL_TYPE_DATETIME</p>
<p>Datetime类型，8个字节，直接类型转换为long long，</p>
<p>例如对于 2011-08-27 19：32：46</p>
<p>计算结果值为20110827193246</p>
<p>其实，不管是什么数据类型，我们只要知道其占有的字节数，就能推敲出他们在文件中存储的格式。</p>
<p>&nbsp;</p>
<p><strong>未来可能的应用</strong></p>
<p>1. 通过解析binlog中的行数据，进行增量数据dump；</p>
<p>2. 结合handlersocket进行replication。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/585_mysql-binlog%e7%9a%84row%e6%a8%a1%e5%bc%8f%e6%95%b0%e6%8d%ae%e8%a7%a3%e6%9e%90.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011产品DBA全新招聘</title>
		<link>http://www.taobaodba.com/html/579_2011%e4%ba%a7%e5%93%81dba%e5%85%a8%e6%96%b0%e6%8b%9b%e8%81%98.html</link>
		<comments>http://www.taobaodba.com/html/579_2011%e4%ba%a7%e5%93%81dba%e5%85%a8%e6%96%b0%e6%8b%9b%e8%81%98.html#comments</comments>
		<pubDate>Thu, 21 Jul 2011 03:20:05 +0000</pubDate>
		<dc:creator>丹臣</dc:creator>
				<category><![CDATA[招聘]]></category>
		<category><![CDATA[hbase hadoop 招聘]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=579</guid>
		<description><![CDATA[2011年，淘宝产品DBA团队全新定位，现面向社会招聘，岗位要求如下： 产品DBA 1、熟悉MySQL数据库体系结构与性能优化 2、熟悉关系数据库原理与设计，有大型项目的数据库设计和支持经验优先 3、精通SQL调优 4、熟悉unix/linux操作系统的使用 5、熟悉shell&#038;perl编程 6、大学本科以上，计算机相关专业 我们更希望你具有如下的能力或潜质： 1、良好的C，C++或者java编程能力 2、了解分布式Cache,或者一些NoSQL产品的源代码 3、对Hadoop大数据量计算，或者对HBase在线应用有一些尝试，或者对这方面感兴趣 如果你具有如下的能力，我们将更加欢迎： 1、良好的产品领悟能力，以及系统架构，分析能力 2、恰当合理的利用各种技术，解决业务系统瓶颈，以及未来发展问题 在淘宝，可以接触大量实际的业务需求，海量数据，高并发，每天都在面对挑战，至身这样的环境，你每天不得不去思考，每天去解决各种各样的问题，如果自己长时间解决不了，你可以寻求淘宝牛人的帮助。开放，相互帮助是淘宝的氛围。这是一条快速成长的捷径，快点加入我们吧。 简历请发送至 danchen(#)taobao.com ，将(#)换成@]]></description>
			<content:encoded><![CDATA[<p>2011年，淘宝产品DBA团队全新定位，现面向社会招聘，岗位要求如下：</p>
<p>产品DBA</p>
<p>1、熟悉MySQL数据库体系结构与性能优化<br />
2、熟悉关系数据库原理与设计，有大型项目的数据库设计和支持经验优先<br />
3、精通SQL调优<br />
4、熟悉unix/linux操作系统的使用<br />
5、熟悉shell&#038;perl编程<br />
6、大学本科以上，计算机相关专业</p>
<p>我们更希望你具有如下的能力或潜质：<br />
1、良好的C，C++或者java编程能力<br />
2、了解分布式Cache,或者一些NoSQL产品的源代码<br />
3、对Hadoop大数据量计算，或者对HBase在线应用有一些尝试，或者对这方面感兴趣</p>
<p>如果你具有如下的能力，我们将更加欢迎：<br />
1、良好的产品领悟能力，以及系统架构，分析能力<br />
2、恰当合理的利用各种技术，解决业务系统瓶颈，以及未来发展问题</p>
<p>在淘宝，可以接触大量实际的业务需求，海量数据，高并发，每天都在面对挑战，至身这样的环境，你每天不得不去思考，每天去解决各种各样的问题，如果自己长时间解决不了，你可以寻求淘宝牛人的帮助。开放，相互帮助是淘宝的氛围。这是一条快速成长的捷径，快点加入我们吧。 简历请发送至 danchen(#)taobao.com  ，将(#)换成@</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/579_2011%e4%ba%a7%e5%93%81dba%e5%85%a8%e6%96%b0%e6%8b%9b%e8%81%98.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iDataForum2011日程安排</title>
		<link>http://www.taobaodba.com/html/570_idataforum2011-agenda.html</link>
		<comments>http://www.taobaodba.com/html/570_idataforum2011-agenda.html#comments</comments>
		<pubDate>Tue, 28 Jun 2011 08:19:34 +0000</pubDate>
		<dc:creator>江枫</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[idata]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=570</guid>
		<description><![CDATA[iDataForum2011将于7.10在杭州之江饭店开启数据技术分享之旅，期待与各位报名参加的技术人一起畅赏技术交流的快感。 View Larger Map iDataForum &#8212; 主论坛 时间 主题 拟邀嘉宾 【9:30 &#8211; 9:45】 开场致辞 阳振坤/正祥(淘宝网) 【9:45 &#8211; 10:45】 开放环境下的数据管理 周晓方(澳大利亚昆士兰大学) 【11:00 &#8211; 12:00】 MySQL+SSD数据库优化实践 陈长城/天羽(淘宝网) iDataForum &#8212; 分论坛一 时间 主题 拟邀嘉宾 【13:30 &#8211; 14:30】 网易分布式数据库平台介绍 王磊 (网易) 【14:45 &#8211; 15:45】 高性能模糊查询内存数据库介绍 罗立刚(百度) 【15:45 &#8211; 16:45】 MySQL新技术探索与实践 彭立勋(阿里巴巴) 【17:00 &#8211; 18:00】 MySQL高可用圆桌讨论 主持人+嘉宾 现场互动 iDataForum &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p>iDataForum2011将于7.10在杭州之江饭店开启数据技术分享之旅，期待与各位报名参加的技术人一起畅赏技术交流的快感。</p>
<p><small><a style="color: #0000ff; text-align: left;" href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=%E6%9D%AD%E5%B7%9E%E4%B9%8B%E6%B1%9F%E9%A5%AD%E5%BA%97&amp;aq=&amp;sll=37.0625,-95.677068&amp;sspn=52.505328,79.013672&amp;ie=UTF8&amp;hq=%E4%B9%8B%E6%B1%9F%E9%A5%AD%E5%BA%97&amp;hnear=Hangzhou,+Zhejiang,+China&amp;ll=30.285197,120.147386&amp;spn=0.024438,0.016903">View Larger Map</a></small></p>
<table>
<tbody>
<tr>
<td colspan="4">iDataForum &#8212; 主论坛</td>
</tr>
<tr>
<td>时间</td>
<td width="400">主题</td>
<td colspan="2">拟邀嘉宾</td>
</tr>
<tr>
<td>【9:30 &#8211; 9:45】</td>
<td>开场致辞</td>
<td colspan="2">阳振坤/正祥(淘宝网)</td>
</tr>
<tr>
<td>【9:45 &#8211; 10:45】</td>
<td>开放环境下的数据管理</td>
<td colspan="2">周晓方(澳大利亚昆士兰大学)</td>
</tr>
<tr>
<td>【11:00 &#8211; 12:00】</td>
<td>MySQL+SSD数据库优化实践</td>
<td colspan="2">陈长城/天羽(淘宝网)</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td colspan="4">iDataForum &#8212; 分论坛一</td>
</tr>
<tr>
<td>时间</td>
<td width="400">主题</td>
<td colspan="2">拟邀嘉宾</td>
</tr>
<tr>
<td>【13:30 &#8211; 14:30】</td>
<td>网易分布式数据库平台介绍</td>
<td colspan="2">王磊 (网易)</td>
</tr>
<tr>
<td>【14:45 &#8211; 15:45】</td>
<td>高性能模糊查询内存数据库介绍</td>
<td class="ws-n" colspan="2">罗立刚(百度)</td>
</tr>
<tr>
<td>【15:45 &#8211; 16:45】</td>
<td>MySQL新技术探索与实践</td>
<td colspan="2">彭立勋(阿里巴巴)</td>
</tr>
<tr>
<td>【17:00 &#8211; 18:00】</td>
<td>MySQL高可用圆桌讨论</td>
<td colspan="2">主持人+嘉宾<br />
现场互动</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td colspan="4">iDataForum &#8212; 分论坛二</td>
</tr>
<tr>
<td>时间</td>
<td width="400">主题</td>
<td colspan="2">拟邀嘉宾</td>
</tr>
<tr>
<td>【13:30 &#8211; 14:30】</td>
<td>OceanBase内部探秘</td>
<td colspan="2">黄贵/曲山(淘宝网)</td>
</tr>
<tr>
<td>【14:45 &#8211; 15:45】</td>
<td>HBase简介与实践分享</td>
<td colspan="2">林昊/毕玄(淘宝网)</td>
</tr>
<tr>
<td>【15:45 &#8211; 16:45】</td>
<td>高性能KV数据库THUIRDB</td>
<td colspan="2">梁斌(清华大学)</td>
</tr>
<tr>
<td>【17:00 &#8211; 18:00】</td>
<td>Tair——高性能KV系统</td>
<td colspan="2">朱国云/宗岱(淘宝网)</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td colspan="4">iDataForum &#8212; 分论坛三</td>
</tr>
<tr>
<td class="b t-c">时间</td>
<td width="400">主题</td>
<td colspan="2">拟邀嘉宾</td>
</tr>
<tr>
<td>【13:30- 14:30】</td>
<td>淘宝海量数据产品的技术架构</td>
<td colspan="2">张轩丞/朋春(淘宝网)</td>
</tr>
<tr>
<td>【14:45 &#8211; 15:45】</td>
<td>可视化与可视分析－从数据拥有者到数据用户的桥梁</td>
<td class="ws-n" colspan="2">袁晓如(北京大学信息科学技术学院 )</td>
</tr>
<tr>
<td>【15:45 &#8211; 16:45】</td>
<td>下一代推荐引擎的核心理念和关键技术</td>
<td colspan="2">周涛(北京百分点信息科技有限公司),<br />
张韶峰(北京百分点信息科技有限公司)</td>
</tr>
<tr>
<td>【17:00 &#8211; 18:00】</td>
<td>可视化技术成就淘宝数据之美</td>
<td colspan="2">贾超/玄澄(淘宝网)</td>
</tr>
</tbody>
</table>
<p>更多信息，请参考<a href="http://developerclub.taobao.com/">淘宝技术嘉年华官方</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/570_idataforum2011-agenda.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>增量日志迭代同步和阿基里斯悖论</title>
		<link>http://www.taobaodba.com/html/564_%e5%a2%9e%e9%87%8f%e6%97%a5%e5%bf%97%e8%bf%ad%e4%bb%a3%e5%90%8c%e6%ad%a5%e5%92%8c%e9%98%bf%e5%9f%ba%e9%87%8c%e6%96%af%e6%82%96%e8%ae%ba.html</link>
		<comments>http://www.taobaodba.com/html/564_%e5%a2%9e%e9%87%8f%e6%97%a5%e5%bf%97%e8%bf%ad%e4%bb%a3%e5%90%8c%e6%ad%a5%e5%92%8c%e9%98%bf%e5%9f%ba%e9%87%8c%e6%96%af%e6%82%96%e8%ae%ba.html#comments</comments>
		<pubDate>Thu, 21 Apr 2011 02:23:44 +0000</pubDate>
		<dc:creator>陶方</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[Hbase]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[数据迁移]]></category>
		<category><![CDATA[日志迭代]]></category>
		<category><![CDATA[阿基里斯悖论]]></category>

		<guid isPermaLink="false">http://www.taobaodba.com/?p=564</guid>
		<description><![CDATA[假设我们有一套数据量庞大的前台系统需要从MySQL上转到Hbase上，比较粗糙的数据同步方法有： 1、将整个前台系统变为只读 2、全量dump MySQL数据 3、将MySQL数据导入到Hbase上 4、将前台系统切换到Hbase上，并打开更新 该方案比较简单，易于维持数据一致性，但是缺点是影响了所有用户的写入，并且时间过长。 用户体验看起来比较友好的数据同步方法有： 1、全量dump某个时间点之前的数据，并记录期间的增量日志A 2、apply日志A内的数据，并记录期间的增量日志B 3、apply日志B内的数据，并记录期间的增量日志C 4、不断重复第3步，直到日志C足够小 5、将整个前台系统变为只读，apply日志C内的数据 6、将前台系统切换到Hbase上，并打开更新 该方案实现比较复杂，迭代日志的做法看起来没完没了，而且容易引起少部分用户数据不一致。但是只读的时间非常短，大部分用户都能在数据同步期间自由使用应用。 简单概括一下： 方案1：所有用户都会受到长时间的小影响（只读） 方案2：少部分用户会受到短时间的大影响（数据不一致） 问题： 是不是牺牲小部分人来成全大部分人就是对的？ 在这个问题上，德先生（democracy）是不是最终答案？ 这个问题我没有想到答案， 但是针对迭代日志是不是没完没了的疑问，阿基里斯悖论给了我一点线索： 阿基里斯是一个跑得很快的神话人物，芝诺提出“假如乌龟领先阿基里斯1000米，则阿基里斯永远不可能追上乌龟”。这个结论的推理过程是这样的： 1、乌龟领先阿基里斯1000米 2、阿基里斯追了1000米 3、乌龟前进了100米（假设乌龟速度是阿基里斯的十分之一） 4、阿基里斯追了100米 5、乌龟前进了10米 。。。 6、阿基里斯追了n米 7、乌龟前进了n/10米 。。。 8、阿基里斯无限逼近乌龟，但是永远不可能追上 阿基里斯真的追不上乌龟？当然不可能： 1000*(1+0.1+0.01+&#8230;)=1000*(1+1/9)=10000/9 在10000/9米处，阿基里斯就会和乌龟并驾齐驱，然后超越。 回到增量日志迭代同步的问题。我们在什么前提下，可以认为迭代可终止： 1、日志apply无停顿（阿基里斯一直在跑） 如果apply完一段日志，不是马上去aply新产生的增量日志，那么迭代很可能无法终止 2、日志apply速度大于增量日志生成速度（阿基里斯要跑得比乌龟快） 这个比较显而易见。如果不是这样，日志只会越积越多，不可能apply完成 这是我的一些看法。在不影响用户的前提下，希望以后能够实现完美的数据迁移，呵呵。]]></description>
			<content:encoded><![CDATA[<p>假设我们有一套数据量庞大的前台系统需要从MySQL上转到Hbase上，比较粗糙的数据同步方法有：<br />
1、将整个前台系统变为只读<br />
2、全量dump MySQL数据<br />
3、将MySQL数据导入到Hbase上<br />
4、将前台系统切换到Hbase上，并打开更新<br />
该方案比较简单，易于维持数据一致性，但是缺点是影响了所有用户的写入，并且时间过长。</p>
<p>用户体验看起来比较友好的数据同步方法有：<br />
1、全量dump某个时间点之前的数据，并记录期间的增量日志A<br />
2、apply日志A内的数据，并记录期间的增量日志B<br />
3、apply日志B内的数据，并记录期间的增量日志C<br />
4、不断重复第3步，直到日志C足够小<br />
5、将整个前台系统变为只读，apply日志C内的数据<br />
6、将前台系统切换到Hbase上，并打开更新<br />
该方案实现比较复杂，迭代日志的做法看起来没完没了，而且容易引起少部分用户数据不一致。但是只读的时间非常短，大部分用户都能在数据同步期间自由使用应用。<br />
<span id="more-564"></span><br />
简单概括一下：<br />
方案1：所有用户都会受到长时间的小影响（只读）<br />
方案2：少部分用户会受到短时间的大影响（数据不一致）</p>
<p>问题：<br />
是不是牺牲小部分人来成全大部分人就是对的？<br />
在这个问题上，德先生（democracy）是不是最终答案？</p>
<p>这个问题我没有想到答案，<br />
但是针对迭代日志是不是没完没了的疑问，阿基里斯悖论给了我一点线索：<br />
阿基里斯是一个跑得很快的神话人物，芝诺提出“假如乌龟领先阿基里斯1000米，则阿基里斯永远不可能追上乌龟”。这个结论的推理过程是这样的：<br />
1、乌龟领先阿基里斯1000米<br />
2、阿基里斯追了1000米<br />
3、乌龟前进了100米（假设乌龟速度是阿基里斯的十分之一）<br />
4、阿基里斯追了100米<br />
5、乌龟前进了10米<br />
。。。<br />
6、阿基里斯追了n米<br />
7、乌龟前进了n/10米<br />
。。。<br />
8、阿基里斯无限逼近乌龟，但是永远不可能追上</p>
<p>阿基里斯真的追不上乌龟？当然不可能：<br />
1000*(1+0.1+0.01+&#8230;)=1000*(1+1/9)=10000/9<br />
在10000/9米处，阿基里斯就会和乌龟并驾齐驱，然后超越。</p>
<p>回到增量日志迭代同步的问题。我们在什么前提下，可以认为迭代可终止：<br />
1、日志apply无停顿（阿基里斯一直在跑）<br />
如果apply完一段日志，不是马上去aply新产生的增量日志，那么迭代很可能无法终止<br />
2、日志apply速度大于增量日志生成速度（阿基里斯要跑得比乌龟快）<br />
这个比较显而易见。如果不是这样，日志只会越积越多，不可能apply完成</p>
<p>这是我的一些看法。在不影响用户的前提下，希望以后能够实现完美的数据迁移，呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.taobaodba.com/html/564_%e5%a2%9e%e9%87%8f%e6%97%a5%e5%bf%97%e8%bf%ad%e4%bb%a3%e5%90%8c%e6%ad%a5%e5%92%8c%e9%98%bf%e5%9f%ba%e9%87%8c%e6%96%af%e6%82%96%e8%ae%ba.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

