上个月帮朋友处理一台展示用的CentOS服务器,远程一登录就看到他对着报错发愁:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'。这报错看起来吓人,实际十有八九就是服务没起来,或者MySQL压根还没装完整。后来我一问,他连MySQL初始化都还没做,只是执行了个安装命令,就以为万事大吉了。
这篇文章就把从零开始装MySQL的整套流程整理出来,覆盖RHEL系(CentOS / Rocky / Alma)和Debian系(Ubuntu / Debian)两种主流Linux发行版。内容包括版本选型、仓库配置、初始化、安全加固、生产配置、常见故障排查,全程都是可以直接照抄的命令和配置。适合Linux新手、运维初级选手,以及那些想把MySQL装到自建服务器上但不想被各种小坑绊住的朋友。
1. 安装之前,先把这几道“选择题”做对
很多人装MySQL的习惯是直接yum install mysql-server或者apt install mysql-server,然后一路回车。系统确实会给你装一个MySQL,但版本可能是系统仓库里那个陈旧的8.0.x老版本,模块也可能不完整。更麻烦的是,有的系统仓库默认把MySQL替换成了MariaDB——装了半天,命令都是错的,自己还不知道。
所以在动手之前,有几件事必须先想清楚。
1.1 版本选择:5.7还是8.0
如果你在百度或者技术论坛搜索,大概率还能翻到一堆MySQL 5.7的教程。但我要说的是,2024年的现在,新项目真的别再装5.7了。
先看两组事实:
- MySQL 5.7是2023年10月正式停止官方支持(EOL)的,意味着以后没有安全补丁,出了高危漏洞也没人管。
- MySQL 8.0是目前社区版的稳定主线,默认字符集就是utf8mb4,加上窗口函数、公共表表达式(CTE)、原子DDL、更快的查询优化器,性能比5.7有明显提升。
我在实际项目中体会最深的一点是:8.0的原子DDL确实省心,执行ALTER TABLE中途失败不会留下半改半不改的脏状态。5.7年代遇到一次大表加字段失败,表结构损坏,恢复起来是真的头疼。
唯一需要考虑兼容性的是:8.0的默认认证插件从mysql_native_password换成了caching_sha2_password,一些老版本的客户端、旧驱动(比如很久不更新的Java Connector/J 5.x、某些老版本Navicat)连不上。解决方式后面会讲,不影响大局,但你要提前知道有这回事。
版本选择我给了张对比表,直接抄:
| 对比项 | MySQL 5.7 | MySQL 8.0 |
|---|---|---|
| 官方支持周期 | 已EOL,无安全补丁 | 长期支持(到2026+) |
| 默认字符集 | utf8mb4但非默认 | utf8mb4 |
| 认证插件 | mysql_native_password | caching_sha2_password |
| 查询优化器 | 常规 | 更好,支持窗口函数、CTE |
| 在线DDL | 部分支持 | 原子DDL,失败不残留中间态 |
| 使用建议 | 仅老项目迁移过渡 | 新装首选 |
1.2 安装方式:在线仓库包、离线RPM包、Docker
安装方式的选择,主要看你的网络环境和部署场景。
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 官方yum/apt仓库安装 | 版本最新、依赖自动解决、升级方便 | 需要外网访问仓库 | 有公网的服务器、云主机 |
| 离线RPM/DEB包安装 | 不依赖外网 | 依赖包要手动收集,版本匹配麻烦 | 内网环境、堡垒机管控的服务器 |
| Docker容器 | 环境隔离、秒级启动、多个版本共存 | 性能略有损耗,数据卷管理需谨慎 | 开发测试、微服务架构、快速验证 |
这里我多说一句:如果你只是想快速验证一个功能,Docker确实香,docker run mysql:8.0一条命令。但生产环境放在宿主机上还是容器里,要结合团队运维能力来定,裸机装MySQL把数据目录独立出来,仍然是非常主流的方案。
下面正文以官方仓库在线安装为主线,离线包方式单独拎一节来讲,因为它解决的是完全没有公网的内网场景。
1.3 操作系统和硬件准备
不同Linux发行版的包管理方式差异很大,先确认你的系统:
cat /etc/os-release看到ID是centos、rhel、rocky、almalinux这一类,走yum/dnf路线;看到ubuntu、debian,走apt路线。两台机器的systemd服务名也可能不一样,CentOS上服务叫mysqld,Ubuntu上服务叫mysql,命令细节后面会区分。
硬件建议:最低1GB内存可以跑起来,但8.0跑正式业务建议至少2GB以上。MySQL 8.0启动时默认分配的Buffer Pool是128MB,如果内存太紧张,启动阶段就可能直接OOM。磁盘方面,生产环境一定要把数据目录放到独立数据盘上,比如挂在/data下的盘,系统盘和数据盘分开,后面迁移数据目录那节会细讲。
还需要提前检查SELinux状态(RHEL系):
getenforce如果输出Enforcing,装完MySQL后连接容易出现权限类报错。可以临时setenforce 0测试,生产环境建议用正确放行方式,后面有一节专门说。
2. 环境检查与软件源配置
2.1 先看清系统里有没有“旧账”
安装之前别急着执行安装命令,先确认系统里有没有残留的MySQL或MariaDB:
rpm -qa | grep -i -E "mysql|mariadb"如果有输出,尤其是有mariadb,要评估是否卸载。CentOS默认自带的mariadb-libs会和MySQL的libs有冲突,官方仓库安装时yum会自动解决冲突,但有时候会提示错误。稳妥做法:
sudo yum remove -y mariadb-libs还要确认3306端口没被占用:
ss -lntp | grep 3306有输出说明端口已经被占了,通常是有存量MySQL,这时候就不要重复安装了。把系统时间和同步也确认一下,date看时间,如果差太多,会导致后面SSL握手各种奇怪问题。
2.2 官方仓库在线安装步骤
这里以RHEL系最流行、教程也最多的CentOS/Rocky 8/9为例。官方仓库的安装包是个RPM,不同系统版本要下载对应的el版本号:
# Rocky / Alma / CentOS 9 用 el9 sudo yum install -y https://repo.mysql.com//mysql80-community-release-el9-1.noarch.rpm # CentOS / Rocky 8 用 el8 sudo yum install -y https://repo.mysql.com//mysql80-community-release-el8-6.noarch.rpm装完这个仓库包之后,系统里就多了一个mysql80-community源。检查一下:
yum repolist enabled | grep mysql然后安装MySQL服务端:
sudo yum install -y mysql-community-server这条命令会把mysql-community-server以及client、common、libs等依赖一次性装好。装完顺手验证版本:
mysql --version如果显示mysql Ver 8.0.xx for Linux on x86_64,说明装对了。
Debian/Ubuntu系的官方仓库安装要更绕一点。官方提供了mysql-apt-config这个DEB包,先下载再配置:
wget https://repo.mysql.com//mysql-apt-config_0.8.32-1_all.deb sudo dpkg -i mysql-apt-config_0.8.32-1_all.deb安装时会弹出蓝框选择界面,通常直接选Ok确认默认的MySQL 8.0源即可。然后更新索引,安装:
sudo apt update sudo apt install -y mysql-serverUbuntu装完后root账号默认不能直接用密码登录,而是通过auth_socket插件,执行sudo mysql才能进。这跟CentOS那种自动生成临时密码的逻辑不一样,很多人第一次用Ubuntu装MySQL就被坑了。这个差异后面会专门提到。
2.3 内网Linux服务器离线安装
没有外网的服务器是很多初入公司的朋友第一个崩溃场景:yum install一直超时,后来才知道生产内网根本不让你出网。
离线安装的核心是准备一套与目标系统版本匹配的RPM包。你可以在另一台可以联网的同版本系统上,先执行yum install --downloadonly把依赖全部拉下来:
# 联网机器上执行,/data/rpms就是最后的离线包目录 sudo yum install --downloadonly --downloaddir=/data/rpms mysql-community-server然后把/data/rpms整个目录传到内网服务器,执行:
cd /data/rpms sudo rpm -ivh *.rpm这里要注意两点:第一,rpm -ivh *.rpm会按照文件名顺序装,如果出现依赖报错,用rpm -ivh多次安装直到不报错,或者调整安装顺序,先common再libs再client再server;第二,MySQL 8.0的server包依赖libaio和numactl-libs,内网机器如果没有,也要一并下载,否则会卡在依赖检查上。
用rpm -ivh *.rpm遇到依赖问题时,最简单粗暴的办法是在联网机器上用yum deplist mysql-community-server查看完整依赖列表,把相关包都下载下来放进去,避免来回传包。
3. MySQL 8.0安装、初始化与安全配置
仓库安装完成后,MySQL并不是立刻就能用。8.0的初始化流程和5.7不太一样:5.7是在安装后首次启动自动初始化并生成临时密码,8.0的mysqld --initialize在安装后由systemd自动触发,你需要做的是启动它、找到密码、改密码。
3.1 启动服务并获取临时密码
RHEL系先启动服务:
sudo systemctl start mysqld sudo systemctl status mysqld如果服务状态显示active (running),说明启动成功。首次启动后,日志里会有一条包含临时root密码的记录:
sudo grep 'temporary password' /var/log/mysqld.log输出类似:
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: kXq#3nTfz9x!这里的kXq#3nTfz9x!就是你的临时密码。复制它,用它登录:
mysql -uroot -p输入临时密码后进入MySQL命令行,第一件必须做的事是改密码,否则任何其他操作都会报错提示你必须先重置:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';密码务必复杂一些,8.0默认密码策略是MEDIUM,要求长度至少8位、包含大小写字母数字和特殊字符。如果你用123456这种弱密码,会直接报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsDebian/Ubuntu系的情况不一样。刚才说了,Ubuntu默认root是通过auth_socket认证的,你执行sudo mysql -uroot直接就能进,不需要密码。如果你想像CentOS那样用密码连接root,需要手动切认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的新密码';再执行FLUSH PRIVILEGES;,之后就可以用mysql -uroot -p用密码登录了。
3.2 运行安全加固脚本
MySQL官方提供了一个交互式安全配置脚本:
sudo mysql_secure_installation这个脚本会问你几个问题,我逐个说一下这些问题的含义和建议:
| 提问 | 含义 | 建议 |
|---|---|---|
| VALIDATE PASSWORD COMPONENT | 是否启用密码强度校验组件 | 生产环境选Y,开发机随意 |
| Change the password for root? | 是否立即修改root密码 | 刚改过可以不改 |
| Remove anonymous users? | 是否删除匿名用户 | 选Y |
| Disallow root login remotely? | 是否禁止root远程登录 | 选Y,root只能本机登录 |
| Remove test database? | 是否删除默认test库 | 选Y |
| Reload privilege tables now? | 是否刷新权限表 | 选Y |
mysql_secure_installation做完,你的MySQL基础安全状态就不错了。绝大多数新手装完MySQL直接裸奔,默认还有匿名用户、root允许任意IP登录、自带test库仍在,这些都是安全审计时被点名的重灾区,这个脚本能帮你一次扫干净。
3.3 创建业务账号并授权远程访问
实际项目里,应用服务通常不会用root连接数据库,而是用独立业务账号。注意MySQL 8.0里GRANT语句已经不能再隐式创建用户了,必须先CREATE USER再GRANT,这两个步骤别合并,否则报错:
-- 1. 创建用户 CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPassw0rd!'; -- 2. 授权,给所有库或者指定库 GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';这里的'%'表示允许任意IP登录。如果只允许特定网段访问,可以写成'192.168.10.%',精确的IP则写'192.168.10.88'。数据库也建议精确授权,不要动不动就*.*,万一账号泄露,整个实例都暴露了。
最后刷新权限:
FLUSH PRIVILEGES;我的习惯是尽量用最小的权限,业务账号通常只给它对应业务库的所有权限,不给全局权限。如果应用只需要查询:
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%';这样能避免许多低级灾难。
3.4 防火墙、SELinux和云安全组放行
服务器本机装好MySQL并不代表你能从本地开发机连过去。RHEL系要先放行防火墙端口:
sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reloadUbuntu/Debian系用ufw:
sudo ufw allow 3306/tcp前面提到SELinux是Enforcing状态时,MySQL监听端口可能被拦截。可以查看审计日志:
sudo grep 'mysql' /var/log/audit/audit.log | tail -20如果看到denied字样,用放行方式处理:
sudo setsebool -P mysqld_connect_any 1或者干脆用更通用的方法,给3306端口放行:
sudo semanage port -a -t mysqld_port_t -p tcp 3306还有一个容易忽略的点:如果你用的是云服务器(阿里云、腾讯云、华为云等),安全组规则里也要放行3306。很多朋友防火墙都关了,本机也能连,但外部就是连不上,最后发现是云控制台安全组的入方向规则没配上。
4. 生产环境必做的配置优化
MySQL装好能跑只是第一步,真正让你后面少熬夜的,是初始化阶段就把配置优化好。这一节讨论的配置,我的建议是在启动服务之前或者刚装完就改,不要拖到业务上线后再说。
4.1 字符集与时区,一次配到位
MySQL 8.0默认字符集已经是utf8mb4了,但为了显式可控,以及照顾某些从5.7迁移过来的老库,还是要主动配到my.cnf里。
先确认当前字符集:
SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server';RHEL系的默认配置文件是/etc/my.cnf,Debian系一般是/etc/mysql/mysql.conf.d/mysqld.cnf。在[mysqld]段下添加:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci有些教程推荐用utf8mb4_general_ci做排序规则,我建议用utf8mb4_unicode_ci。它基于Unicode标准排序,多语言场景下更准确;general_ci速度略快,但排序规则和Unicode有差异。现代硬件上这点性能差异几乎可以忽略,准确性优先。
时区也一并配好:
default-time-zone='+08:00'如果不配,MySQL使用的是系统时区。有些部署环境系统时区设置不规范,会出现应用写入的时间是当前时间,但NOW()查出来是UTC时间的情况,排查起来极其蛋疼。直接在配置文件写死时区,一劳永逸。改完配置记得重启:
sudo systemctl restart mysqld4.2 关键性能参数解读
MySQL的性能调优门道很多,但90%的场景只需要关注下面这几个参数。把这些配好,你的实例就能扛住很可观的负载。
| 参数 | 作用 | 建议值 |
|---|---|---|
innodb_buffer_pool_size | InnoDB缓存数据和索引的内存池 | 物理内存的50%~70% |
innodb_log_file_size | Redo日志文件大小 | 128M~512M |
max_connections | 最大连接数 | 200~500,视业务 |
slow_query_log | 慢查询日志开关 | 生产建议开启 |
long_query_time | 慢查询阈值(秒) | 2 |
innodb_flush_log_at_trx_commit | 事务日志刷盘策略 | 默认1,兼顾安全与性能 |
其中最重要的就是innodb_buffer_pool_size。假设服务器内存是8GB,给MySQL分配4GB是合理的:
innodb_buffer_pool_size = 4Ginnodb_buffer_pool_size设置太小,MySQL会频繁读写磁盘;设置太大,内存会被耗尽导致OOM。我们曾遇到一台64GB内存的服务器,开发把Buffer Pool设成48GB,恰好上面还有其他Java服务,结果一到高峰期就OOM杀MySQL进程。这个值需要结合整机内存规划来算,别拍脑袋。
慢查询日志也要建议开启:
slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes = 1上线几个月后,这个文件能帮你精准定位慢SQL和没走索引的查询,调优的时候比啥工具都管用。
4.3 大小写敏感与表目录迁移
Linux和Windows对表名大小写的处理风格完全不同。Windows默认不区分大小写,Linux默认lower_case_table_names=0,即区分大小写。开发在Windows上写代码时没注意,上线Linux后突然报Table 'mytable' doesn't exist,这就是大小写问题在搞鬼。
MySQL 8.0里,lower_case_table_names参数一旦初始化数据目录之后,就不能再修改了。所以必须在初始化之前就要想好:
- 项目用Linux服务器且开发也在Linux:保持默认
0,区分大小写,规范开发习惯。 - 开发在Windows/Mac、生产在Linux:设置
lower_case_table_names=1,避免上线踩坑。
如果已经初始化了数据目录才发现需要修改,只能:
- 备份所有数据(
mysqldump导出)。 - 删除
/var/lib/mysql下的数据文件。 - 修改配置为
lower_case_table_names=1。 - 重启MySQL,重新导入备份。
这条路径的痛苦程度可想而知,所以尽量初始化前配置好。
数据目录迁移也是类似思路。生产建议把数据放到独立数据盘,假设新目录是/data/mysql:
# 1. 停库 sudo systemctl stop mysqld # 2. 复制数据目录 sudo mkdir -p /data/mysql sudo cp -a /var/lib/mysql/. /data/mysql/ sudo chown -R mysql:mysql /data/mysql # 3. 修改配置 # [mysqld] # datadir=/data/mysql # 4. 启动 sudo systemctl start mysqld注意:复制用cp -a保留属主和权限,不要图省事用cp -rf。cp -rf在高版本系统上默认会保留权限吗?不一定,还是-a归档模式最稳。
4.4 开机自启与日常服务管理
新装的MySQL默认不一定开机自启,尤其有些精简Linux发行版,不会帮你把服务设为enable。执行:
sudo systemctl enable mysqld确认状态:
sudo systemctl is-enabled mysqld输出enabled就说明自启已生效。日常最常用的几个命令贴一遍,以后不用查文档:
sudo systemctl start mysqld # 启动 sudo systemctl stop mysqld # 停止 sudo systemctl restart mysqld # 重启 sudo systemctl status mysqld # 查看状态 sudo systemctl reload mysqld # 重载配置,常用于改my.cnf后不重启应用注意:改my.cnf后建议用restart或者reload。reload不会断开已有连接,适合配置微调;改字符集、Buffer Pool这些关键参数还是老老实实restart,否则可能不生效或者部分会话状态混乱。
5. 高频错误排查与避坑经验
5.1 ERROR 2002:socket文件连不上
这个报错在热词里出现频率很高,中文意思就是用socket方式连接本地MySQL时,找不到相关文件。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'遇到这个先别慌,按照顺序排查:
第一,服务是否真的在运行?
sudo systemctl status mysqld ps -ef | grep mysqld如果服务没起来,先看启动了为什么失败:
sudo tail -100 /var/log/mysqld.log日志里通常直接写着失败原因,比如数据目录权限不对、磁盘满了。
第二,socket文件是否存在?
ls -l /var/run/mysqld/mysqld.sock如果文件不存在,服务多半没起来或刚启动失败。如果socket文件在别的路径(有些人配置改成/tmp/mysql.sock但客户端默认找/var/run/mysqld/mysqld.sock),就会报这个错。解决办法是显式指定:
mysql -uroot -p --socket=/tmp/mysql.sock或者修改客户端配置,把socket路径指到一致的位置。
第三,目录权限问题。
ll /var/run/mysqld如果目录不存在,手动创建并授权:
sudo mkdir -p /var/run/mysqld sudo chown mysql:mysql /var/run/mysqld这个问题我遇到过无数次,尤其是用mysqld_safe手动启动时更容易碰到。systemd管理时正常会自动创建,但某些最小化系统环境就是没建。
5.2 客户端连不上:缓存认证插件不兼容
本地MySQL客户端版本太老,或者开发机上的Navicat、DataGrip版本太旧,连接MySQL 8.0时会报:
Authentication plugin 'caching_sha2_password' cannot be loaded或者:
Authentication plugin 'caching_sha2_password' is not supported原因很清楚:8.0默认用caching_sha2_password,老客户端不认识。处理方法有两种。
方法一:升级客户端。这是最推荐的方式,新版驱动都支持这个插件。
方法二:把用户认证方式改回老插件,作为临时兼容:
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPassw0rd!'; FLUSH PRIVILEGES;改完之后,老版本工具就能正常连了。但这个办法我不建议长期使用,mysql_native_password在安全性上不如caching_sha2_password,而且MySQL官方已经明确它是未来要移除的插件。我的建议是:能升级工具就升级,兼容性改动作为过渡方案。
另外,远程连接还有一个常见问题:检测到服务器时区空,Navicat连接后时间不准,或者建立连接阶段直接报Public Key Retrieval is not allowed。后者通常需要在连接属性里面开启allowPublicKeyRetrieval=true,出现这个原因是8.0的caching_sha2_password在SSL未启用时,需要先安全地获取服务器的RSA公钥,客户端默认不允许这样做,需要显式打开。
5.3 root密码忘了怎么办
作为运维,迟早会遇到"这台机器我忘了密码"的情况。别急着重装系统,用跳过权限表的方式进库改密码。
RHEL系以systemd方式启动时:
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking" sudo systemctl start mysqld # 免密登录 mysql -uroot进入MySQL后,先让权限表加载生效:
FLUSH PRIVILEGES;然后改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;退出后恢复:
sudo systemctl unset-environment MYSQLD_OPTS sudo systemctl restart mysqld这里强调一个安全细节:--skip-grant-tables模式下显得像是"裸奔",任何本地进程都能免密登录,所以一定要同时加--skip-networking,禁止通过网络连接,只允许本机socket操作。我见过有人救急时不加--skip-networking,数据库短暂时间内对公网全部免密,当场就被扫描器趁虚而入,教训很深刻。
5.4 老应用报SQL模式问题
MySQL 8.0默认的sql_mode比5.7更严格,常见报错包括:
only_full_group_by: which isn't in GROUP BY或者:
this is incompatible with sql_mode=only_full_group_by原因是8.0默认启用了ONLY_FULL_GROUP_BY,要求SELECT出来的列必须出现在GROUP BY子句中,或者被聚合函数包裹。5.7时代很多老SQL写法不严谨,到了8.0就原形毕露。
临时解决可以在当前会话里放宽:
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';但这是治标不治本,业务代码里的问题SQL迟早还要处理。更关键的是,如果你的应用是接管商的老系统,代码又不能随便改,可以临时在my.cnf里设置sql_mode:
[mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION然后重启MySQL。这个操作能帮老项目平稳过渡,但我的建议是过渡期结束后,一定要让开发把SQL改规范,把ONLY_FULL_GROUP_BY恢复开启,否则新开发的SQL会越来越随意,埋下隐患。
5.5 常见问题速查表
把日常收到最多的求助集中整理成一张表,贴在这里,建议收藏:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
ERROR 2002socket无法连接 | 服务没启动 / socket路径不一致 | 先看systemctl status mysqld,再查日志 |
Access denied for user 'root'@'localhost' | 密码错误 / auth_socket认证 | 重置密码或用sudo mysql进入 |
Your password does not satisfy | 密码强度不够 | 用8位以上含大小写数字特殊字符的密码 |
caching_sha2_password cannot be loaded | 客户端版本太老 | 升级客户端或改用户为native_password |
Public Key Retrieval is not allowed | 客户端连接配置未开启 | 连接参数开allowPublicKeyRetrieval=true |
| 远程连接超时/拒绝 | 防火墙 / SELinux / 云安全组 | 按防火墙、SELinux、安全组逐层排查 |
Table 'xxx' doesn't exist | 大小写敏感配置不一致 | 规划好lower_case_table_names,在初始化前配置 |
| 启动失败但没报错 | 日志文件没权限或磁盘满 | 查看/var/log/mysqld.log,检查df -h |
表格里的第一行和第二行是我被问得最多的两类问题。说句实话,80%的"MySQL连不上"都是服务没起来,在数据目录、权限、防火墙层层排查之前,先花30秒看systemctl status,能省下大半天时间。
我个人在实际操作中的体会是:装MySQL不难,难的是装之前的设计决策。版本选哪个、字符集用什么、数据目录放哪里、大小写敏不敏感——这四个问题,任何一个在初始化之后才想起修改,都意味着推倒重来。所以我的习惯永远是先把my.cnf写完整、把数据目录规划好,再启动服务。
最后再分享一个小技巧:每次装完MySQL,先把根目录下my.cnf做个快照备份,改动前cp /etc/my.cnf /etc/my.cnf.bak.$(date +%F),改出问题能一键还原。这个习惯虽然原始,但在生产环境救过我很多次。