登录一台 CentOS 服务器,启动敲下 mysql -uroot -p,命令回车。启动屏幕弹回来一行:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'。命令不用慌,启动十有八九是命令 MySQL 根本没跑起来。这时候要做的启动不是去翻配置文件,而是命令先把服务拉起来。
Linux 上启动 MySQL 的启动方式取决于你的发行版和安装方式。RHEL 系(CentOS、命令Rocky、启动AlmaLinux)走 systemd 管理,命令命令是启动:
systemctl start mysqld Debian 和 Ubuntu 上服务名不一样,叫 mysql:
systemctl start mysql 就这一个字母的命令差别,坑过不少人。启动在 Ubuntu 上敲 systemctl start mysqld,systemd 会直接告诉你 Unit mysqld.service not found。反过来在 CentOS 上敲 mysql,同样找不到。我的习惯是先 systemctl list-units --type=service | grep -i mysql 确认一下服务名,再执行启动。多花三秒钟,省得来回试。
启动完别急着关终端,用 systemctl status mysqld 看一眼状态。输出里 Active: active (running) 才算真正起来了。如果显示 failed,下面通常会附带几行错误日志的摘要,比如配置文件语法错误或者数据目录权限不对。这些信息比事后去翻 /var/log/mysqld.log 快得多。
有些老系统或者容器环境里没有 systemd,那就得用传统方式。MySQL 自带 mysqld_safe 脚本,它会以守护进程方式启动 MySQL,崩溃时还能自动重启:
mysqld_safe --user=mysql & 注意那个 &,不加的话终端就被占住了。这种方式在 Docker 容器里调试时挺常用,但生产环境还是老老实实交给 systemd 管。
还有一种情况:MySQL 编译安装到了自定义路径,比如 /usr/local/mysql,systemd 里没有对应的 unit 文件。那就得手动写一个,或者直接用 mysqld 二进制启动:
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql & --defaults-file 指定配置文件路径,--user 指定运行用户。这两个参数漏掉任何一个都可能启动失败。跑 mysqld 的用户必须对数据目录有读写权限,否则报错 Can't create/write to file。
启动之后设个开机自启,不然重启一次服务器又得手动来一遍:
systemctl enable mysqld Debian 系同理,把服务名换成 mysql。这条命令只是创建软链接,不会立刻启动服务,所以 start 和 enable 是两件事,别搞混。
再说一个实际遇到的坑。有次在一台 CentOS 7 上执行 systemctl start mysqld,命令卡住十几秒然后超时。查日志发现是 InnoDB 在做崩溃恢复,数据量大,恢复时间长,systemd 默认的超时时间不够用。解决办法是在 unit 文件里加 TimeoutStartSec=300,或者临时用 mysqld_safe 启动等它恢复完再切回去。这种情况不常见,但一旦碰上,光看 systemctl status 的 start operation timed out 提示根本猜不到原因。
最后提一句 MariaDB。很多发行版默认装的其实是 MariaDB,服务名可能是 mariadb。启动命令一样是 systemctl start mariadb,但配置文件路径和 MySQL 略有不同。如果你敲了 mysql 和 mysqld 都说找不到服务,试试 mariadb,大概率就对了。