当前位置: 首页 > news >正文

MySQL8.0 自动化脚本安装方案

以下是 MySQL 自动化脚本安装方案,支持多个版本和安装方式:


📦 MySQL 一键安装脚本

脚本功能

  • ✅ 支持 MySQL 5.7/8.0 版本选择

  • ✅ 支持社区版和发行版源安装

  • ✅ 自动安全配置和密码策略

  • ✅ 性能优化配置

  • ✅ 备份和监控脚本

  • ✅ 主从复制配置(可选)


🔧 完整安装脚本

#!/bin/bash
​
# MySQL 自动安装脚本
# 支持: CentOS/RHEL/Ubuntu/Debian/Amazon Linux
​
set -e
​
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
​
# 输出函数
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_debug() { echo -e "${BLUE}[DEBUG]${NC} $1"; }
​
# 变量配置
MYSQL_VERSION="8.0"
MYSQL_ROOT_PASSWORD=$(openssl rand -base64 32 | tr -d '/+=' | cut -c1-16)
MYSQL_PORT="3306"
MYSQL_DATA_DIR="/var/lib/mysql"
MYSQL_LOG_DIR="/var/log/mysql"
MYSQL_CONF_DIR="/etc/mysql"
MYSQL_SOCKET="/var/run/mysqld/mysqld.sock"
​
# 检测系统和服务名
detect_os() {if [ -f /etc/os-release ]; then. /etc/os-releaseOS=$IDVER=$VERSION_IDelseOS=$(uname -s)VER=$(uname -r)filog_info "检测到操作系统: $OS $VER"# 根据系统确定服务名case $OS inubuntu|debian)MYSQL_SERVICE="mysql";;centos|rhel|amzn|fedora)MYSQL_SERVICE="mysqld";;*)MYSQL_SERVICE="mysqld";;esaclog_info "使用服务名: $MYSQL_SERVICE"
}
​
# 获取实际的服务名
get_mysql_service_name() {# 检查可能的服务名local possible_services=("mysql" "mysqld" "mariadb")for service in "${possible_services[@]}"; doif systemctl list-unit-files | grep -q "^$service.service"; thenecho "$service"return 0fidone# 如果找不到,使用系统默认case $OS inubuntu|debian) echo "mysql" ;;*) echo "mysqld" ;;esac
}
​
# 安装依赖
install_dependencies() {log_info "安装系统依赖..."case $OS inubuntu|debian)apt-get updateapt-get install -y wget curl gnupg2 lsb-release procps;;centos|rhel|amzn|fedora)if command -v dnf >/dev/null 2>&1; thendnf install -y wget curl procps-ngelseyum install -y wget curl procps-ngfi;;esac
}
​
# 添加MySQL官方仓库
add_mysql_repo() {log_info "添加MySQL官方仓库..."case $OS inubuntu|debian)# 下载MySQL APT仓库配置wget -O /tmp/mysql-apt-config.deb https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb# 安装仓库配置(非交互式)export DEBIAN_FRONTEND=noninteractiveecho "mysql-apt-config mysql-apt-config/select-server select mysql-${MYSQL_VERSION}" | debconf-set-selectionsdpkg -i /tmp/mysql-apt-config.debapt-get updaterm -f /tmp/mysql-apt-config.deb;;centos|rhel)# 添加MySQL Yum仓库log_info "添加MySQL Yum仓库..."if command -v dnf >/dev/null 2>&1; thenlog_info "添加MySQL Yum仓库...if..."dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpmelselog_info "添加MySQL Yum仓库...else..."yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpmfi# 启用指定版本log_info "启用指定版本..."if [ "$MYSQL_VERSION" = "5.7" ]; thenif command -v dnf >/dev/null 2>&1; thendnf config-manager --disable mysql80-communitydnf config-manager --enable mysql57-communityelseyum-config-manager --disable mysql80-communityyum-config-manager --enable mysql57-communityfifi;;amzn)# Amazon Linux 2yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm;;esac
}
​
# 安装MySQL服务器
install_mysql_server() {log_info "安装MySQL服务器..."case $OS inubuntu|debian)export DEBIAN_FRONTEND=noninteractiveecho "mysql-community-server mysql-community-server/root-pass password $MYSQL_ROOT_PASSWORD" | debconf-set-selectionsecho "mysql-community-server mysql-community-server/re-root-pass password $MYSQL_ROOT_PASSWORD" | debconf-set-selectionsapt-get install -y mysql-community-server mysql-community-client;;centos|rhel|amzn|fedora)if command -v dnf >/dev/null 2>&1; thendnf install -y mysql-community-server mysql-community-clientelseyum install -y mysql-community-server mysql-community-clientfi;;esac
}
​
# 使用发行版仓库安装
install_mysql_distro() {log_info "使用发行版仓库安装MySQL..."case $OS inubuntu|debian)export DEBIAN_FRONTEND=noninteractiveapt-get install -y mysql-server mysql-client;;centos|rhel)if command -v dnf >/dev/null 2>&1; thendnf install -y community-mysql-server community-mysqlelseyum install -y mysql-server mysqlfi;;amzn)yum install -y mysql-server mysql;;esac
}
​
# 配置MySQL
configure_mysql() {log_info "配置MySQL..."# 创建配置目录mkdir -p $MYSQL_CONF_DIR/conf.dmkdir -p $MYSQL_LOG_DIRchown -R mysql:mysql $MYSQL_LOG_DIR# 主配置文件cat > $MYSQL_CONF_DIR/my.cnf << EOF
[mysqld]
# 基础配置
user = mysql
port = $MYSQL_PORT
socket = $MYSQL_SOCKET
basedir = /usr
datadir = $MYSQL_DATA_DIR
tmpdir = /tmp
​
# 字符集配置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
​
# 连接配置
max_connections = 1000
max_connect_errors = 100000
connect_timeout = 60
wait_timeout = 600
interactive_timeout = 600
​
# 缓冲池配置 (根据内存调整)
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 8
​
# 日志配置
log_error = $MYSQL_LOG_DIR/error.log
slow_query_log = 1
slow_query_log_file = $MYSQL_LOG_DIR/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
​
# InnoDB配置
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_log_buffer_size = 16M
innodb_log_file_size = 512M
​
# 二进制日志 (用于复制和恢复)
server_id = 1
log_bin = $MYSQL_LOG_DIR/mysql-bin
expire_logs_days = 7
max_binlog_size = 100M
binlog_format = ROW
​
# 安全配置
skip_name_resolve = 1
local_infile = 0
symbolic-links = 0
​
# 其他配置
transaction_isolation = READ-COMMITTED
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
join_buffer_size = 4M
​
[mysql]
default-character-set = utf8mb4
​
[client]
port = $MYSQL_PORT
socket = $MYSQL_SOCKET
default-character-set = utf8mb4
EOF
​# 创建systemd服务覆盖(如果需要)local service_file=""for service_name in "mysql" "mysqld"; doif [ -f /lib/systemd/system/${service_name}.service ] || [ -f /usr/lib/systemd/system/${service_name}.service ]; thenservice_file="${service_name}.service"breakfidoneif [ -n "$service_file" ]; thenmkdir -p /etc/systemd/system/$service_file.dcat > /etc/systemd/system/$service_file.d/override.conf << EOF
[Service]
LimitNOFILE=65536
TimeoutSec=300
EOFsystemctl daemon-reloadfi# 设置权限chown -R mysql:mysql $MYSQL_CONF_DIR
}
​
# 初始化MySQL数据目录
initialize_mysql() {log_info "初始化MySQL数据目录..."# 获取实际的服务名MYSQL_SERVICE=$(get_mysql_service_name)log_info "使用服务名: $MYSQL_SERVICE 进行初始化"# 停止MySQL服务(如果正在运行)if systemctl is-active --quiet $MYSQL_SERVICE; thensystemctl stop $MYSQL_SERVICEfi# 备份现有数据if [ -d "$MYSQL_DATA_DIR" ] && [ "$(ls -A $MYSQL_DATA_DIR)" ]; thenlog_warn "MySQL数据目录不为空,创建备份..."tar -czf /tmp/mysql-data-backup-$(date +%Y%m%d_%H%M%S).tar.gz -C $MYSQL_DATA_DIR .fi# 清理数据目录rm -rf $MYSQL_DATA_DIR/*chown -R mysql:mysql $MYSQL_DATA_DIR# 初始化MySQL(MySQL 8.0和5.7方式不同)if [ "$MYSQL_VERSION" = "8.0" ]; thenmysqld --initialize-insecure --user=mysql --datadir=$MYSQL_DATA_DIRelsemysql_install_db --user=mysql --datadir=$MYSQL_DATA_DIRfi# 启动MySQL服务systemctl start $MYSQL_SERVICE# 等待MySQL启动local max_attempts=30local attempt=1while [ $attempt -le $max_attempts ]; doif systemctl is-active --quiet $MYSQL_SERVICE; thenlog_info "MySQL服务已启动"breakfilog_info "等待MySQL启动... ($attempt/$max_attempts)"sleep 2((attempt++))doneif [ $attempt -gt $max_attempts ]; thenlog_error "MySQL启动超时"journalctl -u $MYSQL_SERVICE -n 50 --no-pagerexit 1fi# 设置root密码和基本配置mysql -u root --skip-password << EOF
-- 设置root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
​
-- 删除匿名用户
DELETE FROM mysql.user WHERE User='';
​
-- 删除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
​
-- 创建管理用户
CREATE USER 'admin'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
​
-- 允许远程连接(生产环境应限制IP)
CREATE USER 'remote'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' WITH GRANT OPTION;
​
-- 刷新权限
FLUSH PRIVILEGES;
​
-- 创建系统监控数据库
CREATE DATABASE IF NOT EXISTS sysmon;
EOF
}
​
# 配置防火墙
configure_firewall() {log_info "配置防火墙..."if command -v ufw >/dev/null 2>&1; thenufw allow $MYSQL_PORT/tcpufw reloadelif command -v firewall-cmd >/dev/null 2>&1; thenfirewall-cmd --permanent --add-port=$MYSQL_PORT/tcpfirewall-cmd --reloadelselog_warn "未找到防火墙工具,请手动开放 $MYSQL_PORT 端口"fi
}
​
# 创建管理脚本
create_management_scripts() {log_info "创建管理脚本..."# 创建MySQL连接脚本cat > /usr/local/bin/mysql-connect << EOF
#!/bin/bash
mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD
EOF
​# 创建MySQL监控脚本cat > /usr/local/bin/mysql-monitor << 'EOF'
#!/bin/bash
echo "=== MySQL 基本信息 ==="
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT VERSION() AS 'MySQL版本';"
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW VARIABLES LIKE 'max_connections';"
echo
​
echo "=== 连接统计 ==="
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW STATUS LIKE 'Threads_connected';"
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW PROCESSLIST;" | head -10
echo
​
echo "=== 性能指标 ==="
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%';"
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW STATUS LIKE 'Slow_queries';"
echo
​
echo "=== 数据库大小 ==="
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "
SELECT table_schema AS '数据库', 
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)'
FROM information_schema.tables 
GROUP BY table_schema;"
EOF
​# 创建备份脚本cat > /usr/local/bin/mysql-backup << EOF
#!/bin/bash
# MySQL 备份脚本
BACKUP_DIR="/var/backups/mysql"
DATE=\$(date +%Y%m%d_%H%M%S)
​
mkdir -p \$BACKUP_DIR
​
echo "开始备份MySQL数据库..."
mysqldump -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD --all-databases --single-transaction --routines --triggers > \$BACKUP_DIR/full_backup_\$DATE.sql
​
if [ \$? -eq 0 ]; thengzip \$BACKUP_DIR/full_backup_\$DATE.sqlecho "备份完成: \$BACKUP_DIR/full_backup_\$DATE.sql.gz"# 清理7天前的备份find \$BACKUP_DIR -name "full_backup_*.sql.gz" -mtime +7 -delete
elseecho "备份失败!"exit 1
fi
EOF
​# 创建数据库初始化脚本cat > /usr/local/bin/mysql-create-db << 'EOF'
#!/bin/bash
if [ $# -ne 1 ]; thenecho "用法: mysql-create-db <数据库名>"exit 1
fi
​
DB_NAME=$1
mysql -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
echo "数据库 $DB_NAME 创建成功"
EOF
​chmod +x /usr/local/bin/mysql-connect /usr/local/bin/mysql-monitor /usr/local/bin/mysql-backup /usr/local/bin/mysql-create-db
}
​
# 配置主从复制(可选)
configure_replication() {log_info "配置主从复制..."read -p "是否配置主从复制? (y/N): " replication_choiceif [[ ! $replication_choice =~ ^[Yy]$ ]]; thenreturn 0fiecho "请选择角色:"echo "1) 主服务器 (Master)"echo "2) 从服务器 (Slave)"read -p "请输入选择 [1-2]: " role_choicecase $role_choice in1)# 主服务器配置log_info "配置主服务器..."# 创建复制用户mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD << EOF
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
​
-- 查看主服务器状态
SHOW MASTER STATUS\G
EOFlog_info "主服务器配置完成,请记录 File 和 Position 值";;2)# 从服务器配置read -p "请输入主服务器IP地址: " master_ipread -p "请输入主服务器File值: " master_fileread -p "请输入主服务器Position值: " master_posmysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD << EOF
STOP SLAVE;
​
CHANGE MASTER TO
MASTER_HOST='$master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password123',
MASTER_PORT=3306,
MASTER_LOG_FILE='$master_file',
MASTER_LOG_POS=$master_pos,
MASTER_CONNECT_RETRY=10;
​
START SLAVE;
​
-- 检查复制状态
SHOW SLAVE STATUS\G
EOFlog_info "从服务器配置完成";;*)log_info "跳过复制配置";;esac
}
​
# 启动前检测启动问题&修复
fix_mysql_issues() {log_info "启动检测MySQL启动问题&修复..."# 停止MySQL服务log_info "停止MySQL服务..."systemctl stop $MYSQL_SERVICE 2>/dev/null || truepkill -f mysqld || truesleep 3# 检查常见问题# 1. 检查数据目录权限log_info "检查数据目录权限..."if [ -d "$MYSQL_DATA_DIR" ]; thenchown -R mysql:mysql $MYSQL_DATA_DIRchmod 755 $MYSQL_DATA_DIRlog_info "已设置数据目录权限"elselog_warn "数据目录不存在: $MYSQL_DATA_DIR"fi# 2. 检查日志目录log_info "检查日志目录..."mkdir -p $MYSQL_LOG_DIRchown -R mysql:mysql $MYSQL_LOG_DIRchmod 755 $MYSQL_LOG_DIR# 3. 检查SELinux状态log_info "检查SELinux..."if command -v getenforce >/dev/null 2>&1; thenif [ "$(getenforce)" = "Enforcing" ]; thenlog_warn "SELinux处于Enforcing模式,可能阻止MySQL启动"log_info "临时禁用SELinux..."setenforce 0# 永久禁用(可选)sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/configfifi# 4. 检查AppArmor (Ubuntu)if command -v aa-status >/dev/null 2>&1; thenlog_info "检查AppArmor..."aa-status | grep mysql && {log_info "暂时禁用MySQL的AppArmor配置"ln -sf /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ 2>/dev/null || trueapparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld 2>/dev/null || true}fi# 5. 检查配置文件语法log_info "检查配置文件..."if [ -f /etc/my.cnf ]; thenlog_info "发现主配置文件: /etc/my.cnf"fiif [ -f /etc/mysql/my.cnf ]; thenlog_info "发现主配置文件: /etc/mysql/my.cnf"fi# 6. 清理可能的锁文件log_info "清理锁文件和临时文件..."rm -f /var/lock/subsys/mysqlrm -f /var/lock/subsys/mysqldrm -f /var/lib/mysql/mysql.sockrm -f /var/run/mysqld/mysqld.pidrm -f /var/run/mysql/mysql.sockrm -f /tmp/mysql.sock
}
​
# 启动MySQL服务
start_mysql() {log_info "启动MySQL服务..."# 获取实际的服务名MYSQL_SERVICE=$(get_mysql_service_name)log_info "使用服务名: $MYSQL_SERVICE"log_info "设置MySQL开机自启"systemctl enable $MYSQL_SERVICElog_info "启动前检验MySQL启动&修复"fix_mysql_issueslog_info "开始启动MySQL服务..."systemctl start $MYSQL_SERVICE# 等待服务启动local max_attempts=30local attempt=1while [ $attempt -le $max_attempts ]; doif systemctl is-active --quiet $MYSQL_SERVICE; thenlog_info "MySQL 启动成功"breakfilog_info "等待MySQL启动... ($attempt/$max_attempts)"sleep 2((attempt++))doneif [ $attempt -gt $max_attempts ]; thenlog_error "MySQL 启动失败"systemctl status $MYSQL_SERVICEjournalctl -u $MYSQL_SERVICE -n 50 --no-pagerexit 1fi
}
​
# 验证安装
verify_installation() {log_info "验证MySQL安装..."# 获取实际的服务名MYSQL_SERVICE=$(get_mysql_service_name)# 检查进程if pgrep -f mysqld >/dev/null; thenlog_info "MySQL 进程运行正常"elselog_error "未找到MySQL进程"exit 1fi# 检查端口监听if netstat -tulpn | grep -q ":$MYSQL_PORT"; thenlog_info "MySQL 正在监听 $MYSQL_PORT 端口"elselog_error "MySQL 未在 $MYSQL_PORT 端口监听"exit 1fi# 测试连接
#     if mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD -e "SELECT 1;" &>/dev/null; then
#         log_info "MySQL 连接测试成功"
#     else
#         log_error "MySQL 连接测试失败"
#         exit 1
#     fi#     # 测试基本操作
#     mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD << EOF
# CREATE DATABASE IF NOT EXISTS install_test;
# USE install_test;
# CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
# INSERT INTO test_table VALUES (1, '测试数据');
# SELECT * FROM test_table;
# DROP DATABASE install_test;
# EOFif [ $? -eq 0 ]; thenlog_info "MySQL 基本操作测试成功"elselog_error "MySQL 基本操作测试失败"exit 1filog_info "安装完成!"log_info "MySQL 端口: $MYSQL_PORT"log_info "MySQL root 密码: $MYSQL_ROOT_PASSWORD"log_info "数据目录: $MYSQL_DATA_DIR"log_info "日志目录: $MYSQL_LOG_DIR"log_info "配置文件: $MYSQL_CONF_DIR/my.cnf"log_info "服务管理: systemctl {start|stop|restart|status} $MYSQL_SERVICE"log_info "连接命令: mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD"
}
​
# 主函数
main() {log_info "开始安装 MySQL..."# 检查root权限if [ "$EUID" -ne 0 ]; thenlog_error "请使用root权限运行此脚本"exit 1fi# 选择MySQL版本echo "请选择MySQL版本:"echo "1) MySQL 5.7"echo "2) MySQL 8.0 (推荐)"read -p "请输入选择 [1-2]: " version_choicecase $version_choice in1) MYSQL_VERSION="5.7" ;;2) MYSQL_VERSION="8.0" ;;*) log_info "使用默认版本: MySQL 8.0" ;;esac# 选择安装方式echo "请选择安装方式:"echo "1) MySQL官方仓库 (推荐)"echo "2) 发行版仓库"read -p "请输入选择 [1-2]: " install_choicedetect_osinstall_dependenciescase $install_choice in1)add_mysql_repoinstall_mysql_server;;2)install_mysql_distro;;*)add_mysql_repoinstall_mysql_server;;esaclog_info "配置MySQL..."configure_mysqllog_info "启动MySQL服务..."start_mysqllog_info "初始化MySQL数据目录..."initialize_mysqllog_info "配置防火墙..."configure_firewalllog_info "创建管理脚本..."create_management_scripts# 询问是否配置复制log_info "配置主从复制(可选)..."configure_replicationlog_info "验证安装..."verify_installation# 显示重要信息echolog_info "=== 安装摘要 ==="log_info "MySQL 版本: $MYSQL_VERSION"log_info "监听端口: $MYSQL_PORT"log_info "Root 密码: $MYSQL_ROOT_PASSWORD"log_info "数据目录: $MYSQL_DATA_DIR"log_info "连接命令: mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p$MYSQL_ROOT_PASSWORD"
}
​
# 执行主函数
main "$@"

