最近想把mysql数据库里面的数据同步到elasticsearch,由于我对实时性没有太大的要求,所以一开始考虑的方法是写一个python脚本获取数据,然后使用es的bulk方法更新进去,这样的好处在于不用思路,拿来就写,但是服务器的性能开销不会太低,后来查阅资料发现有一些现成的插件可以使用,例如go-mysql-elasticsearch。
在研究文档时,发现都会使用到bin_log,而且会用到一种名为ROW(row-based replication, RBR)的日志格式,于是又去了解了下mysql的bin_log,以下为一些备注。
mysql的bin_log属于一种二进制日志(类似之前介绍的mysql数据库慢日志),它有两个重要作用:复制和恢复,记录了所有的 DDL (data definition language,如CREATE、ALTER、DROP等定义表结构的语句)和 DML (data manipulation language,如SELECT、UPDATE、INSERT、DELETE等操纵数据的语句)。
我的数据库版本:
mysql Ver 15.1 Distrib 10.3.27-MariaDB, for Linux (x86_64) using readline 5.1
首先我们进入到数据库,查看自己的binlog是否开启
show variables like '%bin%';
进入我的mysql的配置目录,打开配置文件:
cd /etc/my.cnf.d
vim mariadb-server.cnf
# 加入以下代码后重启mysql
# expire_logs_days指定日志两天后自动删除
log-bin=my-binlog-20210415
expire_logs_days = 2
重启之后,我们再进入mysql,输入同样的show命令查看,可以发现已经打开了log-bin,其中log_bin_basename正是我们在配置文件中定义的名称,然后打开配置文件中定义的datadir文件夹(因为没有指定路径),可以发现里面多了两个文件
好奇心比较重的我打开了两个文件看了下,后缀为index的文件是一个索引文件,记录了binlog的二进制日志相对路径,二进制日志路径我们可以使用以下两种方式之一打开:
mysqlbinlog my-binlog-20210415.000001
mysqlbinlog -v --base64-output=decode-rows my-binlog-20210415.000001
由于没有在配置文件中定义binlog_format,所以默认为MIXED,截取一段内容,解释如下:
# at 256 代表位于文件中的位置,说明该事件记录从文件第256个字节开始
#210415 18:58:08 事件发生的时间戳
end_log_pos 285 表示下一个事件开始的位置
...
这些内容我们也可以在mysql中使用如下命令查看:
show binlog events;
bin_log的初步了解就到这里,顺便备注下mysqldump的用法,有可能也会用到
#备份数据库
mysqldump -uroot -p test_database> /opt/test.db
#还原数据库
mysqladmin -uroot -p create test_database
mysql -uroot -p test_database < /opt/test.db
这里面需要注意的是还原数据库时,这个库是必须已经存在的,这里使用了mysqladmin命令预先创建了一个库方能恢复成功。
关于go-mysql-elasticsearch,看到简介时感觉就是我想要的东西,“go-mysql-elasticsearch是一项将您的MySQL数据自动同步到Elasticsearch的服务。它首先使用mysqldump来获取原始数据,然后与binlog增量同步数据。”,遗憾的是,Notice里面说明了只支持ES6.0以下版本,所以没有去研究了,本来都搭建了go环境。
还好有大佬提示可以使用logstash和canal,研究成功再来记录吧。
参考:#go-mysql-elasticsearch
https://github.com/go-mysql-org/go-mysql-elasticsearch
# Using MySQL BinLogs: A Detailed Guide
https://hevodata.com/learn/using-mysql-binlog/
# DML,DDL
https://www.cnblogs.com/qxqbk/p/7240195.html