1. mysql忘記密碼
vim /etc/my.conf 文件在mysqld下添加skip-grant-tables,表示mysql在登錄的時候不檢查權限。登錄mysql。直接運行mysql
> use mysql;
> update user set Password=password('root') where User='root'
> flush privileges;
> quit;
User表存儲的是mysql的用戶的權限和密碼,mysql密碼都是經過加密後存儲的,所以我們的密碼需要用password函數對其進行加密。刪掉第一步添加的skip-grant-tables;重啟mysql. service mysqld restart
2. mysql無法登錄
首先檢查mysql服務器是否開啟,service mysqld status.如果開啟了,但是仍然登錄不進去,如登錄賬戶是bob, 可以用root賬戶登錄mysql.user表,查看bob賬戶的Host是否正確,如果在登錄mysql服務器沒有明確指定Host,默認是localhost,有時表中有127.0.0.1,但是沒有localhost,這個時候嘗試下mysql -h127.0.0.1 -ubob -p如果能夠登錄,那就每次登錄的時候直接制定host登錄,或者修改mysql.user表,添加root@localhost.
> use mysql;
> insert into user(Host,User,Password) values('localhost','bob',password('1234'));
> grant all on *.* to 'bob'@'localhost'
最後一句是賦予權限的意思,賦予bob所有的權限,其中all可以換成[update|delete|insert|create...]等權限,*.*表示任意數據庫的任意表,用戶可以自己根據需要篩選。最後是賦予權限給哪個用戶。如果創建用戶後執行mysql -u bob -p仍然無法登錄, Access denied for user 'bob'@'localhost' (using password: YES),這時需要檢查下是否有''@localhost賬戶存在,如果有執行
DROP USER ''@'localhost';
由於mysql如果匹配到多個賬戶時,有特定的順序the most-specific Host values first,詳細見http://stackoverflow.com/questions/10299148/mysql-error-1045-28000-access-denied-for-user-billlocalhost-using-passw
3. 執行grant時出現Access denied for user 'root'@'localhost' to database 'database'
root@localhost沒有訪問database的權限。我們執行
SELECT * FROM mysql.user WHERE User='root' and Host="localhost" \G
\G表示以鍵值對形式返回,這樣看起來更方面,其中我們會發現
Grant_priv: N
表示賬戶沒有grant權限,所以我們就賦予grant權限給它。
> update user set Grant_priv='Y' where User='root' and Host='localhost';
> flush privileges;
重新登錄mysql。筆者直接flush privilege後執行grant命令,出錯,但是重新登錄後成功了。