MySQL8.0-Hole

 

mysql8.0 创建用户授予权以及客户端连接错解决方法……

一、创建用户和授权

MySQL8.0 创建用户和授权和之前不太一样了,其实严格上来讲也不能说是不一样,只能说更严谨了。MySQL8.0 需要先创建用户和设置密码,然后再进行授权。

-- 创建用户:
root@localhost [(none)]> create user 'root'@'%' identified by 'admin123';
-- 再进行授权:
root@localhost [(none)]> grant all privileges on *.* to 'root'@'%' with grant option;

二、MySQL8.0 的远程链接

使用客户端链接会报: Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。

原因是 MySQL8 之前的版本中加密规则是 mysql_native_password,而在 MySQL8 之后,加密规则是 caching_sha2_password,解决问题方法有两种,一种是升级 navicat 驱动,一种是把 mysql 用户登录密码加密规则还原成 mysql_native_password

使用第二种方式 :

-- 修改加密规则 
root@localhost [(none)]> ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; 
-- 更新一下用户的密码 
root@localhost [(none)]> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 
-- 刷新权限 
root@localhost [(none)]> FLUSH PRIVILEGES; 

三 lower_case_table_names

在 my.cnf 里设置了 lower_case_table_names=1,安装好了之后,启动报错

2018-01-28T13:24:25.339412+08:00 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').

查看MySQL官方文档,有记录:

lower_case_table_names can only be configured when initializing the server. Changing the lower_case_table_names setting after the server is initialized is prohibited.

只有在初始化的时候设置 lower_case_table_names=1 才有效,比如:

--initialize --lower-case-table-names=1

ERROR 1820 (HY000)

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

解决方式如下:

(1)MySQL版本5.7.6版本(以前)用户可以使用如下命令:

mysql> SET PASSWORD = PASSWORD('l!vWT#mL93');

(2)MySQL版本5.7.6版本(开始后)的用户可以使用如下命令:

mysql> ALTER USER USER() IDENTIFIED BY 'l!vWT#mL93';        

原因分析:

(1)MySQL版本5.6.6版本起,添加了 password_expired 功能,它允许设置用户的过期时间。这个特性已经添加到 mysql.user 数据表,但是它的默认值是 N,可以使用ALTER USER语句来修改这个值。

输入以下命令,将账号密码强制到期:

mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE;

此时,用户可以登录到MYSQL服务器,但是在用户为设置新密码之前,不能运行任何命令,就会得到上图的报错,修改密码即可正常运行账户权限内的所有命令。由于此版本密码过期天数无法通过命令来实现,所以DBA可以通过cron定时器任务来设置MySQL用户的密码过期时间。

(2)MySQL 5.7.4版开始,用户的密码过期时间这个特性得以改进,可以通过一个全局变量 default_password_lifetime 来设置密码过期的策略,此全局变量可以设置一个全局的自动密码过期策略。可以在MySQL的 my.cnf 配置文件中设置一个默认值。  

(a)这会使得所有MySQL用户的密码过期时间都为120天,MySQL会从启动时开始计算时间。    

my.cnf配置如下:

[mysqld]
default_password_lifetime=120

(b)如果要设置密码永不过期,my.cnf配置如下:    

my.cnf配置如下:

[mysqld]
default_password_lifetime=0

(3)如果要为每个具体的用户账户设置单独的特定值,可以使用以下命令完成(注意:此命令会覆盖全局策略),单位是“天”,命令如下:

ALTER USER ‘root’@‘localhost' PASSWORD EXPIRE INTERVAL 250 DAY;

(4)如果让用户恢复默认策略,命令如下:

ALTER USER 'root'@'localhost' PASSWORD EXPIRE DEFAULT;

(5)个别使用者为了后期麻烦,会将密码过期功能禁用,命令如下:

ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;

  

详见

以上。


Power by TeXt.