这事儿得从上周说起。一个刚转行做运维的朋友半夜给我发消息,说他公司服务器要装 MySQL,照着教程折腾了俩小时,结果连服务都起不来。我隔着屏幕都能感受到他的崩溃——不是代码难,而是 Linux 下装数据库这事儿,看着简单,坑却能踩出一串。这让我想起自己当年第一次在 CentOS 上装 Oracle,装完发现连图形界面都没有,差点把键盘砸了。

其实 Linux 装数据库,说白了就是三个步骤:选、下、配。但每个步骤里都藏着细节。先说选择。别以为这是个简单决定——MySQL、PostgreSQL、MariaDB、MongoDB,甚至 Oracle,哪个适合你的场景?要是做 Web 开发,MySQL 或它的分支 MariaDB 最稳,社区资源多,遇到问题百度一下全是答案。但如果你搞的是数据分析,PostgreSQL 的 JSON 支持和窗口函数能让你的 SQL 写得飞起。我见过一个团队,为了图省事直接装了默认的 MySQL,结果业务需要地理空间查询,才发现 MySQL 对 PostGIS 的支持鸡肋得要命,最后全量迁移,加班了一个月。
下载这步看着简单,却最容易出幺蛾子。很多人习惯直接 或者 ,图省事。但系统源里的版本通常落后两三年,甚至更老。去年有个安全漏洞爆出来,影响 MySQL 5.7 以下所有版本,结果那些用系统源装的用户连补丁都不好打,因为官方早就不维护这些老版本了。正确做法是去官网或官方镜像站下载最新稳定版,或者使用官方提供的 APT/YUM 仓库。比如 MySQL 有官方的 APT 仓库,装完以后 再 ,版本就是最新的。别嫌麻烦,这一步省了,后面能少哭十次。
安装过程中,最让人头疼的是依赖冲突。Linux 发行版之间各有脾气,Ubuntu、Debian 系用 APT,CentOS、RHEL 系用 YUM 或 DNF,SUSE 用 Zypper。你从官网下载一个 RPM 包,双击安装,系统告诉你“缺少 libaio.so.1”。然后你装了 libaio,又提示“缺少 libncurses.so.5”。这就是典型的“链式依赖地狱”。更绝的是,有时候两个包互相依赖,形成闭环——装 A 需要 B,装 B 需要 A,这时候只能强制安装或用 参数跳过检查,但跳过后可能运行时报错。我见过有人装 MySQL 装到半夜三点,就是因为一个 Perl 模块版本不对,发现是系统自带的 Perl 太老,得先升级它。
配置这一步,才是真正拉开新手和老手差距的地方。默认安装完的数据库,安全配置基本为零。我刚入行时,领导让我上线一套 MySQL,我直接 就交给前端了。结果第二天数据库被黑,黑客在表里留了一句话:“你的密码太弱了,我帮你改了。”那会儿用的是 root 无密码,端口 3306 暴露在公网。现在想起来都后怕。正确姿势是:装完立刻跑 ,设置 root 密码、删除匿名用户、禁止远程 root 登录、删除测试数据库。另外, 要设成 127.0.0.1,除非真的需要远程连接。端口也别用默认的 3306,改成 3307 或其他,能省掉一半的扫描攻击。
性能调优这块,很多人直接忽略,等到业务跑起来才发现不对劲。默认的配置文件 (或 )里,缓冲池大小、连接数限制、日志文件大小都是保守值。举个例子,InnoDB 缓冲池默认只有 128 MB,你要是跑一个几百万行的表,查询速度慢得像蜗牛。正确做法是根据服务器内存来调整:内存 16 GB 的机器,缓冲池设到 8‑10 GB;内存 8 GB 的设到 4‑5 GB。连接数也别默认 151,如果业务并发高,设到 500 甚至 1000。日志文件大小默认是 48 MB,写日志频繁的话,很快就把磁盘撑爆。我有个朋友做电商,双十一那天数据库挂了,查了半天发现是 binlog 把磁盘塞满了,临时清数据清到手软。
文件权限也是个容易被忽略的坑。Linux 下,数据库的数据文件、日志文件、配置文件都有严格的权限要求。MySQL 运行用户是 ,所以数据目录 的属主和属组必须是 mysql,权限一般是 750。如果你用 root 去改了这个目录的权限,或者不小心把文件拷到别的目录,服务启动时就会报 “Permission denied”。更隐蔽的是 SELinux,它会在背后拦截所有“不合规”的操作。比如你把 MySQL 的数据目录改到 ,如果 SELinux 没放行,服务就起不来。这时候要么关闭 SELinux(不推荐),要么用 给新目录打上 标签。
备份和恢复策略应该在装完数据库后立刻规划,但很多人都是等到出事才想起来。我见过一个公司,数据库跑在云上,运维觉得云服务商的快照就行了。结果某天一个开发手误执行了 ,快照是每天凌晨一次的,数据丢了大半天。花了两天从 binlog 里恢复,还丢了几百条订单。正确做法是:装完数据库就配置定时备份,用 或 ,全量加增量,每天凌晨跑。备份文件要存到不同的磁盘或对象存储,别和数据库放在同一块硬盘。另外,定期做恢复演练,别等到真出事才发现备份文件损坏或恢复脚本有 bug。
说说版本升级这件事。很多人装完一个版本就不管了,一跑就是三五年。但数据库软件和操作系统一样,需要安全补丁和性能改进。MySQL 5.7 升到 8.0,很多人以为只要 就行,结果升级后发现 sqlmode 变了,以前能跑的 SQL 现在报错。更惨的是字符集从 latin1 改成 utf8mb4,字段长度计算方式变了,索引重建需要时间,业务直接停摆。正确做法是:升级前先阅读官方变更日志,了解不兼容的改动;在测试环境里完整演练升级流程,验证业务 SQL 都能跑通。生产环境升级时,先做全量备份,然后使用 检查并修复系统表。如果数据量大,考虑用主从复制的方式,先升级从库,切流后再升级主库,把宕机时间降到最低。
说到底,Linux 下装数据库不是技术活,而是细心活。每一步都有坑,只要你提前想清楚“这个操作会带来什么后果”,就能避开大多数问题。我那个朋友后来重新装了 MySQL,这次每一步都做了笔记,还在虚拟机里练了三遍才敢上生产。他现在已经能给别人讲怎么装数据库了。你看,吃一堑长一智,装得越多自然就成了老手。如果你能把文中提到的坑记住,基本上就能一次不踩坑,直接成为别人眼中的“老手”。下次再有人跟你说“装数据库很简单”,你就把这篇甩给他——装是简单,装好才是本事。


