皮皮舟印岁月

A JOURNAL OF TRAVEL · CODE · MARKETS
第三十六期 · 第 36 号 二〇二六年八月 · 立秋之后

openSUSE Leap 16 并行部署 MySQL 5.7 全记录

2026-09-26 4 阅读

本文记录一次"在已运行 PostgreSQL 18 的生产数据库服务器上,再并行装一套 MySQL 5.7"的完整过程。 目标是让新库与原库完全隔离、参数与老系统 RDS 对齐,为后续数据迁移做准备。 系统为 openSUSE Leap 16.0,SELinux 处于 Enforcing,firewalld 为 public 区默认策略——这两点各带来一个坑。 文中所有命令、配置、报错与验证结果均为实机执行所得,可直接复用。

这次任务的技术难点不在"装 MySQL",而在三件事:发行版已经不再提供 MySQL 5.7 的包、SELinux 开着而我们要装到非标准路径、防火墙默认只放行了 PostgreSQL 和 SSH。把这三个问题逐个拆开之后,剩下的就是常规的初始化与参数对齐。


一、需求背景

新项目"通格"脱胎于一套老系统,老系统跑在云上 RDS 上,版本是 MySQL 5.7.43-log。为了保证 SQL 方言、字符集、表名大小写规则、sql_mode 这些"隐性约定"完全一致,迁移期间选择沿用 5.7 版本,而不是直接上 MySQL 8.0。

同时,团队已有的开发与部署环境建立在 PostgreSQL 18 之上:192.168.1.151 这台数据库服务器已经稳定运行 PostgreSQL 18,业务服务通过 jdbc:postgresql://192.168.1.151:5432/... 连接。

于是需求变成:在同一台机器上,让 MySQL 5.7 与 PostgreSQL 18 和平共处,互不干扰,各自独立启停、独立备份、独立升级。

需要说明的是,MySQL 5.7 已于 2023 年 10 月 21 日结束官方支持(EOL),5.7.44 是该系列的最后一个版本。这意味着后续不再有安全补丁,这是一次有明确代价的兼容性妥协——用它换迁移期的确定性,同时应当规划好后续升级到 8.0 的路径。


二、环境信息

项目 值
服务器 192.168.1.151(主机名 dbserver)
操作系统 openSUSE Leap 16.0
已运行数据库 PostgreSQL 18(端口 5432)
新增数据库 MySQL 5.7.44(端口 3306)
安装方式 MySQL 官方通用二进制包(glibc 版 tarball)
MySQL 安装目录 /opt/mysql(basedir)
MySQL 数据目录 /var/lib/mysql(datadir)
MySQL 日志目录 /var/log/mysql
配置文件 /etc/my.cnf
服务单元 /etc/systemd/system/mysqld.service
运行用户 mysql(系统用户,uid=473)
网络接口 wlp1s0
防火墙 firewalld,public 区(默认区)
SELinux Enforcing,已加载 mysql 策略模块

本次未改动任何 PostgreSQL 相关配置,PG 的安装路径、数据目录、服务单元、防火墙放行项全部保持原样。


三、可行性分析:两个数据库怎么共存

先回答最关键的问题——会不会冲突。结论是:不会,因为两者的隔离点足够多,而且没有一个需要共享。

隔离维度 PostgreSQL 18 MySQL 5.7 冲突
监听端口 5432 3306 无
系统用户 postgres mysql 无
安装位置 由发行版包管理决定 /opt/mysql 无
数据目录 发行版默认路径 /var/lib/mysql 无
服务单元 postgresql.service mysqld.service 无
配置文件 各自的配置体系 /etc/my.cnf 无
客户端 socket PG 自有目录 /var/lib/mysql/mysql.sock 无
防火墙放行 public 区的 postgresql 服务 新增 3306 规则(限内网网段) 无
SELinux 各自策略域 运行在 unconfined_service_t 无

真正需要留意的是共享的物理资源,只有两项:

  • 内存:本次 innodb_buffer_pool_size 取 1G。如果物理内存紧张,这个值需要按 PG 的实际占用下调,装之前建议先看一眼 free -h。
  • 文件描述符上限:MySQL 的 systemd 单元里设了 LimitNOFILE=65535,这只影响 MySQL 自己的进程,不动系统全局值。

