不知道之前对 mysql 数据库做过什么操作,我发现服务器在访问 mysql 数据库的时候,
在 hibernate 连接数据库的配置里面,只有填写内网 ip (192.168.1.*)才能正常地连接到数据库。
今天有空准备把这个问题给解决一下,首先回顾一下已经掌握的东西:
在 OS X 的 Terminal 中键入 mysql -uroot -p123456 连接到数据库。连接成功,没问题。
然后,show databases 查看所有数据库,选择使用名为 mysql 的系统数据库(use mysql)
键入 show tables 查看当前数据库中的所有表,其中有一张叫 user 的表吸引了我的注意,
事实上这就是 mysql 管理用户权限,账号密码等数据的表了。
desc user 列出该表的所有字段信息,其中的 Host, User, Password 这三个字段应该引起我们的重视。
当 web 服务器连接数据库的时候,是与上述的三个字段息息相关的。
之前应该有说过更改 root 密码的方法,其中的一个方法就通过如下两条 sql 语句来完成的:
update user set Password=PASSWORD('123456') where User='root';
flush privileges;
上面只是涉及到了用户名和密码两项,其实 Host 也是很重要的!今天我就被上了一课。
前面不是说我只有用内网 ip 才能连接到服务器的事情么,那个纯属意外,
因为用户的密码在查询表的结果集中都是以加密的形式呈现的,
所以让我误以为 root@127.0.0.1 的密码就是我设置过的密码 123456,
但实际上并不是这样的,密码并不是 123456,所以我在用 127.0.0.1 连接数据库的时候会失败,
其实很简单,只需要执行如下的 sql 语句把 root@127.0.0.1 对应的密码修改回来就能正常连接了:
update user set Password=PASSWORD('123456') where User='root';
flush privileges;
但问题并没有这么简单,我执行 select Host,User,Password from user 命令以后,得到了如下的结果集:
% root *SDFWEFWF...
kodeloves-Mac-mini.local root *AFEWFG...
127.0.0.1 root*AFEWFG...
...
我的第一直觉就是,第一行和第三行有点儿矛盾,
两条记录的用户名都是 root,但密码却是不一样的,这肯定有问题!
于是我果断地执行 delete from user where User='root' and Host='%' 将第一条记录给咔嚓掉了。
然后我用 web 服务器再次尝试连接 mysql 数据库(以 127.0.0.1 连接),还是失败
(其实不是因为存在 % 这条记录的原因所致,而是如前文所述我输错了密码所致)
失败就失败,没什么大不了,继续试呗。可这时我惊奇地发现用 mysql -uroot -p123456 竟然被拒绝连接了。
坑爹了,以我来看我根本就没有动过账号密码啊,怎么就被拒绝连接了呢...
思来想去觉得可能是因为删除了 % 那条记录所致(% 可能是匹配除 localhost, 127.0.0.1 以后的其他所有 ip 的)
这样的话还不算难办,在网上查了一下,用 mysql -h127.0.0.1 -uroot -p123456 顺利地连进了数据库。
有了前面的教训,看来 % 这条记录还是不能省略,还是把它给补上来吧:
手动插入?尼玛 user 表有几十个字段,手写太累了。
怎么办呢?想了半天想到一个好办法,把 mysql.user 这张表导出为 sql 文件,
再从里面找出相关的插入语句,稍作修改执行一下就行了。下面是网上找到的相关资料:
/usr/local/mysql/bin/mysqldump -uroot -p123456 mydb mytb < /opt/mytb.sql
解释:
mysqldump 备份命令
-uroot root用户
-p123456 密码为123456
mydb 表所在的数据库mydb
mytb 将要导出的表mytb 如果不指定具体表,就导出整个数据库
> /opt/mytb.sql 备份到mytb.sql中
还原:
/usr/local/mysql/bin/mysql -uroot -p123456 mydb > /opt/mytb.sql
至此,就算是愉快的结束了,我获得了如下的福利:
web 服务器以 192.168.1.*、127.0.0.1、localhost 都能够连接到数据库了。
另外,又可以像之前一样仅用 mysql -uroot -p123456 在控制台连入数据库了。
最后,还是挺好奇 mysql 命令默认是以怎样的 Host 连接服务器的(可以肯定不是 127.0.0.1)