技术开发 频道

DTCC:MySQl核心代码开发经验揭示

  【IT168资讯】由IT168(ITPUB、IXPUB、ChinaUnix)主办的2012中国数据库技术大会(DTCC)于(以下简称大会)2012年4月13日~15日在北京永泰福朋喜来登大酒店隆重召开。大会将针对大数据架构设计、数据库安全、分布式数据库、商业智能、NoSQL、Hadoop等多个重点话题进行深入探讨。此次大会得到了全国数据库技术高手们的高度关注与支持,是当前象征最高技术水平的数据库工程师盛会。

互联网协会孙永革:专业的数据库大会
更多报道,更多精彩尽在IT168现场直播(点击了解更多)

  北京万里开源软件有限公司是一家立足于中国的开源软件产品、解决方案和技术服务提供商。致力于在中国推广LAMP架构的企业级应用,中国最早的MysQL合作伙伴,2005年开始与MySQL AB合作,作为当时中国精品的认证白金合作伙伴,在全国范围提供MySQL产品销售、咨询与支持服务, 为关键的企业级数据库应用提供技术支持及数据保障。拥有多位MySQL认证的专业工程师。2006年与MySQL AB共同建立了中国研发中心。

  Oracle的金牌合作伙伴。2006年8月29日,MySQL AB与万里开源共同组建MySQL中国研发中心,参与NDB Cluster 的开发。2007年10月,开始参与 Replication 的开发。2008年1月,Sun收购MySQL之后,MySQL中国研发中心也随之终止,但保留研发团队,继续MySQL的研发合作。2009年4月Oracle收购Sun之后仍继续研发合作,同时开始万里开源自己的数据库相关产品的研发。2011年年底,万里开源终止与Oracle在MySQL上的研发合作

  Mysql推广案例

  MysQL BUG修复的流程

  1、QA验证Bug。2、分配给开发人员,修复(1人),代码审核2人。3、开发人员的工作:便携测试用例,用于重现Bug、代码调试和回归测试;调试和分析问题,提出解决方案;修改代码;运行测试用例,通过后提交patch;审核通过后将patch push到bugfixing分支。4、合并到Trunk,技术文档人员更新相应的文档。

  测试用例在Bug提交过程中起到非常重要的作用

  MysQL测试框架简介

  MysQL测试框架的基本思想是比较(diff)运行测试产生的输出和预先保存好的预期效果。每一测试包含一个测试文件(test)和一个结果文件(result)。测试文件中可以使用SQL语句和mysQLtest指令。测试用例依照功能分为多个suite,main suite测试文件放在mysql-test/t,结果文件放在mysQL-test/r,其他的suite在mysQL-test/suite下,如:mysql-test/suite/rpl/{t,r}.

  测试用例样本展示图

  运行测试用例

  • 使用mysql-test/mysql-test-run.pl 运行测试用例

  $ ./mysql-test-run.pl sample

  • 如果运行某个suite下的测试,可以使用--suite选项

  $ ./mysql-test-run.pl --suite=binlog binlog_database

  • 可以使用--record选项生成结果文件,结果文件会保存在测试文件对应的结果文件夹中

  $ ./mysql-test-run.pl --record sample

  • 脚本mysql-test-run.pl会自动启动mysqld,并将测试文件中的语句发送到mysqld执行,并比较结果

  • 使用 --gdb 可以自动启动调试器调试mysqld

  $ ./mysql-test-run.pl –gdb sample

  MySQL 测试框架参考资源

  • The MySQL Test Framwork, Version 2.0

  Ø http://dev.mysql.com/doc/mysqltest/2.0/en/index.html

  • mysqltest Language Reference

  Ø http://dev.mysql.com/doc/mysqltest/2.0/en/mysqltest-commands.html

  • How to Create Good Tests

  Ø http://forge.mysql.com/wiki/How_to_Create_Good_Tests

  • Test Synchronization

  Ø http://forge.mysql.com/wiki/MySQL_Internals_Test_Synchronization

  测试Replication功能

  脚本mysql-test-run.pl支持测试Replication功能,自动启动两个mysql实例。在测试文件中包含include/master.slave.inc可以初始化一个主从replication测试环境。通过使用mysqltest指令connect和connection可以在测试文件中连接到master或slave上执行SQL语句。

  Bug#32205案例修复介绍

  • 现象是使用mysql客户端执行mysqlbinlog dump 出的语句时产生语法错误

  • 问题的原因是mysqlbinlog在dump 语句时,会在语句最后添加定界符(/*!*/),但如果原始SQL语句中使用 -- 注释时,就会导致这个定界符也被当成了注释

  CREATE TABLE t1 (a INT) -- create table;

  INSERT INTO t1 VALUES (1);

  CREATE TABLE t1 (a INT) -- create table/*!*/

  INSERT INTO t1 VALUES (1)/*!*/

  Bug#32205 测试用例

  编译和运行测试用例

  • 使用Bazaar获取最新的MySQL源代码

  $ bzr branch lp:mysql-server

  • BUILD子目录下有针对各个平台和选项的编译脚本

  Ø BUILD/compile-pentium-debug-max

  Ø BUILD/compile-pentium-max

  Ø BUILD/compile-pentium-debug-max-no-ndb

  • 运行测试用例,验证测试用例可以复现bug

  $ cd mysql-test

  $ ./mysql-test-run.pl binlog_start_comment

  • 使用--gdb选项运行测试时调试代码

  $ ./mysql-test-run.pl --gdb binlog_start_comment

  Bug#32205的修复方法

  一种方法是分析每个语句,遇到包含-注释的语句时进行特殊处理,比如转换成/**/注释格式。方法二是在添加界定符之前,先添加一个换行符,将界定符作为单独的一行,而不是加在原来的语句后面。

  Bug#32205 代码修改(部分)

  --- a/sql/log_event.cc 2007-12-14 20:05:58 +08:00

  +++ b/sql/log_event.cc 2007-12-17 21:13:20 +08:00

  @@ -2177,7 +2177,7 @@

  void Query_log_event::print(FILE* file,

  print_query_header(&cache, print_event_info);

  my_b_write(&cache, (uchar*) query, q_len);

  - my_b_printf(&cache, "%s\n", print_event_info->delimiter);

  +my_b_printf(&cache, "\n%s\n", print_event_info->delimiter);

  }

  #endif /* MYSQL_CLIENT */

  编译和测试修改后的代码

  1、编译修改后的代码:$make;2、重新运行测试用例:$ cd mysql-test $ .mysql-test-run.pl binlog_start_comment;3运行完整测试,确保修改没有引进regression:

  新功能举例

  1、Mysql 5.5最重要的replication新功能。2、原始的patch来自Google,针对Mysql 5.0;3、

  Mysql中国研发团队所做的工作主要有:移植到mysql 5.5;设计并添加Replication plugin interface;利用Replication plugin interface来改写Google的 patch,将Semi-synchronous功能作为插件,可动态加载和卸载;修改原google的patch中的bug。

  GreatSQL Cloud设计思想

  1、尽量避免使用全局锁,只使用本地锁和区域锁,最大程度实现并发执行。2.最小化数据移动,将执行计划发送到数据所在的节点,对于执行计划产生的中间结果,将根据数据量的大小决定是发送中间结果,还是将需要的数据发送当前节点。3、基于share-nothing架构,不依赖共享存储,同时考虑OLTP和OLAP应用的需求,针对SSD硬盘的优化。

0
相关文章