[SHELL]mysql主从+keepalived线上恢复解决方案

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

最近一个项目需要做一个mysql+keepalived高可用主从同步,配起来当然轻车熟路,但想到如何在主库挂掉,从库接管后,以最快的速度恢复数据,并让主库重新接管,所以整理了下思路,编写了如下脚本,供大家参考

mysql主从,以及keepalived高可用配置本博传送门:

http://showerlee.blog.51cto.com/2047005/1220801

http://showerlee.blog.51cto.com/2047005/1188549


一.备份从库当前数据库

注:以下的所有配置需要在数据库未运转状态下进行,建议做一个iptables规则禁止非管理员IP访问主从服务器IP,以及VIP,这样既能保证管理员可SSH远程登陆配置,又能恢复主从环境,待配置完成后解除禁止即可。

# vi /etc/rc.d/mysql_bak.sh

-------------------------

#!/bin/bash


# 环境变量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C


# 日常备份目录

basedir=/backup/daily/


# 数据库账户

user=root

passwd=123456


# mysql备份目录

mysql_db_bak=$basedir/$(date +%F_%H%M)

[ ! -d "$mysql_db_bak" ] && mkdir -p $mysql_db_bak


# mysql下所有库名称

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")


# 1.备份MySQL数据库

for((i=0; i!=${#db_name[@]}; ++i))

{

mysqldump -u $user -p$passwd --opt --skip-lock-tables --flush-logs --database ${db_name[i]} > $mysql_db_bak/${db_name[i]}.sql

}

-------------------------


二.复制从(192.168.7.12)数据库备份到主库(192.168.7.9)

# vi /etc/rc.d/scp_mysql.sh

----------------------

#/bin/bash

# 环境变量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

scp /backup/daily/2013-09-10_1258/* 192.168.7.9:/tmp

----------------------


三.恢复主库(192.168.7.9)

版本一:

# vi /etc/rc.d/recover_mysql.sh

------------------------------------

#/bin/bash

# 环境变量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C


# 数据库账户

user=root

passwd=123456


# mysql下所有库名称

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")


# 恢复MySQL数据库

cd /tmp

for((i=0; i!=${#db_name[@]}; ++i))

{

mysql -u $user -p$passwd -e "drop database \`${db_name[i]}\`;"

mysql -u $user -p$passwd -e "create database \`${db_name[i]}\`;"

mysql -u $user -p$passwd ${db_name[i]} < ${db_name[i]}.sql

}


# 开启从库

mysql -u $user -p$passwd -e "stop slave;"

mysql -u $user -p$passwd -e "reset slave;"

# 设置从库连接主库的相关参数,可利用相关命令查看

mysql -u $user -p$passwd -e "change master to master_host='192.168.7.9',master_user='slave',master_password='123456#',master_log_file='bin.000029',master_log_pos=106 ";

mysql -u $user -p$passwd -e "start slave;"

# 查看主从是否连接成功

mysql -u $user -p$passwd -e "show slave status\G;"

------------------------------------


版本二:

(自动获取主库binlog文件,和偏移值,优化参数,推荐):

------------------------------------

#/bin/bash

# 环境变量

PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH

export LANG=C


# 数据库参数

master_ip=192.168.7.9

mysql_master_user=root

mysql_slave_user=root

mysql_passwd=123456

master_user=slave

master_passwd=123456#


master_log_file=$(mysql -h$master_ip -u$mysql_master_user -p$mysql_passwd -e "show master status" |sed -n '2p' |awk '{print $1}')

master_log_pos=$(mysql -h$master_ip -u$mysql_master_user -p$mysql_passwd -e "show master status" |sed -n '2p' |awk '{print $2}')


# mysql库

db_name=("information_schema" "mysql" "test_db1" "test_db2" "test_db3" "test_db4")


# 恢复MySQL数据库

cd /tmp/mysql_bak


for((i=0; i!=${#db_name[@]}; ++i))

{

mysql -u $mysql_slave_user -p$mysql_passwd -e "drop database \`${db_name[i]}\`;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "create database \`${db_name[i]}\`;"

mysql -u $mysql_slave_user -p$mysql_passwd ${db_name[i]} < ${db_name[i]}.sql

}


# 开启从库

mysql -u $mysql_slave_user -p$mysql_passwd -e "stop slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "reset slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "change master to master_host='${master_ip}',master_user='${master_user}',master_password='${master_passwd}',master_log_file='${master_log_file}',master_log_pos=${master_log_pos};"

mysql -u $mysql_slave_user -p$mysql_passwd -e "start slave;"

mysql -u $mysql_slave_user -p$mysql_passwd -e "show slave status\G;"

-----------------------------------


四.查看主从同步信息

1.查看主库binlog日志以及偏移量

# mysql -u root -p123456 -e "show master status"

2.查看从库是否连接到主库

# mysql -u root -p123456 -e " show slave status\G;"


注:实际操作中发现,一旦VIP切换后有一定几率造成主从服务器都会同时获取到该虚IP,导致主从数据库冲突,无论重启keepalived与否都无法干掉该VIP,目前我的临时解决方案是将两台服务器均重新启动,大家如果有更好的方法请留言告知我,不胜感谢。


后续:

在网上翻阅大量资料,初步判断VIP切换后造成的冲突是因为在触发切换动作时使用的pkill keepalived 来杀掉keepaliaved进程,造成系统只是杀掉keepalived自身进程,并未来得及切换VIP,

目前的解决方案是使用正规的keepalived启动脚本/etc/init.d/keepalived stop 来关闭

初步测试未发现异常。。。


如果出现主从在切换VIP时,出现了主的VIP未自动关闭,从的正常开启,导致都获取到VIP,造成互相冲突的情况,可手动输入如下命令删除一方的VIP地址

# ip addr del "虚拟ip" dev eth0

但此方法只是一个临时的解决方案,当手动删除VIP后,重启keepalived服务会无法正常开启vip,需要重启服务器方能恢复。




     本文转自 showerlee 51CTO博客,原文链接:http://blog.51cto.com/showerlee/1298160 ,如需转载请自行联系原作者



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 开发工具
MySQL5.7主从配置(Docker)
MySQL5.7主从配置(Docker)
728 0
|
1月前
|
SQL 关系型数据库 MySQL
解决MySQL主从慢同步问题的常见的解决方案:
解决MySQL主从慢同步问题的方法有很多,以下是一些常见的解决方案: 1. 检查网络连接:确保主从服务器之间的网络连接稳定,避免网络延迟或丢包导致数据同步缓慢。 2. 优化数据库配置:调整MySQL的配置参数,如增大binlog文件大小、调整innodb_flush_log_at_trx_commit等参数,以提高主从同步性能。 3. 检查IO线程和SQL线程状态:通过SHOW SLAVE STATUS命令检查IO线程和SQL线程的状态,确保它们正常运行并没有出现错误。 4. 检查主从日志位置:确认主从服务器的binlog文件和位置是否正确,避免由于错误的日志位置导致同步延迟。 5.
122 1
|
1月前
|
关系型数据库 MySQL 数据库
深入探讨MySQL并发事务的问题及解决方案
深入探讨MySQL并发事务的问题及解决方案
72 0
|
3月前
|
缓存 关系型数据库 MySQL
mysql shell如何查看服务器状态
mysql shell如何查看服务器状态
252 1
|
15天前
|
SQL 关系型数据库 MySQL
mysql主从同步出错解决办法
mysql主从同步出错解决办法
10 0
|
2月前
|
关系型数据库 MySQL 数据库
Host 'XXX' is not allowed to connect to this MySQL server 解决方案
Host 'XXX' is not allowed to connect to this MySQL server 解决方案
|
2月前
|
SQL 关系型数据库 MySQL
MySQL - 死锁的产生及解决方案
MySQL - 死锁的产生及解决方案
198 0
|
3月前
|
关系型数据库 MySQL Shell
linux shell脚本实现自动备份Mysql数据库脚本
linux shell脚本实现自动备份Mysql数据库脚本
183 3
|
3月前
|
JavaScript 前端开发 关系型数据库
针对Mysql转义反斜杠的解决方案
针对Mysql转义反斜杠的解决方案
42 2
|
3月前
|
SQL 关系型数据库 MySQL
mysql数据库备份shell
mysql数据库备份shell
24 0