MySQL协议分析
MySQL协议分析,主要参考MySQL Forge上的wiki和源码.协议的全图见这里, 给同事分享的ppt见这里,下载见这里
MySQL协议分析,主要参考MySQL Forge上的wiki和源码.协议的全图见这里, 给同事分享的ppt见这里,下载见这里
mydumper是一个多线程、高性能的数据逻辑备份、恢复的工具,相比MySQL自带的mysqldump提速不少。我下载了0.23的稳定版本,阅读了源码并总结了一些使用的心得。 mysqldump是个单线程的逻辑备份工具,依次一个个导出多个表,没有一个并行的机制。mydumper弥补了这方面的缺陷可以并行的多线程的从表中读入数据并同时写到不同的文件里。项目的作者是由一群在sun、fb、skysql的工程师完成的。类似的工具还有mk-parallel-dump。 编译安装 cmake . make sudo make install 源码分析 根据流程图解释一下mydumper的工作步骤。 解析参数 使用glib的g_option_context_parse,比libc里的getopt_long简单多了。 连接目标数据库。 通过show processlist来判断是否有长查询,如果有长查询则退出dump,可以通过–long-query-guard加长时间,或者使用–kill-long-queries杀掉长查询。 锁定myisam表。 针对innodb table开启事务。 产生3个消息队列(线程ready队列、任务队列、myisam表处理完毕队列)。 conf.queue = g_async_queue_new(); conf.ready = g_async_queue_new(); conf.unlock_tables= g_async_queue_new(); 产生指定的线程个数,–threads可以指定,默认是4个。 GThread **threads = g_new(GThread*,num_threads); struct thread_data *td= g_new(struct thread_data, num_threads); for (n=0; n<num_threads; n++) { td[n].conf= &conf; td[n].thread_id= n+1; threads[n] = g_thread_create((GThreadFunc)process_queue,&td[n],TRUE,NULL); g_async_queue_pop(conf.ready); } dump_database,从DATA_DICTIONARY.TABLES读取所有表,通过–ignore, –tables-list, [...]
使用Python操作MySQL数据库的时候常使用MySQLdb这个模块。 今天在开发的过程发现MySQLdb.connect有些参数没法设置。通过这个页面我们可以看到在connect的时候,可以设置的option和client_flags和MySQL c api相比差不少。 一个很重要的参数 MYSQL_OPT_READ_TIMEOUT没法设置,这个参数如果不设置,极致状况MySQL处于hang住,自动切换IP漂移,客户端无法重连到新MySQL。 给MySQLdb加Option很简单,只要修改_mysql.c这个把Python对象映射到MySQL操作的文件,添加参数,再加一段mysql_option即可。 下面是修改后的git diff 文件 diff –git a/_mysql.c b/_mysql.c index d42cc54..61a9b34 100644 — a/_mysql.c +++ b/_mysql.c @@ -489,9 +489,10 @@ _mysql_ConnectionObject_Initialize( “named_pipe”, “init_command”, “read_default_file”, “read_default_group”, “client_flag”, “ssl”, - “local_infile”, + “local_infile”, “read_timeout”, NULL } ; int connect_timeout = 0; + int read_timeout = 0; int compress = -1, named_pipe = [...]