Files
hzdyjs/docs/部署文档/生产环境双机部署方案/部署脚本/setup-mysql-replication.sh
T
2025-11-27 00:02:01 +08:00

181 lines
6.0 KiB
Bash

#!/bin/bash
# MySQL主从复制配置脚本
# 用途:配置MySQL主从复制
set -e
MASTER_IP="172.16.0.67"
SLAVE_IP="172.16.0.68"
DB_NAME="hzdyjs_xg"
REPL_USER="repl"
REPL_PASSWORD="Repl@123456"
ROOT_PASSWORD="Hzdyjs@Root@123456"
echo "=========================================="
echo "MySQL主从复制配置脚本"
echo "=========================================="
# 检查当前机器IP
CURRENT_IP=$(hostname -I | awk '{print $1}')
echo "当前机器IP: $CURRENT_IP"
if [ "$CURRENT_IP" = "$MASTER_IP" ]; then
echo "配置主库 (Master)..."
# 检查是否已经配置过
if grep -q "server-id = 1" /etc/my.cnf 2>/dev/null; then
echo "⚠️ 检测到主库配置已存在,跳过配置文件修改"
echo "如果binlog未开启,请手动检查配置"
else
# 1. 配置主库my.cnf
echo "正在配置主库 my.cnf..."
cat >> /etc/my.cnf <<EOF
# 主从复制配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = $DB_NAME
expire_logs_days = 7
max_binlog_size = 500M
# 性能优化配置(减少主从复制对主库性能影响)
# 使用性能优先方案,性能影响约1-2%
sync_binlog = 0
binlog_cache_size = 2M
max_binlog_cache_size = 512M
EOF
# 2. 重启MySQL
echo "正在重启MySQL服务..."
systemctl restart mysqld
sleep 5
echo "MySQL服务已重启"
fi
# 3. 检查并创建复制用户
echo "检查复制用户..."
USER_EXISTS=$(mysql -u root -p"$ROOT_PASSWORD" -e "SELECT COUNT(*) FROM mysql.user WHERE user='$REPL_USER' AND host='$SLAVE_IP';" -s -N 2>/dev/null || echo "0")
if [ "$USER_EXISTS" = "0" ]; then
echo "创建复制用户 $REPL_USER@$SLAVE_IP..."
mysql -u root -p"$ROOT_PASSWORD" <<EOF
CREATE USER IF NOT EXISTS '$REPL_USER'@'$SLAVE_IP' IDENTIFIED BY '$REPL_PASSWORD';
GRANT REPLICATION SLAVE ON *.* TO '$REPL_USER'@'$SLAVE_IP';
FLUSH PRIVILEGES;
EOF
echo "复制用户创建成功"
else
echo "复制用户已存在,跳过创建"
fi
# 4. 显示主库状态
echo ""
echo "=========================================="
echo "主库状态信息(请记录以下信息用于从库配置):"
echo "=========================================="
mysql -u root -p"$ROOT_PASSWORD" -e "SHOW MASTER STATUS;" 2>/dev/null || {
echo "⚠️ 无法获取主库状态,请检查:"
echo " 1. MySQL服务是否正常运行"
echo " 2. binlog是否已开启"
echo " 3. root密码是否正确"
exit 1
}
echo ""
echo "主库配置完成!"
echo "⚠️ 重要:请记录上面的 File 和 Position 值,用于从库配置"
elif [ "$CURRENT_IP" = "$SLAVE_IP" ]; then
echo "配置从库 (Slave)..."
# 检查是否已经配置过
if grep -q "server-id = 2" /etc/my.cnf 2>/dev/null; then
echo "⚠️ 检测到从库配置已存在,跳过配置文件修改"
echo "如果配置不正确,请手动检查 /etc/my.cnf"
else
# 1. 配置从库my.cnf
echo "正在配置从库 my.cnf..."
cat >> /etc/my.cnf <<EOF
# 主从复制配置
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = $DB_NAME
EOF
# 2. 重启MySQL
echo "正在重启MySQL服务..."
systemctl restart mysqld
sleep 5
echo "MySQL服务已重启"
fi
# 3. 检查当前从库状态
echo "检查当前从库状态..."
SLAVE_STATUS=$(mysql -u root -p"$ROOT_PASSWORD" -e "SHOW SLAVE STATUS\G" 2>/dev/null | grep -c "Master_Host" || echo "0")
if [ "$SLAVE_STATUS" != "0" ]; then
echo "⚠️ 检测到从库已配置主从复制"
echo "当前主从状态:"
mysql -u root -p"$ROOT_PASSWORD" -e "SHOW SLAVE STATUS\G" 2>/dev/null | grep -E "Slave_IO_Running|Slave_SQL_Running|Master_Host|Master_Log_File|Read_Master_Log_Pos|Seconds_Behind_Master" || true
echo ""
read -p "是否要重新配置主从复制?(y/N): " RECONFIGURE
if [ "$RECONFIGURE" != "y" ] && [ "$RECONFIGURE" != "Y" ]; then
echo "跳过重新配置"
exit 0
fi
echo "停止当前从库复制..."
mysql -u root -p"$ROOT_PASSWORD" -e "STOP SLAVE;" 2>/dev/null || true
fi
# 4. 提示用户输入主库状态信息
echo ""
echo "=========================================="
echo "请输入主库的binlog信息(从主库 SHOW MASTER STATUS 获取):"
echo "=========================================="
read -p "MASTER_LOG_FILE (例如: mysql-bin.000001): " MASTER_LOG_FILE
read -p "MASTER_LOG_POS (例如: 154): " MASTER_LOG_POS
# 验证输入
if [ -z "$MASTER_LOG_FILE" ] || [ -z "$MASTER_LOG_POS" ]; then
echo "❌ 错误:MASTER_LOG_FILE 和 MASTER_LOG_POS 不能为空"
exit 1
fi
# 5. 配置从库复制
echo ""
echo "正在配置从库复制..."
mysql -u root -p"$ROOT_PASSWORD" <<EOF
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='$MASTER_IP',
MASTER_USER='$REPL_USER',
MASTER_PASSWORD='$REPL_PASSWORD',
MASTER_LOG_FILE='$MASTER_LOG_FILE',
MASTER_LOG_POS=$MASTER_LOG_POS;
START SLAVE;
EOF
if [ $? -eq 0 ]; then
echo ""
echo "=========================================="
echo "从库配置完成!主从复制状态:"
echo "=========================================="
mysql -u root -p"$ROOT_PASSWORD" -e "SHOW SLAVE STATUS\G" 2>/dev/null | grep -E "Slave_IO_Running|Slave_SQL_Running|Master_Host|Master_Log_File|Read_Master_Log_Pos|Seconds_Behind_Master|Last_IO_Error|Last_SQL_Error" || true
echo ""
echo "✅ 使用以下命令检查主从状态:"
echo " mysql -u root -p -e \"SHOW SLAVE STATUS\\G\" | grep -i \"slave_io_running\\|slave_sql_running\""
else
echo "❌ 从库配置失败,请检查错误信息"
exit 1
fi
else
echo "错误:当前机器IP ($CURRENT_IP) 不在配置范围内"
exit 1
fi
echo "=========================================="