2019年11月2日星期六

mysql 普通用户无权限连接问题

ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: NO)
想着LAMP环境搭建好了就应该没啥事了,但是在php中与数据库交互时,浏览器出现了这样的提示:
Warning: mysqli::__construct(): (HY000/1698): Access denied for user 'root'@'localhost' in /var/www/index.php at line 16
我看了一下,这不是我连接数据库的代码行嘛
mysqli_connect("localhost","root",'','database')

当时在网上搜了一下,下意识的以为是mysql没有设置root密码的问题,然后就准备去修改mysql的密码,打开终端的连接数据库的时候,它提示我
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
喵喵喵?什么情况?第一反应就是权限不够,于是输入sudo mysql(这种情况下默认用户名为root,密码为空),能正确进入数据库。
尝试1:修改mysql root用户密码
  mysql -u root

  mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
之后退出,在进入还是那个样子,不行……
尝试2:修改mysql文件目录权限
sudo chmod 777 -R /etc/mysql
我擦,修改之后,不但没有解决,还出现了另一个问题,连接数据库的时候额外多出了这样一句话
mysql: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
然后又是各种找,在https://help.aliyun.com/knowledge_detail/41106.html 上面发现的解决方法,特么的是权限给多了,重新设置为 644 就好了,但是主要问题还是没有解决!
受不了了,这么一个问题整了我半天,百度各种找,然后突然想了一下,为什么不谷歌一下呢?
...
...
...
我有句妈卖批不知当讲不当讲,谷歌特喵的真的是什么都有,马上就解决问题了好伐
当时找的是这个博客
http://www.cnblogs.com/leolztang/p/5094930.html
感谢ing
方法很简单,查看一下user表,错误的起因就是在这里, root的plugin被修改成了auth_socket,用密码登陆的plugin应该是mysql_native_password。(由于可以用sudo mysql -uroot -p进入,所以并不需要以安全模式启动)
mysql> select user, plugin from mysql.user;
+-----------+-----------------------+
| user      | plugin                |
+-----------+-----------------------+
| root      | auth_socket           |
| mysql.sys | mysql_native_password |
| dev       | mysql_native_password |
+-----------+-----------------------+
3 rows in set (0.01 sec)
只要把auth_socket改成mysql_native_password就行了:
mysql> update mysql.user set authentication_string=PASSWORD('111111'), 
plugin='mysql_native_password' where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
之后退出mysql,重启一下,就可以了

本文链接:https://www.jianshu.com/p/2b63c65caf6a