学习、思考和思考的地方

写一些给自己看的内容,然后觉得做一个网站比较屌而已

MySQL复制与数据一致性 分享

这是针对公司内部的一个分享,主题是去年10月份就想好的,中间因为一些项目,也包括自己的拖延症,ppt一直没准备好。 在临近快要辞职的时候,还是想兑现一下承诺,加班加点完成了。 ...

2018-03-22 · 1 min

MySQL分页优化

关于数据库分页查询的话题,网上谈论的很多,但开发人员在使用上还是习惯以往的思路。 比如我们有个电话记录表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE `t_tel_record` ( `f_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流水号', `f_qiye_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '企业', `f_callno` varchar(20) DEFAULT NULL COMMENT '主叫号码', `f_calltono` varchar(30) DEFAULT NULL COMMENT '被叫号码', `f_Starttime` datetime NOT NULL COMMENT '开始时间', `f_Endtime` datetime DEFAULT NULL COMMENT '结束时间', `f_Calltime` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '通话时间', `f_user_id` bigint(20) NOT NULL COMMENT '员工用户', `f_path` varchar(200) DEFAULT NULL COMMENT '语音文件路径', `f_crm_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '客户库id', `f_call_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0:未知,1:为呼入类型,2:呼出类型', PRIMARY KEY (`f_id`), KEY `idx_endtime_userid` (`f_Endtime`,`f_user_id`,`f_qiye_id`), KEY `idx_crmid` (`f_crm_id`), KEY `idx_qiye_user_calltime` (`f_qiye_id`,`f_Starttime`), KEY `idx_calltono` (`f_calltono`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 1 2 3 4 5 6 7 8 9 10 11 12 查询第1页的数据: SELECT * FROM t_tel_record WHERE f_qiye_id=xxx ORDER BY f_Starttime DESC LIMIT 0,100 当数据量很大,需要查询第10000页的数据: SELECT * FROM t_tel_record WHERE f_qiye_id=xxx ORDER BY f_Starttime DESC LIMIT 999900,100 -- 或者 OFFSET 999900 LIMIT 100 MySQL的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。这也是大部分ORM框架生成的分页sql。 ...

2018-03-21 · 8 min

MySQL主从复制idempotent模式以及同步错误处理预案

1. slave_exec_mode 参数作用 slave_exec_mode 可以在主从复制中遇到 duplicate-key 和 no-key-found 错误时,自动覆盖或者略过binlog里面这个row_event,避免报错停止复制。 这个参数原本是解决像 NDB Cluster 多节点写入冲突的情况,也可以在普通主从、双主、环形复制等情况下解决冲突,保持幂等性。幂等性怎么定义,感兴趣的可以阅读The differences between IDEMPOTENT and AUTO-REPAIR mode)。 ...

2018-03-11 · 8 min

Binlog可视化搜索:实现类似阿里RDS数据追踪功能

MySQL Binlog 里面记录了每行数据的变更,开发有时候需要根据这些变更的时间、中间值去查问题,是bug导致的,还是用户操作引发的。然而原始binlog内容不利于检索,有段时间使用阿里RDS企业版DMS数据追踪的功能,也能完成这个工作,甚至生成回滚sql,后由于收费以及容量不够的缘故,放弃不用。 ...

2018-01-25 · 13 min

基于MySQL binlog增量数据同步方案(maxwell+rabbimt+pydbsync)

应用场景:同 http://xgknight.com/2017/09/05/mysql-binlog-subscribe-simple-for-dba/ ,但更灵活: 实时同步部分表到另外一个数据库实例 比如在数据库迁库时,将当天表的数据同步到新库,模拟阿里云dms数据传输的功能,相当于在测试环境演练,减少失误。 另外还可以从新库反向同步增量数据到老库,解决测试环境多项目测试引起数据库冲突的问题。 ...

2018-01-14 · 3 min

自建Binlog订阅服务 —— Maxwell

1. 介绍 Maxwell 是java语言编写的能够读取、解析MySQL binlog,将行更新以json格式发送到 Kafka、RabbitMQ、AWS Kinesis、Google Cloud Pub/Sub、文件,有了增量的数据流,可以想象的应用场景实在太多了,如ETL、维护缓存、收集表级别的dml指标、增量到搜索引擎、数据分区迁移、切库binlog回滚方案,等等。 ...

2018-01-13 · 12 min

RabbitMQ 入门

rabbitmq可以用一本书取讲,这里只是介绍一些使用过程中,常用到的基本的知识点。 官方文档覆盖的内容,非常全面:http://www.rabbitmq.com/documentation.html 。 ...

2018-01-06 · 22 min

MySQL数据库表结构同步之SchemaSync

SchemaSync是个能够在mysql数据库之间,比较并生成表结构差异的工具,项目地址 https://github.com/mmatuson/SchemaSync 。 SchemaSync介绍与使用 因为工作中经常需要在各个环境之间同步表结构,特别是生产与测试环境之间,长时间的运行后,总会有不一致的。测试环境的表结构一般是测试验证功能之后没有问题,然后通过工单的形式由DBA在生产环境修改。但生产库的结构,如修改索引,紧急修改字段长度,久而久之就会与测试环境有差异,需要同步到测试环境。 ...

2017-11-02 · 4 min

MySQL order by limit 走错索引(range->indexscan)

生产库遇到过好几例本文要讨论的案例,而且比较棘手。简而言之,有类似这样的查询 SELECT * FROM t1 where t1.f2>1 and t2.f2<100 order by t1.id,id是主键,条件里面有个range查询,就会造成优化器是选择主键,还是选择filesort问题,有些特殊情况就会选错索引,比如为了回避内存排序,选择了主键扫描,导致原本走范围过滤再sort 500ms勉强可以结束的查询,5分钟不出结果。 ...

2017-10-26 · 12 min

“大”事务引起的锁等待分析案例

1. 现象 生产环境数据库在某一刻突然发现大量活跃连接,而且大部分状态是 updating 。问题出现在周六上午,持续了大概三四分钟,得益于我们自己的快照程序,拿到了当时现场的的processlist, 锁等待关系,innodb status 信息:(经过脱敏处理) ...

2017-10-17 · 6 min