🔍 脚本安装过程


 🔧 脚本root修改密码&远程访问

#!/bin/bash# CentOS 7 + MySQL 8.0 远程访问配置脚本
# 功能:修改root密码、允许远程访问、配置防火墙set -eRED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }# 配置参数
NEW_ROOT_PASSWORD="321321"
MYSQL_SERVICE="mysqld"check_environment() {log_info "检查系统环境..."# 检查操作系统if [ ! -f /etc/redhat-release ]; thenlog_error "此脚本仅适用于CentOS/RHEL系统"exit 1fi# 检查CentOS版本CENTOS_VERSION=$(grep -oP '(?<=release )\d' /etc/redhat-release)if [ "$CENTOS_VERSION" != "7" ]; thenlog_warn "检测到CentOS版本: $CENTOS_VERSION,此脚本针对CentOS 7优化"fi# 检查MySQL是否安装if ! rpm -qa | grep -q mysql; thenlog_error "未检测到MySQL安装,请先安装MySQL 8.0"exit 1fi# 检查MySQL版本MYSQL_VERSION=$(mysql --version 2>/dev/null | grep -oP 'Distrib \K[0-9]+\.[0-9]+' || echo "未知")log_info "检测到MySQL版本: $MYSQL_VERSION"# 检查MySQL服务状态if ! systemctl is-active --quiet $MYSQL_SERVICE; thenlog_warn "MySQL服务未运行,尝试启动..."systemctl start $MYSQL_SERVICEsleep 3fi
}modify_root_password() {log_info "修改MySQL root密码为: $NEW_ROOT_PASSWORD"# 检查当前root访问状态if mysql -u root -e "SELECT 1;" &>/dev/null; thenlog_info "当前root可以无密码访问"NEED_PASSWORD=falseelif mysql -u root -p"$NEW_ROOT_PASSWORD" -e "SELECT 1;" &>/dev/null; thenlog_info "密码已经是目标密码,跳过修改"return 0elselog_warn "无法使用当前密码访问,需要重置密码"reset_root_passwordreturn 0fi# 修改root密码mysql -u root << EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_ROOT_PASSWORD';
FLUSH PRIVILEGES;
EOFif [ $? -eq 0 ]; thenlog_info "✓ root密码修改成功"elselog_error "✗ root密码修改失败"reset_root_passwordfi
}reset_root_password() {log_info "需要重置root密码..."# 停止MySQL服务systemctl stop $MYSQL_SERVICEsleep 3# 跳过权限启动log_info "以跳过权限模式启动MySQL..."#mysqld_safe --skip-grant-tables --skip-networking --datadir=/var/lib/mysql --user=mysql &sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"sudo systemctl start $MYSQL_SERVICElocal safe_pid=$!sleep 10log_info "重置密码..."# 重置密码mysql -u root << EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_ROOT_PASSWORD';
FLUSH PRIVILEGES;
EXIT;
EOFlog_info "停止临时进程..."# 停止临时进程kill $safe_pidsleep 3log_info "正常启动..."# 正常启动systemctl start $MYSQL_SERVICEsleep 5log_info "验证新密码..."# 验证新密码if mysql -u root -p"$NEW_ROOT_PASSWORD" -e "SELECT 1;" &>/dev/null; thenlog_info "✓ root密码重置成功"elselog_error "✗ root密码重置失败"exit 1fi
}configure_remote_access() {log_info "配置root用户远程访问..."# 修改root的host为%; 2>&1 | grep -v "Using a password" 过滤掉警告信息mysql -u root -p"$NEW_ROOT_PASSWORD" 2>&1 | grep -v "Using a password" << EOF
-- 创建root@%用户(如果不存在)
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED  BY '$NEW_ROOT_PASSWORD';-- 或者更新现有root用户的host
-- UPDATE mysql.user SET host='%' WHERE user='root' AND host='localhost';
UPDATE USER SET host='%' WHERE user='root' AND host='localhost';-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;-- 刷新权限
FLUSH PRIVILEGES;-- 显示修改后的用户权限
SELECT user, host, authentication_string FROM USER WHERE user='root';
EOFif [ $? -eq 0 ]; thenlog_info "✓ root远程访问配置成功"elselog_error "✗ root远程访问配置失败"exit 1filog_info "配置root用户远程访问..成功."
}modify_bind_address() {log_info "修改MySQL绑定地址..."# 查找MySQL配置文件local mysql_conf=""for conf in /etc/my.cnf /etc/mysql/my.cnf /etc/my.cnf.d/mysql-server.cnf; doif [ -f "$conf" ]; thenmysql_conf="$conf"breakfidoneif [ -z "$mysql_conf" ]; thenlog_error "未找到MySQL配置文件"return 1filog_info "找到配置文件: $mysql_conf"# 备份原配置cp "$mysql_conf" "${mysql_conf}.backup.$(date +%Y%m%d_%H%M%S)"# 修改或添加bind-addressif grep -q "bind-address" "$mysql_conf"; thensed -i 's/^bind-address.*/bind-address = 0.0.0.0/' "$mysql_conf"else# 在[mysqld]段添加配置if grep -q "\[mysqld\]" "$mysql_conf"; thensed -i '/\[mysqld\]/a bind-address = 0.0.0.0' "$mysql_conf"elseecho -e "\n[mysqld]\nbind-address = 0.0.0.0" >> "$mysql_conf"fifilog_info "修改后的bind-address配置:"grep -i "bind-address" "$mysql_conf"# 重启MySQL使配置生效systemctl restart $MYSQL_SERVICEsleep 5if systemctl is-active --quiet $MYSQL_SERVICE; thenlog_info "✓ MySQL重启成功"elselog_error "✗ MySQL重启失败"exit 1fi
}configure_firewall() {log_info "配置防火墙..."if systemctl is-active --quiet firewalld; thenlog_info "firewalld正在运行,配置3306端口..."firewall-cmd --add-port=3306/tcp --permanentfirewall-cmd --reloadlog_info "✓ 防火墙已配置"elselog_warn "firewalld未运行,跳过防火墙配置"fi
}configure_selinux() {log_info "配置SELinux..."if command -v getenforce >/dev/null 2>&1; thenlocal selinux_status=$(getenforce)if [ "$selinux_status" = "Enforcing" ]; thenlog_info "SELinux处于Enforcing模式,配置MySQL端口..."if command -v semanage >/dev/null 2>&1; thensemanage port -a -t mysqld_port_t -p tcp 3306 2>/dev/null || \semanage port -m -t mysqld_port_t -p tcp 3306 2>/dev/nulllog_info "✓ SELinux已配置"elselog_warn "未安装semanage,无法配置SELinux"log_info "可以临时禁用SELinux: setenforce 0"fielselog_info "SELinux状态: $selinux_status"fifi
}verify_configuration() {log_info "验证配置..."echolog_info "1. 检查MySQL监听地址:"netstat -tulpn | grep 3306echolog_info "2. 检查root用户权限:"mysql -u root -p"$NEW_ROOT_PASSWORD" -e "SELECT user, host FROM mysql.user WHERE user='root';"echolog_info "3. 测试本地连接:"if mysql -u root -p"$NEW_ROOT_PASSWORD" -e "SELECT '本地连接成功' as status, @@version as version;" 2>/dev/null; thenlog_info "✓ 本地连接测试成功"elselog_error "✗ 本地连接测试失败"fiecholog_info "4. 获取服务器IP地址:"SERVER_IP=$(hostname -I | awk '{print $1}')log_info "服务器IP: $SERVER_IP"echolog_info "=== 配置完成 ==="log_info "root密码: $NEW_ROOT_PASSWORD"log_info "服务器IP: $SERVER_IP"log_info "端口: 3306"echolog_info "远程连接命令:"echo "mysql -h $SERVER_IP -u root -p$NEW_ROOT_PASSWORD"echolog_info "安全提示: 在生产环境中建议使用非root用户进行远程连接"
}create_remote_test_script() {log_info "创建远程测试脚本..."cat > /tmp/test_mysql_remote.sh << 'EOF'
#!/bin/bash
# MySQL远程连接测试脚本SERVER_IP=$(hostname -I | awk '{print $1}')
PASSWORD="32131"echo "=== MySQL远程连接测试 ==="
echo "服务器: $SERVER_IP"
echo "用户: root"
echo "密码: $PASSWORD"
echo# 测试端口连通性
echo "1. 测试端口连通性..."
if command -v nc >/dev/null 2>&1; thenif nc -z -w 3 $SERVER_IP 3306; thenecho "✓ 端口连通性正常"elseecho "✗ 端口无法访问"fi
fi# 测试MySQL连接
echo
echo "2. 测试MySQL连接..."
mysql -h $SERVER_IP -u root -p$PASSWORD -e "SELECT '远程连接成功!' as status, @@version as version;" 2>/dev/nullif [ $? -eq 0 ]; thenecho "✓ MySQL远程连接成功!"
elseecho "✗ MySQL远程连接失败!"
fi
EOFchmod +x /tmp/test_mysql_remote.shlog_info "测试脚本已创建: /tmp/test_mysql_remote.sh"
}main() {log_info "开始配置MySQL 8.0远程访问..."log_info "目标: 修改root密码为32131,允许远程访问"# 检查root权限if [ "$EUID" -ne 0 ]; thenlog_error "请使用root权限运行此脚本"exit 1fi# 执行配置步骤check_environmentmodify_root_passwordconfigure_remote_access#modify_bind_addressconfigure_firewallconfigure_selinuxverify_configurationcreate_remote_test_scriptecholog_info "=== 所有配置已完成 ==="log_info "请在其他机器上运行测试脚本验证远程连接:"log_info "/tmp/test_mysql_remote.sh"
}# 执行主函数
main "$@"

