首先确认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
```。