尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CentOS安装MySQL完整指南:版本选择、yum配置与常见坑

CentOS安装MySQL完整指南:版本选择、yum配置与常见坑 在 CentOS 上安装 MySQL 这件事看着简单——网上教程一搜一大把但真正自己动手的时候踩坑的人依然前仆后继。我自己从 CentOS 6 时代一路用过来装过 MySQL 5.1、5.5、5.6、5.7再到 8.0也帮不少同事排查过安装失败、初始化卡住、远程连不上这类问题。今天这篇就抛开那种复制粘贴的所谓教程用我实际操作的记录把 LinuxCentOS安装 MySQL 的完整路径、关键选型和那些文档里不会写的坑一次性说清楚。不管你是刚转行做运维的萌新还是需要在本地虚拟机里搭一套开发环境的程序员又或者是公司服务器上要部署生产库的负责人这篇文章都适用。核心思路是一致的先想清楚需求再选对安装方式然后按步骤执行最后把安全和备份做到位。下面直接进正题。1. 装之前先想清楚你需要的到底是什么1.1 版本选择MySQL 5.7 还是 8.0这一步很多人会忽略但它直接决定了你后面所有操作的复杂度。目前 CentOS 上主流的生产版本就是 5.7 和 8.0 两代这两者在安装包、初始化命令、认证插件、SQL 语法上都有明显差异。如果你是为了兼容老项目尤其是那种用了很久的 PHP 5.x 或者旧版 Java 应用老老实实选 5.7。为什么因为 MySQL 8.0 默认的认证插件换成了caching_sha2_password很多旧客户端和驱动不认识这个协议连接时会报Authentication plugin caching_sha2_password cannot be loaded这类错误。如果你在 Windows 上用 Navicat 连 CentOS 上的 MySQL版本配套很关键Navicat 老版本连 8.0 基本必踩这个坑。如果是从零开始的新项目直接上 8.0。它带来了窗口函数、公共表表达式、更好的优化器性能上也有明显提升。而且 8.0 的默认字符集是utf8mb4对现代应用更友好不用再像以前那样装完还要手动改字符集。这里有一个比较实用的判断标准安装前花两分钟确认你未来要连接 MySQL 的客户端版本和驱动版本。如果你的开发环境是 Navicat、DBeaver、MySQL Workbench 的较新版本8.0 完全没问题如果是老系统里内嵌的旧驱动就选 5.7别给自己找麻烦。1.2 安装方式对比yum、rpm 还是源码编译CentOS 下装 MySQL 主要有三种方式yum 源安装、rpm 包安装、源码编译安装。我全部试过说说实际感受。yum 安装是最推荐的方式没有之一。它最大的优势是自动处理依赖关系安装、升级、卸载都方便。如果你用 CentOS 自带的 yum 源去装默认装的是 MariaDB不是 MySQL这点要特别注意。正确做法是先把 MySQL 官方的 yum 源配置好然后直接用yum install mysql-server就能装到官方版本。rpm 包安装适合那种内网环境、无法访问外网的情况。你可以提前在一台能联网的机器上把所有需要的 rpm 包下载好打包传到内网服务器上用rpm -ivh一个个装。缺点是要自己处理依赖尤其是mysql-community-server依赖mysql-community-client、mysql-community-libs、mysql-community-common漏一个就装不上。源码编译安装我只有在需要定制 mysql 内核参数、或者需要魔改源码的时候才用。编译一次至少二三十分钟而且要对 gcc、cmake、boost 这些依赖非常熟悉不适合绝大多数场景。一句话能用 yum 就别折腾除非你有特殊需求。2. 环境准备与官方源配置2.1 从检查系统环境开始正式安装前先把系统环境摸清楚。这里我列一下我每次装库前的固定检查动作照着做可以避免很多后续问题。# 查看系统版本 cat /etc/redhat-release # 查看内核版本 uname -a # 检查是否已经装了 MySQL 或 MariaDB rpm -qa | grep -E mysql|mariadb # 查看系统内存和磁盘空间 free -h df -h系统版本决定了你选哪个版本的 MySQL yum 源。CentOS 7 和 CentOS 8 对应的源是分开的用错的话虽然也能装但会出现一些依赖上的小问题。内存方面MySQL 8.0 安装后默认配置下开机就会占 300-500MB 内存如果你是在虚拟机里装建议至少给 2GB 内存否则后面跑 SQL 查询会明显卡顿。磁盘空间也别忽视。MySQL 数据目录默认在/var/lib/mysql数据库文件会持续增长。我见过有人装完 MySQL 才发现根目录磁盘快满了只能折腾着迁移数据目录非常麻烦。建议预留至少 10GB 空间给数据目录如果打算用 Docker 或者虚拟机跑提前把磁盘资源规划好。还有一个很重要的检查点确认 SELinux 的状态。CentOS 默认开启了 SELinuxMySQL 安装过程中如果 SELinux 策略没放行会出现一些不明所以的权限问题比如启动失败、连接被拒绝。检查一下getenforce如果输出是Enforcing建议先临时关闭或设置为 permissive等安装完成再重新打开。很多网上教程不提这个你实际操作时就会遇到。2.2 配置 MySQL 官方 yum 源联网环境下最稳妥的方案是使用 MySQL 官方提供的 yum 源。官方源不只有最新版本还保留了历史版本你可以根据需要选择。以 CentOS 7 为例配置官方源的步骤如下# 下载官方 yum 源 rpm 包 wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm # 安装这个 rpm它会自动在 /etc/yum.repos.d/ 下生成 mysql-community.repo rpm -ivh mysql80-community-release-el7-7.noarch.rpm如果你要装 5.7安装 rpm 之后需要修改/etc/yum.repos.d/mysql-community.repo文件把 5.7 对应的enabled0改成enabled1同时把 8.0 的enabled1改成enabled0。这个文件里面其实写得很清楚每个小节的name、baseurl和enabled字段都有注释。改完以后执行一条命令验证源是否生效yum repolist enabled | grep mysql这一步如果你没看到任何输出说明源没配好或者没开启对应版本别急着往下走。配置源这一步出错后续所有环节都会跟着崩宁可多花两分钟确认。2.3 解决 CentOS 自带 MariaDB 冲突这是新手最容易懵的地方。CentOS 7 和 8 的系统镜像默认自带 MariaDB一个 MySQL 的分支你直接执行yum install mysql会有概率装出个不伦不类的东西或者和系统自带的 MariaDB 发生冲突。我的建议是安装官方 MySQL 之前先把系统自带的 MariaDB 清理干净。# 卸载系统自带的 mariadb 相关包 yum remove mariadb mariadb-server mariadb-libs mariadb-devel # 清楚残留的配置文件和数据目录 rm -rf /var/lib/mysql rm -rf /etc/my.cnf有朋友会问删掉了 /var/lib/mysql 会不会把以后的数据也删了其实不会因为新的 MySQL 安装会重新创建这个目录和对应权限。但删除前我还是建议你检查一下里面有没有重要数据毕竟有些场景下这个目录里装着以前服务留下的数据一旦删错就找不回来了。清理完成后再执行rpm -qa | grep mariadb确认输出为空再进行下一步。3. 核心安装步骤与初始化配置3.1 执行安装与启动服务源配好、系统清理干净之后安装就非常顺手了。直接用 yum 安装官方 MySQL# 使用 yum 安装 MySQL 服务端 yum install -y mysql-community-server安装完成后先不要急着启动先了解一下 MySQL 8.0 和 5.7 的启动方式差异。在 CentOS 7 之后统一使用 systemd 管理服务# 启动 MySQL 服务 systemctl start mysqld # 设置开机自启 systemctl enable mysqld # 查看运行状态 systemctl status mysqld如果你熟悉的是老式的service mysqld start命令在 CentOS 7 上也能用但本质还是调用 systemd。另外MySQL 服务名在很多新版安装包里叫mysqld而不是mysql命令错了会得到报错Failed to start mysql.service: Unit not found。启动之后最好立刻确认端口是否在监听netstat -tlnp | grep 3306如果 3306 端口没有 LISTEN大概率是启动失败了。此时要去看日志日志文件在/var/log/mysqld.log里面有详细的报错信息。定位问题最忌瞎猜日志是第一手信息。3.2 初始密码获取与安全初始化MySQL 从 5.7 开始安装后会自动生成一个临时初始密码保存在日志文件里。有些朋友手动把skip-grant-tables加进配置文件来免密登录这我不推荐因为很容易引入安全风险还会让后续的权限验证出乱子。正确的取密码方式是grep temporary password /var/log/mysqld.log我遇到过日志里查不到临时密码的情况原因一般是日志文件权限不对或者安装的是老版本 MySQL 5.65.6 默认密码为空。如果确实查不到可以先修改/etc/my.cnf在[mysqld]段临时加一行skip-grant-tables然后重启 MySQL 免密进入把 root 密码改掉再把这行注释掉并重启服务。整个过程要注意修改完密码后务必去掉skip-grant-tables否则你相当于把数据库大门敞开着给所有人看。拿到临时密码后的第一件事就是执行安全初始化脚本。这个脚本会引导你完成密码强度设置、删除匿名用户、禁用 root 远程登录、删除测试数据库等一系列安全配置mysql_secure_installation这个交互式脚本是英文界面流程大概是输入当前 root 密码设置新密码要求至少 8 位且包含大小写字母、数字和特殊字符确认是否删除匿名用户建议选 Y确认是否禁止 root 远程登录这里要看你的需求如果只有本机访问选 Y如果应用服务器是远程的先选 N后面再单独授权确认是否删除 test 测试库建议选 Y确认是否重新加载权限表选 Y我个人的建议是即使你觉得默认提示烦琐也尽量把每一项都走完别图省事。安全这东西平时看不出价值出事才追悔莫及。3.3 远程访问授权与防火墙设置默认情况下MySQL 只允许 root 从 localhost 登录也就是只能在本机访问。如果你是需要远程连接的场景——比如本机用 MySQL Workbench 连虚拟机里的数据库——就必须手动授权并配置防火墙。授权操作并不复杂但有几个坑要注意。我先说 8.0再对照说 5.7。8.0 的授权方式-- 创建专用账号这里我建议不要直接用 root而是建一个业务账号 CREATE USER app_user% IDENTIFIED BY YourStrongPassword123!; -- 给这个账号授权all privileges 能用但实际生产环境我倾向于按需授权 GRANT ALL PRIVILEGES ON *.* TO app_user%; -- 刷新权限 FLUSH PRIVILEGES;5.7 的授权方式-- 5.7 可以直接用 GRANT 同时创建用户和授权 GRANT ALL PRIVILEGES ON *.* TO app_user% IDENTIFIED BY YourStrongPassword123!; FLUSH PRIVILEGES;如果你直接照搬 8.0 的写法到 5.7没问题但把 5.7 的GRANT ... IDENTIFIED BY写法拿到 8.0就会报错。8.0 已经不允许 GRANT 里直接创建用户了必须先用 CREATE USER 建好用户再授权。防火墙这一块CentOS 7 默认用的是 firewalld。如果你已经确认 MySQL 在监听但远程就是连不上八成是防火墙拦住了 3306 端口# 放行 3306 端口 firewall-cmd --zonepublic --add-port3306/tcp --permanent # 重新加载防火墙配置 firewall-cmd --reload还有一种情况是云服务器安全组没有放行端口这个和服务器内部防火墙无关需要去云控制台操作。我遇到不少学员反馈“防火墙关了也连不上”最后发现是云安全组没配置这个一定要记得检查。4. 常见问题排查与避坑技巧4.1 启动失败与日志排查启动失败是安装环节里出现频率最高的异常。核心排查路径就三步看服务状态、看日志、看端口占用。# 第一步查看服务状态 systemctl status mysqld # 第二步查看日志最后 50 行 tail -n 50 /var/log/mysqld.log # 第三步检查端口占用 netstat -tlnp | grep 3306日志是定位问题的金钥匙。常见的有这么几种情况第一种日志里出现[ERROR] Cant start server: Bind on TCP/IP port: Permission denied这通常是 SELinux 拦截导致的参考我前面说的临时关闭 SELinux或者正确配置策略。第二种出现[ERROR] The server quit without updating PID file这种大多是数据目录权限不对MySQL 进程无法写文件。修复方式chown -R mysql:mysql /var/lib/mysql chmod -R 755 /var/lib/mysql第三种是端口被别的程序占用。如果你之前装过别的数据库比如 MariaDB、Redis 或者其他服务占用了 3306 端口也会启动失败。此时用lsof -i:3306查占用进程再决定是杀掉进程还是修改 MySQL 端口。4.2 密码策略与连接错误密码策略是另一个高频问题点。MySQL 默认的密码校验插件validate_password要求密码长度至少 8 位并且包含大小写、数字、特殊字符。有些教程在测试环境想用简单密码比如123456就会报ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。如果你确实是在本地开发环境想降低密码策略强度可以这样调整-- 查看当前密码策略 SHOW VARIABLES LIKE validate_password%; -- 降低密码长度要求 SET GLOBAL validate_password_length 6; -- 降低密码强度要求为 LOW只检查长度 SET GLOBAL validate_password_policy LOW;但这里我要提醒一句这只是开发环境图省事的做法生产环境还是保持默认策略比较安全。另外这些SET GLOBAL是临时生效的重启后又回到默认值。如果你希望永久生效要写进/etc/my.cnf的[mysqld]段。连接错误也是一个常见雷区。比如你输入正确的密码报ERROR 1045 (28000): Access denied for user rootlocalhost可能是密码输错了也可能是密码包含特殊字符被 shell 转义了。特别是密码里有$、!、这些字符时在命令行里需要用单引号包起来否则 shell 会把它们当特殊符号处理。4.3 磁盘不足与数据目录迁移装完 MySQL 只是开始跑着跑着磁盘满了是常事。默认的数据目录在/var/lib/mysql一旦根分区满了MySQL 会直接无法写入表现为应用报 “The table is full” 或者 MySQL 进程异常退出。此时最常用的方案是把数据目录迁移到大容量分区。整体流程如下# 停止 MySQL 服务 systemctl stop mysqld # 使用 rsync 同步数据目录到新位置比如 /data/mysql rsync -av /var/lib/mysql/ /data/mysql/ # 修改配置文件 vi /etc/my.cnf # 在 [mysqld] 段修改或添加 datadir/data/mysql # 如果修改了 socket 文件位置需要一并修改 socket/data/mysql/mysql.sock # 重新启动 systemctl start mysqld迁移数据目录后还要处理 SELinux 和 AppArmor 的相关配置CentOS 上主要是 SELinux。如果启动时日志报权限相关的错误可以用restorecon -Rv /data/mysql恢复文件的安全上下文。这个细节我一开始也吃过亏后来才知道光chown mysql:mysql还不够CentOS 的 SELinux 会管第二层有些发行版的移动数据目录操作比这更麻烦。5. 落地之后的服务管理与日常维护5.1 systemd 管理与开机自启细节安装完成、能正常连接之后我建议你把服务管理的基础操作背下来。日常使用频率最高的就是 systemctl 那几条命令# 启动、停止、重启 systemctl start mysqld systemctl stop mysqld systemctl restart mysqld # 设置开机自启 systemctl enable mysqld # 查看是否设置了开机自启 systemctl is-enabled mysqld另外MySQL 8.0 官方包会默认创建/etc/my.cnf以及/etc/my.cnf.d/目录你写的自定义配置应该放在/etc/my.cnf.d/下比如新建一个custom.cnf。这样做的目的是保持配置模块化升级 MySQL 版本时不容易被覆盖。我见过有同事把业务配置直接写在/etc/my.cnf里结果升级官方 rpm 包时配置被覆盖数据库起不来场面一度很崩溃。5.2 备份与恢复基本功安装和初始化的完成不代表你的数据库已经安全稳固备份是第一生命线。哪怕是一个简单的个人项目备份也要养成习惯。我最常用的就是mysqldump虽然慢一点但逻辑清晰、适用范围广# 备份指定数据库 mysqldump -u root -p --single-transaction --routines --triggers mydb mydb_backup.sql # 恢复 mysql -u root -p mydb mydb_backup.sql--single-transaction参数很关键它能在不锁表的情况下做 InnoDB 表的一致性备份对生产环境是基本操作。--routines和--triggers是备份存储过程和触发器用的有存储过程需求的千万别漏掉我就见过只备份了表结构结果丢了存储过程的惨案。对于数据量大的库用xtrabackup做物理备份是更合适的选择这里先不展开但你要知道有这两套备份方案根据数据量选择合适的手段。另外备份文件不要只存在同一台机器上。万一这台服务器硬盘损坏、机房故障备份也跟着没了才是最尴尬的。定期把备份文件传到其他存储这个习惯一旦建立你会感谢自己。5.3 性能参数快速调优给新手的参考很多人装完 MySQL 之后直接用默认配置跑跑了半年来求助说数据库性能差。实际上 MySQL 的默认配置更多是考虑通用兼容性不会针对你的服务器做优化。这里我给出几个参考调优点不涉及高深理论新手上手就能改。首先要确认你的总内存大小然后按比例分配。一个常见的起步配置是这样的假设你的服务器内存是 8GB[mysqld] # 连接数默认 151如果并发不高可以先不动 max_connections 500 # InnoDB 缓冲池大小建议设成物理内存的 50%-70% innodb_buffer_pool_size 4G # 日志文件大小默认值有时候太小影响写入性能 innodb_log_file_size 256M # 允许的最大数据包大小导入大 sql 文件时有用 max_allowed_packet 64M # 字符集统一为 utf8mb4 character-set-server utf8mb4 collation-server utf8mb4_general_ci修改配置后记得重启 MySQLsystemctl restart mysqld。然后执行SHOW VARIABLES LIKE innodb_buffer_pool_size;确认参数生效。注意innodb_buffer_pool_size在 5.7 版本之后可以动态调整但在配置文件里修改仍然是最稳妥的方式。还有一个小技巧用SHOW STATUS查看 MySQL 运行状态比如Threads_connected可以看当前连接数Slow_queries可以查看慢查询数量。对这些指标心里有数才能对性能瓶颈有一个大概判断而不是等出了问题再手忙脚乱。根据我个人实际操作的经验装 MySQL 这个事大部分坑都出在安装前的准备和安装后的配置上。版本选错、源配错、SELinux 没处理、安全初始化没做、远程访问没配好——这五个环节覆盖了九成以上的问题。我这几年下来已经把一套检查流程固定成了习惯每次装完都会按步骤确认一遍先看版本再看端口再测连接再跑一次mysql_secure_installation最后做一次全量备份和恢复演练。这套流程看似繁琐但确实帮我避开了很多后期隐患。另外还要提醒一句MySQL 安装本身只是数据库应用的开始后面还有用户权限管理、慢日志分析、主从复制、高可用方案等一大片领域。文章里涉及的这些常用命令和排查思路希望你们收藏下来实际遇到问题时拿出来对照排查一遍很多时候比盲目搜索教程来得高效得多。
返回列表