【IT168资讯】由IT168(ITPUB、IXPUB、ChinaUnix)主办的2012中国数据库技术大会(DTCC)于(以下简称大会)2012年4月13日~15日在北京永泰福朋喜来登大酒店隆重召开。大会将针对大数据架构设计、数据库安全、分布式数据库、商业智能、NoSQL、Hadoop等多个重点话题进行深入探讨。此次大会得到了全国数据库技术高手们的高度关注与支持,是当前象征最高技术水平的数据库工程师盛会。
北京万里开源软件有限公司是一家立足于中国的开源软件产品、解决方案和技术服务提供商。致力于在中国推广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硬盘的优化。