MySQL / MariaDB 自动兼容
面板启动、数据库恢复重连、初始化页“测试连接”和初始化提交共用连接实现。程序以 SELECT VERSION() 返回的实际服务端为准,不按主控 CPU、浏览器架构或 system.db-type 标签决定 SQL 方言。类型选反时无需改动数据目录。
配置来源与优先级
统一使用 mysql: 保存两种数据库的连接参数;旧版 mariadb: 仍可读取。若两段同时存在,完整选择 mysql:,不会拼接另一段的密码或地址。非空 DB_HOST、DB_PORT、DB_NAME、DB_USER、DB_PASSWORD、DB_TYPE 环境变量覆盖文件。部署模板中的空变量不清空文件配置;确需空密码时在 YAML 中设置,并移除非空环境覆盖。密码中的空格、引号、反斜线等按原始字节保留。
初始化页保留文件中的连接池、超时、TLS 等高级选项。修改文件后如果环境变量仍指向另一个端点,应同时修改部署环境再重启,否则环境变量仍优先。自定义配置文件路径及 .yml 文件也沿用实际启动路径。
自动修复的范围
- 自动识别实际 MySQL/MariaDB;按当前连接选择 SQL,测试另一数据库不会改变正在使用的连接的方言。
- 检测并转换
transaction_isolation/tx_isolation、transaction_read_only/tx_read_only的兼容别名。两个别名值冲突时明确失败。 - 检测已知默认 UTF8MB4 排序规则。服务端支持但驱动握手不支持的 MariaDB UCA1400 规则改为每条连接设置;实际不支持的已知默认规则回退为
utf8mb4_unicode_ci并记录修复项。不会修改已有表或索引的排序规则。 - 初始连接采用有限超时;用户配置的连接池和读写超时不会被简单重置。
- 内置数据库为已知跨版本调优参数生成兼容运行配置,保留原始
my.cnf。安装脚本复用实际已安装的数据库,不因标签错误安装另一引擎接管数据。 - Compose 共用的
deploy/my.cnf同时保留loose-innodb_redo_log_capacity和loose-innodb_log_file_size:MySQL 使用前者,MariaDB 使用后者;内置单容器启动器还会生成严格的引擎专用运行配置。 - 内置单容器启动器不会信任配置文件中的数据目录、Socket、端口和服务端标签:它按服务端版本检测真实引擎,并在运行时副本末尾固定生命周期路径;同时安装两个引擎且数据目录无法明确归属时会拒绝猜测。裸机安装遇到另一引擎的数据标记也会停止,不会覆盖或删除数据。
- 裸机安装支持
noninteractive=true,兼容旧NONINTERACTIVE=true;显式小写变量优先。安装配置中的密码、IPv6 地址和含 YAML 特殊字符的名称按原值保存。设置数据库账户时只在该管理会话补充NO_BACKSLASH_ESCAPES,不改变全局 SQL 模式或应用事务设置。 - 裸机安装从当前版本获取
deploy/my.cnf,按实际引擎渲染到数据库包含目录中的oneclickvirt.cnf;写入前由对应的mysqld/mariadbd做无启动语法校验,旧 drop-in 保留为带时间戳的备份,管理员已有文件和源文件均不覆盖。DB_CONFIG_SOURCE可指向经过审查的替代源文件;Compose 的0.0.0.0监听在裸机运行时会被收敛为127.0.0.1。
测试连接返回实际类型、版本和修复项,不返回密码。正常启动和重连使用修复后的内存连接参数;配置文件可写时会在确认端点仍未切换后,以原子方式备份并保存实际引擎和兼容参数,不会让旧探测覆盖新配置。初始化提交会备份原文件后保存检测结果。只读文件无法自动回写时仍可正常连接,并记录修复提示。
安全边界
自动兼容不等于忽略所有错误。错误密码、拒绝访问、无效 TLS 证书、未知参数、冲突的事务设置和不支持的安全配置会报错;不会自动改密码、关闭证书验证、降低 SQL 模式或删除数据来“修复”。缺少系统表但存在数据、或数据目录属于另一引擎时停止初始化,需备份后显式迁移,不能直接复用两种引擎的数据文件。
Compose 内部数据库监听容器网络供 API 访问;默认宿主机映射为 127.0.0.1:3306:3306,不对公网开放。内置单容器安装与外部数据库部署的网络边界不同,不应互抄监听地址。
可重复验证
源码仓库中执行 bash scripts/tests/database_compat_integration_test.sh,会创建独立、临时的真实数据库容器,验证双向错标签、旧配置段、连接参数、错误配置、初始化和保留原数据重启。测试只清理自己创建的容器及测试卷。CI 覆盖 MySQL 8.0 / 8.4 / 9 和 MariaDB 10.11 / 11.4;缺少 Docker、启动失败或断言失败均为失败,不通过跳过用例报告成功。