🔍 脚本执行过程


🔧 手动root修改密码&远程访问

1. sudo systemctl stop mysqld # 停止服务
2. sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"   # 跳过验证
3. sudo systemctl start mysqld # 启动服务
4. mysql -u root  #无密码登录
5. use mysql 
6. mysql> select user,host from user;  # 查询查询结果mysql> select user,host from user;+------------------+-----------+| user             | host      |+------------------+-----------+| remote           | %         || admin            | localhost || mysql.infoschema | localhost || mysql.session    | localhost || mysql.sys        | localhost || root             | localhost |+------------------+-----------+
7. mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_pwd';  # 修改root密码
8. mysql>UPDATE USER SET host='%' WHERE user='root' AND host='localhost'; #修改localhost为%
8. mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; # 授予所有权限
9. mysql>FLUSH PRIVILEGES; # 刷新权限

🚀 快速安装方式

方法1:一键脚本安装

# 下载脚本
wget -O install-mysql.sh https://raw.githubusercontent.com/example/install-mysql/master/install-mysql.sh
​
# 添加执行权限
chmod +x install-mysql.sh
​
# 运行安装
sudo ./install-mysql.sh

方法2:各系统快速安装

# Ubuntu/Debian
sudo apt update && sudo apt install -y mysql-server mysql-client
sudo systemctl enable mysql && sudo systemctl start mysql
​
# CentOS/RHEL/Amazon Linux
sudo yum install -y mysql-server mysql
sudo systemctl enable mysqld && sudo systemctl start mysqld
​
# 安全初始化
sudo mysql_secure_installation

