阿里巴巴 MySQL binlog 增量订阅&消费组件支持多语言客户端

 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x工作原理MySQL主备复制原理MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)MySQL...

PHP,软件工具,Golang,.Net,数据库,解决方案 2024-04-29 AM 133次 0条

mysql随机获取指定数量数据

 通常情况下我们在开发项目中一般会用到 随机推荐 或者 购买类 需求,一般情况下很多程序猿都是 正序 或者 倒叙 获取 然后随机返回给前端,这种方式有 很多缺陷。解决方案 下面我们分享一种直接从 mysql 数据库中随机获取数据的一种方式。编写最大id查询sqlSELECT MAX(id) FROM `user`编写joinINNER JOIN ( SELECT ROUND( RAND( ) * ( ( SELECT MAX( id ) FROM `bl_user` ) ) ) AS id ) AS u2 ON u.id >=`u2`.`id` 编写要获取的随机条数LIMIT 50完整实例SELECT * FROM `user` `u` INNER JOIN ( SELECT ROUND( RAND( ) * ( ( SELECT MAX( id ) FROM `user` ) ) ) AS id ) AS u2 ON u.id >= `u2`.`id` LIMIT 50 以上sql主要实现了完全从随机位置取 指定条数 的记录来实现 随机 获取...

数据库,解决方案 2023-04-11 PM 466次 0条

阿里云redis数据库迁移工具RedisShake

 RedisShake是阿里云开源的高性能redis数据库迁移工具简单易用快速,上手非常简单 现在 redis-shake 有两个主版本:redis-shake 2.x:持续更新 3 年,目前停止更新与答疑,遇到问题推荐尝试 3.x 版本。redis-shake 3.x:基于 redis-shake 2.x 重写,代码可读性高,性能较佳。安装RedisShake安装方式有两种二进制包安装直接下载打包后的压缩包二进制包从版本下载:https://github.com/alibaba/RedisShake/releases从源代码编译git clone https://github.com/alibaba/RedisShake cd RedisShake sh build.sh下载打包压缩包下载并解压:https://github.com/alibaba/RedisShake/releases/download/v3.1.10/redis-shake-linux-amd64.tar.gz配置RedisShake 点击配置 scan.toml , restore.toml , sync...

软件工具,数据库,Linux,解决方案 2023-03-13 PM 573次 0条

mysql 报错 this is incompatible with sql_mode=only_full_group_by

 解决在 mysql 中使用 group by 无效报错 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 问题分析 出现这个问题一般一下问题导致的mysql 8.0 及以上版本sql_mode 启用了 only_full_group_by查询字段中或者排序字段中出现了不存在 group by 的字段解决方案在 select 中使用 ANY_VALUE 聚合函数SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name...

数据库,解决方案 2023-03-01 AM 479次 0条

mysql服务器io飚满百分之百的案例分析

mysql飚满问题有一台 mysql 5.7.1 的数据库实例以写入为主,IO 飙到接近100%,可以看到 写入 IOPS 很也高分析mysql飚满问题过程通过 iotop 工具可以看到当前 IO 消耗最高的 mysql 线程查看线程49342的堆栈,可以看到正在进行redo log的刷新,对应的是9号文件9号文件对应的是redo log的第一个文件 为什么 mysql 进程会频繁的刷新 redolog 文件,要结合 redolog 的刷盘策略来分析,关键是 innodb_flush_log_at_trx_commit 参数,默认是1最安全,但在写压力大的情况下,也会带来较大的性能影响,每次事务提交时 mysql 都会把 log buffer 的数据写入 log file 并且 flush (刷到磁盘)中去。 结合这个集群的写入场景来看,大部分都是小事务的写入,每次事务提交都会触发刷盘动作,这种场景下通过增大 innodb_log_buffer_size 和 innodb_log_file_size 的优化效果不明显。mysql飚满优化方案应用层面,对于写压力大的系统,可以将单条...

数据库 2021-10-28 PM 1076次 0条

mysql自增列并发插入死锁问题

 今天有一个朋友问我了一个问题意思是假设我们有一张表需要每天 定时迁移数据 那么我们在进行迁移的时候某些环境下就会触发自增列 并发插入死锁 问题如下。mysql 死锁问题测试  触发 死锁问题 采用一下 sql 进行 测试 复现insert into data_cache (customerID,organizationID,createTime) ( select customerID,organizationID,createTime from data where DATE(createTime) <= DATE(?) and autoIndex >= ? and autoIndex <= ? ); 大致意思是根据 autoIndex 去判定那些数据需要迁移,在程序中已经分好区域了,比如 1~100 , 101~200 , 201~300 这些,两张表的数据表结构均一致如下CREATE TABLE `data` ( `customerID` varchar(50) NOT NULL COMMENT '客户编号...

数据库 2021-10-19 PM 489次 0条

mysql字段数据为null时反查询不到

 当我们通过 mysql 使用 NOT IN 查询时,如果条件字段可以为 NULL 并且值为NULL需要特别注意一下这个时候使用 NOT IN 查询时是查询不到的。测试NULL时反查询不到例子假如我们现在有一个表 useridnickname1张三2李四3NULL4王五现在我们查询用户名不是 张三 和 李四 的用户select * from users where user_name not in ('张三','李四');这个时候我们应该得到的是两条数据idnickname3NULL4王五但是结果却只有一条数据idnickname4王五分析测试NULL时反查询不到问题 这是因为 mysql 中 not in 使用的是 不相等(!=) 比较,即每条记录的 user_name 都和 张三, 李四 进行数据比较。foreach ($user_names as $user_name) { if ($user_name != '张三' && $user_name != '李四') { return true; // 符合条件 }...

数据库 2021-09-28 PM 683次 0条

mysql数据库表重置主键

 mysql数据库表重置主键解决数据表频繁删除新增主键不断自增问题。 比如我们现在有一个 用户访问日志记录表 ,通过程序 不断的记录用户访问信息 ,因为数据量比较大所以我们 只保存1个月内的日志 ,所以要对一个月之前的 数据删除 ,时间久了就会发现 主键不断在增大 ,根据主键类型不同,如果不做任何处理的话,很有可能会达到 主键值的最大长度 ,这个时候数据库就可能会 出现问题。 根据以上问题我们可以通过 定期重置主键 进行解决mysql重置主键ALTER TABLE table_name AUTO_INCREMENT= 1; 通过以上 sql 我们可以将主键重置为 1 ,也可以根据需求进行调整 1 100 1000 等等 关于怎么解决主键不断增加,mysql数据库表重置主键怎么解决已经介绍完毕了。

数据库,解决方案 2021-09-25 AM 591次 0条

mysql数据库开启慢查询日志

首先我们要知道为什么要开启 mysql慢查询日志 开启 慢查询日志 它能记录下所有执行超过 long_query_time 时间的SQL语句,能够帮助开发人员,运维人员快速的找到执行慢的SQL语句,方便我们对这些SQL语句进行进一步优化,从而增强数据库性能。 今天我们要讲的主角就是 mysql慢查询日志。mysql开启慢日志版本要高于mysql5.6以上SELECT VERSION(); #查询版本号 # 或者 show variables like '%version%' #查询版本号mysql 慢查询日志 相关参数说明slow_query_log #慢查询开启状态,ON开启,OFF关闭 slow_query_log_file #慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录) long_query_time #查询超过多少秒才记录,默认10s,查询命令 SHOW VARIABLES LIKE 'long_query_time'; log_queries_not_using_indexes = 1 #表明记录没有使用索引的...

数据库,解决方案 2021-08-08 PM 1263次 0条