linux的ubuntu系统,突然登入不到mysql数据库。Navicat 远程登入数据库发现,数据库莫名其妙没了!!!起初还以为登错远程服务器端了,因为前一天还在使用的数据库,说没就没。仔细观察后发现又多出一个README_TO_RECOVER_A的数据库。看这个数据库的名字就感觉不秒,如此猥琐的名称。
没有删除前的数据库。
删除用户数据库并赠送一个数据库后。
这个曾送的数据库中还留下一句话,大概意思就是限多少时间内给钱,不给就撕票。我这个是测试用的数据库,所以没什么关系。如果是生产环节的就危险了。所以需要处理两个问题。第一如何恢复数据库,第二如何加强数据库安全。
那就开始度娘找答案了,因为最终没有找到一个完整的答案,所以这里总结并记录一下。
1.如何恢复数据库。
准确说,是如何让mysql数据库可用并从新创建自己的数据库。因为被这种绑票后,数据库是创建不了。网上都说是权限问题,有两种方法。
第一、修改权限
登入数据库
# mysql -u root -p
选择mysql数据,并查看权限。
use mysql;
SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
其实看我数据库中root用户的Grant_priv和Super_priv权限都有,但是还是跟着操作了一遍。
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
更新权限 FLUSH PRIVILEGES;
再次进入数据库。
测试创建数据是否可以create database python;
发现问题依旧存在。
第二、赋权
选择数据库use mysql;
给root用户赋权,结果失败了。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
查看当前用户权限show grants;(其实一开始也看不董如何才是正常的权限列表,后面有查看自己创建的root账号权限列表)
度娘上此问题基本上都是用修改权限和赋权法处理的。在我这里第一个修改权限问题依旧,第二个赋权法,本身就执行失败了。毫无头绪了!!!只能在想办法了。
删除此root账号在重新创建一个root账号然后赋权呢?
第三、重新创建root账号
前面有个叫debian-sys-maint的用户选项也是都有权限。
首先用户debian-sys-maint的密码我们不知道,需要先找到此用户密码。我也不知道密码在哪里。
度娘说mysql有个debian.cnf的配置文件有此用户密码。
locate *.cnf
确实发现了上述文件。查看文件cat /etc/mysql/debian.cnf
使用此用户名和密码登入
查看权限show grants;发现跟之前的root用户权限还真不一样。
(后话,用debian-sys-maint账号给root账号赋权不知道是否可以成功GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';因为当时没有执行赋权指令,而是直接删除了root账号,从新创建一个root账号。而后来用新建的root账号登入后去执行赋权指令时候可以的GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';以及用debian-sys-maint账号给新创建的root账号执行赋权指令GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';也是可以成功的,所以是否原来root账号确实有问题,不得而知了。)
删除root用户drop user root;
选择用户并查看用户,显示没有root用户了。
use mysql;
SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
创建root用户并且是可以通过任何IP访问的,密码是123456。(%表示设置为任何IP可访问。这里密码123456也是数据库不安全的原因,后面单独讲。)
创建用户create user 'root'@'%' identified by '123456';
查看用户权限SELECT host,user,Grant_priv,Super_priv FROM mysql.user;
给新用户赋权grant all privileges on *.* to 'root'@'%' with grant option;
查看新创建root账号并赋权后的权限,和原来的root账号显示不同。具体是什么原因,导致之前账号权限有问题,然后又不能被重新赋权,目前我也不知道。
更新权限flush privileges;
用新创建的root用户验证
mysql -u root -p
创建新数据库create database python;
(这里用python为实例是因为度娘,都是用这个举例,所以我也就用这个了。)
删除测试的数据库drop database python;
到此第一个问题恢复数据库可使用就完成了。
2.加强数据库安全
虽然是测试数据库,也不希望每天重新去生成一次,那多麻烦。更重要的是以后生产环境下的就一定要确保安全。那如何提高安全性呢?有以下两点。
1.服务器后台设置允许访问的IP
从源头上防止外部非指定的主机访问到我们的mysql数据库。这里说的服务器后台指的是云服务器控制台。
2.mysql数据库本身的设置
一、关闭远程访问,这点不推荐,因为实际应用中数据库和应用软件都会分别部署在不同的服务器。所以我还是开启了远程访问。
use mysql; #访问mysql库
update user set host = 'localhost' where user = 'root'; #使root能再任何host访问
FLUSH PRIVILEGES; #刷新
二、不使用默认端口3306
找到mysql.cnf配置文件locate mysql.cnf
打开文件vim /etc/mysql/mysql.cnf。找到节点[mysqld]下有个port = 3306,可以修改为新的端口。
保存配置文件后,从前数据库service mysql restart
三、root账号密码增加复杂度
不要用太简单的密码作为root账号密码。这点比前两点更重要,也更容易做到。
UPDATE user SET plugin="mysql_native_password", authentication_string=PASSWORD("Qui12&3#uj9") WHERE user="root";