服务器配置Mysql远程连接

服务器配置Mysql远程连接

正常情况

  在服务器执行:

mysql -u root -p

use mysql;
create user 'root'@'%' identified by '123456';

  注:这是直接创建远程用户的方式,与修改root的host为%不同。

特殊情况

  遇到了一个特殊情况,就是很久之前服务器的mysql配置过了远程访问,但是忘记了密码,然后跳过密码修改密码后,远程链接被拒。

原因分析

⚡首先回顾忘记密码后修改密码的操作
(以下是在服务器上的操作)

  1. 在mysql的配置文件中的[mysqld]下添加skip-grant-tables,来跳过权限认证
  2. mysql不输密码直接登录
  3. use mysql;
    set password for root@localhost = password('123456');
    flush privileges;
    

⚡来看一下报错
(在本地的操作)
报错
  ERROR 1045 (28000): Access denied for user ‘root’@‘27.xxx.xxx.xxx’ (using password: YES)
  根据报错推断是密码错误。这里有个小问题,很多人第一眼看到会很奇怪,为什么报错返回的ip与输入的远程服务器地址不同,这里说明一下,报错返回的ip是本地ip,这一点在访问web应用后可以证明。
登录日志

⚡下面只能登陆远程服务器继续操作了,奇怪的是在服务器可以直接使用修改后端密码登陆
  让我们看一下用户表

mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+

解释下为什么有两个root用户:

MySQL的权限为用户名和主机名共同定义,可以理解为user和host相同才为同一个。
root@localhost:表示只有本地可以访问
root@%:表示任意ip都可以访问

  不难看出,问题就在于改密码的时候,由于使用的命令是set password for root@localhost = password('123456');,修改的是本地访问的密码,而远程连接的密码未变。那么问题来了,本地连接用新密码,远程连接用旧密码可以吗,即本地和远程连接的密码不同?
报错
  试了一下,报错:ERROR 2026 (HY000): SSL connection error: socket layer receive error。
  但是,如果在服务器,先修改本地密码为123,再修改远程密码为123456,经测试,本地和远程,用各自对应的密码时可以登录成功。
登录成功
  所以好像可以在本地访问的时候用简单的密码,比如123456,远程的时候用复杂密码。。。

解决方案

方案一:
  在服务器修改密码时,执行完
  set password for root@localhost = password('123456');
  再执行
  set password for 'root'@'%' = password('123456');

方案二(推荐):
  修改密码时直接执行:(密码会统一)

update user set password=password("123456") where user="root"; 
#  mysql5.7以上版本需要执行下面的命令
update user set authentication_string=password("123456") where user="root";
flush privileges;

远程和本地同一账户使用不同密码

  经过测试是可以实现的。首先登录服务器,执行:

mysql -u root -p
# 如果没有远程账户,先创建,当然如果本地用户改成了远程host,也可以创建本地账户
create user 'root'@'%' identified by '123456';
#create user 'root'@'localhost' identified by '123456';

  本地连接密码改为123

set password for 'root'@'localhost' = password('123');

  远程连接密码改为123456

set password for 'root'@'%' = password('123456');

  刷新

flush privileges;
发布了118 篇原创文章 · 获赞 478 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/y_universe/article/details/104306953