除此之外,两者在端口、目录、用户、进程四个层面完全隔离,可以各自 systemctl start/stop,互不影响。


四、安装方案选型:为什么用通用二进制包

Leap 16.0 的官方仓库里没有 MySQL 5.7 的包。openSUSE 从某个版本起就把 MySQL 系替换成了 MariaDB,仓库里能装到的是 MariaDB,而不是 Oracle 的 MySQL。要在 Leap 16.0 上跑 MySQL 5.7,只剩三条路:

方案 可行性 说明
发行版包管理安装 不可行 仓库无 5.7,只有 MariaDB
第三方兼容仓库 不推荐 会引入仓库信任与依赖污染问题,生产服务器风险高
官方通用二进制包 采用 官方归档提供 glibc 版 tarball,自带全部依赖,可控性最好

最终选择通用二进制包(generic binary tarball),理由是它不依赖发行版的包管理、不与系统库产生版本纠缠、升级和卸载都是"删目录"级别的操作,对一台已经在跑 PostgreSQL 的生产机来说,侵入性最小。

代价是:动态库依赖要自己补齐(后面第五节的坑就出在这里),以及服务要自己写 systemd 单元。


五、安装步骤

5.1 安装系统依赖

MySQL 5.7 的二进制包依赖 libaio 和 libnuma,另外 Leap 16.0 的最小化安装里可能连 tar 都没有(本次就遇到了)。

sudo zypper install -y libaio1 libnuma1 tar gzip

5.2 创建 mysql 用户与目录

MySQL 需要一个专用系统用户来运行,不能用 root 跑。这个用户不建家目录、不给登录 shell:

sudo groupadd -f -r mysql
sudo useradd -r -g mysql -s /usr/sbin/nologin -M mysql
id mysql

预期输出形如:

uid=473(mysql) gid=1001(mysql) 组=1001(mysql)

接着建数据目录和日志目录,并把归属交给 mysql:

sudo mkdir -p /var/lib/mysql /var/log/mysql
sudo chown -R mysql:mysql /var/lib/mysql /var/log/mysql

这一步必须先于初始化,且数据目录必须为空,否则 --initialize 会直接拒绝执行。

5.3 部署二进制包

从 MySQL 官方归档站获取(5.7 已 EOL,只在 archives 提供,不在常规下载页):

# 归档页:https://downloads.mysql.com/archives/community/
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz

解压到 /opt 并把目录名统一成 /opt/mysql:

sudo tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /opt
sudo mv /opt/mysql-5.7.44-linux-glibc2.12-x86_64 /opt/mysql

解压完务必确认关键二进制存在:

ls -l /opt/mysql/bin/mysqld /opt/mysql/bin/mysql

踩坑记录:本次曾出现"解压命令返回成功、但 /opt/mysql/bin/mysqld 不存在"的情况,原因是 tarball 下载不完整。重新下载并解压后恢复正常。所以解压后的这一步确认不能省——否则后面 ldd 会报"没有那个文件或目录",容易被误判成依赖问题。

5.4 补齐动态库依赖

这是整次部署里最典型的一个坑。直接检查依赖:

ldd /opt/mysql/bin/mysql | grep "not found"

报出两个:

libncurses.so.5 => not found
libtinfo.so.5 => not found

原因是 MySQL 5.7 编译时链接的是 ncurses 5 时代的 ABI,而 Leap 16.0 早已升级到 ncurses 6,系统里只有 .so.6:

libncurses.so.6 -> libncurses.so.6.5
libncursesw.so.6 -> libncursesw.so.6.5
libtinfo.so.6 -> libtinfo.so.6.5
libtinfow.so.6 -> libtinfow.so.6.5

ncurses 6 对 5 保持了向后兼容,所以用软链把"5"这个名字指向 6 的实现即可,不需要去编译老库、也不需要找第三方包:

sudo ln -sf /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
sudo ln -sf /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
sudo ldconfig

验证:

ldd /opt/mysql/bin/mysql | grep "not found" || echo "依赖已齐全"
ldd /opt/mysql/bin/mysqld | grep "not found" || echo "mysqld 依赖已齐全"

两条都输出"依赖已齐全"才算过。

