一、mysql初始化

  1. 查看mysql是否开启binlog同步功能,默认false
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
  1. 查看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 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