本文介绍基于二进制压缩包手动安装 MySQL 8 的完整步骤,适配 CentOS 系统 ,安装路径为:/home/soft/mysql/mysql8

一、前置准备

1. 检查系统依赖

安装必要依赖包,避免后续编译 / 运行报错:

# libaio 是运行依赖,提供 MySQL 运行必需的动态库,是基础;libaio-devel 是开发依赖,提供安装 / 编译所需的开发文件;
# libaio-devel 依赖 libaio,所以安装 libaio-devel 时 yum会自动安装 libaio
# numactl 是管理服务器 NUMA 架构的工具库,核心是优化程序对 CPU / 内存的使用效率
# 多核服务器上安装 MySQL 时,安装 numactl 库能充分利用硬件资源,避免性能损耗
# gcc/gcc-c++ 是 C/C++ 编译器,核心是 “翻译源码”
# cmake 是配置工具,核心是 “生成编译规则文件(Makefile)”
# make 是执行工具,核心是 “按规则自动化编译”
yum install -y libaio-devel numactl-devel gcc gcc-c++ make cmake

2. 创建运行用户

创建mysql用户hzmysql

  • 安全原则:避免 MySQL 进程以 root 用户运行(root 权限过高,若 MySQL 被攻击会导致整台服务器沦陷);

  • 权限隔离:hzmysql仅拥有 /home/soft/mysql 目录的操作权限,即使进程出问题,也不会影响系统其他目录。

# 创建用户(不登录)
# useradd Linux 系统创建新用户的核心命令
# -s /sbin/nologin -s(shell)指定用户登录时使用的 shell 解释器,/sbin/nologin 是系统内置的 “禁止登录” shell
# -M 全称 --no-create-home,表示不创建该用户的家目录(默认 useradd 会创建 /home/hzmysql)
# hzmysql要创建的用户名
useradd -s /sbin/nologin -M hzmysql
# 如果用户已存在,则修改已有用户的 shell 为禁止登录(若需要)usermod -s /sbin/nologin hzmysql
# 查看用户信息(重点看 shell 和家目录)cat /etc/passwd | grep hzmysql
# 正常输出示例:hzmysql:x:1001:1001::/home/hzmysql:/sbin/nologin

# 创建mysql目录
mkdir -p /home/soft/mysql
# 这条命令的核心是递归修改 /home/soft/mysql 目录及其下所有文件/子目录的所有者和所属组为 hzmysql 用户和 hzmysql 用户组
# 是为了让 MySQL 运行用户(hzmysql)拥有对安装目录的完整操作权限,避免后续启动/初始化 MySQL 时出现权限不足的报错。
chown -R hzmysql:hzmysql /home/soft/mysql
# 启动MySQL时指定了--user=hzmysql,意味着MySQL进程会以hzmysql用户身份运行;
# 若 /home/soft/mysql 目录的所有者是root(默认),hzmysql 用户没有读写权限,会导致:
# 初始化 MySQL 时无法创建数据文件;
# 启动 MySQL 时无法写入日志、创建 socket 文件。

3. 下载 MySQL 二进制包

前往 MySQL 官网下载对应系统的二进制压缩包(推荐 8.0 稳定版):

  • 下载地址:mysql下载地址

  • 选择版本根据自己的需求下载指定的版本:8.0.xRed Hat Enterprise Linux / Oracle LinuxRed Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit)

  • 下载命令(示例,可替换为最新版本):

cd /home/soft/msyql
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.45-1.el7.x86_64.rpm-bundle.tar

二、安装步骤

1. 解压并配置安装目录

# 解压压缩包
cd /home/soft/mysql
tar -zxvf mysql-8.0.30-el7-x86_64.tar.gz
# 重命名为指定路径(与你的启动命令一致)
mv mysql-8.0.30-el7-x86_64 mysql8
# 确认目录结构
ls /home/soft/mysql/mysql8  # 应包含 bin、lib、share 等目录

2. 创建数据目录及相关目录

创建数据命令、日志命令,等会启动命令需要指定 --datadir=/home/soft/mysql/mysql8/data

# 创建数据目录、日志目录
mkdir -p /home/soft/mysql/mysql8/data
mkdir -p /home/soft/mysql/mysql8/log
# 授权给运行用户
chown -R hzmysql:hzmysql /home/soft/mysql/mysql8
chmod 755 /home/soft/mysql/mysql8/data

3. 初始化 MySQL

