问题
在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,可以这样:
原文地址:https://www.cnblogs.com/IcarusYu/p/10924989.html