mysql8 tar包部署脚本

#!/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.socklogerror=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/mysqlddefaultsfile=/etc/my.cnf initialize user=MYSQL_USER
–lower_case_table_names=1

获取临时密码 - 查找最新的错误日志

ERROR_LOG=(ls−t"(ls -t "(lst"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' "(grepAtemporarypassword"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/mysqladminuser=rootpassword="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权限CREATEUSERIFNOTEXISTSroot@{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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值