1. 为什么非要折腾 .tar.gz 方式安装 MySQL
先聊点实际的。很多人一听到 Linux 下装 MySQL,第一反应就是apt install mysql-server或者yum install mysql-community-server,一条命令搞定,顶多配个密码就完事。那为什么还有那么多人翻出 .tar.gz 压缩包,老老实实手动装一遍?
我在实际工作里遇到过几种情况,逼着你必须走这条“笨路”。
第一种是服务器环境特殊。有些内网环境、国产化系统或者最小化安装的 Linux 发行版,软件源里根本没有 MySQL,或者源里的版本老得掉渣,还是 5.6 时代的东西。CentOS 默认源里连 mysql-server 都没有,只有 MariaDB,但项目又必须用官方 MySQL,这时候只能去官网手动下载 tar.gz 包。第二种是版本洁癖或者说版本强需求。新项目要用 MySQL 8.0 的窗口函数、CTE 这些特性,但生产环境是离线内网,预装的数据库版本不够,yum 源又连不上。第三种更常见——你是开发环境,想装一个“干净”的 MySQL,不受系统包管理器的一堆依赖影响,想装几个版本就装几个版本,想删就删,直接删目录完事。
用 .tar.gz 方式安装,最大的好处就是可控性极强。所有文件都集中在一个目录下,数据目录、配置文件、日志文件、启动脚本,全部由你说了算。不像 rpm/deb 包那样把东西散落在系统的各个目录里,卸载的时候还得清理半天残留。我自己的习惯是装到/usr/local/mysql,数据目录单独放,这样后面要做数据迁移、做备份,甚至整机复制,都非常方便。
这篇文章面向的读者,我默认你已经有基本的 Linux 操作经验,会敲命令行、会用 vim 或者 nano 编辑文件。如果你是个刚接触 Linux 的小白,也不用慌,下面每一步我都会写得非常细,你照着敲就行。
2. 安装前的准备工作:下载、环境检查、依赖处理
2.1 从官网找到对的 MySQL 版本
这一步看着简单,但很多人在官网迷路。MySQL 官方下载页面(dev.mysql.com/downloads/mysql/)进去之后,首先会让你选择操作系统,千万别选错。我们要的是Linux - Generic,也就是通用二进制版本,下面会有 .tar.gz 格式的压缩包下载链接。
选版本的时候,我建议优先选8.0.x 的 GA 稳定版,不要一看到 8.4 或者 9.x 就手痒。MySQL 的版本策略有点特殊,8.0 目前是广泛应用的生产版本,各种兼容性问题踩得差不多了,社区资料也最全。另外注意区分两个包:
- 带
-glibc2.12或类似标识的,是预编译好的二进制包,适用大多数 Linux 发行版,我们下载这个。 - 不带这个标识的源码包
Source Code,那是要自己编译的,新手先别碰。
下载的时候还有一个讲究。直接在浏览器里下载再上传服务器,速度慢不说,还容易断。我一般用wget直接在服务器上下载:
cd /usr/local/src wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz如果你下载的时候被提示需要登录,可以换一个思路,直接用 CDN 链接。官网页面里每个版本的小字部分通常隐藏着No thanks, just start my download这种快速链接,右键复制链接地址,放到wget后面就行。下载完之后,先确认一下文件大小,MySQL 8.0 的二进制包体积大约在 200~300MB 左右,如果只有几十 KB,那大概率下错东西了。
2.2 检查系统环境和基础依赖
在动手之前,先把系统环境摸清楚。我列几个必须要检查的项目:
查看系统架构和版本
uname -m # 输出 x86_64 说明是 64 位系统 cat /etc/os-release # 查看发行版信息MySQL 8.0 官方提供的 Linux 通用包只支持 64 位系统,32 位系统直接放弃这条路。
检查是否已经安装过 MySQL 或依赖冲突
这一点特别重要。很多人在初始化数据库的时候报错,就是因为系统里已经有旧的 MySQL/MariaDB 残留,把/etc/my.cnf或者数据目录占用了。
rpm -qa | grep -i mysql # 如果有输出,说明有旧包 rpm -qa | grep -i mariadb # 如果有输出,需要先移除如果有 MariaDB,执行yum remove mariadb-libs之类的命令先清掉。不要犹豫,两个数据库的库文件如果混在一起,后面会出各种莫名其妙的问题。
检查基础编译运行库
MySQL 二进制包虽然不需要你现场编译,但是运行它需要系统有libaio这个依赖库。我踩过最典型的坑就是:所有步骤都做完了,结果启动服务的时候报错error while loading shared libraries: libaio.so.1。
不同发行版的安装命令不一样,Debian/Ubuntu 用:
apt update && apt install -y libaio1 libnuma-devCentOS/RHEL 系用:
yum install -y libaio libaio-devel numactl有些精简版系统可能还需要安装ncurses-compat-libs,可以用ldd命令检查 MySQL 的二进制文件依赖情况:
ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz # 这只是看压缩包,没意义正确的做法是先解压,再对解压出来的mysqld文件做检查:
cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ldd /usr/local/src/mysql-8.0.36-linux-glibc2.12-x86_64/bin/mysqld看到输出里如果有not found字样,那就对照着缺什么装什么。这一步做好,后面能少掉 50% 的报错。
2.3 创建专用用户和数据目录
这是个被讲了无数次但总是被忽略的步骤。我见过有人直接用 root 用户跑 MySQL,短时间看着没问题,但隐患极大。MySQL 官方文档明确要求,mysqld 进程不允许用 root 身份启动,否则会直接报错拒绝运行。而且安全角度来说,数据库进程权限越小越好,万一被注入,攻击者也拿不到系统 root 权限。
创建方式:
# 创建 mysql 用户组 groupadd mysql # 创建 mysql 用户,不创建家目录,不允许登录 shell useradd -r -g mysql -s /bin/false mysql-s /bin/false这个参数会让该用户无法登录系统,这是安全基线要求,别为了省事不加。
数据目录我习惯单独建在/data/mysql而不是默认的/usr/local/mysql/data。这样做的原因很实际:数据目录和应用程序目录分离,如果系统盘出了问题要重装系统,只要数据盘没坏,数据就不会丢。另外很多服务器的数据盘是额外挂载的,比如挂载在/data下,后续做扩容也更灵活。
mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysql注意这里的权限设置。750意味着只有 mysql 用户和 mysql 组有读和执行权限,其他用户一律不可访问。数据库文件是敏感资产,权限过松是大忌。
3. 解压安装与目录规划:把所有东西放在该放的地方
3.1 解压 .tar.gz 并移动到目标目录
准备工作完毕,正式进入安装流程。
cd /usr/local/src tar -xzf mysql-8.0.36-linux-glibc2.12-x86_64.tar.gz ls -ld mysql-8.0.36-linux-glibc2.12-x86_64解压出来的是一个带版本号的目录,这个名字太长不好用,后续配环境变量、写脚本都不方便。我习惯把它重命名成mysql:
mv mysql-8.0.36-linux-glibc2.12-x86_64 /usr/local/mysql然后设置目录归属:
chown -R mysql:mysql /usr/local/mysql这里有个细节想多说两句。我看到有些教程在解压之后就让人把 MySQL 文件夹的权限改成777,理由是“避免权限报错”。这完全是在给自己埋雷。777意味着所有用户都能读写执行,任何普通用户都能直接改你的数据库文件,这是灾难级的配置。正确做法就是保持mysql:mysql的所有者,把权限控制在755或更紧。
如果你解压之后打算用软链接的方式做多版本管理,那么把目录命名为mysql-8.0.36保留版本号,再建一个软链接ln -s mysql-8.0.36 /usr/local/mysql,也是常见的玩法。但我个人更推荐直接改名为mysql,少了软链接这一层,排查问题的时候路径更清晰。
3.2 配置环境变量
为了让mysql、mysqldump这些命令在任何目录下都能直接用,需要把 MySQL 的 bin 目录加入 PATH 环境变量。
编辑用户的~/.bashrc文件:
vim ~/.bashrc在文件末尾添加:
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/sbin然后让配置立即生效:
source ~/.bashrc验证一下:
mysql --version如果输出mysql Ver 8.0.36 for Linux on x86_64之类的内容,说明命令已经可用了。
如果你是系统管理员,希望所有用户都能使用 MySQL 命令,可以把上面的export写到/etc/profile里面,效果一样。但我自己更推荐写在用户级配置里,因为服务器上不是每个人都需要访问数据库,减少暴露面总是好的。
3.3 提前理清 MySQL 的重要目录结构
安装完 MySQL,很多人看/usr/local/mysql目录一脸懵,不知道每个文件夹是干嘛的。这里我把关键目录的作用和是否需要备份列个表:
| 目录/文件 | 作用 | 是否需要备份 |
|---|---|---|
/usr/local/mysql/bin | 存放 mysql、mysqldump、mysqladmin 等可执行命令 | 不需要,安装包自带 |
/usr/local/mysql/lib | 存放运行所需的库文件 | 不需要 |
/usr/local/mysql/share | 存放错误信息、字符集等支持文件 | 不需要 |
/data/mysql | 存放实际数据库数据文件(如果我们配置到这儿) | 需要,核心资产 |
/usr/local/mysql/my.cnf | 自建的主配置文件 | 需要,建议纳入版本管理 |
/var/log/mysql或/data/mysql/mysql.log | 错误日志和查询日志 | 视需求决定 |
理清这个结构之后,你切换版本或者迁移服务器的时候就会从容很多。数据在/data/mysql,配置在/etc/my.cnf,程序在/usr/local/mysql,三个互不干扰。
4. 编写配置文件 my.cnf:这一步决定 MySQL 能不能跑顺
4.1 最小可用配置是怎么来的
MySQL 8.0 的安装目录里其实自带了一份默认配置,路径在/usr/local/mysql/support-files/my-default.cnf。但是说实话,那份配置非常保守,几乎等于没配。而且 8.0 之后,MySQL 对配置文件的依赖比旧版本小了很多,很多参数都有默认值。你甚至可以不建配置文件直接初始化,MySQL 会按照内置默认值运行。但在生产环境或者要通过调试的场景,我建议还是手动写一份。
官方读取配置文件的顺序是:
/etc/my.cnf/etc/mysql/my.cnf/usr/local/mysql/my.cnf~/.my.cnf
先读到的配置生效,后面的配置会覆盖前面相同的配置项。我一般会把主配置放在/etc/my.cnf,这样系统上所有用户都遵循同一套配置,也符合 Linux 的目录规范。
下面是我整理的一份适用于大多数场景的 MySQL 8.0 最小可用配置,你可以直接复制,然后根据实际情况调整:
[client] port = 3306 socket = /data/mysql/mysql.sock [mysql] auto-rehash prompt="\\u@\\h [\\d]> " [mysqld] user = mysql port = 3306 basedir = /usr/local/mysql datadir = /data/mysql socket = /data/mysql/mysql.sock pid-file = /data/mysql/mysqld.pid log-error = /data/mysql/mysql.err character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci default-storage-engine = InnoDB max_connections = 500 back_log = 128 wait_timeout = 600 interactive_timeout = 600 connect_timeout = 10 lower_case_table_names = 1 sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"我逐项说明一下,为什么不写的参数你可以先不管。
basedir和datadir是最核心的两个路径,分别指程序目录和数据目录。写错任何一个,MySQL 都起不来。socket文件路径也很关键,本地通过mysql命令连接的时候走的是 socket 通信,不是 TCP,所以这个路径必须和[client]里的保持一致。character-set-server统一设置为utf8mb4,这是为了支持 Emoji 表情和大部分特殊字符。MySQL 8.0 默认的 collation 是utf8mb4_0900_ai_ci,这个排序规则的性能和准确性都优于旧版,不建议改成老的general_ci。lower_case_table_names = 1表示表名不区分大小写,这一点在 Windows 开发、Linux 部署的项目里特别重要,否则本地建的表叫UserInfo,Linux 上报错找不到表,能把人折腾疯。
sql_mode里我只保留了一部分严格模式参数。STRICT_TRANS_TABLES开启后,插入非法数据会直接报错而不是产生警告,这能在开发阶段就暴露问题,而不是把脏数据写进库里隐藏起来。
4.2 初始化数据目录的正确姿势
配置写好之后,先别急着启动,因为数据目录还是空的,MySQL 没法运行。在 8.0 版本中,初始化命令整合到了mysqld里面,用--initialize参数。
这里有一个非常关键的选择——是否使用--initialize-insecure。两者区别在于:
--initialize:初始化时会生成一个随机 root 密码,写进错误日志里,你需要在日志里找出来。--initialize-insecure:初始化后 root 用户是空密码,可以直接无密码登录,然后再自行修改。
我推荐第一次使用--initialize-insecure。原因很简单,你手动去找日志里的随机密码,输错大小写、输错特殊符号的概率太大了,搞半天连不上,容易怀疑人生。先用空密码登录进去,再用 SQL 语句把密码改掉,整个过程清晰可控。
执行初始化:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql注意指定--user=mysql,确保初始化生成的文件的属主是 mysql 用户。初始化完成后,查看数据目录:
ls -l /data/mysql/你应该能看到mysql、performance_schema、sys、undo_001、undo_002等目录和文件。如果这些文件存在,说明初始化成功。如果这一步报了错,不要急着重复执行,先去看错误日志,也就是我们在配置里指定的log-error = /data/mysql/mysql.err。
4.3 配置日志系统和默认目录的权限问题
日志这块值得单独说一次。MySQL 8.0 的默认错误日志位置挺隐蔽的,有人找不到日志就以为程序卡死了。我们在配置文件里把log-error指向了/data/mysql/mysql.err,那么注意观察这个文件是否会自动生成。
如果初始化命令提示无法写入日志文件,大概率是目录权限问题:
chown -R mysql:mysql /data/mysql还需要注意,日志文件会不断增长,不给它做轮转的话,时间长了会占满磁盘。主流的解决方案是配置logrotate,系统自带的日志轮转工具就能搞定。
创建一个配置文件:
vim /etc/logrotate.d/mysql内容如下:
/data/mysql/mysql.err { daily rotate 7 missingok notifempty compress sharedscripts postrotate /bin/systemctl reload mysqld > /dev/null 2>&1 || true endscript }意思是每天轮转一次,保留 7 份历史,旧日志压缩。配置完后可以用logrotate -d /etc/logrotate.d/mysql做一次模拟执行,检查配置有没有语法错误。
5. 启动 MySQL 与 systemd 管理:让它像正规服务一样工作
5.1 手动启停与后台运行
配置和初始化都到位后,第一件事是手动启动一次,确认整个链路没问题:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql &&表示后台运行。启动后看进程是否存活:
ps -ef | grep mysqld或者直接尝试用客户端连接:
/usr/local/mysql/bin/mysql -uroot -S /data/mysql/mysql.sock如果返回了 MySQL 的欢迎界面,说明安装基本成功。但这只是临时启动,进程在系统重启之后会消失。要把 MySQL 变成开机自启的服务,需要写 systemd 服务文件。
5.2 编写并启用 mysqld.service
8.0 的安装包里自带了一份 systemd 服务文件,在/usr/local/mysql/support-files/mysql.server,这是旧版的 SysV 风格脚本。我强烈建议不要直接用这个,而是按照 systemd 的方式自己写一个,管理起来更顺手。
创建服务文件:
vim /etc/systemd/system/mysqld.service内容如下:
[Unit] Description=MySQL Server 8.0 Documentation=https://dev.mysql.com/doc/refman/8.0/en/ After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql Type=forking PIDFile=/data/mysql/mysqld.pid ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --daemonize --pid-file=/data/mysql/mysqld.pid ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID Restart=on-failure RestartSec=10 PrivateTmp=false几个关键点解释一下。Type=forking表示 mysqld 启动后会 fork 出一个守护进程,systemd 靠 PID 文件来追踪主进程。所以pid-file路径必须和 my.cnf 里一致。ExecStart中必须加--daemonize,否则 systemd 会因为进程没退出而认为启动挂起。Restart=on-failure是个保险,进程异常退出时能自动重启,避免数据库服务因为一次崩溃就长时间不可用。
配置好后,重新加载并启动:
systemctl daemon-reload systemctl start mysqld systemctl enable mysqldenable是为了设置开机自启。最后检查状态:
systemctl status mysqld看到active (running)就是正常了。
5.3 用一个快速脚本验证服务健康
在正式投入使用之前,我还习惯用脚本快速验证一下服务是否真的能正常服务客户端连接。写一个最简单的脚本:
#!/bin/bash # MySQL 健康检查脚本 MYSQL_USER="root" MYSQL_PASSWORD="yourpassword" MYSQL_SOCKET="/data/mysql/mysql.sock" MYSQL="/usr/local/mysql/bin/mysql" if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -S $MYSQL_SOCKET -e "SELECT 1" >/dev/null 2>&1; then echo "MySQL is healthy" else echo "MySQL is DOWN" exit 1 fi把它放进 crontab 里每分钟执行一次,数据库出问题的时候能在第一时间收到告警。当然你也可以用更完善的监控系统,但小项目、个人服务器用这个脚本足够了。
6. 安全配置与客户端连接:新装的数据库必须做这几步
6.1 登录并修改 root 密码
如果你用--initialize-insecure初始化的,那么现在 root 密码为空,做安全配置的第一步就是设置密码。
先用 socket 方式登录:
mysql -uroot -S /data/mysql/mysql.sock然后执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的强密码'; FLUSH PRIVILEGES;密码建议至少 12 位,包含大小写字母、数字和特殊字符。不要用 root 这个用户名之外还要设置一个同名的远程账号,后面会说为什么。
6.2 创建专用账号,而不是裸奔 root
我见过太多人图省事,直接用 root 连应用。这是非常危险的习惯。应用的数据库账号应该遵循最小权限原则,只给它需要的库和表的权限。
常规做法是为业务单独建用户:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'app_password'; CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'app_password'; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.1.%'; FLUSH PRIVILEGES;这里192.168.1.%表示只允许来自这个网段的主机连接,比%全放开的限制强得多。如果应用在另一台服务器上,把网段改成实际的内网网段。对外网开放 MySQL 端口是火坑,除非有严格的安全组规则把关,否则不建议做。
6.3 远程连接时的常见坑:root 不允许远程、端口没开
很多人在本地用 Navicat 连服务器上的 MySQL,连不上就认为是 MySQL 的问题。实际上一半的“连不上”不是 MySQL 的锅。
排查顺序应该是:
- 检查 MySQL 是否允许远程连接。MySQL 8.0 默认 root 只允许
localhost连接,需要确认你的账号 host 是不是%或者你的 IP 网段。 - 检查防火墙是否开放了 3306 端口:
firewall-cmd --list-ports # CentOS 7+ iptables -L -n | grep 3306 # 传统方式如果没有放行,执行:
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload检查程序监听地址。MySQL 8.0 默认绑定
*,也就是所有网卡,一般没问题。但如果你的 my.cnf 里设置了bind-address = 127.0.0.1,那对不起,外部怎么都连不上。需要多网卡时也可以绑定具体 IP。本地客户端连接时,确认 socket 文件和 TCP 连接别混用。Navicat 或 DBeaver 这类图形工具走的是 TCP,不要填 socket 路径。
7. 常见问题与排查技巧实录
这一节是我最想分享的,因为每种报错基本都对应着之前某个配置环节没做对。我按报错信息给你列一个速查表。
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
./mysqld: error while loading shared libraries: libaio.so.1 | 缺少 libaio 依赖库 | 安装 libaio/libaio1 后重试 |
Can't open the mysql.plugin table | 数据目录损坏或初始化不完整 | 删除 datadir 下内容,重新初始化 |
The server quit without updating PID file | PID 文件无法写入或 datadir 权限错误 | 检查/data/mysql的属主和权限 |
Access denied for user 'root'@'localhost' | root 密码错误 | 用--skip-grant-tables跳过授权表重置密码 |
Can't connect to local MySQL server through socket '/tmp/mysql.sock' | client 和 server 的 socket 路径不一致 | 检查 my.cnf 中 [client] 和 [mysqld] 的 socket 配置 |
Table 'xxx' doesn't exist但表明明存在 | 表名大小写敏感问题 | 在 my.cnf 中设置lower_case_table_names = 1 |
启动时提示[ERROR] [MY-010237] Can't start server: Bind on TCP/IP port | 端口被占用 | lsof -i:3306或ss -lntp | grep 3306找到占用进程 |
7.1 密码忘了怎么重置
这是所有 DBA 实操中一定会遇到的场景。某天你发现 root 密码记不清了,应用连不上库,又不能贸然重启服务,这时可以用跳过授权表的方式登录。
# 停止服务 systemctl stop mysqld # 以跳过授权表的方式启动 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &跳过授权表后不需要密码就能登录:
mysql -uroot -S /data/mysql/mysql.sock注意登录后要刷新授权表,让内存中的 grant 表生效:
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';然后退出,把刚才手动起在后台的 mysqld 进程杀干净,再通过 systemd 正常启动。
pkill mysqld systemctl start mysqld--skip-networking一定要加,这意味着 MySQL 进程只允许本机 socket 连接,不允许任何 TCP 连接,防止在恢复期间被外部访问,这是一个隐藏的安全开关。
7.2 端口被占用的排查思路
有时候启动失败,看日志发现是 bind 端口失败,这时候不要只盯着 MySQL 本身。先用ss -lntp | grep 3306看看 3306 端口上到底是谁。
经常会出现一个情况:旧版本的 mysqld 进程没杀干净,或者之前手动启动过多个实例,两个进程同时争抢一个端口。这些残留进程用ps -ef | grep mysqld一查就能发现,kill -9干掉之后重新启动。
还有一种情况是其他服务恰好用了 3306 这个端口,比如有些业务自己写的小程序默认也在 3306。这时候要么改 MySQL 端口,要么改那个程序的端口。优先改程序端口,因为改 MySQL 端口意味着所有应用的连接串都要改,牵连太大。
7.3 数据目录初始化失败后怎么安全重来
初始化失败最大的敌人是“残留”。如果你第一次初始化失败,直接第二次去执行,往往还是失败,因为上一次初始化生成的半成品文件污染了目录。
我重来的步骤是:
systemctl stop mysqld 2>/dev/null rm -rf /data/mysql/* chown -R mysql:mysql /data/mysql/清空数据目录之后重新初始化:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql这一步配合查看错误日志的方式,基本能定位所有初始化问题。
7.4 磁盘空间不足导致启动失败的隐蔽问题
有一类问题大家很容易忽视——磁盘空间不足。MySQL 启动时要写 pid 文件、写日志、初始化 buffer pool,如果磁盘满了,会报一些匪夷所思的错误,比如Segmentation fault或者Can't create/write to file。
用df -h看一下分区使用率,另外用du -sh /data/mysql/*查看哪个目录在快速膨胀。日志文件是最大的嫌疑,所以前面特意讲了 logrotate 配置。另一个容易被忽视的膨胀源是 binlog(二进制日志),如果不控制 expire_logs_days 或 binlog_expire_logs_seconds,时间一长磁盘会被拖垮。
mysql 8.0 可以通过 SQL 直接设置:
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天并把配置写进 my.cnf 里,防止重启后失效。
8. 安装完成之后我还建议你做的几件事
到这里,MySQL 已经能正常跑起来了。但安装一个数据库只是第一步,把它“收拾利索”才算完成。
我建议你在安装完成后把这几件事也做了:
- 备份
/etc/my.cnf和初始化配置的 SQL 脚本,放到 git 仓库或者至少打包存一份。新装服务器的时候可以直接复用,省得从头配一遍。 - 设置好 binlog 的过期时间和备份策略。哪怕是最简单的
mysqldump脚本,也要让数据有个保底。我见过太多开发机没有备份,某天数据误删了,连哭都找不到地方。 - 修改 MySQL 的欢迎语或版本提示信息,减少被外部扫描工具识别的风险。
- 在
/data/mysql下留一个readme.txt,记录这个实例是什么时候装的、配置了什么、改过哪些密码(密码写在单独的文件里并做好权限控制),方便下次接手的人快速了解情况。
最后说一个我自己的使用习惯。每次装完 MySQL 之后,我都会额外设置一个自定义配置文件片段,放在/etc/mysql/mysql.conf.d/下面,专门存放一些临时调优的参数。比如连接数不够了、缓存大小需要调整,直接在这个新文件里修改,不影响主配置文件。这样主配置始终保持着最小化,排查问题的时候不用在几百行配置里翻找。
安装数据库不是一个高频操作,但每一次都值得认真对待。把流程吃透,把每一步为什么要那么做搞清楚,比单纯记住命令要可靠得多。