Linux下MySQL数据库安装与基础配置

站长资讯56分钟前发布 jdkjadmin
0 00
Linux下MySQL数据库安装与基础配置

Linux下MySQL数据库安装与基础配置

MySQL 常用于网站、业务系统和内部工具的数据持久化。Linux 上安装 MySQL 并不只是执行一条安装命令:发行版和软件仓库会影响可用版本与默认配置;数据库监听地址、账号授权和防火墙共同决定能否远程访问;备份是否可恢复,则决定故障后能否真正找回数据。

本文以常见的 Ubuntu/Debian 和 RHEL 系发行版为例,介绍安装、启动、初始化、安全配置、远程连接、备份恢复和故障排查。示例面向单机开发或小型服务。生产环境还需结合数据规模、可用性要求、网络架构和运维规范评估,不应把示例直接当作完整的高可用或合规方案。

一、适用场景与关键边界

MySQL 是关系型数据库,适合需要结构化数据、事务、索引和 SQL 查询的应用,例如用户与订单、内容管理、业务后台等。它支持事务与多种存储引擎;实际事务行为、锁定方式和崩溃恢复能力与存储引擎及配置有关。常规业务表通常使用 InnoDB。

安装前应先确定以下事项:

  • 版本来源:发行版自带仓库、Oracle MySQL 仓库和其他供应商仓库,提供的版本、更新节奏和默认配置可能不同。不要只看命令名称就假定安装的是某个精确版本。
  • 数据目录:数据库文件默认位于发行版配置指定的位置。不要在服务运行时直接搬动或手工改写数据文件;迁移数据目录需要停止服务、正确设置权限并检查配置。
  • 网络边界:服务监听地址、主机防火墙、云平台安全组和 MySQL 用户的主机匹配规则是不同层次。开放其中一层,不代表其他层自动放行。
  • 资源规划:数据库会占用内存、磁盘和文件描述符。特别是 InnoDB 缓冲池等参数,不能脱离机器内存、连接负载和其他服务一概设定为固定值。
  • 运维目标:单机安装不等于高可用。复制、自动故障切换、时间点恢复、监控和恢复演练需要另行设计。

下面的命令假设使用具有 sudo 权限的普通账号。请在开始前确认发行版、架构、磁盘空间和目标 MySQL 版本,并从可信软件源安装。生产环境不建议在不了解影响的情况下跨大版本升级或混用多个来源的软件包。

二、安装前确认系统信息

先查看发行版与磁盘情况,避免把适用于某个系统的包管理命令直接套到另一种发行版上。

cat /etc/os-release
uname -m
df -h
free -h

同时检查系统时间是否正确。错误的系统时间会影响日志排查、证书校验和依赖时间戳的业务逻辑。时区设置应符合服务器管理规范,业务中通常建议统一使用 UTC 存储时间,并由应用负责展示时区。

三、在 Ubuntu 或 Debian 上安装

Ubuntu 和 Debian 的默认仓库通常可以通过 APT 安装服务器包。不同发行版版本和仓库配置可能提供不同的 MySQL 版本,执行前可先查询候选版本。

sudo apt update
apt-cache policy mysql-server

确认包来源和版本后安装:

sudo apt install mysql-server

安装完成后检查服务状态:

sudo systemctl status mysql --no-pager
mysql --version

若服务没有自动启动,可执行:

sudo systemctl start mysql
sudo systemctl enable mysql

enable 表示配置为随系统启动,不等同于立即启动;start 用于当前启动服务。生产服务器是否应设置开机启动,应与服务恢复策略一致。

在部分 Ubuntu/Debian 安装方式中,系统数据库管理员可能通过本机 Unix socket 认证,因此使用操作系统 sudo 权限执行 sudo mysql 可以进入客户端,而不需要输入数据库 root 密码。具体认证方式取决于包和初始化配置。若需要确认,可登录后查看账号认证插件,不要为了“能用密码登录”而随意改动 root 认证方式。

