启动MySQL服务器没有一条万能命令,选择哪种方式取决于你的操作系统、安装方法和MySQL版本,Linux系统多用systemctl或service,Windows上用net start,macOS用brew services,容器环境用docker start。
Linux系统下启动mysql服务器的命令
Linux是MySQL部署的主战场,但发行版不同,启动命令也会跟着变,搞混了系统类型,命令敲下去大概率只会收到一条报错。
systemd 系发行版(CentOS 7+/RHEL 7+/Ubuntu 16.04+)
现在的Linux发行版几乎统一用systemd管理服务,你只需要执行:
systemctl start mysqld # CentOS / RHEL 系 systemctl start mysql # Ubuntu / Debian 系
为什么有两个名字?CentOS的软件包叫mysqld,Ubuntu的软件包叫mysql,很多人栽在这一步在CentOS上敲systemctl start mysql,系统直接回你一句”Unit mysql.service not found”。
想让MySQL开机自启,执行:
systemctl enable mysqld systemctl enable mysql
启动后验证状态:
systemctl status mysqld
看到active (running)绿色字样,说明服务起来了,如果只敲了systemctl start,没敲enable,下次重启机器MySQL依然不会自动运行。
SysVinit 老系统(CentOS 6/RHEL 6/Ubuntu 14.04)
老机器上跑的还是init.d脚本,命令长这样:
service mysqld start service mysql start
或者直接调脚本:
/etc/init.d/mysqld start
这套命令现在用得少了,但不少生产环境的存量机器还在用它,启动过程中卡住不动,多半是数据目录损坏或者磁盘满了,日志在/var/log/mysqld.log里。
二进制/源码安装的启动方式
如果你是用tar包手动装的MySQL,没有注册成系统服务,那就得走mysqld_safe或者mysql.server:
mysqld_safe --user=mysql & mysql.server start
mysqld_safe是MySQL官方推荐的守护进程启动方式,它会在mysqld崩溃时自动拉起进程。mysql.server是一个Shell脚本封装,通常在/usr/local/mysql/support-files/目录下,这两种方式适合喜欢自己掌控一切的运维老手。
Windows和macOS上启动mysql服务
Linux之外,开发机上最常见的就是Windows和macOS,两边的启动逻辑不太一样,但都有一个共同坑点:安装时的服务名决定了你的启动命令。
Windows启动mysql服务的命令
Windows下MySQL装完后会自动注册成Windows服务,最直接的启动命令是:
net start mysql
但这里有个大坑:如果你的MySQL是用MySQL Installer安装的,服务名不叫mysql,而是叫MySQL80或者MySQL57,举个例子,MySQL 8.0默认服务名是MySQL80:
net start MySQL80
搞不清楚服务名,用管理员身份打开PowerShell或CMD,执行:
sc query | findstr mysql
或者打开服务管理器(Win + R,输入services.msc回车),在列表里找名称带MySQL的项,那才是真正的服务名。
停止服务对应net stop MySQL80,重启服务在CMD里没有直接命令,通常先stop再start,或者用Restart-Service MySQL80(PowerShell)。
macOS上通过Homebrew启动mysql
macOS装MySQL十有八九走的是Homebrew,启动命令是:
brew services start mysql
这条命令不仅启动服务,还会注册成开机自启项,对日常开发来说非常省心,如果你只需要临时跑一次,不想常驻后台:
mysql.server start
后面这个命令来自MySQL附带的mysql.server脚本,位置一般在/usr/local/opt/mysql/bin/或/opt/homebrew/opt/mysql/bin/下。
docker 启动 mysql 容器的方式
越来越多的开发环境和测试环境开始用Docker跑MySQL,容器里的MySQL启动逻辑和裸机装完全不一样,因为MySQL本身就是容器的主进程。
首次创建并启动容器
第一次跑MySQL容器,需要指定镜像、端口、密码和存储目录,一个标准的启动命令长这样:
docker run -d --name mysql-dev \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -v /opt/mysql-data:/var/lib/mysql \ mysql:8.0
各参数含义:-d后台运行,--name给容器取名,-p映射宿主机3306端口到容器3306端口,-e设置root密码,-v把容器内的数据目录挂载到宿主机防止数据丢失。
日常启动和停止容器
容器创建成功后,后续的启动就一条命令:
docker start mysql-dev
停止是docker stop mysql-dev,这里有个经典误操作:很多人以为docker run是启动命令,每次开机都重新run一遍,结果报错The container name "/mysql-dev" is already in use。docker run只在第一次创建时用,之后一律用docker start。
进入容器内部操作
有些情况下你需要进到容器里执行mysql命令:
docker exec -it mysql-dev mysql -uroot -p
这个命令进入容器,并直接打开MySQL客户端连接本地服务,注意exec和run不要搞混run是启动新容器,exec是在已运行的容器里执行命令。
mysql 启动失败怎么办
启动命令敲完,不是每次都顺顺利利,根据行业共识,MySQL启动失败的原因七成以上集中在三个地方:端口被占、数据目录权限错乱、初始化文件缺失。
端口被占用
最常见的是3306端口被另一个MySQL实例或其他程序占用,排查命令:
lsof -i:3306 netstat -tlnp | grep 3306
如果输出显示有进程占着3306,要么关掉那个进程,要么修改MySQL配置文件/etc/my.cnf里的port参数,改用其他端口。
数据目录权限错误
MySQL进程必须以mysql用户运行,如果数据目录/var/lib/mysql的所有者不对,启动时会直接报错,修复方式:
chown -R mysql:mysql /var/lib/mysql
如果你是源码安装在自定义目录,记得把路径换掉,权限问题一般伴随错误日志Permission denied,一眼就能认出来。
初始化文件和系统表损坏
7以上版本在首次启动前必须做初始化,否则会出现Data Dictionary initialization failed这类错误,初始化命令:
mysqld --initialize --user=mysql
CentOS上则用mysqld --initialize-insecure,这样生成的root账号默认无密码,方便首次登录,如果系统表真的损坏了,通常在/var/lib/mysql/目录下重新初始化,但操作前务必确认数据已备份。
用日志定位问题
启动失败的通用排查思路是看日志,MySQL默认错误日志位置:
- CentOS / RHEL:
/var/log/mysqld.log - Ubuntu / Debian:
/var/log/mysql/error.log - Docker容器:
docker logs mysql-dev
tail -100 /var/log/mysqld.log
日志里找[ERROR]开头的行,通常最后一条就是根本原因。
验证mysql服务器是否成功启动
命令敲完不等于服务已经可用,判断MySQL是否真正就绪,几个快速方法。
检查进程和端口
ps -ef | grep mysqld
输出里能看到/usr/sbin/mysqld的进程,说明主进程没挂,同时确认端口监听:
ss -tlnp | grep 3306
有LISTEN状态的记录,说明MySQL已经在等客户端连接了。
用mysqladmin做连通性测试
mysqladmin -uroot -p ping
MySQL服务正常时返回mysqld is alive,这个命令直接测试服务端是否响应客户端请求,比单纯的进程检查更靠谱。
实际连一次
mysql -uroot -p
能进到mysql>交互界面,那才是铁板钉钉的启动成功,很多情况下服务是起来了,但root密码不对或认证插件不兼容,会在这一步卡住。
Q&A
Q1:mysql和mysqld这两个命令有什么区别?
mysqld是MySQL服务端守护进程,负责实际的数据存储和查询处理,启动服务本质是启动mysqld。mysql是客户端程序,用来连接服务器执行SQL语句,启动服务器用systemctl start mysqld或service mysqld start,连接服务器用mysql -uroot -p。
Q2:systemctl start mysql和service mysql start有什么不同?
systemctl依赖systemd守护进程管理服务,支持开机自启配置、服务依赖管理和详细状态输出,现代Linux发行版默认使用。service是SysVinit时代的命令,通过/etc/init.d/下的脚本启停服务,兼容老式管理风格,新系统优先用systemctl,老系统只能乖乖用service,两者不能跨用。
Q3:mysql启动后过几秒就自动停止是什么原因?
最常见的原因是/var/lib/mysql目录下存在损坏的InnoDB重做日志或表文件,启动时MySQL会执行崩溃恢复,恢复失败就自动退出,处理方式是查看错误日志找到具体报错,部分情况下删除ib_logfile0和ib_logfile1让MySQL重建日志文件,但如果表数据没有完整备份,删除重做日志可能导致数据不一致,操作前必须谨慎评估。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793170.html


