ERROR: Access denied for user 'root'@'localhost' (using password: NO)
發現:
mysql -u root@localhost -p 成功
mysql -u root -p 失敗
mysql> SELECT user, host FROM mysql.user;
ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for table 'user'
mysql> SELECT USER(), CURRENT_USER();
+--------------------------+----------------+
| USER() | CURRENT_USER() |
+--------------------------+----------------+
| root@localhost@localhost | @localhost |
+--------------------------+----------------+
1 row in set (0.01 sec)
原因: root 設置了密碼,需要把root的密碼清掉。
以下可以解決問題(方案一):
1) service mysqld stop
2) mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
3) mysql -u root
4) Setup new MySQL root user password
use mysql;
select user,host,password from mysql.user;
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *CF1E6A25C954B638A451D6|
| root | centos64 | |
| root | 127.0.0.1 | |
| | localhost | |
| | centos64 | |
+------+-----------+-------------------------------------------+
update mysql.user set password=PASSWORD("***********") where User='root';
select user,host,password from mysql.user;
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *CF1E6A25C954B638A451D6 |
| root | centos64 | *CF1E6A25C954B638A451D6|
| root | 127.0.0.1 | *CF1E6A25C954B638A451D6|
| | localhost | |
| | centos64 | |
+------+-----------+-------------------------------------------+
flush privileges;
quit
5) Stop MySQL Server: service mysqld stop
6) Start MySQL server and test it:
service mysqld start
mysql -u root -p
SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)
以下可以解決問題(方案二):
先用方案一登錄mysql,再把root的密碼設置為空
use mysql;
update user set password=PASSWORD("****************") where User='root';
flush privileges;
quit
=========================
在授權的時候報錯:
ERROR 1044 (42000): Access denied for user 'root'@'%' to database 'mdm'
首先這里是用root用戶操作,所以對這個數據庫的權限絕對是最高級的,但是如果是非root用戶操作,就可能是權限的問題,需要root用戶授權。
出現上面的報錯,很可能,其實應該可以說基本上都是因為my.cnf 文件里面有skip-name-resolve參數,這個參數導致這不能解析hostname或其它方式的登錄, 所以登錄任何用戶,匹配的時候不走root@'localhost',或者127.0.0.1或者::1 ,而是 一個勁的走root@'%'.
再來查看一下每種方式下的root用戶的具體權限:
mysql> select * from user\\G;
我這里root有三種解析登錄方式分別是:Host: bidevedw\_db、Host: ::1、Host: %
一般情況還有Host:127.0.0.1、Host:localhost我的里面把哪兩種刪了。
請注意 !
注意上面每條記錄的的紅色字體部分Grant_priv: Y
這個表示,以這種方式解析登錄的root用戶,是否有grant權限,Y則表示有授權限給其他用戶的權限,N表示沒有。
這里恰好,就是我們要找的原因,因為我的/my.cnf文件里面有skip-name-resolve參數,所以root都是解析到@'%'方式登錄,於是就沒有grant_priv權限。
解決方法:
1、在不重啟MySQL服務的情況下,只需要在登錄的時候加上-h參數。
例如:(a). /usr/local/mysql/bin/mysql -uroot -p123456 -h::1
(b)./usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1
(c)./usr/local/mysql/bin/mysql -uroot -p123456 -hlocalhost
2、需要重啟MySQL。把skip-name-resolve參數去掉 ---- 還沒驗證。不過我記得,如果去掉了,日志里面會有大量的警告信息。我是因為那些警告信息,才添加的這個參數。
=========================================
HTTP Status 500 - javax.servlet.ServletException: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
grant all privileges on aldb.* to root@localhost;
grant select on aldb.* to nobody@localhost;
grant all privileges on aldb.* to root@112.112.112.112;
grant select on aldb.* to nobody@112.112.112.112;
grant all privileges on aldb.* to root@res.res.res.res;
grant select on aldb.* to nobody@res.res.res.res;
use mysql
update user set password=password('xxxxxxxxxx') where user='root';
flush privileges;
====================================================
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
-----------------------------
/etc/init.d/mysqld status
/etc/init.d/mysqld stop
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
需要使用Enter中斷會話
mysql -u root -p -hlocalhost
mysql> use mysql;
select Host, User, Password from user where user='root' and host='root' or host='localhost';
+-----------+--------+----------+
| Host | User | Password |
+-----------+--------+----------+
| localhost | | |
| localhost | aimin | |
| localhost | nobody | |
| localhost | root | |
+-----------+--------+----------+
4 rows in set (0.00 sec)
update user set password=PASSWORD('XXXXXXXXXXXXXX') where user='root' and host='root' or host='localhost';
flush privileges;
quit
/etc/init.d/mysqld restart
mysql -u root -p -hlocalhost
----------------------------------------------
# service mysqld stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# mysql -u root -p -hlocalhost
mysql> UPDATE user SET Password=PASSWORD('xxxxxxxxxxxxxxxxxxxxx') where USER='root';
mysql> FLUSH PRIVILEGES;
mysql> quit
# service mysqld start
restart CentOS.
-------------------------------------
Access denied for user 'root'@'localhost' (using password: YES)
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql'
SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
GRANT ALL ON *.* TO 'root'@'localhost';
GRANT ALL ON *.* TO 'root'@'127.0.0.1';
GRANT ALL ON *.* TO 'root'@'xyz.xyz.com.cn';
GRANT ALL ON *.* TO 'root'@'123.123.123.123';
FLUSH PRIVILEGES;
quit
REF:
http://www.cnblogs.com/kerrycode/p/3861719.html