这里有个容易被忽略的点:这两个库只影响 mysql 命令行客户端,mysqld 服务端并不依赖它们。所以即使客户端暂时报缺库,也不影响服务端启动和建库——但客户端修不好,后面导数据、排查问题会很难受,所以建议顺手解决。

另外,软链只新增了 .so.5 这个名字,系统里没有任何东西原本在用 .so.5,因此不会影响其它已安装软件。

5.5 编写 my.cnf(参数对齐老 RDS)

配置文件是整个部署里最需要"较真"的部分。目标是把老 RDS 上那些影响数据语义的参数原样搬过来。

sudo tee /etc/my.cnf > /dev/null <<'EOF'
[mysqld]
basedir                         = /opt/mysql
datadir                         = /var/lib/mysql
socket                          = /var/lib/mysql/mysql.sock
pid-file                        = /var/lib/mysql/mysqld.pid
log-error                       = /var/log/mysql/error.log
user                            = mysql
port                            = 3306
bind-address                    = 0.0.0.0

character-set-server            = utf8
collation-server                = utf8_general_ci
lower_case_table_names          = 1
sql_mode                        = ""

default-storage-engine          = InnoDB
innodb_buffer_pool_size         = 1G
max_connections                 = 500
max_allowed_packet              = 64M

[client]
socket                          = /var/lib/mysql/mysql.sock
default-character-set           = utf8
EOF

几个关键项的含义:

  • character-set-server = utf8 / collation-server = utf8_general_ci:老系统的字符集是 utf8(即 utf8mb3),不是 utf8mb4。这一项如果搞错,后续可能出现乱码或索引长度差异,必须严格对齐。
  • lower_case_table_names = 1:表名不区分大小写,存储时统一转小写。这一项只在初始化时生效,初始化之后无法再改(改了会直接起不来)。老系统是 1,新库也必须是 1,否则表名大小写不一致会导致大量"表不存在"。
  • sql_mode = "":老系统的 sql_mode 是空的,意味着关闭了严格模式。MySQL 5.7 的默认值包含 ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES 等,如果不置空,老系统里那些"能跑但不规范"的 SQL 会大面积报错。
  • bind-address = 0.0.0.0:监听所有网卡。这是安全上的一个取舍——因为要在局域网内被其它机器访问。真正做访问控制靠的是账号的 host 限制加上防火墙规则,而不是监听地址。

一个教训:/etc/my.cnf 与 systemd 单元文件写完之后,应当立刻 ls 确认落盘。本次部署中出现过"以为写好了、后来检查发现文件并不存在"的情况(大概率是会话中断导致命令没真正执行),只好重新创建。系统级配置文件不确认就往下走,后面排错会绕远路。

5.6 注册 systemd 服务

sudo tee /etc/systemd/system/mysqld.service > /dev/null <<'EOF'
[Unit]
Description=MySQL 5.7 Community Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
KillMode=mixed
TimeoutSec=300

[Install]
WantedBy=multi-user.target
EOF

说明几点:

  • --defaults-file=/etc/my.cnf 显式指定配置文件,避免 mysqld 去猜默认路径。
  • Type=simple 而不是 forking:MySQL 5.7 的 mysqld 默认前台运行,用 simple 最直接,不需要 mysqld_safe 那层包装。
  • Restart=on-failure:异常退出自动拉起,避免数据库"悄悄挂了"。
  • LimitNOFILE=65535:MySQL 连接数较高时,文件描述符是常见瓶颈。

5.7 初始化数据目录

sudo /opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql

这条命令不输出内容,正常几秒到十几秒返回。参数含义:

  • --initialize-insecure:初始化并创建一个 空密码的 root@localhost。因为这台服务器在内网、且马上就会设密码,所以选它而不是 --initialize(后者会生成随机临时密码,需要去日志里翻)。
  • --user=mysql:以 mysql 用户身份创建文件,避免后续出现属主不一致。

如果报错,去看错误日志:

sudo tail -30 /var/log/mysql/error.log

验证初始化结果:

sudo ls /var/lib/mysql

预期能看到 ibdata1、ib_logfile0、ib_logfile1、mysql、performance_schema、sys 以及一组 *.pem 证书文件。

5.8 启动服务并验证参数

sudo systemctl daemon-reload
sudo systemctl enable mysqld
sudo systemctl start mysqld
sudo systemctl status mysqld --no-pager

