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 deniedCan'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();"

练习#

  1. 模拟端口冲突:启动一个占用 3306 的进程,观察 mysqld 报错并修改端口恢复。
  2. 模拟权限错误:将 datadir 权限改为 700 且属主非 mysql,观察错误日志并修复。
  3. 使用 journalctl -u mysqld 定位一次启动失败的具体原因并给出修复命令。
  4. 设置 socket 到新路径,验证客户端连接并写入测试表。