在服务器或本地虚拟机上搭建数据库环境时,MySQL 8.0 是一个非常主流的选择。但由于 CentOS 7 默认预装了 MariaDB,且官方仓库已停止维护,直接安装 MySQL 会遇到各种冲突和依赖问题。本文将带你一步步完成从卸载冲突、下载安装包、配置、初始化到开启远程连接的全过程。
一、准备工作:卸载 MariaDB
1.1 为什么要卸载 MariaDB
MariaDB 是 MySQL 的一个开源分支,CentOS 7 及之后版本已不再内置 MySQL,转而使用 MariaDB。如果直接安装 MySQL,两者文件会相互冲突,导致安装失败。因此,我们首先需要彻底卸载系统中自带的 MariaDB。
1.2 卸载步骤
首先,查看系统中是否已安装 MariaDB 相关包:
bash
rpm -qa | grep mariadb

如果有返回结果(例如 mariadb-libs-5.5.68-1.el7.x86_64),说明需要卸载。复制该包名,执行以下命令强制卸载:
bash
rpm -e --nodeps 包名
--nodeps表示忽略依赖关系,强制移除,因为 MariaDB 的库文件可能被其他软件依赖,但安装 MySQL 时必须清除。

卸载完成后,再次确认是否还有残留:
bash
rpm -qa | grep mariadb
若无输出,则表示卸载成功。

二、下载 MySQL 8.0 安装包
2.1 准备存放目录
为了方便管理,我们在 /usr/local/ 下创建一个 software 目录,后续所有安装包和 MySQL 程序都将集中放在这里。
bash
mkdir -p /usr/local/software
cd /usr/local/software

2.2 选择下载方式
可以从 MySQL 官方归档页面选择 Linux - Generic (glibc 2.12) (x86, 64-bit) 版本,下载后上传到服务器;

也可以使用 wget 直接下载,效率更高。
这里主要演示 wget 方式。
执行以下命令下载 MySQL 8.0.20 的通用二进制包:
bash
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
如果系统提示 wget: command not found,说明尚未安装 wget

需要先安装:
bash
yum install -y wget
但此时你可能会遇到另一个错误:Could not retrieve mirrorlist http://mirrorlist.centos.org/...。这是因为 CentOS 7 已于 2024 年 6 月停止维护,官方 mirrorlist 已经失效。

解决方法:更换为 CentOS 的归档仓库或国内镜像源(如阿里云)。具体操作如下:
-
进入 yum 配置目录:
bashcd /etc/yum.repos.d
-
备份原有配置,并编辑
CentOS-Base.repo:bashcp CentOS-Base.repo CentOS-Base.repo.backup vi CentOS-Base.repo
-
将文件内容修改为指向
vault.centos.org的归档地址(或后面直接换成阿里云镜像)。进入后改为:
bash
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
#baseurl=http://vault.centos.org/7.9.2009/x86_64/os/
baseurl=http://vault.centos.org/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
#baseurl=http://vault.centos.org/7.9.2009/x86_64/os/
baseurl=http://vault.centos.org/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#$baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
#baseurl=http://vault.centos.org/7.9.2009/x86_64/os/
baseurl=http://vault.centos.org/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
#baseurl=http://vault.centos.org/7.9.2009/x86_64/os/
baseurl=http://vault.centos.org/7.9.2009/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-
保存后执行:
bashsudo yum clean all sudo yum makecache
-
为了获得更快的下载速度,可以进一步替换为阿里云镜像源:
bashcurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo cat CentOS-Base.repo # 确认 mirror 为阿里云地址
-
再次清理并重建缓存:
bashsudo yum clean all sudo yum makecache
现在 yum 恢复正常,重新执行 yum install -y wget 即可成功安装 wget。

回到 /usr/local/software 目录,再次执行 wget 下载 MySQL 安装包,耐心等待下载完成(若中途失败或卡住,可中断后重试)。
bash
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz


三、解压并安装 MySQL
3.1 解压压缩包
根据文件后缀,使用不同的 tar 参数解压。.tar.xz 格式使用 -Jxvf,.tar.gz 使用 -zxvf。这里下载的是 tar.xz 格式,执行:
bash
tar -Jxvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