sudo mysql

四、在 RHEL 系发行版上安装

RHEL、Rocky Linux、AlmaLinux 等系统的软件仓库和 MySQL 包来源可能不同。系统仓库可能提供发行版维护的兼容实现;若明确需要 Oracle MySQL 的特定版本,通常要按 Oracle 官方文档配置对应仓库。不要同时启用互相冲突的数据库仓库,也不要假设包名相同就意味着版本和行为完全一致。

先查询当前启用仓库中可用的包:

sudo dnf info mysql-server

如果仓库中有符合需求的 MySQL Server 包,可以安装并启动:

sudo dnf install mysql-server
sudo systemctl enable --now mysqld
sudo systemctl status mysqld --no-pager

某些 Oracle MySQL 软件包安装后会生成临时 root 密码,通常可在服务日志中查找;其他打包方式或版本可能采用不同的初始化流程。先按对应软件包文档核对,不要将“日志中一定有临时密码”当作通用规则。

sudo journalctl -u mysqld --no-pager

如果从 Oracle 官方仓库安装,应使用该仓库对应的包管理说明、版本选择方式和升级说明。仓库配置属于系统级变更,升级前应确认候选版本、备份状态和兼容性。

五、安装后检查与初始化

检查服务是否正在运行,并确认客户端能连接。Ubuntu/Debian 的服务单元通常名为 mysql,RHEL 系常见名称为 mysqld,以实际系统为准。

sudo systemctl is-active mysql
sudo systemctl is-active mysqld

未安装或不存在的服务单元会返回错误,这是名称不匹配时的常见现象,并不一定说明数据库本身损坏。可以用以下命令查看系统中相关单元:

systemctl list-unit-files | grep -E 'mysql|mysqld'

MySQL Server 8.0 及之后版本提供 mysql_secure_installation 辅助程序;不同发行版、版本及安装方式中,其可用性和交互内容可能不同。先确认程序存在:

command -v mysql_secure_installation

若存在,可按提示检查匿名账号、测试数据库等初始化项目,并根据本机认证方式设置管理账号。工具提示并不替代人工审查:例如是否允许本机管理、是否需要删除测试对象,应按实际用途决定。不要把数据库 root 账号用于应用程序。

登录后可查看版本、数据目录和监听相关变量:

SELECT VERSION();
SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'bind_address';
SHOW VARIABLES LIKE 'port';

也可检查数据库中已有的账号及认证插件。查询账号信息需要相应权限,生产操作前应确认不会泄露账号信息到公开日志或工单中。

SELECT user, host, plugin
FROM mysql.user
ORDER BY user, host;

六、创建应用数据库与专用账号

应用应使用专用账号,并只获得完成工作所需的权限。不要在应用配置中使用 root,也不要给普通业务账号授予 ALL ON *.*。以下示例创建一个数据库和本机连接账号。请将示例密码替换为安全管理系统生成并保存的随机密码。

CREATE DATABASE appdb
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_0900_ai_ci;

CREATE USER 'appuser'@'localhost'
  IDENTIFIED BY '替换为随机生成的强密码';

GRANT SELECT, INSERT, UPDATE, DELETE
  ON appdb.*
  TO 'appuser'@'localhost';

SHOW GRANTS FOR 'appuser'@'localhost';

utf8mb4 可用于存储完整 Unicode 字符。示例中的 utf8mb4_0900_ai_ci 是 MySQL 8.0 系列常见排序规则,但较旧版本或其他兼容实现可能不支持。创建数据库时报排序规则不存在,应先检查服务器版本和可用排序规则,而不是盲目更改服务器版本。

示例授权只包含常见数据读写权限。若应用需要创建或修改表,可能还需要按部署流程临时或长期授予相应的 DDL 权限,例如 CREATE、ALTER、INDEX。应根据应用行为单独评估,而不是为了省事授予全局管理权限。MySQL 8.0 的 CREATE USER 和 GRANT 会更新权限信息,不需要再执行旧式的 FLUSH PRIVILEGES。