⚙️ 常用管理命令

# 服务管理
sudo systemctl start mysql       # 启动
sudo systemctl stop mysql        # 停止
sudo systemctl restart mysql     # 重启
sudo systemctl status mysql      # 查看状态
sudo systemctl enable mysql      # 设置开机自启
​
sudo systemctl start mysqld.service # 启动
sudo systemctl stop mysqld.service  # 停止
sudo systemctl restart mysqld.service # 重启
sudo systemctl status mysqld.service # 查看状态
​
​
​
# MySQL连接
mysql -u root -p                 # 连接MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p  # 指定参数连接
​
# 数据库操作
mysql -u root -p -e "SHOW DATABASES;"                    # 查看数据库
mysql -u root -p -e "CREATE DATABASE mydb;"              # 创建数据库
mysql -u root -p -e "DROP DATABASE mydb;"                # 删除数据库
​
# 用户管理
mysql -u root -p -e "CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';"
mysql -u root -p -e "GRANT ALL ON mydb.* TO 'user'@'localhost';"
mysql -u root -p -e "FLUSH PRIVILEGES;"
​
# 备份恢复
mysqldump -u root -p --all-databases > backup.sql        # 全量备份
mysql -u root -p < backup.sql                            # 恢复备份

📁 重要目录和文件

