首先確認MySQL服務是否正在運行,使用以下命令查看服務狀態:
sudo systemctl status mysqld
若服務未啟動,可通過以下命令啟動:
sudo systemctl start mysqld
如需設置開機自啟,執行:
sudo systemctl enable mysqld
若啟動失敗,可重置服務失敗狀態后再次嘗試:
sudo systemctl reset-failed mysqld && sudo systemctl start mysqld
MySQL錯誤日志記錄了啟動、運行過程中的詳細錯誤信息,是故障排查的核心依據。默認日志路徑為/var/log/mysqld.log(部分系統可能為/var/log/mysql/error.log),使用以下命令實時查看最新日志:
sudo tail -f /var/log/mysqld.log
通過grep命令可快速篩選關鍵錯誤(如“ERROR”“failed”):
sudo grep -i "ERROR" /var/log/mysqld.log
日志中常見的錯誤包括配置文件語法錯誤、數據文件損壞、端口沖突等。
MySQL的主配置文件通常為/etc/my.cnf或/etc/mysql/my.cnf,需檢查以下關鍵配置項的正確性:
datadir=/var/lib/mysql(確保路徑存在且MySQL用戶有讀寫權限);port=3306(默認端口,避免與其他服務沖突);bind-address=0.0.0.0(允許遠程連接,若僅需本地連接可設為127.0.0.1);socket=/var/lib/mysql/mysql.sock(確保路徑正確)。sudo systemctl restart mysqld
MySQL默認使用3306端口,若該端口被其他進程占用,會導致服務無法啟動或連接失敗。使用以下命令檢查端口占用情況:
sudo netstat -tuln | grep 3306
或使用更詳細的ss命令:
sudo ss -tulnp | grep 3306
若發現占用進程,可通過kill命令終止該進程(需確認進程無重要用途):
sudo kill -9 <PID>
或修改MySQL配置文件中的port參數,更換為其他未被占用的端口(如3307)。
若出現“連接被拒絕”“權限不足”等錯誤,需檢查MySQL用戶權限配置:
mysql -u root -p
host字段):SELECT host, user FROM mysql.user;
若用戶僅能從localhost連接(如'root'@'localhost'),則無法從遠程主機訪問。username為例):CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
若需限制訪問IP,可將%替換為具體IP地址(如192.168.1.100)。若數據文件(如InnoDB表空間文件ibdata1、MyISAM表文件.MYD/.MYI)損壞,可使用以下工具修復:
--innodb_force_recovery參數(從1到6逐步嘗試,6為最高級別,但可能導致數據丟失):sudo mysqld_safe --innodb_force_recovery=1 &
修復后需導出數據并重新初始化數據庫。mysqlcheck工具自動修復所有數據庫:sudo mysqlcheck --all-databases --auto-repair -u root -p
或針對單個表修復:sudo mysqlcheck --repair --databases your_database your_table -u root -p
```。
若MySQL出現性能瓶頸(如慢查詢、高CPU/內存占用),需進行以下優化:
top、htop命令查看CPU、內存使用情況;使用df -h查看磁盤空間(確保/var/lib/mysql所在分區有足夠空間);使用vmstat 1查看磁盤IO負載。pt-query-digest或mysqldumpslow分析慢查詢,添加合適的索引(使用EXPLAIN查看查詢執行計劃,確認是否使用了索引)。my.cnf中的關鍵參數(如innodb_buffer_pool_size設置為物理內存的50%-70%、max_connections根據并發量調整)。sudo setenforce 0
或修改SELinux策略,允許MySQL訪問數據目錄:sudo chcon -R -t mysqld_db_t /var/lib/mysql
firewalld,需開放MySQL端口(3306):sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
若使用iptables,需添加相應規則:sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo service iptables save
```。