账号中的主机部分是授权匹配条件,不是密码的一部分。'appuser'@'localhost' 适用于本机连接;它不会自动允许任意远程主机连接。用 '%' 表示匹配范围较宽的主机时,风险也随之扩大,不应把它当作默认远程配置。优先限定应用服务器的固定来源地址,并在防火墙与网络层一并限制。

需要应用创建表时,可以按确切需求增加权限,例如:

GRANT CREATE, ALTER, INDEX
  ON appdb.*
  TO 'appuser'@'localhost';

SHOW GRANTS FOR 'appuser'@'localhost';

权限应定期复核。删除不再使用的账号时,先确认没有任务或服务依赖该账号,再执行:

DROP USER 'appuser'@'localhost';

七、常见基础配置

MySQL 配置文件位置依发行版和安装来源而异。常见位置包括 /etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf、/etc/my.cnf 和 /etc/my.cnf.d/。先检查主配置文件包含了哪些目录,再编辑实际生效的服务端配置文件,避免写在未被读取的位置。

sudo grep -R "includedir\\|!include" /etc/mysql /etc/my.cnf /etc/my.cnf.d 2>/dev/null
sudo find /etc/mysql /etc/my.cnf.d -maxdepth 3 -type f 2>/dev/null

配置项应放在服务端配置段,例如 [mysqld],而不是客户端段。下面是格式示例,不要求所有系统使用同一文件路径:

[mysqld]
port = 3306
bind-address = 127.0.0.1

若修改配置,先备份文件,再检查拼写和当前版本是否支持相关选项。MySQL 有些设置可动态修改,有些需要重启;具体以变量说明和版本文档为准。配置文件有错误时,服务可能无法启动,应结合错误日志定位,而不是反复添加同一参数。

监听地址与远程连接边界

bind-address 决定服务监听的本地网络地址。设为 127.0.0.1 通常表示只接受本机 TCP 连接;设为特定内网地址可限制监听接口;设为通配地址则可能在所有可用接口监听,具体行为要以版本和平台为准。监听在所有接口不等于自动对互联网开放,但会扩大需要审查的网络暴露面。

如确实需要从其他主机连接,先选定私有网络接口地址,并检查实例实际地址。不要仅为解决连接问题就绑定所有接口。修改后重启服务并确认生效:

sudo systemctl restart mysql
sudo systemctl restart mysqld
sudo ss -lntp | grep 3306

前两条命令对应不同发行版的服务名,实际只需执行适用的一条。若服务重启失败,立即检查服务状态与日志。

字符集设置

新建数据库时显式指定字符集和排序规则通常更容易维护。服务器默认字符集、客户端连接字符集和既有数据库的字符集是不同层面。更改服务器默认值不会自动转换已有数据,也不应在不了解兼容性时对生产表执行全库转换。

可以查看当前连接与服务器设置:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

应用程序应使用数据库驱动提供的字符集配置,避免自行拼接编码转换逻辑。若遇到乱码,先检查数据写入时的连接编码、字段类型、历史数据和客户端显示编码,不能仅通过修改一个全局变量推断问题已解决。

八、配置远程访问与防火墙

远程连接需要同时满足:MySQL 在目标地址监听、账号允许来源主机、网络路由可达、防火墙放行,以及客户端使用正确的地址、端口和认证信息。任何一项失败都可能导致连接超时或被拒绝。

假设应用服务器的内网地址为 10.20.30.40,数据库监听在可由该服务器访问的内网接口。可以为该来源创建单独账号:

CREATE USER 'appuser'@'10.20.30.40'
  IDENTIFIED BY '替换为随机生成的强密码';