/var/lib/mysql/                  # 数据目录
/var/log/mysql/                  # 日志目录
├── error.log                   # 错误日志
└── slow.log                    # 慢查询日志
/etc/mysql/                      # 配置目录
├── my.cnf                      # 主配置文件
└── conf.d/                     # 额外配置
/var/run/mysqld/                 # 运行时文件

🔧 常用配置修改

修改字符集

sudo vi /etc/mysql/my.cnf
# 添加:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

调整缓冲池大小

# 根据服务器内存调整
innodb_buffer_pool_size = 2G

启用慢查询日志

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

配置连接数

max_connections = 1000
max_connect_errors = 100000

🔍 安装验证和测试

# 检查服务状态
sudo systemctl status mysql
​
# 检查端口监听
netstat -tulpn | grep 3306
ss -tulpn | grep 3306
​
# 测试连接
mysql -u root -p -e "SELECT VERSION();"
​
# 查看运行状态
mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
mysql -u root -p -e "SHOW PROCESSLIST;"
​
# 性能测试
mysql -u root -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool_read%';"
​
# 创建测试数据库和表
mysql -u root -p << EOF
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users (name) VALUES ('测试用户');
SELECT * FROM users;
EOF


🔍 客户端链接测试


这个脚本提供了完整的MySQL安装方案,包括安全配置、性能优化和复制支持,适合生产环境使用!

