Category Archives: database

database

有效收集 MySQL 的死锁信息

By | 2019-06-18

简单介绍 收集 MySQL 的死锁信息有什么好处? 可见的包含以下好处: 1. 死锁发生的频率; 2. 哪些库的哪些表发生死锁; 3. 事务执行了多久, 哪个事务被回退; 4. 方便排错, 可以和程序的日志相对应; MySQL 提供了两种方式可以用来查看死锁信息, 这两种方式受 innodb_print_all_deadlocks 参数的影响, 如果开启死锁信息会记录到 MySQL 的 error 日志中, 如果关闭可以使用 SHOW ENGINE INNODB STATUS 语句来查看死锁信息, 第一种方式适合全量收集, 第二种方式适合增量收集, 其中最新的死锁信息会覆盖掉以前的信息. 实际上这两种方式都不利于死锁信息的统一搜集, 都需要管理员做额外的汇总操作. 我们提供了 mysql-deadlock-check 工具, 以第二种方式统一收集死锁信息进行汇总, 更多信息参考 pt-deadlock-logger. 工具说明 mysql-deadlock-check 主要用来收集线上 MySQL 实例的死锁信息, 实例存在死锁信息则对其收集, 解析并入库以便于以后的统计分析. 如下所示: +—–+ | DB1 | ———-+… Read More »

mysql-connector-java 插入 utf8mb4 字符失败问题处理分析

By | 2019-05-17

问题说明 业务数据库实例的编码由 utf8 修改为 utf8mb4 后, java 业务插入表情符等宽字符(4 字节)的时候一直报错以下相关的错误: ### Cause:java.sql.SQLException:Incorrect string value:\xF0\x9F\x98\x8E for column nick_name at row 1 ;uncategorized SQLException for SQL[]; SQL state [HY000]; error code[1366];Incorrect string value: \xF0\x9F\x98\x8E for column nick_name at row 1 程序及数据库运行的版本及环境如下所示: Centos 7.6 kernel-3.10.0-957.1.3.el7.x86_64 mysql-connector-java-5.1.46 Percona-Server-5.6.38-rel83.0-Linux 测试环境中使用同样的 mysql-connector-java 版本, 程序可以正常插入. 所不同的是测试环境修改完编码后重启了 MySQL 服务, 线上环境仅做以下修改, 重启程序而不重启 MySQL 服务: set… Read More »

TokuDB 使用问题汇总

By | 2019-02-19

简单介绍 TokuDB 引擎提供很好的压缩比(笔者环境中的数据在默认的 zlib 设置下压缩比大致为 InnoDB:TokuDB ~= 5:1), 以及快速增加, 删除, 重命名列, 热更索引等特性, 这些特性很适合日志记录类的表来使用, 该类表可以仅做主从复制, 不做定期的备份. 如果需要备份可以参考 AliSQLBackup, 其基于 xtrabackup-2.3.5版本, 可以同时备份 InnoDB 和 TokuDB 引擎的表. 另外innodb_buffer_pool_size 和 tokudb_cache_size 两个参数的值需要按需分配, 如果没有多少 InnoDB 表, 最好调小 innodb_buffer_pool_size 的值. 更多基础的特性说明可以参考以前的文章: TokuDB 使用简单说明. 下述的问题列表则主要介绍在使用 TokuDB 的过程中碰到的一些问题, 后期碰到的问题也会在该列表中持续更新. 问题列表 修改分区表耗时长问题处理 转换 InnoDB 大表到 TokuDB 崩溃问题 修改 tokudb_data_dir 参数出现不能找到文件错误 temp 锁占用不能启动问题 修改分区表耗时长问题处理 详见… Read More »

使用 mmm-manager 管理云环境中的 MySQL 双主实例

By | 2019-01-28