状态应显示 active (running):

● mysqld.service - MySQL 5.7 Community Server
     Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; preset: disabled)
     Active: active (running) since Sat 2026-09-26 16:15:09 CST; 8s ago
   Main PID: 2853 (mysqld)
     CGroup: /system.slice/mysqld.service
             └─2853 /opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf

然后验证参数是否真的生效——这一步不能省,配置文件写了不代表 mysqld 读到了:

/opt/mysql/bin/mysql -uroot -e "select version(); select @@lower_case_table_names, @@character_set_server, @@collation_server, @@sql_mode;"

本次实际输出:

+-----------+
| version() |
+-----------+
| 5.7.44    |
+-----------+

+--------------------------+------------------------+--------------------+------------+
| @@lower_case_table_names | @@character_set_server | @@collation_server | @@sql_mode |
+--------------------------+------------------------+--------------------+------------+
|                        1 | utf8                   | utf8_general_ci    |            |
+--------------------------+------------------------+--------------------+------------+

四项全部与老 RDS 一致,参数对齐完成。

5.9 创建业务账号并设置 root 密码

按"来源限定内网网段 + 全部权限"的方式建账号:

/opt/mysql/bin/mysql -uroot -e "CREATE USER 'zhoubo'@'192.168.1.%' IDENTIFIED BY '<密码>'; GRANT ALL PRIVILEGES ON *.* TO 'zhoubo'@'192.168.1.%' WITH GRANT OPTION; FLUSH PRIVILEGES;"

这里有个很容易踩的细节:'192.168.1.%' 这个 host 限制匹配不到 socket 连接。socket 连接的来源在 MySQL 眼里是 localhost,所以在本机用 -uzhoubo 登录会直接 Access denied。如果本机也要用这个账号,需要单独再建一个 localhost 账号:

/opt/mysql/bin/mysql -uroot -e "CREATE USER 'zhoubo'@'localhost' IDENTIFIED BY '<密码>'; GRANT ALL PRIVILEGES ON *.* TO 'zhoubo'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"

同时,初始化产生的 root 是空密码,而 bind-address 又是 0.0.0.0,必须立刻设上:

/opt/mysql/bin/mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '<root密码>'; FLUSH PRIVILEGES;"

之后登录改为 /opt/mysql/bin/mysql -uroot -p。

验证账号:

/opt/mysql/bin/mysql -uroot -p -e "SELECT user,host FROM mysql.user WHERE user='zhoubo'; SHOW GRANTS FOR 'zhoubo'@'192.168.1.%';"

六、远程连接排查:2003 Connection refused

局域网内另一台机器连接时报:

2003 - Can't connect to MySQL server on '192.168.1.151' (61 "Connection refused")

这个报错的定位要点是:错误号 61(Connection refused)是 TCP 层被拒,不是账号或密码问题。MySQL 的账号问题会报 1045 Access denied。所以先排除网络层,别去改 mysql.user。

被拒只有两种可能:要么 MySQL 没监听在那个地址上,要么防火墙把包拒了(REJECT 表现为 refused,DROP 表现为超时)。用三条命令分辨:

sudo ss -lntp | grep 3306
sudo systemctl is-active firewalld
sudo firewall-cmd --list-all

本次输出:

LISTEN 0      150          0.0.0.0:3306      0.0.0.0:*    users:(("mysqld",pid=2853,fd=27))

MySQL 监听正常,0.0.0.0:3306 说明所有网卡都在听。防火墙则是:

public (default, active)
  target: default
  interfaces: wlp1s0
  services: dhcpv6-client postgresql ssh
  ports:
  rich rules:

public 区只放行了 dhcpv6-client、postgresql、ssh——有 postgresql 而没有 3306,这就是原因。防火墙收到 3306 的连接请求后直接 REJECT,客户端看到的就是 "Connection refused"。

解决方式用 rich rule 而不是 --add-port:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-rich-rules

为什么不用 sudo firewall-cmd --permanent --add-port=3306/tcp?因为那个写法是对所有来源开放。而我们的账号本身限定了 192.168.1.%,防火墙这边也应当保持一致,只让内网网段摸到端口。两层限制叠加,即使将来账号 host 写成 %,外网也进不来。