使用 mysqld 初始化数据目录,生成临时密码(关键步骤):

# 切换到 mysql 二进制目录
cd /home/soft/mysql/mysql8/bin
# 初始化
# ./mysqld 调用当前目录(/home/soft/mysql/mysql8/bin)下的 mysqld 程序
# --initialize MySQL 核心初始化参数
# 1. 创建 data 目录下的系统文件 / 数据库(如 mysql、information_schema);
# 2. 生成 root 用户的临时密码(会输出到终端 / 错误日志);
# 3. 初始化权限表、字符集等基础配置;
# --user=hzmysql 指定以 hzmysql 用户身份执行初始化操作(后续 MySQL 运行也用该用户);
# 确保初始化生成的文件所有者是 hzmysql,避免权限混乱。
# --basedir=/home/soft/mysql/mysql8 指定 MySQL 的安装根目录(基础目录),MySQL 会从该目录读取配置、库文件、插件等。
# --datadir=/home/soft/mysql/mysql8/data 指定 MySQL 数据存储目录(核心!):
# 1. 初始化生成的系统库、后续创建的用户库/表都存在这里;
# 2. 必须与你后续启动 MySQL 时的 --datadir 一致。
# --plugin-dir=/home/soft/mysql/mysql8/lib/plugin 指定 MySQL 插件目录(如认证插件、存储引擎插件等);
# 确保初始化时能加载必要插件(如 caching_sha2_password 认证插件),避免登录报错。
./mysqld --initialize \
--user=hzmysql \
--basedir=/home/soft/mysql/mysql8 \
--datadir=/home/soft/mysql/mysql8/data \
--plugin-dir=/home/soft/mysql/mysql8/lib/plugin
  • 执行后会输出临时密码(格式:A temporary password is generated for root@localhost: xxxxxx),务必记录,后续登录需要。

  • 若报错 “权限不足”,检查目录所有者是否为 hzmysql;若报错 “缺少依赖”,补充安装对应依赖包。

  • 执行结果如下:

  • 失败常见原因

    • Permission denieddata 目录所有者不是 hzmysql,重新执行 chown -R hzmysql:hzmysql /home/soft/mysql/mysql8

    • data directory not empty:清空 data 目录后重新执行;

    • missing libaio:未安装 libaio/libaio-devel,补装后重试。

4. 启动Mysql

4.1命令直接启动(不推荐)可以略过

我们编写好命令可以快速启动mysql,但是命令太复杂,每次执行都要写命令。

# 方式1:直接执行启动命令(前台启动,测试用)
# --user 指定运行 MySQL 进程的系统用户为hzmysql,避免 MySQL 以 root 用户运行(root 权限过高,若 MySQL 被攻击会导致整台服务器沦陷)
/home/soft/mysql/mysql8/bin/mysqld \
--basedir=/home/soft/mysql/mysql8 \
--datadir=/home/soft/mysql/mysql8/data \
--plugin-dir=/home/soft/mysql/mysql8/lib/plugin \
--user=hzmysql \
--log-error=msyql8.err \
--pid-file=/home/soft/mysql/mysql8/data/mysql8.pid \
--socket=/home/soft/mysql/mysql8/data/mysql.sock \
--port=3306

# 方式2:后台启动(推荐)
nohup /home/soft/mysql/mysql8/bin/mysqld \
--basedir=/home/soft/mysql/mysql8 \
--datadir=/home/soft/mysql/mysql8/data \
--plugin-dir=/home/soft/mysql/mysql8/lib/plugin \
--user=hzmysql \
--log-error=mysql8.err \
--pid-file=/home/soft/mysql/mysql8/data/mysql8.pid \
--socket=/home/soft/mysql/mysql8/data/mysql.sock \
--port=3306 > /dev/null 2>&1 &

前台启动:终端关闭则 MySQL 进程终止,适合测试;

后台启动:nohup 保证进程后台运行,日志输出到 mysql8.err

4.2 脚本启动

4.2.1创建配置文件vi /etc/my.cnf
# MySQL 启动时会按以下顺序查找 my.cnf/my.ini,找到第一个就优先使用,后续的会被忽略:
# --defaults-file=/指定路径/my.cnf(启动命令显式指定,优先级最高,一般不用);
# /etc/my.cnf(系统级默认目录,推荐使用这个);
# /etc/mysql/my.cnf(Debian/Ubuntu 系统常用,CentOS 也兼容);
# $MYSQL_HOME/my.cnf(即 /home/soft/mysql/mysql8/my.cnf,自定义安装场景适配);
# ~/.my.cnf(当前用户家目录,仅对该用户生效,不推荐)。

