my.cnf应放在/etc/my.cnf,至少包含[mysqld]段的datadir、basedir、socket,[client]段建议加socket,lower_case_table_names=1需初始化前设定;初始化必须用--defaults-file指定配置文件,且带--user=mysql;pid-file路径须存在并属主为mysql;推荐建软链接和配置PATH。

my.cnf 放哪、怎么写、哪些参数必须设
MySQL 启动时按顺序读取配置文件:/etc/my.cnf → /etc/mysql/my.cnf → $BASEDIR/my.cnf → ~/.my.cnf,优先级从高到低。生产环境强烈建议只用 /etc/my.cnf 或显式指定路径(如 --defaults-file=/data/my_3306.cnf),避免多实例间互相干扰。
最简可用的 my.cnf 至少要包含以下三块:
-
[mysqld]段必须有datadir(指向你准备好的空数据目录)、basedir(指向解压后的 MySQL 根目录)、socket(推荐设为/tmp/mysql.sock或/data/mysql/mysql.sock) -
[client]段建议加socket,否则mysql -u root默认连/var/lib/mysql/mysql.sock,容易报Can't connect to local MySQL server -
lower_case_table_names=1如果你后续要迁移旧库或跨平台,现在就得定死,初始化后不可改
别碰 thread_concurrency:MySQL 5.7+ 已废弃该参数,设了反而触发 warning;MySQL 8.0 完全移除。
初始化命令必须带 --defaults-file,且不能漏 --user
二进制包没装服务,mysqld --initialize 是纯命令行操作,它不会自动去读 /etc/my.cnf —— 除非你显式用 --defaults-file 指定。漏掉这个参数,mysqld 就按内置默认值跑,datadir 会变成 ./data(当前目录下),导致初始化完找不到数据文件。
正确初始化命令长这样:
bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
注意点:
-
--user=mysql必须存在,否则初始化生成的文件属主是当前用户(比如 root),后续 mysqld 进程以 mysql 用户启动时会因权限拒绝启动 - 初始化成功后,临时 root 密码在错误日志里(不是 stdout),默认输出到
stderr,但实际写入的是mysqld.log或你配置的log-error路径;查不到就翻cat /data/mysql/*.err | grep 'temporary password' - 如果重复执行
--initialize,会直接退出并报错A mysqld process already exists,不是覆盖,是拒绝重入
启动失败常见原因:pid-file 路径不存在或权限不对
MySQL 5.7+ 的 mysql.server 脚本依赖 pid-file 配置项定位进程。如果你的 my.cnf 里没写 pid-file,脚本会拼一个默认路径(比如 /data/mysql/hostname.pid),但该目录往往没创建,或属主不是 mysql,结果就是 ERROR! The server quit without updating PID file。
解决办法很简单,在 [mysqld] 段加一行:
pid-file = /data/mysql/mysql.pid
然后确保该路径所在目录可写:
mkdir -p /data/mysqlchown -R mysql:mysql /data/mysql- 别用
chmod 777,MySQL 启动时若发现 pid 目录权限过松,会直接 abort
另外,mysql.server 脚本里的 basedir 和 datadir 变量必须和 my.cnf 一致,否则它会自己瞎猜路径,大概率错。
软链接和环境变量不是可选项,是免踩坑刚需
二进制包解压出来是一堆带版本号的目录(如 mysql-8.0.33-linux-glibc2.12-x86_64),不建软链接的话,每次升级都要改所有路径:配置文件、启动脚本、PATH、crontab 里的备份命令……极易遗漏。
标准做法:
ln -sf mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysqlecho 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile && source /etc/profile
这样 mysql、mysqld、mysqladmin 等命令全局可用,mysql.server 脚本也能通过 basedir 找到 bin 目录。不设环境变量,连 mysql -V 都会报 command not found。
最后提醒一句:初始化完别急着 start,先手动跑一次 mysqld --defaults-file=/etc/my.cnf --user=mysql 看是否静默返回(无报错即成功),再交给 service 脚本——很多问题其实在这一步就能暴露。


















