就在昨天上午,刚为云服务器安装好Apache2.4.33和PHP7.2.4环境,准备再来一个最新的MySQL5.7.22。寻找5.7版本的rpm包时下到mysql80xxx.rpm,看人家的教程是mysql57,难道80是MySQL出出…出了8版,一搜新闻2个小时前MySQL发布了8.0.11正式稳定版(GA)。我心里什么感觉
——刚刚准备起步就被超车
看到宣传的2倍性能提高、诸多新特性,objk。那就来飙(踩)车(坑)吧,果断放弃MySQL5.7直接上8。
MySQL8.0用到了新的密码插件验证方式,5.7叫做mysql_native_password,8.0叫做caching_sha2_password,这种加密方式让很多和MySQL连接的界面工具(如Navicat)或编程语言(如PHP)mysqli接口失效:
Error : The server requested authentication method unknown to the client [caching_sha2_password]
报错:客户端不知道服务器要求验证的规则[caching_sha2_password],
目标:在云服务器Linux和本地windows都上最新MySQL8.0.11,同时让PHP7能连通用mysqli接口连通。
工具:PuTTY用于远程连接云服务器输入命令;FileZilla Client监控服务器的文件目录,看看到底命令做了什么。
windows版
1、在官方下载MySQL ZIP压缩版
https://dev.mysql.com/downloads/mysql/
2、解压后放到任意一个你指定的目录
例如:E:\myServer\mysql-8.0.11-winx64
新建自定义默认配置文件my.ini内容如下,根据实际存放地址修改路径
[mysqld] # port 设置端口 ,若设置3306是默认端口可生路# basedir 设置MySQL的安装目录 # datadir 设置MySQL数据库的数据的存放目录port = 3380basedir=E:\myServer\mysql-8.0.11-winx64\datadir=E:\myServer\mysql-8.0.11-winx64\data# mysql8.0.11 默认值为caching_sha2_passworddefault_authentication_plugin=mysql_native_password[client]# cmd.exe MySQL命令行所用端口 与上方保持一致port = 3380# https://dev.mysql.com/doc/refman/8.0/en/connecting.html
3、以管理员身份进入命令行cmd.exe执行安装和初始化
注意:以管理员身份执行cmd.exe,输入完一行指令按回车键执行
语句解释如下,默认路径为E:\myServer请根据实际修改# 1 [跳转到MySQL主进程mysqld目录]E:cd E:\myServer\mysql-8.0.11-winx64\bin# 2 [加入windows服务,自定义名字MySQL3380]mysqld -install MySQL3380#3 [初始化将生成数据存放文件夹data,生成无密码root帐号]mysqld --initialize-insecure# 4 [启动MySQL服务]net start MySQL3380# 5 通过命令行,进入mysql控制台。默认密码为空,回车即可mysql -u root -p#--------------------------------------------# [卸载服务(未用到)]net stop MySQL3380sc delete MySQL3380
[上方指令动图演示.gif]
Linux版
环境为云服务器系统版本CentOS7.3,使用Yum Repository安装
[root@codenight ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core)
发现系统目录/etc下存在一个MySQL配置文件my.cnf(2016年11月显然是系统自带的),我们想知道在执行mysql-server过程中,哪一步会生成或修改my.cnf,默认存的内容只有几行
[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockassorted security riskssymbolic-links=0[mysqld_safe]log-error=/var/log/mariadb/mariadb.logpid-file=/var/run/mariadb/mariadb.pid!includedir /etc/my.cnf.d
1.下载MySQL8.0.11的.rpm文件
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
这一步在服务器 /root 目录下载文件mysql80-community-release-el7-1.noarch.rpm
2.安装rpm包
rpm -ivh mysql80-community-release-el7-1.noarch.rpm --force --nodeps
这一步在 /etc/yum.repos.d/ 目录下生成两个文件:
mysql-community.repo
mysql-community-source.repo
3.安装mysql-community-server
yum install mysql-community-server
弹出对话框确认y,最终Complete! 这一命令安装了很多
就是这一步生成了新的MySQL配置文件my.cnf,主要内容如下,不必修改
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html[mysqld]# innodb_buffer_pool_size = 128M# log_bin# join_buffer_size = 128M# sort_buffer_size = 2M# read_rnd_buffer_size = 2M## 移除default_authentication_plugin前面的#, # 这样就可以兼容老旧的客户端了。有关内容请看:# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin# default-authentication-plugin=mysql_native_passworddatadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid
4、启动mysqld服务并加入开机自启动
[root@codenight ~]# systemctl start mysqld.service[root@codenight ~]# systemctl enable mysqld.service
5、获取临时登录密码
[root@codenight ~]# grep 'temporary password' /var/log/mysqld.log
复制其中返回的密码:
小提示:如果密码死活不对,复制到记事本仔细核对。还不行的话只能用黑魔法(其实最大的可能还是密码复制错了),去到/var/log/下载mysqld.log,找到里面的password修改自定义密码上传mysql.log并重启MySQL服务
6、登录数据库输入以上密码
[root@codenight ~]# mysql -u root -p
执行任意SQL语句都会提示错误
mysql> SHOW DATABASES;ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
[错误1820] 提醒必须使用ALTER USER重置你的密码
7、重置密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';ERROR 1819 (HY000): Your password does notsatisfy the current policy requirements
[错误 1819]提示你的密码不满足当前policy要求
原因是validate_password.policy的默认值是1(中级强度),除了8位长度必须要含有数字、大小写字母、特殊字符至少一种,例如3ONbm
https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html#sysvar_validate_password.policy
如果还是想用简单8位密码例如abc54321,降低policy的值
mysql> SET GLOBAL validate_password.policy=0;Query OK, 0 rows affected (0.00 sec)
现在密码就改为12345678了
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';Query OK, 0 rows affected (0.04 sec)
8、开放远程连接
我们直接在user表插入一个条适用于任何主机,登录名为root密码为12345678的记录,刷新权限就可以远程登陆了,确认服务器安全组或已放行3306端口。
USE mysql;INSERT INTO `user` VALUES ('%', 'root', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', '0', '0', '0', '0', 'mysql_native_password', '*84AAC12F54AB666ECFC2A83C676908C8BBC381B1', 'N', '2018-04-21 11:25:16', null, 'N', 'Y', 'Y', null, null);FLUSH PRIVILEGES;
看看用户权限表里面用户和密码
mysql> SELECT host,user,plugin,authentication_string FROM mysql.user;+-----------+------------------+-----------------------+---------------------------------------------------------------------+| host | user | plugin | authentication_string |+-----------+------------------+-----------------------+---------------------------------------------------------------------+| % | root | mysql_native_password | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 || localhost | mysql.infoschema | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE || localhost | mysql.session | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE || localhost | mysql.sys | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE || localhost | root | caching_sha2_password | $A$005$0qyQJPnk>R5J>~}tGo2dCdahVKfz42pCUr/3tLWJYERvir2Mr5jUUkBR2B |+-----------+------------------+-----------------------+---------------------------------------------------------------------+5 rows in set
注:同样的密码12345678生成的密文string,第一行是native加密的结果,第五行是sha2加密的结果,服务器命令行使用的是host=localhost AND user=root,远程连接使用host=% AND user=root
9、优雅降级
现在Navicat可以远程连接上了,PHP等编程语言调用的mysqli接口还不行,因为MySQL8.0.11 前天才发布正式版,这些程序接口都没来得写(PHP最新一版是3月30号),所以加密plugin需要设置为mysql_native
修改/etc/my.cnf,保存并重启MySQL服务器
[root@codenight ~]# systemctl restart mysqld.service
10、其他相关错误处理
例如密码12345678,user表里的authentication_string字段必须存放根据 plugin字段指明的规则生成的密文,否则无论如何输入都提示密码错误的
参考资料:
[官方]使用Yum Repository安装MySQL:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html
CentOS7 通过YUM安装MySQL5.7:https://www.cnblogs.com/jorzy/p/8455519.html
https://blog.csdn.net/wisdom_c_1010/article/details/55506081