解压后会在当前目录下生成一个类似 mysql-8.0.20-linux-glibc2.12-x86_64 的文件夹。

3.2 移动并重命名
为了路径简洁,通常我们会将 MySQL 安装到 /usr/local/mysql 下,并将版本目录重命名为 mysql8(或其他自定义名称,但需与后续配置文件保持一致)。
首先创建目标父目录(如果不存在):
bash
mkdir -p /usr/local/mysql
然后将解压出的文件夹移动到 /usr/local/mysql/ 并重命名:
bash
mv mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local/mysql/mysql8


为什么要重命名为
mysql8? 一方面方便记忆和配置文件中引用,另一方面如果以后安装多个 MySQL 版本,可以清晰区分。
四、配置 MySQL
4.1 创建数据存放目录
根据我们后续要编写的配置文件,数据库文件将存放在 /usr/local/mysql/mysql8/data/mysql8_data 下。所以先创建该目录:
bash
cd /usr/local/mysql/mysql8
mkdir -p data/mysql8_data

4.2 编辑 MySQL 配置文件 my.cnf
MySQL 启动时需要读取配置,我们统一将自定义配置放在 /usr/local/etc/my.cnf(也可以放在其他位置,但后续初始化命令需指定路径)。
首先创建文件:

然后用 vim 创建并编辑 my.cnf:
bash
vim /usr/local/etc/my.cnf
按 i 进入插入模式,粘贴以下内容:
ini
[mysql]
default-character-set=utf8mb4
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
server-id = 3306
user = root
socket = /tmp/mysql.sock
# 安装目录
basedir = /usr/local/mysql/mysql8
# 数据存放目录
datadir = /usr/local/mysql/mysql8/data/mysql8_data
log-bin = /usr/local/mysql/mysql8/data/mysql8_data/mysql-bin
innodb_data_home_dir = /usr/local/mysql/mysql8/data/mysql8_data
innodb_log_group_home_dir = /usr/local/mysql/mysql8/data/mysql8_data
# 日志及进程数据存放
log-error = /usr/local/mysql/mysql8/data/mysql8_data/mysql.log
pid-file = /usr/local/mysql/mysql8/data/mysql8_data/mysql.pid
# 服务端字符集
character-set-server=utf8mb4
lower_case_table_names=1
autocommit =1
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 1024
sort_buffer_size = 4M
net_buffer_length = 8K
read_buffer_size = 4M
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 64M
thread_cache_size = 128
tmp_table_size = 128M
explicit_defaults_for_timestamp = true
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535
binlog_format=mixed
binlog_expire_logs_seconds =864000
# 默认存储引擎
default_storage_engine = InnoDB
innodb_data_file_path = ibdata1:10M:autoextend
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
transaction-isolation=READ-COMMITTED
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 4M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
说明:
basedir指向 MySQL 安装根目录;datadir指向我们刚刚创建的数据目录;- 字符集统一为
utf8mb4,支持更完整的 Unicode(包括 emoji);user = root表示以 root 用户运行 MySQL(学习环境可接受,生产建议使用专用mysql用户);- 其他参数对性能做了简单优化,可直接沿用。
按 Esc 退出编辑,输入 :wq 保存并退出。
五、初始化 MySQL 数据库
5.1 设置环境变量(可选,方便后续操作)
为了方便在任意路径下执行 MySQL 命令,可以将 bin 目录添加到 PATH 中。临时生效可执行:
bash
export PATH=$PATH:/usr/local/mysql/mysql8/bin
若需永久生效,可将此行写入 /etc/profile 或 ~/.bashrc。
bash
echo 'export PATH=$PATH:/usr/local/mysql/mysql8/bin' >> ~/.bashrc
#使配置立即生效
source ~/.bashrc
bash
echo 'export PATH=$PATH:/usr/local/mysql/mysql8/bin' >> /etc/profile
source /etc/profile
当然,也可以每次都使用绝对路径。
5.2 执行初始化
进入 MySQL 的 bin 目录(如果已配置 PATH 可省略切换):
bash
cd /usr/local/mysql/mysql8/bin
执行初始化命令(注意参数中各项路径要与配置文件一致):
bash
mysqld --defaults-file=/usr/local/etc/my.cnf \
--basedir=/usr/local/mysql/mysql8 \
--datadir=/usr/local/mysql/mysql8/data/mysql8_data \
--user=root \
--initialize-insecure
参数解释:
--defaults-file:指定配置文件,必须放在--initialize之前;--basedir:安装目录;--datadir:数据文件存储目录;--user=root:指定以 root 身份运行(与配置文件中的user一致);--initialize-insecure:初始化后 root 用户无密码(若省略-insecure则会生成一个随机密码,记录在错误日志中)。
为什么用
--initialize-insecure? 学习环境为了方便,我们让 root 初始无密码,等首次登录后再修改。生产环境请使用--initialize生成随机密码并妥善保管。
初始化过程会创建系统表空间等必要文件,耐心等待执行完毕,无错误输出即表示成功。
六、启动 MySQL 服务
6.1 使用 mysqld_safe 安全启动
MySQL 的 bin 目录下有一个 mysqld_safe 脚本,它会在后台启动 MySQL 服务,并在服务异常终止时尝试重新拉起,非常适合手动管理。