# [client]的作用范围,所有 MySQL 客户端程序(通用段)读取
[client]
port=3306
socket=/home/soft/mysql/mysql8/data/mysql.sock
default-character-set=utf8mb4

# [mysql] 仅 mysql 命令行客户端(专属段)
[mysql]
default-character-set=utf8mb4

# [mysqld]的作用范围,仅mysqld进程(MySQL 服务器核心进程)会读取
[mysqld]
# 基础路径(对应启动命令的 --basedir)
basedir=/home/soft/mysql/mysql8
# 数据目录(对应 --datadir)
datadir=/home/soft/mysql/mysql8/data
# 插件目录(对应 --plugin-dir)
plugin_dir=/home/soft/mysql/mysql8/lib/plugin
# 运行用户(对应 --user)
user=hzmysql
# 端口(对应 --port)
port=3306
# 错误日志(对应 --log-error,建议改个易识别的名称)
log_error=/home/soft/mysql/mysql8/data/mysql8.err
# PID 文件(对应 --pid-file,自定义名称更易维护)
pid_file=/home/soft/mysql/mysql8/data/mysql8.pid
# 套接字文件(对应 --socket)
socket = /home/soft/mysql/mysql8/data/mysql.sock
# 可选:补充基础优化配置(新手可保留)
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
lower_case_table_names=1
max_connections=1000
# 禁用符号链接(默认值,推荐生产环境使用)
symbolic-links=0
# 自增字段步长设为 10
auto_increment_increment=10

# 这行配置的作用是:让 MySQL 读取主配置文件 /etc/my.cnf 时,自动加载 /etc/my.cnf.d 目录下所有以 .cnf 为后缀的配置文件。
# 这是 MySQL 配置的 “模块化管理” 方案,对新手和生产环境都很友好,核心优势:
# 1. 拆分配置,避免主配置文件臃肿
# 2. 适配系统 / 软件的默认配置.很多 Linux 发行版(如 CentOS、RHEL)或 MySQL 官方包,会在 /etc/my.cnf.d 下预置默认配置文件(比如 mysql-server.cnf、client.cnf),通过 !includedir 能自动加载这些配置,无需手动复制到主配置文件。
# 3. 配置优先级规则(关键)
!includedir /etc/my.cnf.d
4.2.2设置配置文件权限(避免权限过高报错)
# 仅 root 可读写,其他用户只读(MySQL 要求配置文件不能全局可写)
chmod 644 /etc/my.cnf
chown root:root /etc/my.cnf
4.2.3启动方式
1. mysql.server start:封装脚本的 “便捷启动”(推荐)

mysql.server 是 MySQL 官方提供的 Shell 封装脚本,核心逻辑是:

mysql.server start → 调用 mysqld_safe → 加载配置文件 → 启动 mysqld 进程 + 后台守护

执行脚本:

# 第一步:确认脚本路径(你的场景)
ls /home/soft/mysql/mysql8/support-files/mysql.server

# 第二步:启动(后台+守护,推荐)
/home/soft/mysql/mysql8/support-files/mysql.server start

# 配套操作(便捷运维)
/home/soft/mysql/mysql8/support-files/mysql.server stop   # 停止
/home/soft/mysql/mysql8/support-files/mysql.server restart # 重启
/home/soft/mysql/mysql8/support-files/mysql.server status # 查看状态
  • 核心优势:

    • 「后台运行」:启动后终端可正常使用,不会被占用;

    • 「进程守护」:mysqld_safe 会监控 mysqld 进程,若意外崩溃会自动重启,提升稳定性;

    • 「运维友好」:配套 stop/restart/status 命令(如 mysql.server stop),无需手动操作 PID;

    • 「配置兼容」:自动读取默认配置文件,无需启动时手动指定 --basedir/--datadir 等参数。

2. /home/soft/mysql/mysql8/bin/mysqld:直接启动核心进程

