#!/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 </dev/null || echo "0") if [ "$USER_EXISTS" = "0" ]; then echo "创建复制用户 $REPL_USER@$SLAVE_IP..." mysql -u root -p"$ROOT_PASSWORD" </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 </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" </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 "=========================================="