Posts tagged ‘VIP bond’

frm文件损坏修复

上周六坏掉的机器,本周三终于修复了一部分,检查以后发现是有一根内存坏掉了。因为没有备件,所以先拔掉了内存,下次更换成新的。(拔掉一根4G的内存,还有28G,羡慕吧,哈哈)

老办法,重启机器,因为搬迁机房,主备两台机器分布在两个机房,所以heartbeat没有必要启动起来了。手工绑定了IP。利用唐牛的方法:

Linux下:
手工加IP的方法:
ifconfig -a先看一下网卡情况,选一个没有使用的子接口bond0:0,在这个子接口上加vip:
ifconfig bond0:0 10.0.20.30 netmask 255.255.255.0
加完IP后,需要通知周边的机器特别是网关更新arp缓存(否则其它机器可能连不通这个IP):
arping -q -U -c 3 -I bond0 10.0.20.30
去除掉这个vip的方法:
ifconfig bond0:0 down

添加上VIP。

因为是主机突然关闭的,MySQL属于非法关闭,很多日志什么的没有刷到数据文件中去。启动要等好久。刷好了日志,查看主备机的复制时发现了如下的错误:
100512 17:47:33 [ERROR] Slave: Error ‘Incorrect information in file: ‘./eshop/sample.frm” on query.

frm文件损坏了。这个是MySQL的表结构文件(庆幸的还只是表结构文件,如果是数据文件什么的,就要开始哭了)。check table返回错误。show create table sample也同样有问题。

没有办法,只能采用变通的办法。备份好本机的sample.frm。从主机的数据文件目录(my.cnf里面datadir指定的目录里面,对应数据库目录中)拷贝了sample.frm,覆盖本机的sample.frm。
然后重启数据库,检查。这里覆盖的时候需要注意:修改权限和属主。
chown mysql:mysql sample.frm
chmod 660 sample.frm

启动以后一切正常,复制继续进行。就等它赶主机这几天的数据了。

究 其原因,是由于MySQL数据库突然被停止了,然后部分数据还在内存中,没有刷到磁盘中去,导致数据文件不完整。但是数据库的表文件一般不会修改,我有 99%的把握用户不会修改这张表的结构信息,怎么会损坏了表结构文件列,MySQL只会去读这个文件阿。想不通。估计是个世纪难题,哈哈。

这里其实还有一个小插曲:
备机21b到主机21a的复制,我们发现也停掉了,检查发现主机21a的show slave status结果中,
Master_Log_File: mysql-bin.001708
Read_Master_Log_Pos: 334529910
对 应的备机21b的mysql-bin.001708的大小为334357108。也就是说,主机21a已经复制执行了334529910位置以前的所有 event。他现在想执行后面的event。备机21b一看,你给我的位置,比我文件的位置还要大,我不可能给你阿。于是,备机21b到主机21a的复 制,肯定不行。
这里也是由于部分数据还在内存中,结果机器挂掉了,binlog不能及时写回磁盘。但是,这个时候,数据早通过网络发送给了主机 21a,主机21a收到了event,更新了它自己的复制位置为334529910。备机21b启动的时候,主机21a还是想从这个位置开始读数据,那当 然是没有的阿。

这个文件解决起来也很简单,切换主机21a的日志,让它从下一个binlog文件开始复制。
CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.001709′, MASTER_LOG_POS=0;

may you success