执行启动命令(同样需指定配置文件):
bash
/usr/local/mysql/mysql8/bin/mysqld_safe --defaults-file=/usr/local/etc/my.cnf &
# 若添加了PATH变量,可省略如下
mysqld_safe --defaults-file=/usr/local/etc/my.cnf &
结尾的 & 表示放入后台执行。

检查服务是否启动成功:
bash
ps -ef | grep mysql
如果看到包含 mysqld 的进程(第二条通常就是 MySQL 服务),则说明启动成功。

七、首次登录与密码修改
7.1 登录 MySQL
由于我们初始化时选择了无密码模式,因此首次登录可以跳过密码验证:
bash
mysql -u root --skip-password

如果之前生成了随机密码,则需要找到该密码(通常在 /usr/local/mysql/mysql8/data/mysql8_data/mysql.log 中)并使用 mysql -u root -p 输入。
7.2 修改 root 密码
出于安全考虑,首次进入系统后必须修改 root 密码。建议使用 mysql_native_password 插件,以保证兼容性(部分客户端工具可能不支持新的认证插件)。
sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES让权限更改立即生效。
以后如果想再次修改密码,可以使用:
sql
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');
或在 Linux 命令行下使用 mysqladmin:
bash
mysqladmin -u root -p旧密码 password 新密码
八、配置远程连接
很多时候我们需要在本地用图形化工具(如 Navicat、DBeaver)连接服务器上的 MySQL。为此,必须创建一个允许任意主机访问的用户,并开放防火墙端口。
8.1 创建远程访问用户
登录 MySQL 后,先查看当前用户表:
sql
USE mysql;
SELECT user, host, plugin, authentication_string FROM user;

可以看到 root 的 host 字段为 localhost,表示只能本地登录。现在我们创建一个允许任意 IP(%)连接的 root 用户:
sql
CREATE USER 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
再次查看用户表,应该能看到两个 root 用户,其中一个 host 为 %。

8.2 开放防火墙 3306 端口
MySQL 默认监听 3306 端口,需要让防火墙放行。
检查当前端口状态:
bash
firewall-cmd --query-port=3306/tcp
若返回 no,表示未开放。

执行永久开放并重启防火墙:
bash
firewall-cmd --add-port=3306/tcp --permanent
systemctl restart firewalld


8.3 使用 Navicat 等工具远程连接
打开 Navicat,新建 MySQL 连接,主机 IP 填写你服务器的实际 IP(可通过 ip addr 查看),端口 3306,用户名 root,密码为刚才设置的远程用户密码。

连接成功后,你就可以在图形界面中轻松管理数据库了。
九、退出与关闭 MySQL 服务
用完数据库后,可以安全退出或关闭。
在 MySQL 命令行内退出:
sql
quit;
或
sql
exit;

关闭 MySQL 服务,可以在 Linux 命令行执行:
bash
/usr/local/mysql/mysql8/bin/mysqladmin -u root -p shutdown
输入密码后服务即停止。

总结
至此,我们完成了从卸载冲突、下载安装包、配置、初始化、启动、设置密码到开启远程访问的全部步骤。