下面这份是我 按你当前使用场景(CRMEB + Java + PHP) 整理的
👉 「MySQL 8.0 生产可用 · 高兼容 · 少踩坑」专用配置
目标只有一个:
能跑、不炸、性能比 5.7 好、老代码不改或少改
一、MySQL 8.0 专用 my.cnf(CRMEB / Java / PHP 通用)
✅ 兼容 CRMEB(ThinkPHP)✅ 兼容老 PHP PDO / mysqli✅ 兼容老 Java Connector/J✅ 避开 8.0 最常见雷点
[mysqld]
# =========================
# 基础端口 & 路径
# =========================
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
pid-file = /var/run/mysqld/mysqld.pid
# =========================
# 字符集(统一,避免乱码)
# =========================
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
skip-character-set-client-handshake = 1
# =========================
# 兼容 5.7 / 老项目(重点)
# =========================
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
default_authentication_plugin = mysql_native_password
explicit_defaults_for_timestamp = 1
lower_case_table_names = 1
# =========================
# InnoDB(8.0 推荐)
# =========================
default-storage-engine = InnoDB
innodb_buffer_pool_size = 4G # 按内存调整
innodb_buffer_pool_instances = 1
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_autoinc_lock_mode = 2
# =========================
# 连接 & 超时
# =========================
max_connections = 500
max_connect_errors = 100000
wait_timeout = 28800
interactive_timeout = 28800
connect_timeout = 10
# =========================
# 缓冲 & 临时表
# =========================
tmp_table_size = 256M
max_heap_table_size = 256M
sort_buffer_size = 4M
join_buffer_size = 4M
# =========================
# 包大小(防止导入报错)
# =========================
max_allowed_packet = 256M
# =========================
# 日志(生产推荐)
# =========================
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1
log_error = mysql-error.log
# =========================
# 安全(不影响业务)
# =========================
secure-file-priv = NULL
symbolic-links = 0
# =========================
# 关闭 MySQL 8.0 新特性(老系统更稳)
# =========================
mysqlx = 0
二、不同项目的「额外适配说明」
CRMEB(ThinkPHP / PHP)
必须确认的点
- PHP ≥ 7.2(推荐 7.4 / 8.0)
- PDO / mysqli 驱动 ≥ mysqlnd
PHP 连接建议
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'crmeb',
'username' => 'root',
'password' => '******',
'charset' => 'utf8mb4',
'prefix' => 'eb_',
]
常见 CRMEB 报错
- SQLSTATE[42000] GROUP BY👉 已通过 sql_mode 规避
Java 项目(Spring Boot / MyBatis)
驱动版本(非常重要)
| 驱动 | 是否支持 8.0 |
|---|---|
| mysql-connector-java 5.1.x | 勉强 |
| mysql-connector-j 8.0.x | 推荐 |
JDBC URL 推荐
jdbc:mysql://127.0.0.1:3306/db_name
?useUnicode=true
&characterEncoding=utf8
&useSSL=false
&serverTimezone=Asia/Shanghai
&allowPublicKeyRetrieval=true
不加 allowPublicKeyRetrieval=truecaching_sha2_password 会连不上
(我们已在 MySQL 侧强制 mysql_native_password,更稳)
PHP 老项目(非 CRMEB)
必查项
php -m | grep mysqli
php -m | grep pdo_mysql
建议 ini
mysqli.default_socket=/var/lib/mysql/mysql.sock
pdo_mysql.default_socket=/var/lib/mysql/mysql.sock
三、不同内存服务器的推荐参数
| 服务器内存 | innodb_buffer_pool_size |
|---|---|
| 4G | 2G |
| 8G | 4G |
| 16G | 8G |
| 32G | 16G |
原则:内存的 50%~60%
四、8.0 下「强烈不建议开启」的选项
ONLY_FULL_GROUP_BY
utf8mb4_0900_ai_ci
caching_sha2_password(老项目)
MySQLX(33060)
五、升级后必做 SQL 修复(可选但推荐)
-- 修复非法时间
UPDATE 表名
SET created_at = NULL
WHERE created_at = '0000-00-00 00:00:00';
-- 检查 group by
SET SESSION sql_mode='';
六、上线前自检清单(非常重要)
- PHP / Java 正常连接
- CRMEB 后台不报 SQL 错
- 下单 / 支付流程跑通
- 慢日志无异常暴涨
- 备份可恢复

