类Git数据库Dolt的使用方法

568 阅读4分钟

最近类Git数据库Dolt火了,主要是他给我们带来了数据版本管理的功能。最近正好有个项目用了这个组件,遇到了一些坑,下面主要讲下他的使用模式及在Versioned Mysql Replica场景下的坑。

官网文档docs.dolthub.com

Dolt的三种使用模式

Dolt支持三种使用模式,三种都可对数据进行版本控制

使用时通过类Mysql客户端连接和操作

使用时就像使用Git一样,本地修改后推送到远端,只是操作的是表和数据,编辑具体的数据是用dolt sql -q "增册改查sql"来实现。

Dolt的三种运行方式

  1. Hosted Dolt:官方为你提供云资源,即IaaS;
  2. DoltHub:官方为你提供云平台,即PaaS,托管你的库,类似GigHub。优点:有完备的功能,可部署成集群、Web UI、Web API等;问题:不能用于“数据库副本模式”;
  3. DoltLab:自建类似官方的DoltHub;
  4. Dolt数据库副本服务: 专门用于同步和访问Mysql的副本。问题:无法搭建集群(但可设置多个副本)、没有Web UI、Web API等功能

数据库副本模式的使用

建议使用详细搭建说明,log_level设置为trace,可能会避免一些问题,或者能得到错误提示

我就不具体翻译搭建的详细过程了,重点说下

遇到的大坑

1. 使用 getting started 的方法搭建时,Dolt的root用户完全失效

问题:start replica后,Dolt的root用户完全失效,已经用mysql客户登录的,不能做任何操作,退出后也不能再登录,啥也干不了,只能把 .doltcfg目录 和 已经同步的数据(以database名为目录名)删除后重新搞。

原因:我用的腾讯云Mysql8,有些字符排序规则Dolt还没有支持,造成Dolt同步Mysql里的mysql库相关表时出错,造成user表等创建失败,Dolt在内部判断有mysql库的相关表,就不使用启动程序的root账号而使用mysql库里的root账号,所以造成root账号失效。

解决办法:在Replica Warming阶段的Export databases步骤(详细搭建说明)只导出业务库,不导出mysql库等系统库。

2. 不支持一些字符排序规则,例如:utf8mb4_0900_ai_ciutf8mb4_0900_ai_ci

问题:如题,我用的腾讯云Mysql8,mysql库里的表有多种排序规则。至少有三种还未支持。 具体支持详细可参考官网 docs.dolthub.com/sql-referen…

解决办法:

  1. 在Dolt的git里增加issue, Dolt的作者可能会支持,但发release版的时间不确定;
  2. 如果只是系统库里有不支持的排序规则,而且也不需对系统库做版本管理,则可以按坑1的解决方案解决。

3. Dolt部分设置没有做持久化,每次重启时需要重新设置

问题:如题,我遇到的没有做持久化的配置项有:

  • SET @@GLOBAL.SERVER_ID
  • CHANGE REPLICATION SOURCE
  • CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE
  • CHANGE REPLICATION FILTER REPLICATE_ON_TABLE
  • START REPLICA

解决思路:写一个服务启动脚本,在脚本中使用mysql客户端设置和启动replica。

具体脚本内容如下:

# 启动dolt
dolt sql-server --config config.yml 1>./logs/$(date +%Y%m%d).log 2>./logs/$(date +%Y%m%d)-err.log &
# 等待服务启动
sleep 5s
# 每次重启都需要重新配置dolt replica
mysql --login-path=client < ./reset_replica.sql
echo "$(date +%Y%m%d_%H:%M) 启动成功!"

为了不在指令中暴露密码:

  1. 把dolt的密码等启动配置放在了config.yml里了;
log_level: trace

behavior:
  read_only: false
  autocommit: true

user:
  name: root
  password: "……"

listener:
  host: 0.0.0.0
  port: 8039
  max_connections: 100
  read_timeout_millis: 28800000
  write_timeout_millis: 28800000

performance:
  query_parallelism: null
  1. 把要设置dolt的replica等命令(包含密码)放在reset_replica.sql里了;
SET @@GLOBAL.SERVER_ID=11;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='IP...', SOURCE_USER='slave', SOURCE_PORT=8036, SOURCE_PASSWORD='pwd...';
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(database1.table1,database1.table2);
START REPLICA;
  1. 把登录源mysql的配置,放在--login-path里了(用mysql_config_editor工具设置)
mysql_config_editor set --login-path=client --host=127.0.0.1 --port=8039 --user=root --password