--permanent + --reload 组合保证规则写入持久化配置并立即生效,重启后依然在。


七、SELinux 的处理思路

Leap 16.0 上 getenforce 返回 Enforcing,而 MySQL 又装在了非标准路径 /opt/mysql,这在 SELinux 环境下通常是麻烦的开始。本次的处理思路值得单独说一下。

先看策略现状:

sudo semodule -l | grep -i mysql
sudo semanage fcontext -l | grep mysqld

mysql 策略模块确实加载了,文件上下文规则里也已经定义好了:

路径 上下文类型
/etc/my.cnf mysqld_etc_t
/usr/bin/mysqld、/usr/libexec/mysqld mysqld_exec_t
/var/lib/mysql(/.*)? mysqld_db_t
/var/log/mysql(/.*)? mysqld_log_t
/usr/lib/systemd/system/mysqld.* mysqld_unit_file_t

关键在于:这些 mysqld_exec_t 规则只匹配 /usr/bin/mysqld、/usr/libexec/mysqld 这类发行版标准路径。我们的二进制在 /opt/mysql/bin/mysqld,不匹配任何一条,因此不会触发到 mysqld_t 域的转换。

而 systemd 启动的、没有专属策略匹配的服务,会运行在 unconfined_service_t 域里。这个域在 targeted 策略下权限很宽,访问 /var/lib/mysql 这类目录不会产生拒绝。

所以本次的策略是:先不动 SELinux 标签,直接按原样初始化并启动。结果是初始化、启动、登录全部正常,没有出现 AVC 拒绝。

这里有个反向的经验:不要想当然地给 /opt/mysql 贴 mysqld_exec_t。一旦贴上去,进程会真的切换到 mysqld_t 域,而该域的策略是按发行版路径设计的(比如期望配置在 /etc/my.cnf、数据在 /var/lib/mysql、二进制在 /usr/bin),自定义路径下反而更容易触发一连串拒绝,把简单问题复杂化。

正确的顺序是:先跑,出拒绝再查。真出现问题时用:

sudo ausearch -m avc -ts recent

拿到具体的 denied 记录后再决定是打标签、还是用 audit2allow 补策略。没报错就别动它。


八、参数对齐对照表

参数 老系统 RDS 新实例 状态
版本 5.7.43-log 5.7.44 同属 5.7 系列
character_set_server utf8 utf8 一致
collation_server utf8_general_ci utf8_general_ci 一致
lower_case_table_names 1 1 一致
sql_mode 空 空 一致
default-storage-engine — InnoDB 本次设定
端口 — 3306 本次设定

四项影响数据语义的参数全部对齐。其中 lower_case_table_names 需要特别强调:它只能在初始化前设定,初始化之后再改会直接导致实例无法启动。所以这个值在 my.cnf 里的位置必须在 --initialize 之前就确定好,顺序不能颠倒。


九、结论与注意事项

发行版不给的包,用官方通用二进制包最省心。 Leap 16.0 仓库里只有 MariaDB,硬找第三方兼容仓库会带来信任和依赖污染问题。官方 tarball 自包含、可控、卸载即删目录,对生产机的侵入性最小。

非标准路径 + SELinux,先跑再修。 不要一上来就打标签。自定义路径下的二进制不匹配发行版的 *_exec_t 规则,反而会跑在 unconfined_service_t 里正常工作;盲目贴标签可能把进程拉进一个按标准路径设计的受限域,触发更多拒绝。

lower_case_table_names 是初始化前的"一次定生死"。 它决定了表名是否大小写敏感,且初始化后不可更改。迁移场景下这一项必须与源库完全一致,否则会出现大面积"表不存在"。

sql_mode 置空是兼容老系统的必要条件。 5.7 默认开启 ONLY_FULL_GROUP_BY 和 STRICT_TRANS_TABLES,老系统里那些不合规但能跑的 SQL 会直接报错。置空等于回到 5.6 的宽松行为。

Connection refused 与 Access denied 是两个层面的问题。 2003 / 61 refused 是 TCP 层被拒,查监听地址和防火墙;1045 Access denied 才是账号权限问题。方向搞错会在 mysql.user 上白折腾。

防火墙用 rich rule 而不是 --add-port。 前者能限定来源网段,后者对所有来源开放。账号 host 限制与防火墙规则应当同向叠加,形成两层控制。