GRANT SELECT, INSERT, UPDATE, DELETE
  ON appdb.*
  TO 'appuser'@'10.20.30.40';

来源地址变化时,主机匹配可能不再成立。要使用网段匹配或其他主机模式,应先理解所用 MySQL 版本的账号匹配规则;不要用宽泛匹配掩盖网络规划问题。应用与数据库跨公网通信时,应使用经过验证的加密传输方案或私有网络,不应把明文凭据直接暴露在不可信网络中。

若服务器使用 UFW,可只允许指定来源访问数据库端口:

sudo ufw allow from 10.20.30.40 to any port 3306 proto tcp
sudo ufw status verbose

使用 firewalld 的系统可以按实际区域和网段配置规则;以下示例添加的是较宽的端口放行规则,生产中应优先限制来源,且需确认接口所在区域:

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.30.40/32" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

云主机还需要检查云平台安全组或网络访问控制列表。不要因为本机防火墙显示放行,就认定外部必然可访问。反过来,也不要为了排查而长期关闭整个防火墙。

从客户端测试时可使用:

mysql --host=数据库内网地址 --port=3306 --user=appuser --password appdb

--password 后不写密码,会由客户端交互提示输入,避免把明文密码留在命令历史或进程参数中。仍需确保终端和凭据输入环境可信。不要使用 -p密码 这种把密码直接写在命令行的方式。

九、密码、认证与基础安全

密码强度和密码策略由账号管理方式及服务器配置决定。MySQL 可配置密码校验组件或策略,但不同版本和发行版的默认状态不完全相同。不要未经验证就宣称密码必须满足某一固定长度或字符规则;应检查服务器实际策略,并使用密码管理器生成随机、唯一的密码。

应用凭据应通过受限权限的配置文件、密钥管理服务或部署平台的秘密管理功能提供。避免将凭据提交到代码仓库、写入公开脚本、放在命令行参数中或打印进日志。数据库账号和操作系统账号是两套身份体系,拥有系统 sudo 权限并不意味着应用程序应使用数据库管理员身份。

MySQL 8.0 默认常见认证插件是 caching_sha2_password,新旧客户端兼容性可能不同。若客户端连接时报认证插件相关错误,应升级客户端驱动并核对服务端版本、TLS 和认证配置。不要为了迁就旧客户端,未经安全评估就降低认证方式或启用不适合当前版本的旧插件。

应及时安装安全更新,但升级前要核对版本路径、应用兼容性和回退方案。包管理器自动更新是否适合数据库服务器,取决于维护窗口和变更流程;不能假设每次自动升级都没有服务中断或行为变化。

十、备份与恢复

备份不仅是生成文件,还要确认备份可读、保存在独立故障域,并定期演练恢复。对于小型数据库,可以使用 mysqldump 逻辑备份。以下示例通过交互提示输入密码,并导出结构和数据:

mysqldump --host=localhost --user=backupuser --password \
  --single-transaction --routines --events \
  appdb > appdb_$(date +%F).sql

--single-transaction 对 InnoDB 等支持事务一致性读的表有助于在导出期间获得一致性快照;它不能保证非事务表的一致性,也不替代针对业务写入和 DDL 变更的备份规划。大型数据库的逻辑导出可能耗时较长并增加资源负担,应先在相似规模环境中评估。

生产使用时应限制备份账号权限,并将备份文件写入有访问控制的位置。备份文件可能包含全部业务数据和个人信息,权限、加密、保留期限和异地副本都需要纳入安全管理。下面仅演示恢复命令,执行前应确认目标库和覆盖风险:

mysql --host=localhost --user=restoreuser --password appdb \
  < appdb_2025-01-31.sql

恢复到已有数据库可能覆盖或冲突;不要在生产库上未经验证地直接执行。较稳妥的做法是在隔离环境恢复,核对表数量、关键数据和应用行为,再按维护计划切换。若需要时间点恢复或大规模数据恢复,应评估二进制日志、物理备份工具和复制架构,而不是只依赖定期 SQL 导出。

