linux上从 MySQL 官方二进制包安装 MySQL
准备工作(确认与下载)
-
确认系统架构(示例):
uname -m # 输出 aarch64 或 x86_64
lsb_release -a # 确认发行版/版本(可选)
2. 下载 MySQL 二进制包
访问 MySQL 社区服务器下载页面:
https://dev.mysql.com/downloads/mysql/
选择:
-
Version: 8.0.x(或 5.7.x)
-
Operating System: Linux - Generic
-
OS Version: Linux - Generic (glibc 2.28) (xxx, 64-bit)
下载你想要安装版本的 tar 包:
wget https://dev.mysql.com/get/MySQL-8.0/mysql-8.0.xx-linux-glibc2.28-xxx.tar.xz
安装目录与用户准备
建议把 MySQL 安装到 /usr/local/mysql 或 /opt/mysql。并创建 mysql 用户/组与数据目录。
# 以 root 或 sudo 执行
sudo groupadd mysql || true
sudo useradd -r -g mysql -s /bin/false mysql || true# 创建安装与数据目录
sudo mkdir -p /usr/local/mysql
sudo mkdir -p /var/lib/mysql # 数据目录
sudo mkdir -p /var/run/mysqld # socket / pid 文件目录
sudo chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
注意:如果你使用的是 Debian/Ubuntu 的系统服务(apt 安装版本),这些目录由包自动处理;二进制手动安装需自己管理权限。
解压二进制包并部署
把 tar.xz 解压到目标目录(示例使用 /usr/local):
cd /usr/local
sudo tar -xJf /path/to/mysql-8.0.xx-linux-*.tar.xz
# 解压后目录可能名为 mysql-8.0.xx-... ,可改名为 mysql
sudo mv mysql-8.0.*/ mysql
sudo chown -R mysql:mysql /usr/local/mysql
设置符号链接(可选,方便升级):
sudo ln -sfn /usr/local/mysql /usr/local/mysql-current
将可执行文件加入 PATH(可在 /etc/profile.d/mysql.sh):
sudo tee /etc/profile.d/mysql.sh > /dev/null <<'EOF'
export PATH=/usr/local/mysql/bin:$PATH
EOF
source /etc/profile.d/mysql.sh
配置 my.cnf(最小示例)
在 /etc/my.cnf 或 /etc/mysql/my.cnf 放一份最小配置(示例):
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /var/lib/mysql
port = 3306
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
log-error = /var/log/mysql/error.log
# 根据内存/负载调整:
# innodb_buffer_pool_size = 1G
# max_connections = 200
创建日志文件目录并设置权限:
sudo mkdir -p /var/log/mysql
sudo touch /var/log/mysql/error.log
sudo chown -R mysql:mysql /var/log/mysql
初始化数据目录(两种方式)
1)安全模式初始化(推荐:自动创建随机 root 密码)
cd /usr/local/mysql
sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql
# 输出会包含临时 root 密码,记下来(或查 error.log)
2)不设置密码(测试用,不建议生产)
sudo bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql
# 初始化后 root 密码为空
初始化过程会在 /var/log/mysql/error.log 输出信息,包括初始 root 密码(如果用 --initialize)。
确保数据目录属主:
sudo chown -R mysql:mysql /var/lib/mysql
systemd 服务单元(创建 / 管理)
创建 systemd unit 文件 /etc/systemd/system/mysql.service(示例):
[Unit]
Description=MySQL Server
After=network.target[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql
ExecStop=/usr/local/mysql/bin/mysqladmin --defaults-file=/etc/my.cnf shutdown
PIDFile=/var/run/mysqld/mysqld.pid
Restart=on-failure
LimitNOFILE=5000[Install]
WantedBy=multi-user.target
然后 reload systemd 并启用:
sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql
sudo systemctl status mysql
如果你偏好直接使用
mysqld而非mysqld_safe,可以把 ExecStart 改为/usr/local/mysql/bin/mysqld --daemonize --defaults-file=/etc/my.cnf并确保 PIDFile 路径一致。
首次登录与安全配置
若使用 --initialize,error.log 会记录临时 root 密码。登录并运行 mysql_secure_installation(或手动设置):
# 登录(替换临时密码)
/usr/local/mysql/bin/mysql -u root -p# 或使用环境 PATH
mysql -u root -p
运行 mysql_secure_installation(交互式):
sudo /usr/local/mysql/bin/mysql_secure_installation
它会引导你设置 root 密码、移除匿名用户、禁止远程 root 登录、删除测试数据库、重新加载权限等。
如果想手动设置 root 密码(示例):
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码';
FLUSH PRIVILEGES;
常见额外配置与优化
-
将 basedir、datadir、socket、pid-file 在 my.cnf 中明确指定,避免多个安装混淆。
-
若系统启用 AppArmor(Ubuntu),需为自建 MySQL 调整 AppArmor 配置或禁用相关 profile。路径
/etc/apparmor.d/。 -
防火墙(ufw/iptables):如果需要远程访问,允许 3306 端口(注意安全)。
-
SELinux(RHEL/CentOS)上要设定正确的上下文。
验证安装是否成功
# 查看进程
ps aux | grep mysqld# 登录
mysql -u root -p# 查看版本
mysqladmin version
日常运维命令(快速清单)
sudo systemctl start|stop|restart mysql
sudo tail -f /var/log/mysql/error.log
mysqld --verbose --help | head -n 50 # 查看默认变量位置
mysql -e "SHOW VARIABLES LIKE 'datadir';"
卸载(手动安装)与清理
-
停止服务并移除 unit:
sudo systemctl stop mysql
sudo systemctl disable mysql
sudo rm /etc/systemd/system/mysql.service
sudo systemctl daemon-reload
-
删除安装目录、数据、配置(注意:会丢数据):
sudo rm -rf /usr/local/mysql /usr/local/mysql-current /var/lib/mysql /etc/my.cnf /var/log/mysql
常见故障排查(简要)
-
启动失败查看
/var/log/mysql/error.log(最重要)。 -
socket文件未找到:确认 my.cnf 中 socket 路径一致,且/var/run/mysqld存在且属主为 mysql。若重启后丢失,参考上文 tmpfiles/systemd RuntimeDirectory。 -
权限问题:确认数据目录属主
mysql:mysql并且有读写。 -
端口被占用:
ss -ltnp | grep 3306。 -
AppArmor/SELinux 拒绝访问:检查系统日志(
journalctl -xe)与对应安全模块配置。
一键安装脚本:
#!/bin/bash
#
# 自动安装 MySQL 8.0.42 (aarch64, glibc2.28)
# 适用于 Debian 11 ARM64 系统
# 作者: ChatGPT GPT-5
# -------------------------------------------MYSQL_VER="8.0.42"
MYSQL_TAR="mysql-${MYSQL_VER}-linux-glibc2.28-aarch64.tar.xz"
MYSQL_URL="https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_TAR}"INSTALL_DIR="/usr/local/mysql"
DATA_DIR="/var/lib/mysql"
LOG_DIR="/var/log/mysql"
RUN_DIR="/var/run/mysqld"
MY_CNF="/etc/my.cnf"
SERVICE_FILE="/etc/systemd/system/mysql.service"
TMPFILES_CONF="/etc/tmpfiles.d/mysqld.conf"ROOT_PASSWORD="19940416"
DB_NAME="oilgas_triple"
INIT_SQL="/root/oilgas_triple.sql" # 如果存在该文件则自动导入#--------------------------
echo "===> 检查系统架构与依赖..."
ARCH=$(uname -m)
if [ "$ARCH" != "aarch64" ]; thenecho "❌ 当前架构不是 aarch64,请确认你下载的是正确版本的 MySQL 包。"exit 1
fiapt-get update -y
apt-get install -y libaio1 xz-utils curl lsb-release#--------------------------
echo "===> 创建 mysql 用户与目录..."
groupadd -r mysql 2>/dev/null || true
useradd -r -g mysql -s /bin/false mysql 2>/dev/null || truemkdir -p $INSTALL_DIR $DATA_DIR $LOG_DIR $RUN_DIR
chown -R mysql:mysql $DATA_DIR $LOG_DIR $RUN_DIR#--------------------------
echo "===> 下载并解压 MySQL 二进制包..."
cd /usr/local
if [ ! -f "/tmp/${MYSQL_TAR}" ]; thenecho "下载 ${MYSQL_TAR} ..."curl -L -o "/tmp/${MYSQL_TAR}" "$MYSQL_URL"
fitar -xJf "/tmp/${MYSQL_TAR}" -C /usr/local
mv /usr/local/mysql-${MYSQL_VER}-linux-glibc2.28-aarch64 /usr/local/mysql
chown -R mysql:mysql $INSTALL_DIR#--------------------------
echo "===> 配置环境变量..."
cat >/etc/profile.d/mysql.sh <<'EOF'
export PATH=/usr/local/mysql/bin:$PATH
EOF
source /etc/profile.d/mysql.sh#--------------------------
echo "===> 生成 my.cnf 配置文件..."
cat >$MY_CNF <<EOF
[client]
port = 3306
socket = ${RUN_DIR}/mysqld.sock[mysqld]
user = mysql
basedir = ${INSTALL_DIR}
datadir = ${DATA_DIR}
socket = ${RUN_DIR}/mysqld.sock
pid-file = ${RUN_DIR}/mysqld.pid
log-error = ${LOG_DIR}/error.log
port = 3306
symbolic-links = 0
EOF#--------------------------
echo "===> 初始化数据库目录..."
$INSTALL_DIR/bin/mysqld --initialize-insecure --user=mysql --basedir=$INSTALL_DIR --datadir=$DATA_DIR
chown -R mysql:mysql $DATA_DIR#--------------------------
echo "===> 创建 systemd 服务文件..."
cat >$SERVICE_FILE <<EOF
[Unit]
Description=MySQL Server
After=network.target[Service]
Type=forking
User=mysql
Group=mysql
RuntimeDirectory=mysqld
RuntimeDirectoryMode=0755
ExecStart=${INSTALL_DIR}/bin/mysqld_safe --defaults-file=${MY_CNF} --datadir=${DATA_DIR}
ExecStop=${INSTALL_DIR}/bin/mysqladmin --defaults-file=${MY_CNF} shutdown
PIDFile=${RUN_DIR}/mysqld.pid
Restart=on-failure
LimitNOFILE=5000[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload#--------------------------
echo "===> 创建 tmpfiles 配置(确保重启后 /var/run/mysqld 存在)..."
cat >$TMPFILES_CONF <<EOF
d ${RUN_DIR} 0755 mysql mysql -
EOF
systemd-tmpfiles --create $TMPFILES_CONF#--------------------------
echo "===> 启动 MySQL 服务..."
systemctl enable mysql
systemctl start mysql
sleep 5if ! systemctl is-active --quiet mysql; thenecho "❌ MySQL 启动失败,请检查日志:$LOG_DIR/error.log"exit 1
fi#--------------------------
echo "===> 设置 root 密码并初始化数据库..."
mysql -u root --socket=${RUN_DIR}/mysqld.sock <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '${ROOT_PASSWORD}';
FLUSH PRIVILEGES;
CREATE DATABASE IF NOT EXISTS ${DB_NAME};
EOF# 导入初始化 SQL(如果存在)
if [ -f "$INIT_SQL" ]; thenecho "===> 导入初始化 SQL 文件: $INIT_SQL"mysql -u root -p${ROOT_PASSWORD} ${DB_NAME} < "$INIT_SQL"
fi#--------------------------
echo "✅ MySQL ${MYSQL_VER} 安装完成!"
echo "-------------------------------------------"
echo "服务控制: systemctl start|stop|restart mysql"
echo "配置文件: $MY_CNF"
echo "数据目录: $DATA_DIR"
echo "日志目录: $LOG_DIR"
echo "root 密码: ${ROOT_PASSWORD}"
echo "数据库名: ${DB_NAME}"
echo "socket: ${RUN_DIR}/mysqld.sock"
echo "-------------------------------------------"
