6.2.4 初始化与基础配置(my.cnf、数据目录、端口)

本节聚焦 MySQL 初始化与基础配置,核心是规范化 my.cnf、数据目录与端口规划,确保实例可控、可迁移、可审计,并给出可执行的初始化与验证流程、排错与练习。

  • 原理草图:初始化与配置生效路径
文章图片
  • 初始化方式与数据目录规划(示例)
  • 目录准备与权限(建议独立磁盘或 LVM)
# 假设 /data 已挂载独立盘
mkdir -p /data/mysql /data/mysql/log /data/mysql/tmp
chown -R mysql:mysql /data/mysql
chmod 750 /data/mysql /data/mysql/log /data/mysql/tmp
  • 初始化(选择其一)
# 方式1:生成随机 root 密码(MySQL 8.0)
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

# 方式2:空密码初始化,务必后续立即设置
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
  • 预期效果:/data/mysql 下生成 mysql/、ibdata1、undo、auto.cnf 等文件

  • my.cnf 基础结构与关键项(完整示例)

# /etc/my.cnf
[client]
port=3306
socket=/data/mysql/mysql.sock

[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
port=3306
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
log-error=/data/mysql/log/mysql-error.log
tmpdir=/data/mysql/tmp

character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
default-time-zone=+08:00
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 安全与可控
local_infile=0
skip-name-resolve=ON
bind-address=0.0.0.0

# 初始化阶段基础性能项
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
max_connections=300
sync_binlog=1
innodb_flush_log_at_trx_commit=1
  • 启动与验证(systemd 示例)
# 启动
systemctl start mysqld
systemctl status mysqld --no-pager

# 验证端口与 socket
ss -lntp | grep 3306
ls -l /data/mysql/mysql.sock
  • 首次登录与密码设置(初始化验证)
# 使用 socket 登录(若为随机密码初始化,需先从错误日志中获取临时密码)
grep "temporary password" /data/mysql/log/mysql-error.log

# 登录并设置新密码
mysql -uroot -p -S /data/mysql/mysql.sock
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Str0ng!Passw0rd';
  • 常见排错与对应命令
  • 报错 1:Can't find file: 'mysql' (errno: 2)
# 原因:未初始化或 datadir 不匹配
grep "datadir" /etc/my.cnf
ls -l /data/mysql
  • 报错 2:Permission denied
# 原因:目录权限或属主不正确
ls -ld /data/mysql /data/mysql/log /data/mysql/tmp
chown -R mysql:mysql /data/mysql
  • 报错 3:Address already in use
# 原因:端口冲突
ss -lntp | grep 3306
# 修改 /etc/my.cnf 的 port=3307,并重启
  • 配置核对清单(命令版)
# 字符集与时区
mysql -uroot -p -S /data/mysql/mysql.sock -e "SHOW VARIABLES LIKE 'character_set_server';"
mysql -uroot -p -S /data/mysql/mysql.sock -e "SHOW VARIABLES LIKE 'time_zone';"

# sql_mode 与安全项
mysql -uroot -p -S /data/mysql/mysql.sock -e "SHOW VARIABLES LIKE 'sql_mode';"
mysql -uroot -p -S /data/mysql/mysql.sock -e "SHOW VARIABLES LIKE 'local_infile';"
  • 练习
    1) 在同一台机器上规划第二实例(端口 3307),要求数据目录、socket、日志、pid 全部独立,并成功启动。
    2) 将 character-set-server 改为 utf8mb4,重启后验证 SHOW VARIABLES 输出。
    3) 人为将 /data/mysql 权限改错,观察报错并恢复。
    4) 修改 bind-address 为 127.0.0.1,验证远程连接失败、本地连接成功。