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,验证远程连接失败、本地连接成功。