Category Archives: database

database

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 »

有效升级 MySQL 表的 ip 字段

By | 2018-08-07

在文章 IPv6 使用及注意事项 中我们提到了应用程序如果要支持 IPv6, 需要关注相关数据库的修改, 不过由于业务设计的不同, 有些程序可能使用 char, varchar 等存储 ip 字符串, 有些程序也可能考虑到索引效率使用 int unsigned 存储 ip 的整形. 不过对于 IPv6 地址, 由于其 128 bit 的长度, 决定了 IP 地址数量为 (2^128 – 1), 这个值对 64 位的主机而言无法存储, 所以建议使用 varchar 类型存储所有的 IPv6 地址. MySQL 5.6 及以上的版本可以使用 hex(inet6_aton(ipv6address)) 的方式将 ipv6 存到 binary 或 varbinary 的字段中, 不过为了统一处理, 下文则主要介绍修改 ip 字段到… Read More »

使用 usql 连接各种不同的数据库

By | 2018-07-02

usql 介绍 usql 是一个统一的数据库连接工具, 目前支持常用的各种数据库, 包括 PostgreSQL, MySQL, Oracle, SQLite3, Microsoft SQL Server 以及最近几年出现的较新的数据库, 比如 clickhouse, Cassandra 等, 详见 database-support. 通常情况下 usql 以 usql [options] DSN 的方式进行连接, 不过 usql 并没有对各个数据的 DSN 进行过多的处理, 大部分情况下只是将其值直接传递到后端的数据库 driver, 所以 usql 的 DSN 格式依据不同的数据库会有不同的选项参数. 下面通过示例说明如何使用 usql 连接 MySQL, SQL Server, sqlite3, cassandra 以及 clickhouse. 连接 mysql DSN 参数依据 go-sql-driver #… Read More »