nacos以mysql8.0.x为数据源出现的一些问题

背景

2019年1月22日nacos-server发布了0.8.0版本,加入了登录页默认账号密码为nacos/nacos,我之前用的是0.7.0版本,因为之前没有把配置文件存在mysql中(当前版本只支持单机mysql存储),所以如果要升级0.8.0需要重新创建很麻烦,于是决定存到mysql中一劳永逸。

遇到的问题

1、在mysql8.0.14中运行官方nacos-mysql.sql脚本失败(schema.sql不是mysql的脚本)

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

2、配置mysql连接后nacos-server 无法启动
3、项目正常启动后数据无法保存

PreparedStatementCallback; Could not retrieve transation read-only status server

环境

mysql8.0.14,nacos-server-0.8.0

过程

根据官方文档中的运维指南,数据落地有以下要求:

单机模式支持mysql:
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

问题一:

解决方法:https://blog.csdn.net/qq_34707744/article/details/78031413
修改mysql.cnf或mysql.ini

[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

重启mysql

systemctl restart mysqld

问题二:

乍一看没什么问题单机部署都符合要求,但修改完配置后发现项目启动不了,于是下载源码进行调试(本地启动需要根据错误提示创建一个cluster.conf,内容为本机ip),我的原则是除非有必要否则尽量不改动源码
源码目录结构为:
nacos以mysql8.0.x为数据源出现的一些问题_第1张图片
控制台项目需要修改配置:
注意mysql8.0需要指定时区即:serverTimezone=Asia/Shanghai
nacos以mysql8.0.x为数据源出现的一些问题_第2张图片

追踪以下两个主要错误:

1、org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; 
nested exception is org.apache.commons.dbcp.SQLNestedException:
Cannot create PoolableConnectionFactory (Could not create connection to database server. Attempted reconnect 3 times. Giving up.)
2、Caused by: java.lang.NullPointerException
        at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:29
        at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1873)
        at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(My
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1206)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2234)
        at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:
        ... 28 more

追踪源码可以看到错误是由于com.mysql.jdbc.ConnectionImpl.getServerCharset中获取不到character_set_server参数造成的

解决方案:

找到你的mysql配置文件my.cnf或my.ini
在[mysqld]下添加编码配置,如下所示:

[mysqld]
character_set_server=utf8

重启mysql

systemctl restart mysqld

问题三:

项目正常启动了,看到了0.8.0的登录页面,输入账号密码正常登录,以为终于成功了,但是在创建配置文件时却提示失败请检查参数,没办法只能再追踪源码,
在nacos-config项目中找到com.alibaba.nacos.config.server.exception.GlobalExceptionHandler
打上断点
在这里插入图片描述
看到错误为

PreparedStatementCallback; Could not retrieve transation read-only status server

根据这两篇文章描述进行了修改依然不行
1、https://www.cnblogs.com/jeffen/p/6005410.html
2、https://www.cnblogs.com/rangle/p/9046121.html

然后这篇文章中看到

问题分析:
导致这个异常的情况有两种:
一种情况为:使用MySql数据库服务为最新版本8.0.11,而在项目开发的过程中使用了低版本的MySql驱动包。
二种情况为: 当MySQL的数据库隔离级别为REPEATABLE-READ时,查询一个select语句也算是事物的开始,而且在hibernate里会把以select语句开头的事务标记为只读事务,此时在这个事务里再执行insert、update、delete等DML语句就会出现如上的异常信息。
-________________
作者:CSDN-华仔
来源:CSDN
原文:https://blog.csdn.net/Hello_World_QWP/article/details/80654536
版权声明:本文为博主原创文章,转载请附上博文链接!

看来还是要修改源码,因为官方的mysql-connector-java为5.x驱动太低

解决方案

首先更新驱动为对应版本,在父级(最外面)的pom里找到mysql-connector-java将5.1.34版本改为8.0.14(你对应的版本)
在这里插入图片描述
在nacos-config下找到com.alibaba.nacos.config.server.service.BasicDataSourceServiceImpl
将JDBC_DRIVER_NAME修改为com.mysql.cj.jdbc.Driver
在这里插入图片描述
本地运行会出现编译错误,原因是驱动包升级对应的路径变了,根据提示去相应的文件中重新引入一下就可以了,如果一切正常后就可以打包了!
cmd到你的nacos根目录运行以下官方打包命令

mvn -Prelease-nacos clean install -U

然后可以在
【你的目录】\nacos-0.8.0\distribution\target下看到nacos-server-0.8.0文件夹,里面有个官方zip一样的nacos文件,检查一下里面的conf是否为你需要的配置后就可以正常启动了

最终效果
nacos以mysql8.0.x为数据源出现的一些问题_第3张图片

你可能感兴趣的:(坑)