正文开始
推荐MySQL 万能安装脚本的几个有力理由:
对于个人开发者
1. 节省时间精力:个人开发者在搭建开发环境时,手动安装 MySQL 涉及下载、配置、初始化等多个步骤,容易出错且耗时。万能安装脚本可一键完成所有安装配置工作,大大节省开发者的时间和精力,让开发者能将更多时间投入到项目开发中。 2. 提高安装准确性:手动安装过程中,由于配置参数众多,容易因人为疏忽导致安装失败或配置错误。万能脚本经过多次测试和优化,能确保每一步安装配置都准确无误,提高安装的成功率和稳定性。 3. 方便版本管理:脚本可以根据不同需求选择合适的 MySQL 版本进行安装,方便开发者在不同项目中使用不同版本的 MySQL,更好地进行版本管理和兼容性测试。
对于运维人员
1. 提升工作效率:在企业环境中,运维人员需要在多台服务器上安装和配置 MySQL。使用万能安装脚本可以批量自动化安装,显著提升工作效率,减少重复性劳动。 2. 保证环境一致性:通过脚本安装,可以确保所有服务器上的 MySQL 安装和配置一致,避免因环境差异导致的问题,方便后续的维护和管理。 3. 快速响应需求:当业务需要快速部署新的 MySQL 实例时,使用脚本可以在短时间内完成安装和配置,满足业务的紧急需求。
对于技术爱好者和开源社区
1. 知识共享与交流:分享脚本是一种知识共享的行为,能够促进技术爱好者之间的交流和学习。其他人可以通过学习脚本的实现原理和代码逻辑,提升自己的技术水平。 2. 推动开源发展:开源社区的发展离不开大家的贡献。分享万能安装脚本可以为开源项目提供支持,帮助更多人使用和推广 MySQL,同时也可能吸引更多人参与到开源项目的开发和维护中。 3. 解决常见问题:脚本可以集成一些常见问题的解决方案,如依赖安装、权限设置等。分享脚本可以帮助更多人解决在安装过程中遇到的问题,减少不必要的困扰。
对于企业和团队
1. 降低技术门槛:对于非专业技术人员或新入职员工来说,手动安装 MySQL 可能具有一定的难度。万能安装脚本降低了技术门槛,使他们能够轻松完成 MySQL 的安装和配置,提高团队的整体工作效率。 2. 增强团队协作:团队成员使用统一的安装脚本,可以确保大家使用的 MySQL 环境一致,减少因环境差异导致的协作问题,提高团队协作的效率和质量。 3. 节约成本:通过自动化安装和配置,减少了人工操作和错误处理的成本,同时提高了系统的稳定性和可靠性,降低了企业的运维成本。
脚本内容:
#!/bin/bash
set -euo pipefail
exec > >(tee -i mysql_install.log)
exec 2>&1
echo"-----------------------------开始MYSQL安装--------------------------------------"
start_time=$(date +%s)
# 检测root权限
[[ $EUID -ne 0 ]] && { echo -e "\e[31m错误:必须使用root用户执行此脚本\e[0m"; exit 1; }
# 默认配置
DEFAULT_VERSION="8.0.37"
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-$(openssl rand -base64 12)}
DATA_DIR="/data/mysql"
BASE_DIR="/usr/local/mysql"
# 获取系统glibc版本,此处保留获取操作但不做严格版本检查
GLIBC_VERSION=$(ldd --version | awk '/ldd/{print $NF}')
echo"检测到系统glibc版本: ${GLIBC_VERSION}"
# 固定安装包后缀为linux-glibc2.12-x86_64
PKG_SUFFIX="linux-glibc2.12-x86_64"
# 用户输入版本
read -p "请输入MySQL版本(默认:${DEFAULT_VERSION}): " version
version=${version:-${DEFAULT_VERSION}}
# 安装包名称
INSTALL_PKG="mysql-${version}-${PKG_SUFFIX}.tar.xz"
echo"正在检查安装包: ${INSTALL_PKG}"
# 检查安装包是否存在
if [[ ! -f "${INSTALL_PKG}" ]]; then
echo -e "\e[31m错误:安装包 ${INSTALL_PKG} 不存在\e[0m"
echo"请从以下地址下载后放到当前目录:"
echo"https://downloads.mysql.com/archives/community/" #需联网,建议离线下载上传。
exit 1
fi
# 检查现有进程
if pgrep mysqld &>/dev/null; then
echo -e "\e[31m检测到正在运行的MySQL进程,正在停止...\e[0m"
systemctl stop mysqld || pkill -9 mysqld
fi
# 清理旧数据
cleanup_dirs=("${BASE_DIR}""/etc/my.cnf""/etc/my.cnf.d""${DATA_DIR}""/tmp/mysql.sock")
fordirin"${cleanup_dirs[@]}"; do
[[ -e "${dir}" ]] && rm -rf "${dir}" && echo"已清理 ${dir}"
done
# 安装依赖
echo"正在安装系统依赖..."
yum install -y libaio numactl ncurses-compat-libs > /dev/null || {
echo -e "\e[31m依赖安装失败,请检查网络配置\e[0m"
exit 1
}
# 创建用户和目录
echo"创建系统用户和目录..."
groupadd mysql > /dev/null 2>&1 || true
useradd -r -g mysql -s /bin/false mysql > /dev/null 2>&1 || true
mkdir -p "${BASE_DIR}""${DATA_DIR}"
chown -R mysql:mysql "${DATA_DIR}"
# 解压安装包
echo"正在解压安装包..."
tar -xJf "${INSTALL_PKG}" -C "${BASE_DIR}" --strip-components=1
# 配置文件
echo"生成配置文件..."
cat > /etc/my.cnf << EOF
[mysqld]
user=mysql
port=3306
basedir=${BASE_DIR}
datadir=${DATA_DIR}
socket=/tmp/mysql.sock
log-error=${DATA_DIR}/mysql.err
pid-file=${DATA_DIR}/mysql.pid
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
explicit_defaults_for_timestamp=1
log_bin=mysql-bin
server_id=1
innodb_file_per_table=1
max_connections=1000
[client]
socket=/tmp/mysql.sock
EOF
# 初始化数据库,去掉 --initialize-insecure 参数
echo"正在初始化数据库..."
"${BASE_DIR}/bin/mysqld" --initialize \
--user=mysql \
--basedir="${BASE_DIR}" \
--datadir="${DATA_DIR}"
# 获取临时密码
TEMP_PASSWORD=$(grep 'A temporary password is generated for root@localhost'"${DATA_DIR}/mysql.err" | awk '{print $NF}')
# 创建systemd服务
echo"配置系统服务..."
cat > /etc/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=${BASE_DIR}/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=10000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# 环境变量配置
echo"export PATH=${BASE_DIR}/bin:\$PATH" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
# 启动服务
systemctl daemon-reload
systemctl enable --now mysqld > /dev/null
# 等待 MySQL 服务器启动
echo"等待 MySQL 服务器启动..."
sleep 10
# 检查套接字文件是否存在
if [[ ! -S /tmp/mysql.sock ]]; then
echo -e "\e[31m错误:套接字文件 /tmp/mysql.sock 未创建,请检查日志文件 ${DATA_DIR}/mysql.err\e[0m"
exit 1
fi
# 设置root密码
echo"正在配置安全设置..."
"${BASE_DIR}/bin/mysql" -uroot -p"${TEMP_PASSWORD}" --connect-expired-password -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"
# 安装完成提示
end_time=$(date +%s)
execution_time=$((end_time - start_time))
echo -e "\n\e[32mMySQL安装完成!\e[0m"
echo -e "根密码: \e[31m${MYSQL_ROOT_PASSWORD}\e[0m"
echo -e "数据目录: \e[34m${DATA_DIR}\e[0m"
echo -e "安装路径: \e[34m${BASE_DIR}\e[0m"
echo -e "配置文件: \e[34m/etc/my.cnf\e[0m"
echo"脚本执行时间:${execution_time} 秒"
# 清理安装包(可选)
# rm -f "${INSTALL_PKG}"
使用方法:
1. 从官网下载对应版本的MySQL二进制包(如mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz) 2. 将安装脚本和安装包放在同一目录 3. 执行脚本: chmod +x install_mysql.sh && ./install_mysql.sh
安装演示:
[root@myoracle ~]# chmod +x install_mysql.sh && ./install_mysql.sh

文中的概念来源于互联网,如有侵权,请联系我删除。
欢迎关注公众号:智能运维护航舰,致力于数字政府、智慧城市领域的运维知识和经验分享,专注于自动化、智能化、数字化的运维能力发展,提供各类技术支持服务。
文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




