canal-mysql初始化

一、mysql初始化

  1. 查看mysql是否开启binlog同步功能,默认false
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
  1. 查看mysql的binlog模式
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文件开启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.验证canal权限

mysql> show grants for canal;
+---------------------------------------------------------------------------+
| Grants for canal@%                                                        |
+---------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' |
+---------------------------------------------------------------------------+

6.相关设置完毕,重启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数据库连接池的缓存,重启该业务模块即可

猜你喜欢

转载自blog.csdn.net/weixin_41047933/article/details/85274067