对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,开启Mysql binlog日志步骤如下:
[root@node2 ~]# mysql -u root -p123456mysql> show variables like "log_%";
在/etc/my.cnf文件中[mysqld]下写入以下内容:
【资料图】
[mysqld]# 随机指定一个不能和其他集群中机器重名的字符串,配置 MySQL replaction 需要定#义,不要和 canal 的 slaveId 重复server-id=123 #配置binlog日志目录,配置后会自动开启binlog日志,并写入该目录log-bin=/var/lib/mysql/mysql-bin# 选择 ROW 模式binlog-format=ROW
MySQL binlog-format有三种模式:Row、Statement 和 Mixed 。
Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节。
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。
Statement(默认):每一条会修改数据的sql都会记录在binlog中。这种模式下,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些定的函数或者功能的时候会出现。 例如:update 语句中含有uuid() ,now() 这种函数时,Statement模式就会有问题(update t1 set xx = now() where xx = xx)
Mixed: 混合模式在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
[root@node2 ~]# service mysql restart[root@node2 ~]# mysql -u root -p123456mysql> show variables like "log_%";
Cannal下载地址如下:Releases · alibaba/canal · GitHub
这里选择Canal 1.1.4版本下载。
将下载好的Canal安装包上传到node3节点上,解压
#首先创建目录 “/software/canal”[root@node3 ~]# mkdir -p /software/canal#将Canal安装包解压到创建的canal目录中[root@node3 ~]# tar -zxvf /software/canal.deployer-1.1.4.tar.gz -C /software/canal/
关键词: