Bundle安装
下载压缩包一键安装MySQL8.4脚本
set -eo pipefail
NEW_PASSWORD="Admin@123"
# 1. 解析命令行参数 (-p / --password)
while [[ $# -gt 0 ]]; do
case "$1" in
-p|--password)
NEW_PASSWORD="$2"
shift 2
;;
*)
echo "未知参数: $1"
echo "用法: $0 [-p '新密码']"
exit 1
;;
esac
done
# 如果没有通过参数传入密码,则提示交互式输入
if [ -z "$NEW_PASSWORD" ]; then
read -rsp "请输入要设置的 MySQL root 密码: " NEW_PASSWORD
echo ""
if [ -z "$NEW_PASSWORD" ]; then
echo "错误: 密码不能为空!"
exit 1
fi
fi
TAR_PACKAGE="mysql-8.4.10-1.el7.x86_64.rpm-bundle.tar"
EXTRACT_DIR="./mysql-8.4-rpms"
echo "=========================================="
echo "=== [1/6] 检查并补齐系统基础依赖 ==="
echo "=========================================="
systemctl stop mysqld
# 清理 mariadb
if rpm -qa | grep -qi mariadb-libs; then
echo "检测到 mariadb-libs,正在清理..."
rpm -e --nodeps $(rpm -qa | grep -i mariadb-libs) || true
fi
# 彻底清理可能残留的 5.7 旧组件
if rpm -qa | grep -qi mysql; then
echo "检测到残留旧版本 MySQL 组件,正在清理旧版本 RPM..."
rpm -qa | grep -i mysql | xargs rpm -e --nodeps || true
fi
# 自动安装当前目录下存在的依赖包 (numactl, net-tools 等)
if ls numactl-*.rpm net-tools-*.rpm 1>/dev/null 2>&1; then
echo "检测到本地依赖包,正在自动安装..."
rpm -Uvh --replacepkgs --replacefiles numactl-*.rpm net-tools-*.rpm || true
fi
# 核心依赖检查
for pkg in numactl net-tools libaio; do
if ! rpm -q "$pkg" >/dev/null 2>&1; then
echo "错误: 系统缺少必需依赖 $pkg,请将对应 RPM 包放入当前目录或提前安装!"
exit 1
fi
done
echo "系统依赖检查通过。"
echo "=========================================="
echo "=== [2/6] 解压 RPM Bundle ==="
echo "=========================================="
if [ ! -f "$TAR_PACKAGE" ]; then
echo "错误: 未找到安装包 $TAR_PACKAGE"
exit 1
fi
rm -rf "$EXTRACT_DIR" && mkdir -p "$EXTRACT_DIR"
tar -xf "$TAR_PACKAGE" -C "$EXTRACT_DIR"
echo "解压完成。"
echo "=========================================="
echo "=== [3/6] 清理 CentOS 7 旧冲突库 ==="
echo "=========================================="
if rpm -qa | grep -qi mariadb-libs; then
echo "检测到 mariadb-libs,正在清理..."
rpm -e --nodeps $(rpm -qa | grep -i mariadb-libs) || true
fi
echo "=========================================="
echo "=== [4/6] 顺序安装 MySQL 8.4 RPM 包 ==="
echo "=========================================="
cd "$EXTRACT_DIR"
install_rpm() {
local pattern="$1"
local rpm_file
rpm_file=$(ls $pattern 2>/dev/null | head -n 1)
if [ -n "$rpm_file" ]; then
echo "--> 正在安装: $rpm_file"
rpm -Uvh --replacepkgs --replacefiles "$rpm_file"
fi
}
install_rpm "mysql-community-common-8.4*.rpm"
install_rpm "mysql-community-client-plugins-8.4*.rpm"
install_rpm "mysql-community-libs-8.4*.rpm"
install_rpm "mysql-community-libs-compat-8.4*.rpm"
install_rpm "mysql-community-client-8.4*.rpm"
install_rpm "mysql-community-icu-data-files-8.4*.rpm"
install_rpm "mysql-community-server-8.4*.rpm"
cd ..
echo "=========================================="
echo "=== [5/6] 调整 /etc/my.cnf 兼容性 ==="
echo "=========================================="
if [ -f /etc/my.cnf ]; then
echo "清理 8.4 不兼容参数..."
sed -i '/query_cache_/d' /etc/my.cnf
sed -i '/innodb_file_format/d' /etc/my.cnf
sed -i '/default_authentication_plugin/d' /etc/my.cnf
# 启用 mysql_native_password 支持旧驱动连接
if ! grep -q "mysql_native_password" /etc/my.cnf; then
sed -i '/\[mysqld\]/a mysql_native_password=ON' /etc/my.cnf
fi
fi
echo "=========================================="
echo "=== [6/6] 启动服务并重置 root 密码 ==="
echo "=========================================="
systemctl daemon-reload
systemctl enable mysqld
systemctl restart mysqld
# 等待 mysqld 生成临时密码日志并完成启动
sleep 3
TEMP_PWD=""
if [ -f /var/log/mysqld.log ]; then
TEMP_PWD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1)
fi
if [ -n "$TEMP_PWD" ]; then
echo "正在重置 root 密码..."
# 使用临时密码修改为指定密码,并同时支持本地与远程登录配置
mysql --connect-expired-password -uroot -p"${TEMP_PWD}" <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${NEW_PASSWORD}';
FLUSH PRIVILEGES;
EOF
echo "=========================================="
echo "部署完成!root 密码已成功修改。"
else
echo "未获取到临时密码(可能使用的是已有数据目录非全新初始化)。"
echo "如需重置密码,可手动登录执行: ALTER USER 'root'@'localhost' IDENTIFIED BY '${NEW_PASSWORD}';"
fi
echo "当前版本信息:"
mysql --version
压缩包安装
下载 https://downloads.mysql.com/archives/community/
安装 https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html
groupadd mysql |
cd /home |
数据目录初始化echo "[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data" > /opt/mysql/mysql/etc/my.cnf
# 使用 --initialize-insecure 来初始化数据目录,则无需密码即可以 root 身份连接到服务器
bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf
--initialize-insecure --user=mysql
初始化后 root 密码分配mysql -u root --skip-password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your-root-password';
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'your-root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'your-root-password';
UPDATE user SET host = '%' WHERE user = 'root';配置my.cnf
mkdir -p /usr/local/mysql/etc/
echo "[mysqld]
user=mysql
server-id=1
port = 3306
character_set_server=utf8mb4
datadir=/mnt/mysql/mysql_data
tmpdir=/mnt/mysql/mysql_tmp
default-storage-engine=INNODB
join_buffer_size = 512M
tmp_table_size = 1G
max_allowed_packet = 64M
interactive_timeout = 1800
# 默认8小时
wait_timeout = 1800
read_buffer_size = 128M
read_rnd_buffer_size = 256M
sort_buffer_size = 256M
key_buffer_size=512M
back_log=500
flush_time=0
open_files_limit=4161
table_definition_cache=1400
binlog_row_event_max_size=16M
# MySQL服务器最大连接数
max_connections=1000
max_connect_errors = 1000
# MySQL服务器线程缓存大小
thread_cache_size=500
# 日志缓冲刷新的频繁程度
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_log_buffer_size=256M
innodb_thread_concurrency=32
innodb_autoextend_increment=64
innodb_buffer_pool_instances=8
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
innodb_lock_wait_timeout = 50
# 瓶颈位,即使在并发量不高的时候也会出现,最好的选择是从一开始就禁用它
query_cache_size = 0
slow-query-log=1
long_query_time=10
lower_case_table_names=1
table_open_cache=4096
autocommit = 1
skip_name_resolve = 1
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0" >> /usr/local/mysql/etc/my.cnf
yum安装
https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html
Docker安装MySQL
https://dev.mysql.com/doc/refman/5.7/en/linux-installation-docker.html
执行命令mysql数据存放位置
mkdir -p /home/docker/mysql/data
可以将用于数据库初始化的sql文件放到这个目录下,mysql安装时会进行执行。
mkdir -p /home/docker/mysql/init将以下内容保存到 /home/docker/mysql/docker-compose.yml
version: "3"
services:
mysql57:
container_name: mysql
image: mysql:5.7
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=admin # 这里填写mysql密码
volumes:
- ./data:/var/lib/mysql
- ./my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- ./init:/docker-entrypoint-initdb.d
- ./healthcheck.sh:/home/healthcheck.sh
healthcheck:
test: ["CMD", "/bin/bash", "/home/healthcheck.sh"]
interval: 1m30s
timeout: 30s
retries: 3将以下内容保存到 /home/docker/mysql/healthcheck.sh
!/bin/bash
result="$(service mysql status | grep 'is running')"
if [ "$result" ]; then
exit 0;
else
exit 1
fi将以下内容保存到 /home/docker/mysql/my.cnf
[mysqld]
user=mysql
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
symbolic-links=0
default-storage-engine=INNODB
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
default-time_zone='+8:00'
lower_case_table_names=1
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
执行命令cd /home/docker/mysql
# 确保docker已经启动,若已经启动则忽略这条命令
systemctl restart docker
docker-compose up -d
docker exec -it mysql bash# 配置mysql外部访问权限
egrep "mysql" /etc/group >& /dev/null
if [ $? -ne 0 ]
then
groupadd mysql
fi
id mysql >& /dev/null
if [ $? -ne 0 ]
then
useradd -g mysql mysql -s /usr/sbin/nologin
fi一键安装
mkdir -p /home/docker/mysql/data
mkdir -p /home/docker/mysql/init
echo "
[mysqld]
user=mysql
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
symbolic-links=0
default-storage-engine=INNODB
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
default-time_zone='+8:00'
lower_case_table_names=1
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4" > /home/docker/mysql/my.cnf
echo "
#!/bin/bash
result=\"$(service mysql status | grep 'is running')\"
if [ \"$result\" ]; then
exit 0;
else
exit 1
fi" > /home/docker/mysql/healthcheck.sh
echo "
version: \"3\"
services:
mysql57:
container_name: mysql
image: mysql:5.7
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=admin # 这里填写mysql密码
volumes:
- ./data:/var/lib/mysql
- ./my.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- ./init:/docker-entrypoint-initdb.d
- ./sql:/opt/sql
- ./healthcheck.sh:/home/healthcheck.sh
healthcheck:
test: [\"CMD\", \"/bin/bash\", \"/home/healthcheck.sh\"]
interval: 1m30s
timeout: 30s
retries: 3
" > /home/docker/mysql/docker-compose.yml
cd /home/docker/mysql
systemctl restart docker
docker-compose up -d
docker exec -it mysql bash
egrep "mysql" /etc/group >& /dev/null
if [ $? -ne 0 ]
then
groupadd mysql
fi
id mysql >& /dev/null
if [ $? -ne 0 ]
then
useradd -g mysql mysql -s /usr/sbin/nologin
fi
exit