介绍说明 在之前的工具中, mha_switch 和 mha_manager_consul 的使用都是建立在虚 ip 漂移的基础上实现的高可用方案. 不过在云环境中, 目前很多的云厂商还不支持虚 ip 漂移的功能, SLB(负载均衡)等没有类似 haproxy 的 backup 模式, 所以不适用于单 master 读写的场景. 如果使用 SLB 代理多 master, 则很难保证数据一致性问题(比如主从延迟). 一些组织在使用云环境的时候可能首要考虑数据安全性, 这种情况下可能不会考虑 RDS 之类的服务, 而是在云主机中自建 MySQL 实例, 并且最好占用整个宿主机. 如果自建实例, 就一定需要考虑高可用方案, 在不支持虚 ip 漂移的情况下, dns 服务或者绑 hosts 文件是个可选的方案, 在故障切换的时候做好对应的记录修改即可, 不过这种方式需要业务做对应调整, 在业务复杂的场景下, 需要保证修改记录的准确性和及时性. mmm-manager 则提供了另一种方案用来管理双主满足高可用的需求. 不过该方案依赖一些编程语言驱动的特性支持. 对于不支持特性的编程语言, mmm-manager 提供了更新 redis key 值,… Read More »

使用 systemd 限制系统资源的使用

By | 2018-12-10

简单介绍 在基于 Linux-3.x 内核版本的很多发行版都提供了 Systemd 来管理系统和服务. 同时也将 cgroup 功能加到了 slice, scope 和 service 三个单元中, 详见 sec-Default_Cgroup_Hierarchies. 基于这些特性我们可以很方便的通过 systemd 来限制服务或者进程对系统资源的使用, 这在单主机多服务的场景下会很有用. 下面则以 MySQL 服务为例介绍如何使用 systemd 限制资源的使用, 其它服务的限制和此等同. 示例使用 以 Centos7 系统为例, 从 redhat-resource-control 的文档来看, 官方建议通过 service 来实现资源的限制, 所以这里我们增加可以带端口参数(如果单台主机有多个 MySQL 实例的话)启动的 mysql 服务: # cat /usr/lib/systemd/system/mysql@.service [Unit] Description=MySQL Server node%i [Service] Type=forking Environment=”PORT_ARGS=%I” PermissionsStartOnly=true ExecStart=/usr/local/mysqlnode/bin/node ${PORT_ARGS} start… Read More »

TokuDB 修改分区表耗时长问题处理

By | 2018-12-06

问题说明 在之前的文章TokuDB 使用简单说明中简单介绍了如何使用 TokuDB, 其固有的特性很适合存储日志类的需求, 不过近期在修改 TokuDB 分区表的时候出现操作时间较长的提示, 业务端也同时出现响应时间较长的请求. 如下所示: # bash text_data_partition.sh 127.0.0.1 3311 text_base text_data 2018_12_05_14_55_39 [info] alter maxvalue of the partitions 2018_12_05_14_55_39 [info] reorganize p20181217 partition 2018_12_05_14_55_44 [info] reorganize p20181217 partition ok 我们按天对 text_data 表进行分区, p20181217 分区为小于 MAXVALUE 的空表, 在增加 p20181218 分区的时候耗时较长, 上述的操作耗时 5s, 查看各子表信息, 所有子分区文件的时间戳都有改变, 不过我们只操作了 p20181217 分区, 理论上来讲应该只有 p20181217 和… Read More »

使用 repl_mysql 监控表数据变更

By | 2018-10-08

介绍 repl_mysql 在 replication 的基础上增加了更多的功能选项, 基于此可以仅关注指定选项的表的更新. 由于原理同 MySQL 的主从复制, replication 即通过伪造 slave 的方式接收 MySQL master 端的所有更新操作, 不同于真实的 slave, repl_mysql 不需要重新组织接收到的数据到 relay log 日志, 也不用重放 relay log 中的 sql. 注意事项 从上述的实现方式来看, 使用 repl_mysql 的时候需要注意以下几点: 1. 可以在一台主机中使用 repl_mysql 接收多个 MySQL master 的数据, 每个 master 对应一个独立的 repl_mysql 进程. 不过需要注意连接的数量, 避免流量过大引起网络相关的问题; 2. MySQL binlog 为 ROW 格式的情况下会记录所有字段的变更, 单个请求的数据复制会较大, 在更新较多的场景中,… Read More »