MySQL binlog中at position、gtid、sequence_number、last_committed、xid的区别

MySQL binlog中的点如此之多,很容易让人疑惑:有人误解binlog里的at position的每个position代表一个事务、有人误解组提交的一组事务gtid都相同...下面是个人整理的binlog中各个点的用途: 1.at position 用mysqlbinlog解析出来的binlog很容易看到如下内容: # at 259 #161028 16:56:20 server id 1591216 end_log_pos 335 CRC32 0x9f5bee2a Query thread_id=35430137 exec_time=0 error_code=0 这里的at 259的259指的是binlog的第259字节,因而在默认max_binlog_size=1G的配置下,binlog几乎都是# at 4开头,以# at 1073744392左右结尾(1G大小);顺带说明下在备机show…

MySQL中间件Spider引擎问题集锦

最近在测试MySQL中间件Tspider时发现一些问题,但因为spider引擎使用者少,网上关于spider引擎的问题解答非常少,所以做个整理积累: 1. create table db.tb ENGINE=SPIDER DEFAULT CHARSET=gbk PARTITION BY KEY (id) PARTITIONS 2 (PARTITION pt0 COMMENT = 'database "db", table "tb ", server "test_1"' ENGINE = SPIDER,PARTITION pt2 COMMENT = 'database "db", table "tb ", server "test_2"' ENGINE = SPIDER); ERROR 1488 (HY000): Field…

MySQL的slave为什么不独立出一个ack线程?

MySQL 5.7.4之后半同步得到极大增强,我们测试比5.5的半同步性能提升了差不多100%!这得益于MySQL 5.7.4之后的半同步独立出一个ack线程来替代dump thread做ack应答,这样主机发送binlog和接受slave ack回应可以并行化,详细解释可以参考这篇和这篇,以下是简单描述图: 5.6之前 5.7之后 今天来自Oracle的Ivan Ma(马楚成)在介绍5.7新特性时,一个开发同事就针对半同步增强提出了以下问题: 既然master做了dump thread和ack thread分离的优化,那为什么slave不也这样仿效将receive线程和ack线程独立这样做进一步提升性能呢? 当时我的想法是:master后面可能挂多个slave,压力较大,MySQL官方人员精力有限,优先将master如此优化效果更明显,后续再将slave优化。不过这解释实在心里没底... 晚上回家躺在床上又一想不禁哑然失笑:slave接受完主机送过来的binlog再返回ack应答这是半同步规定的行为呀!半同步就是为了解决异步复制情形下事务在主机提交完成而slave不一定收到此事务binlog而提出的:主机的事务就是要等待slave接受完binlog返回个ack应答然后才能提交完成;如果slave的receiver线程和ack线程独立运行,可能receiver线程还没接受完主机事务的一个binlog而ack返回接受成功,主机收到ack应答就提交事务,但这样此时slave其实缺少这个事务,这种情形就不是半同步了呀! 最后,我有两点感触: 1.这是个很好解决的小问题,但提出后现场100多人当时无一人给出解答,…

slave_exec_mode=IDEMPOTENT的行为小结

slave_exec_mode=IDEMPOTENT在MySQL复制环境中是个很有用的参数:只要在备机运行set global slave_exec_mode=IDEMPOTENT,备机的sql thread就运行在冥等模式下,可以让备机在insert主键、唯一键冲突,update、delete值未找到错误发生时不断开复制而保持冥等性(当即生效,连slave的sql线程都不用重启哟);而类似sql_slave_skip_counter=N和slave-skip-errors = N这样的粗暴跳过错误方法可能破坏主备一致性。但官方文档的描述很简洁,我一直好奇slave_exec_mode=IDEMPOTENT是如何在复制出错时保持一致性的--譬如主键冲突时是简单跳过还是覆写,今天在Percona 5.7下做了个实验(binlog是row格式),实验过程就省略了,直接总结如下: 1.insert场景 此时insert into语句在备机的效果就跟replace into一样,但却并不是把insert into转换成replace into来执行,分两种情况: a.MySQL配置成autocommit,直接一条insert into ... 如这样的insert insert…

Linux下终极http下载工具--Flareget Pro

请注意标题中的Flagreget Pro不是红极一时的国产下载工具快车(Flashget),也不是Flareget(不带pro的是免费版,带pro的要收费,最大下载分段数能提升到16);作为Linux下载界的老司机,我用过的http下载工具相当多:multiget、DownThemAll、Uget、Chrono、Xtreme Download Manager、快车Linux版、wine迅雷、wineQQ旋风、、fatrat、pointdownload、XwareDesktop等,但老实说还是windows下的迅雷、QQ旋风最好,毕竟多镜像源和p2p下载对提速和死链的解决很好,可惜没有Linux版。我直到最近才找到个人觉得Linux下的最好http下载工具--Flareget Pro,相对于我用过的其他下载工具,有2个特点: 1.不折腾 Linux的下载工具虽多,但总有各种不完美:界面丑陋、功能太少、浏览器集成不好、没中文支持、需要手工编译、软件后续不维护等.而Flareget是商业软件,安装和日常使用中我觉得是最省事的 2.速度快 得益于Dynamic File Segmentation和HTTP-Pipelining,在我不严谨的测试中(下载中国区服务器的QQ安装包和国外服务器的系统ISO),Flareget…

MySQL的update多个字段时逗号写成and的错误例子

今天一个开发反馈update某行但不生效,场景如下: mysql> select * from test; +------+------+ | c1 | c2 | +------+------+ | 0 | a | +------+------+ 他想将c1列的值改成1、c2的值改成'b',然后用了如下sql: update test set c1=1 and c2='b' where c1=0; 可以发现这个sql写法是错误的,正确写法应该是: update test set c1=1,c2='b' where c1=0; 但第一个错误的sql运行没报错,因为被MySQL理解成: update test set c1=(1…