#!/bin/bash
MySQL 安装配置脚本 (修正版)
#以下操作系统测试通过
#centos 7.9,龙蜥8,麒麟V10
检查是否以root用户运行
if [ “$(id -u)” -ne 0 ]; then
echo “请使用root用户运行此脚本!”
exit 1
fi
配置参数 (两个版本都支持按需用一个)
#MYSQL_PACKAGE=“mysql-8.0.35-linux-glibc2.17-x86_64.tar.xz”
MYSQL_PACKAGE=“mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz”
MYSQL_BASE_DIR=“/data/mysql”
MYSQL_DATA_DIR=“/data/mysql/mydata”
MYSQL_USER=“mysql”
MYSQL_GROUP=“mysql”
MYSQL_SERVICE_NAME=“mysqld”
MYSQL_ROOT_PASSWORD=“” # 设置你想要的root密码,不能有!号
检查安装包是否存在
if [ ! -f “$MYSQL_PACKAGE” ]; then
echo “错误: MySQL安装包 $MYSQL_PACKAGE 不存在!”
exit 1
fi
创建MySQL用户和组
if ! id -u $MYSQL_USER >/dev/null 2>&1; then
groupadd $MYSQL_GROUP
useradd -r -g $MYSQL_GROUP -s /bin/false $MYSQL_USER
echo “已创建MySQL用户和组”
fi
安装依赖
#echo “安装必要依赖…”
#if command -v yum >/dev/null 2>&1; then
yum install -y libaio numactl-libs ncurses-compat-libs
#elif command -v apt-get >/dev/null 2>&1; then
apt-get update
apt-get install -y libaio1 libnuma1 libncurses5
##else
echo “警告: 无法确定包管理器,请手动安装依赖: libaio, libnuma, libncurses”
#fi
解压安装MySQL
echo “解压安装MySQL…”
mkdir -p $MYSQL_BASE_DIR
tar -xvf $MYSQL_PACKAGE -C $MYSQL_BASE_DIR --strip-components=1
创建数据目录
mkdir -p $MYSQL_DATA_DIR
chown -R MYSQLUSER:MYSQL_USER:MYSQLUSER:MYSQL_GROUP $MYSQL_DATA_DIR
chmod 750 $MYSQL_DATA_DIR
配置环境变量
echo “配置环境变量…”
echo “export PATH=$MYSQL_BASE_DIR/bin:$PATH” > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
创建my.cnf配置文件
echo “创建MySQL配置文件…”
cat > /etc/my.cnf <<EOF
[mysqld]
user=MYSQLUSERbasedir=MYSQL_USER
basedir=MYSQLUSERbasedir=MYSQL_BASE_DIR
datadir=MYSQLDATADIRsocket=/tmp/mysql.socklog−error=MYSQL_DATA_DIR
socket=/tmp/mysql.sock
log-error=MYSQLDATADIRsocket=/tmp/mysql.socklog−error=MYSQL_DATA_DIR/mysql-error.log
port=3306
innodb_default_row_format=DYNAMIC
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
#server-id mysql主备部署用到
#server-id=12
log_bin=mysql-bin
log_bin_index=mysql-bin.index
binlog_format = ROW
#从库配置
#中继日志
#relay_log = mysql-relay-bin
从库设为只读(超级用户除外)
#read_only = 1
从库设为只读(root用户也只能读)
#super_read_only = 1
log_slave_updates=1
expire_logs_days = 10
auto_increment_increment=2
auto_increment_offset=2
innodb_buffer_pool_size = 256M
innodb_log_file_size = 2147483648
innodb_log_files_in_group = 2
innodb_log_buffer_size = 16777216
innodb_lock_wait_timeout=1800
interactive_timeout = 1800
wait_timeout = 1800
lock_wait_timeout = 1800
skip_name_resolve = 1
max_connections = 3000
max_connect_errors = 1000000
read_buffer_size = 16M
read_rnd_buffer_size = 32M
sort_buffer_size = 8M
tmp_table_size = 200M
join_buffer_size = 128M
thread_cache_size = 64
max_allowed_packet = 67108864
performance_schema = off
log_bin_trust_function_creators=1
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[client]
socket=/tmp/mysql.sock
default-character-set=utf8
EOF
初始化MySQL (生成随机临时密码)
echo “初始化MySQL…”
MYSQLBASEDIR/bin/mysqld−−defaults−file=/etc/my.cnf −−initialize −−user=MYSQL_BASE_DIR/bin/mysqld --defaults-file=/etc/my.cnf \
--initialize \
--user=MYSQLBASEDIR/bin/mysqld−−defaults−file=/etc/my.cnf −−initialize −−user=MYSQL_USER
–lower_case_table_names=1
获取临时密码 - 查找最新的错误日志
ERROR_LOG=(ls−t"(ls -t "(ls−t"MYSQL_DATA_DIR/"*.err.log 2>/dev/null | head -1)
if [ -z “ERRORLOG"];thenERRORLOG="ERROR_LOG" ]; then
ERROR_LOG="ERRORLOG"];thenERRORLOG="MYSQL_DATA_DIR/mysql-error.log”
fi
TEMP_PWD=(grep′Atemporarypassword′"(grep 'A temporary password' "(grep′Atemporarypassword′"ERROR_LOG" | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 3: NF}̲')
if [ -z "TEMP_PWD" ]; then
echo “错误: 无法获取MySQL临时密码!”
echo “请检查错误日志文件: $ERROR_LOG”
exit 1
fi
创建systemd服务单元
echo “创建systemd服务单元…”
cat > /etc/systemd/system/$MYSQL_SERVICE_NAME.service <<EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=MYSQLUSERGroup=MYSQL_USER
Group=MYSQLUSERGroup=MYSQL_GROUP
Type=simple
ExecStart=$MYSQL_BASE_DIR/bin/mysqld --defaults-file=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
启动MySQL服务
echo “启动MySQL服务…”
systemctl daemon-reload
systemctl enable $MYSQL_SERVICE_NAME
systemctl start $MYSQL_SERVICE_NAME
等待MySQL启动
for i in {1…10}; do
if $MYSQL_BASE_DIR/bin/mysqladmin ping --silent --socket=/tmp/mysql.sock; then
break
fi
sleep 2
done
#关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
更改root密码
echo “设置root密码…”
MYSQLBASEDIR/bin/mysqladmin−−user=root−−password="MYSQL_BASE_DIR/bin/mysqladmin --user=root --password="MYSQLBASEDIR/bin/mysqladmin−−user=root−−password="TEMP_PWD" password “$MYSQL_ROOT_PASSWORD” --socket=/tmp/mysql.sock
if [ $? -eq 0 ]; then
echo -e “\nMySQL安装完成并成功启动!”
echo -e “MySQL根目录: $MYSQL_BASE_DIR”
echo -e “数据目录: $MYSQL_DATA_DIR”
echo -e “错误日志: $ERROR_LOG”
echo -e “MySQL root密码已设置为: $MYSQL_ROOT_PASSWORD”
echo -e “使用以下命令管理服务: systemctl [start|stop|restart|status] $MYSQL_SERVICE_NAME”
else
echo -e “\n错误: 设置root密码失败!”
echo -e “临时密码为: KaTeX parse error: Expected group as argument to '\"' at end of input: …t --password=\"TEMP_PWD” password “$MYSQL_ROOT_PASSWORD” --socket=/tmp/mysql.sock"
exit 1
fi
echo “设置root用户远程登录权限(安全版本)”
mysql -u root -p"MYSQLROOTPASSWORD"<<EOF−−先创建或更新root用户的host权限CREATEUSERIFNOTEXISTS′root′@′MYSQL_ROOT_PASSWORD" <<EOF
-- 先创建或更新root用户的host权限
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MYSQLROOTPASSWORD"<<EOF−−先创建或更新root用户的host权限CREATEUSERIFNOTEXISTS′root′@′{MYSQL_ROOT_PASSWORD}‘;
– 如果用户已存在则更新密码和插件
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘${MYSQL_ROOT_PASSWORD}’;
– 授予所有权限
GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’ WITH GRANT OPTION;
– 刷新权限
FLUSH PRIVILEGES;
EOF
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e “select version()”
systemctl status $MYSQL_SERVICE_NAME