解决Ubuntu下MySQL远程登录问题

2,255 阅读1分钟
  1. 修改mysql配置文件。

     vim /etc/mysql/mysql.conf.d/mysqld.cnf
     找到 bind-address = 127.0.0.1 注释掉,保存退出。
    
  2. 允许所有用户远程登录

    • 在服务器上通过root登录mysql,输入密码登录

        mysql -u root -p 
      
    • 修改 root 的 host 属性为 %,

        use mysql;
        select host, user from user;
        update user set host = '%' where user = 'root'; 
      
  3. 在远程客户端Navicat上测试连接。

  4. 如果Navicat提示错误:

     1698- access denied for user 'root'@'ip'
    

    可能的原因为:

    在最近的Ubuntu安装(当然也可能是其他安装)中,MySQL默认使用了UNIX auth_socket plugin插件。

    简单来说这意味着当db_users使用数据库时,将会通过系统用户认证表进行认证。

    • 在服务器的mysql上执行

        mysql> SELECT User, Host, plugin FROM mysql.user;
        
        +------------------+-----------------------+
        | User             | plugin                |
        +------------------+-----------------------+
        | root             | auth_socket           |
        | mysql.sys        | mysql_native_password |
        | debian-sys-maint | mysql_native_password |
        +------------------+-----------------------+
      

      根据查询结果看出,root用户在使用 auth_socket 插件。

      解决方法:

      • 可以设置你的root用户使用 mysql_native_password 插件

          mysql> USE mysql;
          mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
          mysql> FLUSH PRIVILEGES;
          mysql> exit;
        
      • 用你的操作系统用户名代替YOUR_SYSTEM_USER

          mysql> USE mysql;
          mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
          mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
          mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
          mysql> FLUSH PRIVILEGES;
          mysql> exit;
        

      重启数据库

      如果使用了方法2,则需要通过操作系统的用户名来连接数据库。

参考:

  1. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  2. 解决 MySQL 的 ERROR 1698 (28000): Access denied for user 'root'@'localhost'