Ubuntu 22.04 二进制安装 MySQL LTS(长期支持版)完整教程
MySQL LTS 版本选择:
目前 MySQL 8.4.4 是长期支持(LTS)版本,持续更新并保持稳定。
下载版本:
你也可以在 MySQL 官方网站确认最新稳定 LTS 版本。
安装步骤
1. 卸载已有的 MySQL(如果已安装)
首先,确保系统中没有已安装的 MySQL,避免冲突。
停止 MySQL 服务(如果存在)
sudo systemctl stop mysql
删除 MySQL
sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* -y
删除残留文件
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql
清理系统
sudo apt autoremove -y
sudo apt autoclean
2. 下载 MySQL 二进制包
访问 MySQL 官方下载页面 或直接通过 wget
下载最新稳定版本(以 8.0.33 为例):
wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.4-linux-glibc2.28-x86_64.tar.xz
3. 解压二进制包并移动到安装目录
-
解压下载的 MySQL 压缩包:
tar -xvf mysql-8.0.33-linux-glibc2.17-x86_64-minimal.tar.xz
-
移动解压的 MySQL 文件夹到
/usr/local/mysql
:sudo mv mysql-8.4.4-linux-glibc2.28-x86_64 /usr/local/mysql
-
创建符号链接(方便管理):
sudo ln -s /usr/local/mysql /usr/local/mysql-lts
4. 创建用户和目录
-
创建 MySQL 用户和用户组:
- 创建一个 MySQL 用户,以更安全的方式运行 MySQL。
sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql
-
创建数据目录并更改权限:
sudo mkdir -p /usr/local/mysql/data sudo chown -R mysql:mysql /usr/local/mysql sudo chmod -R 755 /usr/local/mysql
5. 初始化数据库
初始化数据库的步骤
- 数据目录创建和文件生成:初始化操作会根据你提供的
--datadir
参数创建数据目录,并生成 MySQL 必须的表、索引和配置文件。 - 临时密码生成:初始化后,MySQL 会为 root 用户生成一个临时密码,用户需要使用该密码首次登录数据库。
- 权限表创建:MySQL 创建权限表,用于管理用户、权限、角色等。
- 创建系统数据库:如
mysql
、information_schema
、performance_schema
等。
切换到 MySQL 安装目录并初始化数据目录:
cd /XXXXXXX/mysql
sudo bin/mysqld --initialize --user=XXXX --basedir=/XXXXXXXXXX/mysql --datadir=/XXXXXXXX/data
输出结果中会生成一个 临时 root 密码(请保存下来,后面登录时会用到)。
mysqld --initialize
命令的作用
在 MySQL 中,mysqld --initialize
命令用于初始化 MySQL 数据库实例。这是部署 MySQL 数据库的关键步骤,主要是对数据库进行初步配置和创建相关文件,以便能够启动和使用 MySQL 服务。
具体作用:
-
创建数据库系统文件:
该命令会在指定的数据目录(--datadir
)中创建 MySQL 系统所需的数据库和表。例如,系统数据库(如mysql
数据库)以及用于存储表结构、用户权限等数据的表将被初始化。 -
初始化数据目录:
mysqld --initialize
会检查指定的数据目录(--datadir
)是否存在,如果不存在则会创建,并且会生成一系列的系统文件和目录,以供 MySQL 使用。 -
创建系统数据库:
- MySQL 启动时会使用这些系统数据库。典型的系统数据库包括
information_schema
、performance_schema
、mysql
等。 - 其中
mysql
数据库是一个关键的系统数据库,存储了 MySQL 用户和权限信息。
- MySQL 启动时会使用这些系统数据库。典型的系统数据库包括
-
生成临时 root 密码:
当你运行mysqld --initialize
命令时,它会生成一个临时的 root 密码(该密码在命令的输出中显示)。这是初始化数据库后第一次使用 root 用户登录时所需要的密码。 -
初始化权限表:
MySQL 需要权限表来进行用户认证和权限控制,--initialize
命令会创建这些表并为 root 用户分配默认的权限。 -
其他内部数据库:
mysqld --initialize
还会创建一些其他的数据库和表,比如:performance_schema
:用于收集性能数据。information_schema
:存储数据库的元数据信息(例如表结构、索引、列信息等)。
--initialize
命令中的参数作用
1. --user=mysql
- 作用:指定
mysqld
进程将以mysql
用户身份运行。 - 原因:出于安全考虑,MySQL 的进程应该以一个低权限用户运行,而不是
root
。该参数确保 MySQL 数据库不会以 root 用户权限运行,从而降低了潜在的安全风险。 - 默认值:如果没有指定此参数,MySQL 会默认使用当前系统的用户。
2. --basedir=/usr/local/src/mysql_demo/mysql-8.4.4
- 作用:指定 MySQL 安装的基本目录路径。
- 说明:
basedir
参数告诉 MySQL 安装程序 MySQL 文件的根目录,通常包含了二进制文件、配置文件和共享库等。 - 例子:如果你的 MySQL 安装目录是
/usr/local/mysql
,则该参数应该指向这个目录。这样,MySQL 在初始化过程中会根据该目录配置路径。
3. --datadir=/usr/local/src/mysql_demo/standalone/data
- 作用:指定 MySQL 数据文件存储的位置。
- 说明:
datadir
是 MySQL 存储数据库实际数据文件(如表文件、日志文件等)的目录。所有用户数据库和系统数据库都会存储在该目录中。 - 建议:为保证 MySQL 性能和安全,通常会将数据目录放在一个专用的磁盘分区上,避免和系统文件混合。
- 例子:在此命令中,
--datadir
被设置为/usr/local/mysql/data
,意味着所有数据库的数据文件将会被存储在此目录。
常见问题与注意事项
- 权限问题:确保你提供的
datadir
路径具有正确的权限,mysql
用户需要有读写权限。 - 临时密码:初次登录后,请务必尽快更改 root 密码,因为初始化生成的密码通常是随机的并且安全性较低。
- 路径错误:确保
basedir
和datadir
指向正确的路径,否则 MySQL 初始化过程中可能会失败。
通过运行 mysqld --initialize
命令,MySQL 完成了所有数据库的初始化工作,使得你可以开始使用 MySQL 数据库并进行配置。
6. 配置 MySQL
创建配置文件 my.cnf
:
sudo nano /usr/local/src/mysql_demo/standalone/configFile/my.cnf
添加以下内容:
[mysqld]
# MySQL 主配置段,用于指定 MySQL 服务器的配置项# MySQL 安装的根目录,包含了 MySQL 的二进制文件、库、配置文件等。
# 在这里,所有 MySQL 执行的命令都会基于该目录。
basedir=/usr/local/src/mysql_demo/mysql-8.4.4# MySQL 数据库存储目录,即 MySQL 的所有数据库数据文件存放的位置。
# 例如,数据库表文件、日志文件、索引文件等都存储在此目录下。
datadir=/usr/local/src/mysql_demo/standalone/data# MySQL 服务监听的端口号。默认情况下,MySQL 使用端口 3306。
# 你可以根据需求修改此端口,以避免与其他服务冲突。
port=3306# MySQL 使用的 Unix 套接字文件的路径,客户端和服务器之间的通信通常使用此文件。
# 如果你使用的是基于 TCP/IP 的连接方式,则不需要设置此项,但如果使用的是本地 Unix 套接字通信,它就很重要。
socket=/usr/local/src/mysql_demo/mysql-8.4.4/mysql.sock# 指定 MySQL 进程运行的系统用户。通常建议使用 `普通用户` 用户来提高安全性。
# 如果 MySQL 以 root 用户运行,可能会带来潜在的安全隐患。
user=user01# 指定 MySQL 错误日志文件的路径。该日志文件记录 MySQL 服务器的启动、运行过程中的错误和警告信息。
# 错误日志对于排查 MySQL 问题非常重要。
log-error=/usr/local/src/mysql_demo/standalone/logs/mysql-error.log# 慢查询日志的位置。用于记录执行时间超过设定阈值的查询。
slow-query-log-file=/usr/local/src/mysql_demo/standalone/logs/mysql-slow.log# 二进制日志的位置,用于记录所有更改数据库内容的操作。
# 二进制日志对于数据库的备份、恢复以及复制功能非常重要。
log-bin=/usr/local/src/mysql_demo/standalone/logs/mysql-bin.log# 查询日志的位置,用于记录所有客户端发送的 SQL 查询。
# 查询日志对于诊断性能问题以及分析客户端查询行为很有帮助。
general-log-file=/usr/local/src/mysql_demo/standalone/logs/mysql-general.log# MySQL 进程 ID 文件的路径,记录 MySQL 服务器进程的 ID。
# 该文件的作用是便于管理员管理 MySQL 服务,比如停止或启动 MySQL 时使用。
pid-file=/usr/local/src/mysql_demo/standalone/data/mysql.pid# 以下是为生产环境优化性能的可选配置# 设置 MySQL 服务器允许的最大连接数。
# 如果有更多的并发用户连接 MySQL,增大此值可以避免连接数不足的问题。
# 该值应该根据服务器的硬件资源和并发需求来调整。
max_connections=200# 设置 SQL 模式,用于控制 MySQL 的行为和查询的严格性。
# - `STRICT_TRANS_TABLES`: 使得 MySQL 在处理数据时对类型不匹配的操作进行严格检查。
# - `NO_ENGINE_SUBSTITUTION`: 当指定的存储引擎不可用时,MySQL 不会自动使用默认引擎。
# 该设置有助于提高数据一致性和查询的可靠性。
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
保存并退出。
7. 设置环境变量(可选)
编辑 .bashrc
文件,添加 MySQL 命令到环境变量:
sudo nano ~/.bashrc
在文件末尾添加:
export PATH=$PATH:/usr/local/mysql/bin
使环境变量生效:
source ~/.bashrc
8. 创建 systemd 服务(便于使用 systemctl 管理 MySQL)
-
创建 MySQL 服务文件:
sudo nano /etc/systemd/system/mysql.service
-
添加以下内容:
[Unit]
Description=MySQL Server # 描述该服务为 MySQL 数据库服务器
After=network.target # 定义启动顺序,确保网络服务就绪后再启动 MySQL 服务[Service]
Type=forking # 定义服务类型为 forking,表示服务启动时会产生子进程
User=user01 # 指定运行 MySQL 服务的用户为 user01,提升安全性
Group=user01 # 指定服务运行时所属的用户组为 user01,增强权限管理
ExecStart=/usr/local/src/mysql_demo/mysql-8.4.4/bin/mysqld --defaults-file=/usr/local/src/mysql_demo/standalone/configFile/my.cnf # 定义启动命令及配置文件路径
ExecStop=/usr/local/src/mysql_demo/mysql-8.4.4/bin/mysqladmin -u root -p shutdown # 定义停止命令,使用 mysqladmin 管理工具优雅关闭 MySQL 服务
LimitNOFILE=5000 # 提升文件描述符限制为 5000,增强 MySQL 在高并发场景下的性能[Install]
WantedBy=multi-user.target # 定义服务目标,当系统进入 multi-user 模式时,该服务会自动启动
这是一个 systemd 服务单元文件,用于定义如何启动、停止和管理 MySQL 服务器进程。下面我将逐行详细解释这个文件的内容,并注释每一项配置的含义。
这个 systemd 单元文件使管理员能够轻松管理 MySQL 服务,包括自动启动、手动启动、停止以及配置权限和资源限制等。同时,它提升了 MySQL 运行时的安全性和稳定性,通过限制用户权限和提高文件描述符数量来优化系统运行表现。
[Unit] 部分
[Unit]
Description=MySQL Server
After=network.target
解释:
- [Unit]:这是 systemd 单元文件的基本部分,用于描述服务单元的元数据信息,以及定义启动顺序和依赖关系。
- Description=MySQL Server:描述该服务的功能,这一行用来告诉用户或管理员,这个服务是用于管理 MySQL 服务器的。
- After=network.target:表示此服务需要在网络功能就绪后启动。
network.target
代表网络目标,确保 MySQL 在网络服务初始化完成后再启动。
[Service] 部分
[Service]
Type=forking
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin -u root -p shutdown
LimitNOFILE=5000
解释:
-
[Service]:定义与该服务启动、运行、停止相关的配置。
-
Type=forking:表示该服务为 “forking”类型,即 MySQL 服务在启动时,会生成一个父进程,然后将主要的工作交给子进程处理。
forking
通常用于后台运行的守护进程。 -
User=mysql:指定运行该服务的用户为
mysql
,这是一种安全机制,防止使用 root 用户运行数据库服务,从而降低系统被攻击的风险。 -
Group=mysql:指定运行该服务时所属的用户组为
mysql
,进一步细化权限管理,确保只有mysql
用户组成员可以访问相关资源。 -
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf:
- 定义启动命令。
/usr/local/mysql/bin/mysqld
是 MySQL 的主服务器程序路径,执行该程序以启动 MySQL 服务。--defaults-file=/etc/my.cnf
表示启动时使用配置文件/etc/my.cnf
。这个配置文件中包含了 MySQL 的详细参数设置(如端口、数据目录、日志路径等)。
-
ExecStop=/usr/local/mysql/bin/mysqladmin -u root -p shutdown:
- 定义停止命令。
/usr/local/mysql/bin/mysqladmin
是 MySQL 的管理工具,用于关闭或管理 MySQL 服务。-u root
指定使用root
用户登录数据库。-p
提示用户在停止服务时输入密码,确保安全性。shutdown
是命令参数,用于优雅地关闭 MySQL 服务,确保数据在关闭时不会丢失或损坏。
-
LimitNOFILE=5000:
- 设置文件描述符限制,即允许 MySQL 打开的最大文件数为 5000。
- 默认情况下,Linux 系统可能限制每个进程只能打开 1024 个文件,但对于数据库服务来说,这可能不够,因为 MySQL 可能同时处理多个连接、文件、日志等。
- 提升这个限制可以增强 MySQL 的性能,尤其在高并发场景中。
[Install] 部分
[Install]
WantedBy=multi-user.target
解释:
- [Install]:用于定义该服务在安装(即
systemctl enable
)时的行为。 - WantedBy=multi-user.target:
- 表示该服务应该在 multi-user.target 目标下启用。
multi-user.target
是系统启动模式的一部分,它类似于传统的 Linux 运行级别 3,即一个没有图形界面的多用户环境。- 这意味着,当系统进入多用户模式时(如开机完成、进入登录界面),MySQL 服务将自动启动。
-
保存并退出。
-
重新加载 systemd 配置并启动 MySQL 服务:
sudo systemctl daemon-reload sudo systemctl start mysql sudo systemctl enable mysql
9. 修改 root 密码并允许远程访问
-
登录 MySQL(使用初始化时生成的临时密码):
mysql -u root -p
-
修改 root 密码为 123456:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
-
允许远程访问(如果需要):
ALTER USER 'root'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
更改配置文件,允许所有 IP 连接(如果需要远程访问):
编辑/etc/my.cnf
:sudo nano /etc/my.cnf
修改
bind-address
:bind-address = 0.0.0.0
-
重启 MySQL:
sudo systemctl restart mysql
10. 验证安装
-
检查 MySQL 服务是否正常运行:
sudo systemctl status mysql
-
查看 MySQL 版本:
mysql --version
-
登录数据库并确认连接成功:
mysql -u root -p
二进制安装的文件目录结构
安装完成后,你的 MySQL 文件分布大致如下:
- MySQL 程序文件:
/usr/local/mysql/
- 数据存储目录:
/usr/local/mysql/data/
- 配置文件:
/etc/my.cnf
- 日志文件:
/usr/local/mysql/data/mysql-error.log