十一、常见错误与排查顺序

1. 找不到服务单元

常见原因是服务名写错、包未安装或安装来源不同。先检查已安装的软件包与服务单元,不要反复执行不适用的启动命令。

systemctl list-unit-files | grep -E 'mysql|mysqld'
dpkg -l | grep -i mysql
rpm -qa | grep -i mysql

dpkg 与 rpm 命令分别用于不同包管理体系,选择对应的一组检查即可。

2. 服务启动失败

先检查服务状态和最近日志,重点关注配置项拼写、配置文件段落、端口占用、数据目录权限、磁盘空间和文件系统只读状态。

sudo systemctl status mysql --no-pager
sudo journalctl -u mysql -n 100 --no-pager
sudo systemctl status mysqld --no-pager
sudo journalctl -u mysqld -n 100 --no-pager
df -h

实际只查询当前系统对应的服务。不要通过删除数据目录或清空日志来“修复”启动失败;这可能造成不可逆的数据丢失。先备份现场并根据错误日志定位原因。

3. 提示 Access denied

检查用户名、密码、账号的主机部分、认证插件和目标实例。以 localhost 连接与通过 TCP 连接到 127.0.0.1 的认证路径可能不同;同名的不同主机账号也可能匹配到不同权限。用管理员账号查看目标账号的授权,并确认客户端连接的并非另一台数据库。

4. 连接超时或连接被拒绝

连接被拒绝通常表示目标地址上没有对应监听服务,或网络设备主动拒绝;超时常与路由、防火墙或安全组有关。按顺序检查服务状态、监听地址与端口、账号授权、主机防火墙、云安全组和客户端目标地址。可在数据库主机使用 ss -lntp 检查监听,但看到端口监听并不代表远程网络一定可达。

5. 端口已被占用

MySQL 默认常用 TCP 端口为 3306,但端口可配置,其他进程也可能占用。先确认监听进程,不要直接结束不明进程:

sudo ss -lntp | grep ':3306'

如果需要更换端口,应同步更新服务端配置、客户端连接参数、防火墙规则和监控配置。端口改为非默认值只能改变扫描的便利程度,不是访问控制或安全加固的替代方案。

6. 修改配置后无法启动

检查配置是否位于实际读取的文件、是否写在正确段落、参数是否被当前版本支持,以及文件权限和格式是否正确。回滚最近一次变更并查看错误日志通常比连续添加配置更有效。不要仅凭客户端无法连接就修改数据目录、认证插件和多项网络参数。

十二、日常管理建议

  • 记录软件来源、版本、配置文件位置、数据目录和维护联系人,避免交接时凭经验猜测。
  • 监控磁盘空间、连接数、错误日志、备份任务和关键业务查询;监控告警应能区分容量问题与服务不可用。
  • 为账号设置最小权限,定期清理离职人员、测试环境和已废弃服务留下的账号。
  • 在版本升级、配置变更和数据迁移前执行备份,并验证恢复路径。仅看到备份命令成功不等于备份可用。
  • 需要远程访问时优先使用私有网络,限制来源地址,并结合 TLS、网络访问控制和账号权限共同保护连接。
  • 将数据库变更纳入维护流程。生产环境调整字符集、排序规则、数据目录、存储引擎和内存参数前,应先评估对现有数据与业务的影响。

结语

Linux 上安装 MySQL 的命令并不复杂,难点在于确认软件来源与版本、识别发行版差异、控制监听范围、正确设计账号权限,以及建立可验证的备份恢复流程。先在隔离环境完成安装和连接测试,再按最小权限原则配置业务账号;需要远程访问时逐层检查网络边界;进入生产前则应完成升级、恢复和故障演练。这样得到的数据库才不仅是“能够启动”,也更便于维护和排查。

© 版权声明

相关文章