账号 host 的 192.168.1.% 匹配不到 socket 连接。 本机 socket 连接的来源是 localhost,需要单独建账号。这个坑在"本机能用、远程报错"或反过来的场景里特别容易迷惑人。

空密码 root 必须立刻处理。 --initialize-insecure 留下的是空密码 root@localhost,配合 bind-address = 0.0.0.0 是明确的风险点,装完就要设密码。

MySQL 5.7 已 EOL,这是一个有时限的妥协。 2023 年 10 月 21 日之后不再有安全补丁,5.7.44 是终点。用它换取迁移期的行为一致性是合理的,但应同步规划升级到 8.0 的路径——尤其是字符集(utf8 → utf8mb4)和认证插件(mysql_native_password → caching_sha2_password)这两处升级时会遇到的硬约束。


十、附录

10.1 完整命令清单(可照序复现)

# 1. 系统依赖
sudo zypper install -y libaio1 libnuma1 tar gzip

# 2. 用户与目录
sudo groupadd -f -r mysql
sudo useradd -r -g mysql -s /usr/sbin/nologin -M mysql
sudo mkdir -p /var/lib/mysql /var/log/mysql
sudo chown -R mysql:mysql /var/lib/mysql /var/log/mysql

# 3. 部署二进制包
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
sudo tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz -C /opt
sudo mv /opt/mysql-5.7.44-linux-glibc2.12-x86_64 /opt/mysql
ls -l /opt/mysql/bin/mysqld

# 4. 补动态库
sudo ln -sf /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
sudo ln -sf /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
sudo ldconfig
ldd /opt/mysql/bin/mysql | grep "not found" || echo "依赖已齐全"

# 5. 写 /etc/my.cnf 与 /etc/systemd/system/mysqld.service(内容见 5.5 / 5.6)
ls -l /etc/my.cnf /etc/systemd/system/mysqld.service

# 6. 初始化
sudo /opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql
sudo ls /var/lib/mysql

# 7. 启动与验证
sudo systemctl daemon-reload
sudo systemctl enable mysqld
sudo systemctl start mysqld
sudo systemctl status mysqld --no-pager
/opt/mysql/bin/mysql -uroot -e "select version(); select @@lower_case_table_names, @@character_set_server, @@collation_server, @@sql_mode;"

# 8. 账号与密码
/opt/mysql/bin/mysql -uroot -e "CREATE USER 'zhoubo'@'192.168.1.%' IDENTIFIED BY '<密码>'; GRANT ALL PRIVILEGES ON *.* TO 'zhoubo'@'192.168.1.%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
/opt/mysql/bin/mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '<root密码>'; FLUSH PRIVILEGES;"

# 9. 防火墙放行内网网段
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-rich-rules

10.2 日常运维命令

# 启停与状态
sudo systemctl start mysqld
sudo systemctl stop mysqld
sudo systemctl restart mysqld
sudo systemctl status mysqld --no-pager

# 看错误日志
sudo tail -50 /var/log/mysql/error.log

# 登录
/opt/mysql/bin/mysql -uroot -p
/opt/mysql/bin/mysql -h192.168.1.151 -P3306 -uzhoubo -p

10.3 完全卸载(回滚)

按顺序执行,注意先停服务再删目录:

# 停服务并取消自启
sudo systemctl stop mysqld
sudo systemctl disable mysqld

# 移除服务单元
sudo rm -f /etc/systemd/system/mysqld.service
sudo systemctl daemon-reload

# 移除防火墙规则
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

# 移除程序、数据与配置
sudo rm -rf /opt/mysql /var/lib/mysql /var/log/mysql /etc/my.cnf

# 移除兼容软链
sudo rm -f /usr/lib64/libncurses.so.5 /usr/lib64/libtinfo.so.5
sudo ldconfig

# 移除用户(可选)
sudo userdel mysql
sudo groupdel mysql

卸载不会影响 PostgreSQL 18:所有被删除的路径、用户、服务单元、防火墙规则都是本次新增的,没有一项属于 PG。唯一需要确认的是软链——系统里原本没有 .so.5 这两个名字,删除是安全的。

分享此文

评论 (0)

还没有评论,来抢沙发。

发表评论