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/mysql
socket=/var/lib/mysql/mysql.sockassorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-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_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-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 not
satisfy the current policy requirements
[错误 1819] 提示你的密码不满足当前policy要求
原因是validate_password.policy的默认值是1(中级强度),除了8位长度必须要含有数字、大小写字母、特殊字符至少一种,例如3ONbm<gdt1_j
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字段指明的规则生成的密文,否则无论如何输入都提示密码错误的
