要區分 MySQL 是通過 systemd
還是傳統 service
管理,以及對應的密碼重置方案,可按以下步驟操作:
一、如何區分管理方式(systemd
還是傳統 service
)
通過以下命令判斷系統默認的服務管理方式:
-
檢查系統是否使用
systemd
# 查看系統初始化進程 ps -p 1 -o comm=
- 輸出
systemd
→ 系統使用systemd
管理服務(CentOS 7+ 默認)。
- 輸出
- 輸出
init
→ 系統使用傳統sysvinit
(通過service
命令管理)。
-
驗證 MySQL 服務的管理方式
# 檢查是否存在 systemd 服務配置 ls /usr/lib/systemd/system/mysqld.service
- 若文件存在 → MySQL 由
systemd
管理(用systemctl
命令)。 - 若文件不存在 → 通常由傳統
service
命令管理(依賴/etc/init.d/mysqld
腳本)。
- 若文件存在 → MySQL 由
二、方案一:systemd
管理(CentOS 7+,ps -p 1
輸出 systemd
)
1. 停止 MySQL 服務
systemctl stop mysqld
2. 配置跳過權限驗證
# 編輯 MySQL 配置文件
vim /etc/my.cnf
在 [mysqld]
區塊添加:
[mysqld]
skip-grant-tables # 跳過權限表驗證
保存退出(vim
中按 :wq
)。
3. 重啟 MySQL 服務(加載配置)
systemctl start mysqld
4. 無密碼登錄并修改密碼
# 直接登錄(無需密碼)
mysql -u root# 在 MySQL 終端執行
USE mysql;
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; # 如:NewPass@2025
exit;
5. 恢復配置并重啟服務
# 移除跳過權限的配置
vim /etc/my.cnf # 刪除或注釋掉 `skip-grant-tables`# 重啟服務
systemctl restart mysqld
6. 驗證登錄
mysql -u root -p # 輸入新密碼,成功登錄即完成
三、方案二:傳統 service
管理(ps -p 1
輸出 init
)
1. 停止 MySQL 服務
service mysqld stop
2. 跳過權限驗證啟動 MySQL
# 直接啟動服務并跳過權限表(后臺運行)
mysqld_safe --skip-grant-tables --user=mysql &
等待 3-5 秒,確認進程啟動:
ps -ef | grep mysqld_safe # 能看到進程即表示啟動成功
3. 無密碼登錄并修改密碼
# 直接登錄(無需密碼)
mysql -u root# 在 MySQL 終端執行
USE mysql;
FLUSH PRIVILEGES; # 刷新權限
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼'; # 如:NewPass@2025
exit;
4. 停止臨時進程并正常啟動服務
# 終止臨時啟動的 mysqld_safe 進程
ps -ef | grep mysqld_safe | grep -v grep | awk '{print $2}' | xargs kill -9# 用傳統方式啟動服務
service mysqld start
5. 驗證登錄
mysql -u root -p # 輸入新密碼,成功登錄即完成
總結
管理方式 | 系統特征(ps -p 1 ) | 服務命令 | 密碼重置核心步驟 |
---|---|---|---|
systemd | 輸出 systemd | systemctl | 編輯 my.cnf 添加 skip-grant-tables |
傳統 service | 輸出 init | service | 用 mysqld_safe --skip-grant-tables 啟動 |
通過系統初始化進程(ps -p 1
)可快速區分管理方式,再選擇對應的方案即可。兩種方式的核心都是“跳過權限驗證→修改密碼→恢復正常啟動”。