http://www.dtcms.com/a/492895.html

相关文章:

  • 网站兼容问题百度超级链
  • Media Encoder 2025 Mac Me视频音频编码处理
  • 多通道DCDC降压稳压器技术革新与卫星应用的深度探索
  • 如何制作网站网页网站建设的讲话稿
  • harry louis做受网站cms高端建站
  • 建设局网站wps2016怎么做网站
  • 网站建设在哪里个人网页设计作品纯html
  • 综合练习题
  • 【科研绘图】PGF/TikZ 生成矢量图
  • 招商加盟网站的图应该怎么做WordPress破解分享
  • Linux系统函数stat和lstat详解
  • 中文外贸网站有哪些网站开发类合同
  • 百度SEO网站wordpress的设置网址
  • 安贞网站建设公司建设网站制作哪家好
  • 二次网站开发平台购物网站开发参考文献
  • 做搜狗pc网站优化首网站中下滑菜单怎么做
  • php商城网站开发北大青鸟计算机培训学费
  • 一台会“自进化”的AI原生手机:如何撬动智能经济?
  • 外链网站有哪些华为商城官网
  • 房地产管理网站网站建设实践收获
  • 驻马店网站优化公司网站高端网站建设
  • LeetCode 2598.执行操作后的最大 MEX:哈希表统计
  • 凸函数与二阶导数
  • 企业网站界面风格设计描述网站建设管理需要招聘什么人才
  • 上林住房和城乡建设网站从网页上直接下载视频
  • 网站 上传文件专业网站运营托管
  • 本机做网站如何访问重庆网站建设公司
  • 网站开发开发需求2345浏览器打开网址
  • 网站支付宝支付接口申请账号权重查询入口站长工具
  • CSS3 多媒体查询