环境:
CentOS 5.11 mysql-server:5.0.95
mysql之前的存储路径是/var/lib/mysql,最近由于数据量不断增加,根目录已经满了,正好服务器上刚挂载了一块200G的空硬盘,于是就想把mysql的存储路径切换到新硬盘上。但是将数据拷贝到新硬盘后,修改了/etc/my.cnf的datadir和socket路径后,启动服务service mysqld restart后报错:
Cannot check for MySQL Daemon startup because of mysqladmin failure在确认了不是数据文件权限引起的问题后,尝试从log入手分析问题。
查看mysql日志文件 /var/log/mysqld.log
[root@localhost ~]# cat /var/log/mysqld.log
160206 14:53:26 mysqld started
160206 14:53:26 mysqld ended
160214 15:05:46 mysqld started
160214 15:05:47 mysqld ended
160214 15:09:17 mysqld started
160214 15:09:17 mysqld ended
160214 16:58:45 mysqld started
160214 16:58:45 mysqld ended
160214 16:59:55 mysqld started
160214 16:59:55 mysqld ended
160214 16:59:59 mysqld started
160214 16:59:59 mysqld ended没什么有用的信息。
查看/var/log/messages
[root@localhost ~]# cat /var/log/messages | grep mysql
Feb 14 15:05:46 localhost kernel: mysqladmin[21917]: segfault at 0000000000000000 rip 0000003000a607b7 rsp 00007ffff67d0f58 error 4
Feb 14 15:05:46 localhost kernel: mysqladmin[21928]: segfault at 0000000000000000 rip 0000003000a607b7 rsp 00007fff25e70ca8 error 4
Feb 14 15:05:47 localhost kernel: mysqld[22005]: segfault at 0000000000000000 rip 0000003000a607b7 rsp 00007fff6f3e7868 error 4发现报了好多这种类似的错误。
基本上可以判定为是mysql 程序出了问题,尝试过只是通过yum remove和yum instll卸载重装数据库,但是仍然存在这个问题。最后选择备份出必要数据文件后,彻底删除mysql后进行重装。
mysql的数据备份和彻底删除:
mysql常用innodb和myisam引擎,因此备份主要是针对这两种引擎的数据文件。查看/var/lib/mysql下的数据文件,每个文件夹代表的是一个数据库的数据目录,如果数据目录里有.frm,.myd,.myi三种文件,则是myisam引擎的,只需要将整个数据目录拷贝出来即可。如果数据目录里只有.frm和.db文件,则是innodb引擎,需要在拷贝数据目录的同时,将/var/lib/mysql下的ibdata1也一起拷贝出来。
我是直接将整个/var/lib/mysql拷贝到了别处。
拷贝时有一个小技巧,使用
cp -rp /var/lib/mysql 目标路径
带着p参数,就可以将文件的所有者机用户组属性一起拷贝。(mysql数据库文件的所有者和用户组都必须是mysql,也可以使用chown -R 进行修改)
到此文件备份完成,接下来需要彻底删除mysql。
[root@localhost ~]# rpm -qa|grep mysql
mysql-5.5.25-1.el6.remi.i686
mysql-libs-5.5.25-1.el6.remi.i686
compat-mysql51-5.1.54-1.el6.remi.i686
mysql-server-5.5.25-1.el6.remi.i686
[root@localhost ~]# yum remove mysql mysql-server mysql-libs compat-mysql51
同时要注意手动删除/etc/my.cnf和/var/lib/mysql。
接下来就可以重新安装mysql。
使用yum重装完成后,启动mysql,配置root的密码。
之后可以将之前备份的数据重新拷贝到新数据库的/var/lib/mysql下(包含ibdata1,,ib_logfile0,ib_logfile1,执行的是替换操作),注意不要拷贝原数据库存储用户数据的mysql目录。重启mysql,就能正常访问数据库了。