canal-mysql-binlog初始化
canal
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
项目地址:https://gitcode.com/gh_mirrors/ca/canal
免费下载资源
·
一、mysql初始化
- 查看mysql是否开启binlog同步功能,
默认false
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
- 查看mysql的binlog模式,canal只能支持row模式的增量订阅(statement只有sql,没有数据,所以无法获取原始的变更日志)
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
3.canal的原理是基于mysql binlog技术,所以需要开启mysql的binlog写入功能,建议配置binlog模式为row
,开启 binlog
,如果上面2个条件不满足,通过修改/etc/my.inf
或者my.cof(Mac下)
文件开启binlog,设置mysql的binlog相关功能,注意设置完毕,需要重启数据库
。
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
4.canal模拟自己为mysql slave,所以需要做为mysql slave的相关权限.
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
5.重启mysql
systemctl restart mysqld
6.验证canal权限
mysql> show grants for canal;
+---------------------------------------------------------------------------+
| Grants for canal@% |
+---------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' |
+---------------------------------------------------------------------------+
7.相关设置完毕,重启mysql遇到的问题
- mysql语句
GROUP_BY 函数
报错:
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
- 查看mysql
sql_mode
:
SELECT @@sql_mode;
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
#sql_mode查询出来的值为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- 设置mysql
sql_mode
,去掉ONLY_FULL_GROUP_BY,重新设置值:
#全局sql_mode,对于新建的数据库有效
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#对于已存在的数据库生效,
set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;
- mysql重启后
GROUP_BY函数
报错的原因:
使用mysql的set
函数设置的sql_mode(仅在当前会话生效),未写进配置文件中,当数据库重启后则失效,存在缓存中的会话就失效了。 - 设置
sql_mode
永久生效配置:
#在 /etc/my.cnf文件中增加,重启mysql生效
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-
重启数据库后,查看sql_mode中已无ONLY_FULL_GROUP_BY参数,但业务模块请求日志中仍报错(有的业务模块正常,有的报错),是
mysql数据库连接池的缓存
,重启该业务模块即可 -
大小写敏感报错
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'a.titId' in 'field list'
-
查看 :其中 0:区分大小写,1:不区分大小写
mysql> show VARIABLES like 'lower%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.01 sec)
- 配置文件设置:
#在 /etc/my.cnf文件中增加,重启mysql生效
[mysqld]
lower_case_table_names=1#设置大小写不敏感
GitHub 加速计划 / ca / canal
28.22 K
7.57 K
下载
alibaba/canal: Canal 是由阿里巴巴开源的分布式数据库同步系统,主要用于实现MySQL数据库的日志解析和实时增量数据订阅与消费,广泛应用于数据库变更消息的捕获、数据迁移、缓存更新等场景。
最近提交(Master分支:3 个月前 )
1e5b8a20 - 2 个月前
ff82fd65
2 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)