問題
在ubuntu下執行mysql -u root -p顯示:
'Access denied for user 'root'@'localhost' (using password: YES)'
應該算是經典問題,stackoverflow上有很多高票回答,這樣報錯的原因應該是密碼不對。解決方式無外乎是通過skip-grant-tables繞開密碼登陸mysql,然后修改密碼。
參考:https://stackoverflow.com/questions/41645309/mysql-error-access-denied-for-user-rootlocalhost
解決辦法
1、執行:
$ sudo mysqld_safe --skip-grant-tables --skip-networking
注意staoverflow中參考的代碼在networking后還有個&,我的電腦上沒有&但是生效了。之前敲$ sudo mysqld_safe --skip-grant-tables &也沒生效,不知道為什么。
2、這時mariadb應該不需要密碼可以直接進了:
$ mysql -u root
3、進去之后我們需要改密碼,改密碼前先刷新數據庫,大小寫無所謂:
mysql> FLUSH PRIVILEGES;
這時報錯:
不要方,這也不是什么大問題,就是名為'procs_priv'的表損壞了。
5、修復table,修復前先找到這張表屬於哪個database下,我的openstack的mariadb的這張表屬於 'mysql' 數據庫下。OK,回顧以下mysql基本操作:
修復表格參考:
https://syslint.com/blog/tutorial/got-error-130-incorrect-file-format-some_table-mysql-issue-fix/
https://forums.mysql.com/read.php?34,164324=
4、驗證效果,重新刷新數據庫,成功:
5、改密碼
接着看之前參考skip命令的那條stackoverflow的高票回答,給了幾種改密碼的方式,但是對我都不適用:
基本上都是因為使用--skip-grant-tables進的mariadb,屬於匿名用戶:
6、匿名用戶下修改密碼
嘗試了這里的方案:https://ourcodeworld.com/articles/read/704/how-to-change-the-password-of-a-mysql-user-from-the-command-line,無效;
后來嘗試了這里的方案,成功:https://help.ubuntu.com/community/MysqlPasswordReset
改root賬戶的密碼,改所有遠程連接到mariadb的用戶的密碼:
具體操作的時候,本來應該3,4配套,3不生效故使用5,5生效6不生效,故改用4,敲完這些就可以退出數據庫了,效果如下:
6、重啟mariadb
7、驗證
還嘗試過的方案
1、參考上述url在配置文件里添加--skip-grant-tables:我的mysql目錄下配置文件眾多,在一般認為的配置文件my.cnf里又導入了兩個目錄下的配置文件,反正都改了也沒生效;
2、在終端中輸入:
$ sudo mysqld_safe --skip-grant-tables &
之后使用$ mysql -u root是進不去的,后來發現使用上面那條有效的命令,有時也是不能不用密碼進mariadb,猜測之前使用這條命令不生效,有可能是命令不對,也有可能是mariadb時好時壞吧
3、查看錯誤日志
因為嘗試上面兩種方法一直無果我想的是通過查看mariadb日志找報錯原因。
參考官方:https://mariadb.com/kb/en/library/error-log/
官方的說法是如果你不指定log位置,那么錯誤日志在datadir這個路徑下,datadir是mariadb的一個全局變量,進入mariadb后可以通過命令行顯示datadir的實際路徑,但問題就是進不去啊,進不去就看不了路徑;
那么指定log位置吧,進入配置文件后定義error_log,不管是自定義路徑下的文件名是已存在的,還是新建的,重新mysql -u root -p時log總是空的。
事后分析原因:錯誤日志是在數據庫mariadb啟動或運行時發生錯誤才會打日志,進不去mariadb是因為密碼不對的原因,數據庫本身是能啟動的,所以可能正常來說就是不會產生log。
順便學到的mysql/mariadb知識小結
1、openstack中用到的Mysql的配置文件目錄
