前言
个人配置环境,本地习惯用 xampp ,只需要启动控制面板就可以了,而服务器端由于是 Linux 系统,有一套完备的指令集合很方便启动和关闭,也不需要去操心。这次在 windows server 下对 MySQL 的重启过程,让我对进程和服务有了更深的了解。特意通过 win+R
-> services.msc
打开 windows 服务观察了一下,本地的 xampp 并没有注册服务(Apache,MySQL),而 windows server 上使用的 phpStudy 注册了服务(服务器上安装的 phpStudy 版本可以切换运行方式,是否以服务运行)。本地下载安装最新版本的 phpStudy(与服务器上的版本不同),查看了一下,本地依然未注册服务。猜测集成环境软件本身在安装时,判断了宿主机的类型,根据不同的类型安装了不同的版本。
通过任务管理器切换查看进程和服务(右击进程转到服务或右击服务转到进程)发现,每个服务(正在运行状态)都会有一个对应的进程,但进程不一定有对应的服务。本地的 xampp 在关闭(得关闭对应的模块)之后,进程就没了,而在 Windows server 服务器上,phpStudy 停止后,进程没了,同时,服务状态切换成了已停止。进程跟服务之间存在先后关闭的关系,服务对进程有依赖,需要先关闭服务,再考虑关闭进程(关闭服务会自动关闭对应的进程),所以当你通过任务管理器关闭某个服务对应的进程时,会报错:访问拒绝
或者 没有此任务实例运行
。前者还算正常,后者就不知道怎么搞了,能做的只有重启。
过程
确定使用的 MySQL 版本
因为之前不知道本地与服务器上的相关软件的不同,加上服务器上的环境比较复杂(c 盘和 d 盘都分别安装了 phpStudy,d 盘还单独安装了 MySQL 5.5),搞了一天也没出结果,很头大。因为同时存在多个环境、多个版本的 MySQL, 我需要确定之前使用的 MySQL(多个不同版本的 MySQL,存储方式和存储数据的位置不同,就存在了多个数据库环境)。在 MySQL 存储数据的目录 data 下,找到对应的数据库,发现里面的文件,主要以表名开头,扩展名 frm,MYD,MYI
。记得有新增几张表,猜想有可能存在相对应的文件。全局搜索,并没有。一脸懵逼。此路不通,想只能通过切换 MySQL 版本,然后用 Navicat 连接查看来判断了。
切换 MySQL 版本
因为切换需要关闭现有版本的 MySQL,并且不知道存在服务的进程不能直接关闭,所以在任务管理器里直接结束进程得到 访问拒绝
的回应后,就开始搜索通过其他方式强制关闭进程的方式。
查看进程对应的进程号(当然可以通过 任务管理器 -> 查看 -> 选择列 -> 勾选 PID(进程标识符)
的方式直接查看)
# 查找出某个端口的PID netstat -ano | findstr "3360" # 或根据可执行文件名查找 tasklist | findstr "mysql"
MySQL 对应可执行文件 mysqld.exe
,而 Apache 对应可执行文件 httpd.exe
(我这个版本是这样子的)。
结束进程
因为直接结束进程会报错,当时想的就是怎么样杀死进程,没有考虑为什么报错。
#杀死进程 tskill PID #如果存在这个指令的话 ntsd -c q -p PID #taskkill 指令 taskill /f /pid PID taskkill /f /im 进程名
几乎试错了所有的解决方案,都不行。
尝试关闭 MySQL 服务
既然无法从进程下手,就想着关闭服务,是不是就可以了呢?
注册和删除服务
# 删除服务,MySQL57 为注册服务时的名称 sc delete MySQL57 # mysqld 删除 mysqld --remove MySQL57 # 注册服务,mysql5.6 为注册服务名 mysqld --install mysql5.6 # 指定默认的配置文件 mysqld --install MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server X.Y\my.ini"
期间,启动 MySQL 还报错了:1067 进程意外终止
,我的是因为已注册了其他的 MySQL,将其停止即可。
实在不行可以重启,不过要保证,同一个服务,如 MySQL ,只能有一个启动类型为自动。
然后就好了,之后又碰到 iis 服务器启动不了,看了一下,原来是 phpStudy 中的 apache 服务开启了,将其关闭之后重试,启动类型改成手动,或禁用。仍然启动不了 iis, 猜测可能是服务器版本较低,有漏洞或者版本不兼容,重启,OK。