一、mysql初始化
- 查看mysql是否开启binlog同步功能,
默认false
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
- 查看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数据库连接池的缓存
,重启该业务模块即可