6.2.8 常见安装问题与排错思路
在安装部署与初始化阶段,常见问题多由环境依赖、权限、配置与服务管理引起。排错遵循“先环境、后配置、再服务、最后日志”的顺序,结合命令与日志快速定位。
排错前快速体检(示例)
# 1) 系统资源与限制
df -hT
free -h
ulimit -n
# 2) 依赖库检查(以 RHEL/CentOS 为例)
rpm -qa | egrep "libaio|numactl|openssl"
# 3) 端口占用检查
ss -lntp | grep 3306
常见问题与排错示例#
1) 依赖缺失导致安装失败#
现象:YUM/APT 报依赖错误,或二进制启动失败。
处理示例(CentOS/RHEL)
# 安装依赖
yum install -y libaio numactl-libs openssl
# 验证
ldd /usr/sbin/mysqld | egrep "not found"
预期:无 “not found” 输出,依赖齐全。
2) 端口占用导致启动失败#
现象:日志报 Bind on TCP/IP port: Address already in use。
处理示例
# 查占用进程
ss -lntp | grep 3306
# 修改 my.cnf 端口示例
cat >> /etc/my.cnf <<'EOF'
[mysqld]
port=3307
EOF
# 重启服务
systemctl restart mysqld
预期:ss -lntp | grep 3307 有 mysqld 监听。
3) 数据目录权限错误#
现象:Permission denied 或 Can't create/write to file。
处理示例
# 统一属主与权限
chown -R mysql:mysql /data/mysql
chmod 750 /data/mysql
# 重新初始化(注意 datadir 一致)
mysqld --initialize --user=mysql --datadir=/data/mysql
预期:初始化成功并生成 error log。
4) 初始化失败(目录不空/参数冲突)#
现象:--initialize 报错。
处理示例
# 确保目录为空
rm -rf /data/mysql/*
# 核对 my.cnf 关键参数
cat >/etc/my.cnf <<'EOF'
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/var/log/mysqld.log
character-set-server=utf8mb4
EOF
# 执行初始化
mysqld --initialize --user=mysql --datadir=/data/mysql
预期:error log 记录临时 root 密码。
5) systemd 服务启动失败#
现象:systemctl status mysqld 失败。
处理示例
# 查看服务状态与日志
systemctl status mysqld -l
journalctl -u mysqld -n 100
# 验证执行路径
which mysqld
mysqld --verbose --help | head -n 5
预期:服务文件中的 ExecStart 与实际路径一致。
6) Socket 文件缺失#
现象:Can't connect to local MySQL server through socket。
处理示例
# 检查 socket 路径一致性
grep -n "socket" /etc/my.cnf
ls -l /data/mysql/mysql.sock
# 客户端指定 socket
mysql -uroot -p --socket=/data/mysql/mysql.sock
预期:客户端连接成功。
7) root 登录失败(密码未记录)#
现象:忘记初始化密码或登录失败。
处理示例(临时跳过权限表)
# 1) 停止服务
systemctl stop mysqld
# 2) 跳过权限表启动
mysqld --skip-grant-tables --user=mysql --datadir=/data/mysql &
# 3) 重置密码
mysql -uroot <<'EOF'
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewP@ssw0rd!';
EOF
# 4) 正常重启
pkill mysqld
systemctl start mysqld
预期:使用新密码登录成功。
8) SELinux/防火墙阻断#
现象:本地可连,远程不可连。
处理示例
# 临时关闭 SELinux 验证
setenforce 0
getenforce
# 放行端口
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
预期:远程客户端连接成功。
9) 字符集/时区不一致#
现象:乱码或时间偏差。
处理示例
# 查看当前字符集与时区
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%';"
mysql -uroot -p -e "SHOW VARIABLES LIKE 'time_zone';"
# 配置示例
cat >>/etc/my.cnf <<'EOF'
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
default_time_zone=+08:00
EOF
systemctl restart mysqld
预期:变量生效且新库/表默认符合要求。
10) 日志定位思路#
示例(统一日志路径)
# my.cnf 关键配置
cat >>/etc/my.cnf <<'EOF'
[mysqld]
log-error=/var/log/mysqld.log
EOF
# 查看错误日志与 systemd 日志
tail -n 50 /var/log/mysqld.log
journalctl -u mysqld -n 50
预期:可清晰定位错误原因与时间点。
排错流程与验证#
# 1) 依赖与资源
df -hT && free -h && ulimit -n
# 2) 配置检查
mysqld --verbose --help | head -n 10
grep -nE "datadir|socket|log-error|port" /etc/my.cnf
# 3) 启动并验证
systemctl restart mysqld
mysql -uroot -p -e "SELECT VERSION();"
练习#
- 模拟端口冲突:启动一个占用 3306 的进程,观察 mysqld 报错并修改端口恢复。
- 模拟权限错误:将 datadir 权限改为 700 且属主非 mysql,观察错误日志并修复。
- 使用
journalctl -u mysqld定位一次启动失败的具体原因并给出修复命令。 - 设置
socket到新路径,验证客户端连接并写入测试表。