欢迎来到博达网站群学习网!
设为首页 | 加入收藏
当前位置: 首页 >> 知识库 >> 部署类 >> 数据库 >> 正文

Mysql数据库双机(Master/Slave)架构注意事项

发布时间:2016-08-03    浏览次数:

 

说明:

    Mysql数据库主从备份的双机模式(Master和Slave不进行切换,各自身份确定。),部署过程相对简单,因为网上成熟和详尽的文档可以说是比比皆是,但是在双机运行阶段,总会有一些这样或那样的问题,为了便于记忆,个人特别整理汇总了部分常见问题,希望对大家今后工作有所参考。

具体描述:

一、 主机中断服务,从机上线工作

这种情况是最为常见的一种情况;

特别需要注意的一点是:必须暂时停掉从机的同步

cd /usr/local/mysql/bin/

./mysql -uroot -pwebxber -P3306 -e "slave stop"

这是必须的操作,之所以这样,比如以下场景:

主机停止服务并非是由于数据库故障,而是其他系统故障造成的。在主从系统切换以后,从机已经上线,在生产环境中已经增加了新的数据。一旦主机数据库恢复正常上线,由于同步的配置没有取消,主机将根据故障前的数据情况,重新同步从机,导致从机新增加的所有数据丢失。

二、 主机系统恢复,如何同步数据

主机master恢复,准备上线。

为了保证数据完整,有人建议将目前从机slave对应的数据库的所有表lock,然后再备份。备份恢复,主机上线以后再解锁。

个人觉得有点麻烦,一般是会选一个夜深人静,狗少人稀的时间段去操作,直接在从机上将对应数据库的目录打包,然后copy到master的data目录;

在master机上,关闭mysql服务,service mysql stop

重命名对应数据库,比如vsb-old;

解压;启动mysql,service mysql start

cd /usr/local/mysql/bin/

./mysql -u root –p

输入密码;

show master status;

查看运行情况;记录mysql-bin和Position的数值备用;

quit

(如果有必要的话,在VSB中更改数据库连接池测试;)

登录slave,

cd /usr/local/mysql/bin/

./mysql -u root –p

输入密码以后;

reset slave;

change master to

master_host='192.168.59.110',

master_user='bak',

master_password='123456',

master_log_file='mysql-bin.000016',

master_log_pos=98;

quit

重新启动mysql的服务;service mysql stop

service mysql start

cd /usr/local/mysql/bin/

./mysql -u root –p

输入密码以后;

slave start;

show slave status\G;

quit

三、 主机完好运行,从机slave 损毁,须重配置

从机上安装与master上对应的mysql版本并完成基本配置;

Master上操作:

备份master对应数据库,同上文提到的原因一样,也是建议锁表的;

FLUSH TABLES WITH READ LOCK;

UNLOCK TABLES;

当然了,你也可以找一个不严格的时间去做。

cd /usr/local/mysql/bin/

./mysql -u root –p

输入密码;

show master status;

查看运行情况;记录mysql-bin和Position的数值备用;

从机上操作:

将master上对应数据库的目录打包并上传到对应的data目录;

     Slave上停止mysql服务,解压数据库文件;  

     配置my.cnf文件;

     

启动mysql服务;

cd /usr/local/mysql/bin/

./mysql -u root –p

输入密码以后;

slave stop;

reset slave;

change master to

master_host='192.168.59.110',

master_user='bak',

master_password='123456',

master_log_file='mysql-bin.0000xx',

master_log_pos=xxx;

quit

重新启动mysql的服务;service mysql stop

service mysql start

四、 Mysql数据库data目录迁移

由于mysql默认一般会安装在/usr/local目录;data一般在/usr/local/mysql/data 或/var/lib/mysql等;

而同步又采用二进制日志的形式,所以很容易造成data目录不断增大,如果建设初期硬盘分区没有考虑到这些问题,最终可能会导致磁盘空间不足,甚至是引发根/空间不足,影响整个系统的运行;因此在出现类似情况的时候,一般会对data目录进行迁移;

(当然了,data目录安装过程是可以自定义的,但是我个人不建议你这样做,除非你自己做过,你一定要相信我,如果你不熟悉,千万不要这样做,我是很爱你的,不要因为你的固执而痛失一个爱你的人。)

参考操作:

将/usr/local/mysql/data迁移到/opt/mysql/data

service mysql stop

mkdir -p /opt/mysql/data

mkdir -p /opt/mysql/tmp

cp r /usr/local/mysql/data/* /opt/mysql/data

编辑/etc/my.cnf文件,修改socket文件位置;

编辑/etc/init.d/mysql文件;注意权限;

chown –R mysql:mysql /opt/mysql

service mysql start

五、 日常运行中出现slave不同步

show master status;

1. 1062错误

可能原因是master库意外宕机或者slave库被非法(不合理)操作,导致主键冲突问题;

参考解决方法:

Slave机的my.cnf文件,增加忽略常见的errors

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

重启Slave的mysql;

2. 个别表被Lock,这个目前最为常见。

原因一般是两套产品做冷备,生产环境连接master库,备用环境连接slave库,比如:为了验证备份环境的可用性,用户经常通过页面浏览的方式去查看站点,导致站点访问记录表wbstatdata被双写,最终发生死锁,导致同步失败。

这个问题较为简单的参考解决方法是:

在salve的my.cnf增加:

slave-skip-errors=all

忽略所有错误;

当然了,还有其他的方法,就是重新定义pos位置,跳过这个错误,操作相对繁琐,有兴趣的同学可以研究。

六、 附加问题

同步传输正常,待到Slave启动切换,结果发现中文乱码;

建议增加:my.cnf(多个位置)

default-character-set=utf8

另外,还有一个可能是Slave当时建库之初就没有指定数据库的字符集;

你丫悲催了,此时发现太晚了,最好日常多查看双机的运行情况。

附注:

个别问题可能是偶然现象,我也是根据个人的具体环境具体操作整理,不同的场景,肯定有所出入,以上所有内容仅能作为参考,完全仿照操作带来的一切风险和后果,本人概不负责。另外,本文无版权和产权,文中的技术细节不提供讨论,如有纰漏或错误,烦请指出,重新发布更正后的文档即可。