mysqld 是 MySQL 的 核心服务进程,直接运行它相当于 “裸启动”:

  • 核心特点:

    • 「前台运行」:默认会占用终端,所有日志直接输出到终端(适合调试,能实时看报错);

    • 「无守护」:终端关闭 / 断开连接,mysqld 进程会直接终止;若要后台运行,需手动加命令:

      # 直接启动,MySQL 会自动读取 /etc/my.cnf
      /home/soft/mysql/mysql8/bin/mysqld
      # 后台启动(加 nohup 防止终端关闭终止)
      nohup /home/soft/mysql/mysql8/bin/mysqld > /dev/null 2>&1 &
    • 「参数灵活」:启动时可直接加参数(如 --port=3307),临时覆盖配置文件,适合测试不同参数效果;

5. 配置环境变量(可选,方便使用 mysql 命令)

# 编辑环境变量文件
vi /etc/profile
# 添加以下内容
export MYSQL_HOME=/home/soft/mysql/mysql8
export PATH=$MYSQL_HOME/bin:$PATH
# 生效配置
source /etc/profile

三、后续配置

1. 登录 MySQL 并修改密码

使用初始化时的临时密码登录:

# 登录(指定 socket 文件,与启动命令一致)
# 如果my.cnf中没有配置[client] socket = /home/soft/mysql/mysql8/data/mysql.sock
# 那么mysql启动时需要加上-S参数 mysql -uroot -p -S /home/soft/mysql/mysql8/data/mysql.sock
mysql -uroot -p 
# 输入临时密码后,执行以下命令修改密码(示例:123456,建议设复杂密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;

2. 开启远程访问(可选)

默认 root 仅允许本地登录,若需远程连接:

# 登录 MySQL 后执行
use mysql;
# 修改 root 允许所有主机访问(生产环境建议指定具体 IP)
UPDATE user SET host='%' WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;

3. 关闭远程访问

MySQL 8.0 中 root 用户默认仅允许本地访问(root@localhost),但是生产环境为了安全可以关闭,并且创建子账号去登录。

-- 查看所有root账号的访问主机
SELECT user, host FROM mysql.user WHERE user = 'root';

正常输出应为 root@localhost(仅本地访问);

若出现 root@%(% 表示任意主机,即允许远程),必须删除 / 修改。

如果root用户有root@%root@localhost ,那么可以直接删除root@%,如果只有root@% 我们可以通过RENAME USER 修改。

-- 以下两种2选1
---------------------1.删除root@%------------------------------------------
-- 存在多个root账号,删除允许远程的root账号
DROP USER IF EXISTS 'root'@'%';

-- 再次刷新权限
FLUSH PRIVILEGES;

-- 验证删除结果,如果仅保留root@localhost则删除成功
SELECT user, host FROM mysql.user WHERE user = 'root';

---------------------2.RENAME USER root@%------------------------------------------
-- 修改root@%的方式
-- 登录 MySQL(当前用 root@% 登录)
mysql -uroot -p 

-- 直接将 root@% 重命名为 root@localhost
RENAME USER 'root'@'%' TO 'root'@'localhost';

-- 刷新权限,使配置生效
FLUSH PRIVILEGES;

4. 创建子账号

-- 语法:CREATE USER '新用户名'@'允许的主机' IDENTIFIED BY '新密码';
-- 示例1:仅允许指定IP(如192.168.1.100)访问(最安全)
CREATE USER 'newuser'@'192.168.1.100' IDENTIFIED BY 'newuser123!';

-- 示例2:允许任意主机访问(测试/内网场景,生产不推荐)
CREATE USER 'newuser'@'%' IDENTIFIED BY 'newuser123!';

FLUSH PRIVILEGES;
  • 192.168.1.100:仅该 IP 可远程连接;

  • %:所有 IP 可连接(生产建议限定具体 IP / 网段);

  • 密码需符合 MySQL 8.0 复杂度(含大小写、数字、特殊字符)。

授权新账号访问「指定数据库」(最小权限原则)

-- 语法:GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'允许的主机';
-- 示例:授权newuser对testdb数据库的所有权限(仅该库)
GRANT ALL PRIVILEGES ON testdb.* TO 'newuser'@'192.168.1.100';

-- 可选:仅授权查询/插入/更新权限(更严格)
-- GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'newuser'@'192.168.1.100';

FLUSH PRIVILEGES;
  • testdb.*:表示 testdb 数据库下的所有表;

  • 若需授权多个数据库:GRANT ALL ON db1.*, db2.* TO 'newuser'@'%';

  • 若需授权所有数据库(不推荐):GRANT ALL ON *.* TO 'newuser'@'%';

5. 设置开机自启(可选)

文章作者: Z
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 微博客
mysql 数据库 mysql 数据库 运维 工具
喜欢就支持一下吧