每一次安装和使用MYSQL总是有不同的体会。
这一次的问题是这样的。我们的服务器,有两块磁盘,其中一块容量比较大,打算专门用来做数据盘。于是,决定将mysql的数据库文件转移到数据盘上。于是,停掉mysql服务器,将/var/lib/mysql 目录中的所有文件mv到了 datadisk/mysqldb 下面,然后修改了/etc/my.cnf 将其中的datadir指向了新的目录,然后重启了mysql服务。重启后,一个很奇怪的现象发生了,用程序远程连接mysql服务器成功,用root用户命令行登录(mysql -u root -p)成功。 但是,用JAVA程序本地连接失败,抛出org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure 异常。这是一个很奇怪的问题,远程连接的程序和本地连接的程序是同一套,一样的配置,一样的jdbc, 一开始以为是配置的问题,反复修改了配置文件,仍然没有办法解决。 (由于mysql root用户本地登录和远程登录用的不同的两套密码,一开始以为是密码的问题)后来,翻了一下mysql的资料,发现修改了datadir 之后相应的 my.cnf中的socket参数也需要修改,否则的话mysql仍然会使用/var/lib/mysql/mysql.sock文件。 怀疑可能是这个问题,于是,修改my.cnf 中的socket参数,让它也指向datadisk/mysqldb/mysql.sock 。修改后重启mysql,果然,问题解决了,远程和本地程序都可以连接mysql数据库。
可是这个时候,命令行又不行了。 mysql -u root -p 直接报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
看样子,命令行仍然用的是原来的mysql.sock连接。于是,网上搜了一下,原来可以通过my.cnf 配置文件指定命令行的socket参数,于是编辑my.cnf加上如下两行:
[client]
socket=datadisk/mysqldb/mysql.sock
重启mysql,一切正常。
看样子,移动数据库,光复制文件是不行的,还需要重新指向mysql.sock的位置才行啊。