必须先停止MySQL服务再初始化,使用mysqld --initialize --datadir指定空目录生成临时root密码,启动后用该密码登录并执行ALTER USER修改密码。

初始化前先确认 MySQL 服务未运行
如果 mysqld 进程已在后台运行(比如通过 systemd 自启),直接执行初始化会失败,报错类似 Can't start server: Bind on TCP/IP port: Address already in use。必须先停掉现有服务:
- Linux(systemd):
sudo systemctl stop mysqld或sudo systemctl stop mysql(取决于包名) -
macOS(Homebrew):
brew services stop mysql - Windows:任务管理器中结束
mysqld.exe,或运行net stop mysql
验证方式:执行 ps aux | grep mysqld(Linux/macOS)或 tasklist | findstr mysqld(Windows),无输出即为已停止。
用 mysqld --initialize 初始化数据目录
这是官方推荐的现代初始化方式(MySQL 5.7.6+ 默认启用安全模式),会自动生成随机 root 密码并写入错误日志。关键点:
- 必须指定
--datadir,且路径为空或不存在(否则报错Directory not empty) - 推荐同时加
--user=mysql(Linux/macOS)避免权限问题 - 不加
--initialize-insecure才会生成随机密码;加了则 root 密码为空(不推荐生产环境)
示例命令:
mysqld --initialize --user=mysql --datadir=/var/lib/mysql
初始化成功后,检查错误日志(默认在 --datadir 下的 hostname.err 文件),找到类似这一行:A temporary password is generated for root@localhost: abc123XYZ! —— 这就是首次登录要用的密码。
启动 mysqld 并完成首次登录与密码重置
初始化完成后不能直接用 mysql -u root -p 登录,因为:
1.) 将所有文件解压到php环境中,本程序才用smarty+php+mysql设计。如果运行不了,请修改hhy文件夹下的smarty.php文件改法请看说明2.) 修改configs下的config.inc.php下的连接数据库的密码和用户名3.) 本程序没有做安全页面,人工导入sql.inc到mysql数据库。管理员初始化帐号为admin,密码为hhy。后台地址:http://你的网站地址/h
- mysqld 还没运行(初始化只是建库,不启服务)
- root 用户被限制为仅本地 socket 连接(
root@localhost),且密码是临时的,强制要求首次登录后修改
操作步骤:
- 启动服务:
sudo systemctl start mysqld(Linux)或brew services start mysql(macOS) - 登录:
mysql -u root -p,输入错误日志里的临时密码 - 立即执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPass123!';
注意:MySQL 8.0+ 默认认证插件是 caching_sha2_password,某些旧客户端(如老版本 PHP mysqli)可能不兼容,必要时可显式指定:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourNewPass123!';
常见失败原因和绕过陷阱
初始化卡住、报错或后续无法连接,多数源于这几个细节:
-
--datadir路径权限不对:确保该目录属主是mysql用户(Linux/macOS),否则mysqld写不了 ibdata1 或日志文件 - SELinux 或 AppArmor 拦截:临时禁用测试(
setenforce 0)可快速验证是否为此类策略导致 -
配置文件干扰:如果
/etc/my.cnf或/etc/mysql/my.cnf存在,mysqld --initialize会读取其中的datadir、socket等设置,和命令行参数冲突——建议初始化时加--no-defaults - Windows 上路径含空格或中文:会导致初始化静默失败,务必用纯英文路径,如
C:\mysql\data
临时密码找不到?不是所有安装包都把日志输出到 hostname.err;用 mysqld --verbose --help | grep "default log" 查默认错误日志位置,或者初始化时显式指定:--log-error=/tmp/mysqld-init.err。









