Skip to content

使用通用二进制文件在 Unix/Linux 上安装 MySQL

约 1693 字大约 6 分钟

MySQL

2025-06-27

说明

本文基于官方 MySQL 8.0 安全部署指南,记录了使用通用二进制文件在 Unix/Linux 上安装 MySQL 社区版的步骤。

官方的《MySQL 8.0 Secure Deployment Guide》主要面向企业版(重点介绍 MySQL 的安全功能),而本文使用的是 MySQL Community Edition(社区版)Linux 通用二进制包 进行部署。请注意,社区版可能并不包含企业版的某些安全特性

1. 下载 MySQL for Linux 通用二进制包

访问 MySQL 官网下载页面,选择适合的 MySQL 8.0 版本进行下载。

本文使用 mysql-8.0.39-linux-glibc2.28-x86_64 版本。

# Product Version: 8.0.39
# Operating System: Linx - Generic
# OS Version: Linux - Generic (glibc 2.28) (x86, 64-bit)

VERSION_OS="8.0.39-linux-glibc2.28-x86_64"
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-$VERSION_OS.tar.xz

2. 安装 MySQL for Linux 通用二进制包

安装先决条件

MySQL 依赖于 libaio 库。如果本地未安装此库,数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用相应的软件包管理器安装它。

使用 yum 安装
yum search libaio  # search for info
yum install libaio # install library

软件包 /lib64/libtinfo.so.5MySQL 客户端 bin/mysql 所需的。

使用 yum 安装
yum install ncurses-compat-libs

创建 MySQL 用户和组

使用 groupadd 命令添加 mysql

groupadd -r mysql
# groupadd -g 27 -o -r mysql

groupadd -g 27 及其 -o 选项会分配一个非唯一的组 ID (GID)。 -r 选项会将该组设置为系统组。

使用 useradd 命令添加 mysql 用户

DATADIR="/usr/local/mysql/data"
useradd -M -N -g mysql -r -d $DATADIR -s /bin/false -c "MySQL Server" mysql
# useradd -M -N -g mysql -o -r -d $DATADIR -s /bin/false -c "MySQL Server" -u 27 mysql
  • -M 选项可防止创建用户主目录。
  • -N 选项表示将用户添加到该 -g 选项指定的组中。
  • -o 和 选项-u 27分配非唯一的用户 ID (UID)。
  • -r-s /bin/false 选项会创建一个没有服务器主机登录权限的用户。mysql 用户仅用于所有权目的,而非登录目的。
  • -d 选项指定用户登录目录,该目录设置为预期的 MySQL 数据目录路径。
  • -c 选项指定描述帐户的注释。

解压二进制发行版

# VERSION_OS="8.0.39-linux-glibc2.28-x86_64"
tar xvf mysql-$VERSION_OS.tar.xz -C /usr/local/

# 创建指向安装目录的符号链接
ln -s /usr/local/mysql-$VERSION_OS /usr/local/mysql

MySQL Linux 通用二进制分发目录

目录目录内容
binmysqld 服务器;客户端和实用程序
docsInfo 格式的 MySQL 手册
manUnix 手册页
include依赖(头)文件
lib程序库 / 共享函数库
share杂项文件,包括错误消息、示例配置文件、数据库安装的 SQL
support-files与管理多个服务器进程、自动启动配置和日志轮换相关的其他支持文件。

3. 安装 MySQL 后的设置

创建 mysql-files 安全目录

mkdir /usr/local/mysql/mysql-files
chown mysql:mysql /usr/local/mysql/mysql-files
chmod 750 /usr/local/mysql/mysql-files

配置服务器启动选项

touch /etc/my.cnf
chown root:root /etc/my.cnf
chmod 644 /etc/my.cnf

cat <<EOF > /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
log_timestamps=SYSTEM
datadir=$DATADIR
socket=/tmp/mysql.sock
port=3306
log-error=/usr/local/mysql/data/localhost.localdomain.err
user=mysql
secure_file_priv=/usr/local/mysql/mysql-files
local_infile=OFF
EOF

初始化数据目录

创建数据目录

mkdir $DATADIR
chmod 750 $DATADIR
chown mysql:mysql $DATADIR

初始化数据目录

/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
# 使用 --initialize-insecure 选项将不生成 root@localhost 帐户的初始随机密码

初始化输出将打印到错误日志 (/usr/local/mysql/data/localhost.localdomain.err),类似于以下输出。

输出包含 root@localhost 帐户的初始随机密码。稍后重置 root@localhost 密码时需要此密码。

2018-05-02T17:47:49.806563Z 0 [System] [MY-013169] [Server] 
/usr/local/mysql-commercial-8.0.11-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.11-commercial) 
initializing of server in progress as process 16039
2018-05-02T17:47:54.083010Z 5 [Note] [MY-010454] [Server] 
A temporary password is generated for root@localhost: uZmx9ihSd2;.
2018-05-02T17:47:56.225881Z 0 [System] [MY-013170] [Server] 
/usr/local/mysql-commercial-8.0.11-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.11-commercial) 
initializing of server has completed

使用 systemd 启动服务

创建一个 systemd 服务单元配置文件

touch /usr/lib/systemd/system/mysqld.service
chmod 644 /usr/lib/systemd/system/mysqld.service

将配置信息添加到 mysqld.service 文件

cat <<'EOF' > /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql

# Have mysqld write its state to the systemd notify socket
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS 

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false
EOF

启动 MySQL 服务并设置开机自启

systemctl enable mysqld.service
systemctl start mysqld.service

重置 MySQL root 账户密码

初始化数据目录时,会为 MySQL root 帐户生成一个随机初始密码 ( root@localhost),并将其标记为已过期。请执行以下步骤设置新密码:

/usr/local/mysql/bin/mysql -u root -p
Enter password: (enter the random root password here)

连接后,指定一个新 root@localhost 密码。请使用强密码。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

TL;DR