MySQL初始化脚本执行前须确认:1.mysqld进程已启动且监听3306端口;2.脚本不含CREATE USER/GRANT语句(除非用--init-file启动或手动登录);3.脚本首行不可写#!/usr/bin/env mysql。

MySQL 初始化脚本执行前必须确认的三件事
脚本不是丢进命令行就能跑通的——多数失败源于权限、上下文或 MySQL 状态没对齐。
-
mysqld进程必须已启动,且监听本地3306(或你配置的端口),mysqladmin ping能返回mysqld is alive - 初始化脚本里不能含
CREATE USER或GRANT语句,除非你已用--init-file启动或手动登录后执行;默认 root 密码为空时,直接mysql -u root才能连上 - 脚本第一行别写
#!/usr/bin/env mysql—— MySQL 不是解释器,这种 shebang 会被忽略,甚至导致语法错误
用 mysql 命令行直接执行 SQL 文件的正确姿势
这是最常用也最容易出错的方式:路径、字符集、连接参数稍有偏差,就报 ERROR 1045 (28000) 或乱码插入。
- 确保文件是 UTF-8 编码(无 BOM),否则中文注释或字段值可能触发
Incorrect string value - 显式指定连接参数,避免依赖 my.cnf 默认值:
mysql -u root -p -h 127.0.0.1 -P 3306 --default-character-set=utf8mb4 - 如果脚本含多个
USE db_name,建议每个语句后加;并换行;MySQL 在管道中对空行和注释更敏感,--comments参数不解决执行问题
docker 中初始化 MySQL 容器时自动运行脚本的限制
Docker 官方镜像(mysql:8.0)只认 /docker-entrypoint-initdb.d/ 下的 .sql、.sql.gz 或 .sh 文件,但行为有隐含规则。
1.) 将所有文件解压到php环境中,本程序才用smarty+php+mysql设计。如果运行不了,请修改hhy文件夹下的smarty.php文件改法请看说明2.) 修改configs下的config.inc.php下的连接数据库的密码和用户名3.) 本程序没有做安全页面,人工导入sql.inc到mysql数据库。管理员初始化帐号为admin,密码为hhy。后台地址:http://你的网站地址/h
- 仅在容器首次启动、且数据卷为空时执行;重启容器或挂载已有数据卷,脚本完全被跳过
-
.sh脚本必须以#!/bin/bash开头,且最终调用mysql -u root -e "...",不能直接 echo SQL 到 stdout - 如果脚本里创建了数据库,记得在
CREATE DATABASE后立刻USE,否则后续CREATE TABLE会报No database selected
初始化失败后如何快速定位是脚本问题还是环境问题
别急着重跑整个流程,先分层验证。
- 用
mysql -u root -e "SELECT VERSION();"确认连接可用;若失败,问题在认证或网络,不是脚本本身 - 把 init.sql 拆成单条语句,逐条粘贴进
mysql -u root交互终端,观察哪一行报错(比如DATETIME字段在 5.6 里不支持DEFAULT CURRENT_TIMESTAMP) - 检查 MySQL 错误日志:
tail -n 50 /var/log/mysql/error.log(Linux)或docker logs,里面常有比客户端更具体的提示,如Unknown collation: 'utf8mb4_0900_as_cs'(说明用了 8.0 特有排序规则,但服务端是 5.7)
SHOW VARIABLES LIKE 'character_set%';。









