Oracle MySql安全漏洞CVE-2023-22056等漏洞爆出来后,准备对系统的MYSQL数据库进行升级,由5.7升级到8.1,本文主要介绍下升级过程中的几个问题。
通过navicat导出数据库的结构和数据,以便升级后恢复到新版本。
下载地址:MySQL :: Download MySQL Community Server
因为系统服务是通过wamp提供,主要计划是在原5.7的基础上添加MySQL8.1版本,这里就需要解决wamp多版本mysql问题。
这里我们下载MYSQL的压缩包版本:
Windows (x86, 64-bit), ZIP Archive | 8.1.0 | 236.9M | Download |
(mysql-8.1.0-winx64.zip) |
(1)将下载的压缩包解压到wamp的安装路径下,即X:\XXX\wamp64\bin\mysql目录。原先已有5.7.X的目录,类似的创建一个8.1.X的目录,把压缩包解压到里面即可。
(2)修改相关路径参数
把5.7.X目录下的my.ini和wampserver.conf 文件拷贝到mysql8.1.X目录中,并更改my.ini文件中的参数
basedir="D:/wamp64/bin/mysql/mysql8.0.11"
datadir="D:/wamp64/bin/mysql/mysql8.0.11/data"
lc-messages-dir="D:/wamp64/bin/mysql/mysql8.0.11/share"
(3)初始化mysql8.1.x
通过命令行cmd进入到mysql8.1.x下的bin目录,执行以下命令:
mysqld --initialize --console
在执行后的界面中找到:A temporary password is generated for root@localhost:XXXXXX
这是初始化mysql后,生成的密码,后面要使用它访问MySQL,这里要copy下来!!!!
(4)安装MYSQL服务
如果是wamp,需要在wamp的install service,然后启动
如果不是wamp,则直接在cmd中执行命令:mysqld -install,操作系统服务中会添加一个MySql的服务。启动即可。
(5)登录验证
如果是wamp,则在wamp中打开菜单Mysql console,使用(3)中生成的临时密码使用以下命令登录。
注意:第一次登录后,执行命令会报下面的错误:
RROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
这是提醒你需要更改临时密码。操作如下:
mysql> alter user 'root'@'localhost' identified by 'XXXXXXXX';
还需要执行下面命令刷新权限:
mysql> flush privileges;
更改后,使用命令:mysql> show databases;
如果看到结果,即标识成功。
在新的MYSQL中添加数据库,并在新的数据下执行(一)中导出的sql。
如果数据库中由存储过程或者函数,在执行的时候可能会不成功,这时需要在my.ini中的[mysqld]添加:log_bin_trust_function_creators=1,重启服务后重新导入即可。
在配置好用户、主机、数据库权限后,系统通过程序访问数据库。此时系统会出现如下问题:
1.字符集不适配问题
系统报错:SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers
原因:MySQL 8 默认字符集为utf8mb4,而系统使用的是utf8;
解决方案:需要在my.ini文件中的[mysqld]下加以下两行:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2.身份认证问题
系统报错:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
原因:因为MySQL8中用户的认证类型(Authentication type)默认为cacheing sha2 password导致的错误,需要修改用户权限认证方式为mysql_native_password的认证方式。
解决方案:两步(1)在MYSQL console中执行:
mysql>alter user 'root'@'%' identified with mysql_native_password by 'XXXXXXXX';
mysql>flush privileges;
(2)在my.in文件中的[mysqld]下加上
default_authentication_plugin=mysql_native_password