mariadb mysql -u root -p 显示Access denied解决办法

问题

在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的配置文件目录

mysql配置文件my.cnf位置:/etc/mysql/my.cnf
my.cnf最后两行有
!includeddir /..../
把该目录下的所有配置文件都导入进来了
2、openstack用到的Mysql的log位置:
/var/log/mysql
如果sudo CLI进不去,可以用sudo -s进去
3、数据库只运行在控制节点上
4、mariadb属于Mysql的一个分支,所以很多时候显示的是mysql,比如命令行中出现的很多都是mysql。辨别数据库是mysql还是mariadb,可以这样:

 

posted @ 2019-05-26 07:54  IcarusYu  阅读(4556)  评论(0编辑  收藏  举报