181 lines
6.0 KiB
Bash
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 "=========================================="
|
|
|