核心目錄地圖 (RHEL/CentOS/通用二進制安裝)
| 用途 | 典型路徑 | 說明 |
| 數據目錄 | /var/lib/mysql/ | 表空間 (.ibd), Redo/Undo 日志, 錯誤日志, 慢查詢日志, pid/socket 文件 |
| 配置文件 | /etc/my.cnf / /etc/mysql/my.cnf | 主配置; 包含 !includedir /etc/my.cnf.d/ 載入模塊化配置 |
| 二進制/腳本 | /usr/bin/ (mysql, mysqldump, mysqladmin...) | 客戶端工具; /usr/sbin/mysqld 服務端主程序 |
| 啟動腳本 | /etc/init.d/mysqld (SysV) / /usr/lib/systemd/system/mysqld.service (Systemd) | 服務管理入口 |
| 日志目錄 | /var/log/mysql/ 或數據目錄下 | error.log, slow.log, general.log (由配置文件指定) |
| 插件/庫文件 | /usr/lib64/mysql/plugin/ | 存儲引擎、認證插件、審計插件 |
Root 密碼管理全流程
場景 1:全新安裝初始化 (MySQL 5.7+ / 8.0)
# 1. 啟動服務 (會自動初始化數據目錄、生成臨時密碼)
systemctl start mysqld
# 2. 獲取臨時密碼
grep 'temporary password' /var/log/mysqld.log
# 例: 2023-01-01T00:00:00.123456Z 0 [Note] A temporary password is generated for root@localhost: xYz#Abc123
# 3. 首次登錄並強制修改密碼 (密碼策略要求: 長度≥8、大小寫、數字、特殊字符)
mysql -uroot -p'xYz#Abc123' --connect-expired-password
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPwd@123';
mysql> FLUSH PRIVILEGES;
場景 2:常規修改密碼 (已知舊密碼)
# 方法 A: mysqladmin (推薦腳本化)
mysqladmin -uroot -p'OldPwd' password 'NewStrongPwd@123'
# 方法 B: SQL 語句
mysql -uroot -p'OldPwd' -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPwd@123'; FLUSH PRIVILEGES;"
# 方法 C: 更新 user 表 (不推薦, 易出錯)
mysql -uroot -p'OldPwd' -e "UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPwd@123') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;"
場景 3:忘記 Root 密碼 (跳過授權表重置)
# 1. 停止服務
systemctl stop mysqld
# 2. 創建臨時啟動配置 (跳過授權表、跳過網絡)
cat > /tmp/mysql-init.cnf < FLUSH PRIVILEGES; -- 必須先執行 (skip-grant-tables 下權限表未加載)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPwd@123';
mysql> EXIT;
# 5. 正常重啟
pkill mysqld # 結束臨時進程
systemctl start mysqld
# 6. 驗證
mysql -uroot -p'NewStrongPwd@123' -e "SELECT USER();"
服務控制與自啟管理
| 操作 | Systemd (RHEL 7+/CentOS 7+) | SysV Init (RHEL 6/CentOS 6) |
| 啟動 | systemctl start mysqld | service mysqld start / /etc/init.d/mysqld start |
| 停止 | systemctl stop mysqld | service mysqld stop |
| 重啟 | systemctl restart mysqld | service mysqld restart |
| 狀態 | systemctl status mysqld | service mysqld status |
| 設置開機自啟 | systemctl enable mysqld | chkconfig --add mysqld; chkconfig mysqld on |
| 取消開機自啟 | systemctl disable mysqld | chkconfig mysqld off; chkconfig --del mysqld |
| 查看自啟狀態 | systemctl is-enabled mysqld | chkconfig --list mysqld |
安全加固清單 (mysql_secure_installation 交互內容)
- 設置 Root 強密碼 (長度≥12、複雜度高)。
- 移除匿名用戶 (`DELETE FROM mysql.user WHERE User='';`)。
- 禁止 Root 遠程登錄 (`DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');`)。
- 移除測試庫 (`DROP DATABASE test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';`)。
- 重載權限表 (`FLUSH PRIVILEGES;`)。
常見故障速查
| 現象 | 排查路徑 | 典型修復 |
| Can't connect to local MySQL server through socket | 1. 服務是否運行 2. socket 路徑配置一致性 (my.cnf vs 客戶端) 3. 磁盤空間/Inode 耗盡 | 啟動服務; 統一 socket 參數; 清理空間 |
| Access denied for user 'root'@'localhost' | 密碼錯誤 / 插件不匹配 (caching_sha2_password vs mysql_native_password) / Host 不匹配 | 重置密碼; ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'pwd'; 確認 Host 列 |
| InnoDB: Cannot allocate memory for the buffer pool | innodb_buffer_pool_size 過大超過物理內存 | 調整為物理內存 60-70% (專用 DB 服務器) |
| Too many connections | max_connections 耗盡 / 連接泄漏 / 線程緩存過小 | 調大 max_connections; 檢查應用連接池釋放; 增大 thread_cache_size |
總結
掌握 Linux MySQL **目錄佈局、密碼生命周期、Systemd/SysV 服務控制、安全基線** 四大塊,即可覆蓋 95% 的日常運維與故障處置場景。建議將上述操作封裝為 Ansible Playbook / Shell 函數庫 / Runbook 文檔,實現標準化、可審計、可複現的運維體系。