记一次:Clickhouse同步mysql数据库
ClickHouse可以通过使用MaterializeMySQL引擎来实现与MySQL的数据同步。
前言:因为数据量比较大,既然要分库,为何不让clickhouse同步一下mysql数据库呢?
零、前期准备--mysql的查询和配置
1 查询mysql的配置状态
查询以下语句进行验证
show variables like '%gtid_mode%';
show variables like '%enforce_gtid_consistency%';
show variables like '%binlog_format%';
# 结果如下:
gtid_mode ON
enforce_gtid_consistency ON
binlog_format ROW
2 设置mysql的配置
如果不是的查询状态的话设置:
在MySQL配置文件/etc/my.cnf中加入
server-id=1
log-bin=mysqlbin.log
binlog_format=ROW
3 强一致性-暂定
开启GTID模式(在MySQL配置文件/etc/my.cnf中加入)
gtid-mode=on
enforce-gtid-consistency=1 # 设置为主从强一致性
log-slave-updates=1 # 记录日志
default_authentication_plugin=mysql_native_password # 没有这个CK建库会失败
最后这个很重要,踩了一个坑
4 clickhouse库的安装过程就略-这里默认你安装好了
一、案例教程开始
1、准备 MySQL 表和数据
(0)创建授权用户
需要创建,不然后面查询的时候进制使用root用户的错误了---踩得第二个坑
创建用户:CREATE USER 'click'@'%' IDENTIFIED BY '123456';
授权:GRANT ALL PRIVILEGES ON *.* TO 'click'@'%';
(1)在 MySQL 中创建数据表并写入数据
CREATE DATABASE testck;
CREATE TABLE `testck`.`t_organization` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` int NOT NULL,
`name` text DEFAULT NULL,
`updatetime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY (`code`)
) ENGINE=InnoDB;
INSERT INTO testck.t_organization (code, name,updatetime)
VALUES(1000,'Realinsight',NOW());
INSERT INTO testck.t_organization (code, name,updatetime)
VALUES(1001, 'Realindex',NOW());
INSERT INTO testck.t_organization (code, name,updatetime)
VALUES(1002,'EDT',NOW());
(2)创建第二张表
CREATE TABLE `testck`.`t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` int,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO testck.t_user (code) VALUES(1);
2、开启 ClickHouse 物化引擎
1)登录clickhouse-client
set allow_experimental_database_materialize_mysql=1;
2) 创建复制管道
ClickHouse 中创建 MaterializeMySQL 数据库
CREATE DATABASE test_binlog ENGINE =
MaterializeMySQL('192.168.3.26:3306','testck','click','123456');
其中 4 个参数分别是 MySQL 地址、databse、username 和 password。
抛错:Code: 537. DB::Exception: Received from localhost:9000. DB::Exception: Illegal MySQL variables, the MaterializeMySQL engine requires default_authentication_plugin='mysql_native_password'.
失败了,为啥呢?
原来:mysql没配置这个default_authentication_plugin=mysql_native_password # 没有这个CK建库会失败---就是上面说的踩得坑
终于成功了
3)查看 ClickHouse 的数据
use test_binlog;
show tables;
select * from t_organization;
select * from t_user;
终于可以了
4)其它操作
修改数据
(1)在 MySQL 中修改数据:
update t_organization set name = CONCAT(name,'-v1') where id = 1
(2)查看 clickhouse 日志可以看到 binlog 监听事件,查询 clickhouse
select * from t_organization;
删除数据
(1)MySQL 删除数据:
DELETE FROM t_organization where id = 2;
(2)ClicKHouse,日志有 DeleteRows 的 binlog 监听事件,查看数据:
select * from t_organization;
(3)在刚才的查询中增加 _sign 和 _version 虚拟字段
select *,_sign,_version from t_organization order by _sign
desc,_version desc;