MySQL被攻击后创建数据库报错1044 - Access denied for user 'root'@'%' to database 'xxx'
- 一、问题
- 二、解决过程
- 1、正常过程
- 2、踩坑(已经解决问题的可以不看)
一、问题
最近数据库被攻击了,业务数据库都没了
还好也不是有重要数据,但再次创建数据库也报错了
1044 - Access denied for user ‘root’@‘%’ to database ‘xxx’
二、解决过程
1、正常过程
网上一搜都说是root用户没有权限,然后给出这个sql:
SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
查询出来“Grant_priv”或“Super_priv”的值为“N”,再用如下sql更新为“Y”:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
然后再刷新权限,sql如下:
FLUSH PRIVILEGES;
然后就可以了。
可是,如果已经将“Grant_priv”、“Super_priv”这个两个值更新为“Y”,还是报这个错怎么办?
因为“user”表不止这个两个字段,就把所以的字段都查出来,再看看其他的,sql如下:
SELECT * FROM mysql.user;
还真有其他字段值为“N”,那把这些值为“N”的字段更新为“Y”试试,sql如下
UPDATE mysql.user SET Insert_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y' WHERE User='root';
然后,我创建数据库就成功了。
2、踩坑(已经解决问题的可以不看)
注意,千万不要把“account_locked”字段设置为“Y”,这个字段不是权限,是锁定的意思,设置为“Y”就不能用root操作数据库了。
如果已经设置了,并且重启了MySQL,用root做任何操作都会报如下错:
ERROR 3118 (HY000): Access denied for user ‘root’@‘localhost’. Account is locked.
那只好先跳过密码登录了重新设置了。
先进入配置文件,命令如下:
vim /etc/my.cnf
加入如下配置:
skip-grant-tables
重启MySQL
service mysql restart
登录MySQL
将root用户的锁定状态字段“account_locked”更新为“N”
UPDATE mysql.user SET account_locked='N' WHERE User='root';
退出MySQL
exit
再次进入配置文件
vim /etc/my.cnf
注释掉跳过密码登录
重启MySQL
service mysql restart
然后就可以操作数据库了。