简介
本指南面向部署与运维人员,提供 DouPHP 的完整数据库设置说明。内容涵盖:
- 创建 MySQL 数据库与用户(字符集 utf8mb4)
- 导入系统表结构与模块数据(SQL 执行步骤)
- 数据库连接配置项说明(host、port、dbname、username、password 等)
- 不同环境(本地开发、测试、生产)的配置示例
- 数据库性能优化建议与备份策略
- 多站点数据库隔离方案
项目结构
DouPHP 的数据库相关资源主要分布在以下位置:
- 应用级数据库配置:config/config.php
- 系统表结构定义:_\doc/开发手册/系统表结构.sql
- 模块数据与增量脚本:_\module//storage/backup/.sql、devtools/sql/*.sql
- 升级与迁移工具:_\tool/upgrade_v1.9.php
- 兼容的数据库连接适配器(PDO/MySQL/MariaDB 等):plugin/*/sdk/...
graph TB
A["应用配置<br/>config/config.php"] --> B["系统表结构<br/>系统表结构.sql"]
B --> C["模块数据<br/>area_china.sql 等"]
A --> D["连接适配器<br/>DbConnectionAdapterPdo.php"]
A --> E["升级工具<br/>upgrade_v1.9.php"]
F["增量脚本<br/>distribution_level_log.sql"] --> C
核心组件
- 数据库配置:位于 config/config.php,包含 host、dbname、username、password、prefix、字符集等关键参数。
- 系统表结构:_\doc/开发手册/系统表结构.sql,定义了所有系统表的建表语句与默认字符集。
- 模块数据:各模块的 storage/backup/*.sql 提供基础数据或字典数据(如地区)。
- 连接适配器:通过 PDO 适配多种数据库驱动(pdo_mysql 等),用于建立连接与执行 SQL。
- 升级工具:_\tool/upgrade_v1.9.php 在升级过程中会读取配置并设置字符集为 utf8mb4。
架构总览
下图展示了从应用配置到数据库连接的总体流程,以及 SQL 导入的关键节点。
sequenceDiagram
participant Admin as "管理员"
participant App as "DouPHP 应用"
participant DB as "MySQL 服务器"
participant Tools as "升级/导入工具"
Admin->>App : 访问安装/升级入口
App->>App : 读取 config/config.php
App->>DB : 使用 host/port/dbname/user/password 建立连接
Note over App,DB : 连接成功后设置字符集为 utf8mb4
Tools->>DB : 执行系统表结构 SQL
Tools->>DB : 执行模块数据 SQL如 area_china.sql
Tools-->>Admin : 输出导入结果与错误信息
详细组件分析
数据库账户与库创建(MySQL)
- 推荐字符集:utf8mb4,排序规则:utf8mb4_unicode_ci(系统表结构已使用该字符集)。
- 建议为每个站点创建独立数据库与专用用户,最小权限原则(仅授予该库所需权限)。
- 若使用共享主机,确保支持 utf8mb4;部分旧版本 MySQL 需确认服务端配置允许。
系统表结构导入
- 主结构文件:_\doc/开发手册/系统表结构.sql,包含所有系统表的 CREATE TABLE 语句。
- 导入方式:
- 命令行:mysql -u 用户名 -p 数据库名 < 系统表结构.sql
- phpMyAdmin:选择目标数据库后“导入”该 SQL 文件
- 其他客户端:Navicat/DBeaver 等均可直接执行
- 注意:
- 首次导入前请确认数据库为空或已有同名表将被覆盖
- 若表前缀非 dou_,请在执行前替换 SQL 中的前缀(或使用工具进行替换)
模块数据导入
- 地区数据:_\module/area/storage/backup/area_china.sql,包含中国省市区基础数据。
- 其他模块数据:_\module//storage/backup/.sql,按需导入对应模块的基础数据。
- 增量脚本:devtools/sql/*.sql,用于新增或修复特定表结构(幂等,可重复执行)。
数据库连接配置
- 配置文件:config/config.php
- 关键参数:
- dbhost:数据库主机地址(可为 IP 或域名)
- dbname:数据库名称
- dbuser:数据库用户名
- dbpass:数据库密码
- prefix:表前缀(默认 dou_)
- DOU_CHARSET:字符集常量(当前设置为 utf-8;建议在连接层统一使用 utf8mb4)
- 连接适配器:
- 通过 PDO 适配器(pdo_mysql)建立连接,支持持久连接选项
- 升级工具中显式设置字符集为 utf8mb4,确保全链路一致
不同环境的配置示例
- 本地开发:
- host:127.0.0.1
- port:3306(默认)
- dbname:douphp_dou(示例)
- username:root
- password:本地密码
- 特点:开启调试模式,便于定位问题
- 测试环境:
- host:测试数据库主机
- dbname:test_douphp(示例)
- username:test_user
- password:测试密码
- 特点:关闭调试模式,模拟真实网络延迟
- 生产环境:
- host:生产数据库主机(建议使用内网地址)
- dbname:prod_douphp(示例)
- username:prod_user(最小权限)
- password:强密码
- 特点:关闭调试模式,启用只读账号用于报表查询(可选)
提示:
- 端口可通过 host:port 形式传入(升级工具支持解析 host 中的冒号端口)
- 生产环境务必限制数据库访问来源 IP 与最小权限
多站点数据库隔离方案
- 方案一:每站一库
- 为每个站点创建独立的数据库与用户
- 通过不同的 config/config.php 指向各自数据库
- 优点:隔离性强,便于备份与迁移
- 方案二:同库不同前缀
- 同一数据库实例下,使用不同表前缀区分站点
- 优点:资源复用度高;缺点:隔离性较弱
- 方案三:读写分离(高级)
- 主库写、从库读,结合连接池与路由
- 适用于高并发场景
性能优化建议
- 索引与统计:
- 对高频查询字段添加合适索引(如订单号、用户ID、时间戳)
- 定期运行 ANALYZE TABLE 更新统计信息
- 连接与缓冲:
- 合理设置连接池大小与超时
- 调整 innodb_buffer_pool_size、max_connections 等参数
- 日志与监控:
- 开启慢查询日志,定期分析慢查询
- 监控连接数、锁等待、IO 使用率
- 字符集一致性:
- 确保数据库、表、列与应用层均使用 utf8mb4,避免转换开销
备份策略
- 全量备份:每日一次 mysqldump 全库备份
- 增量备份:基于 binlog 的增量备份(如 Percona XtraBackup)
- 异地容灾:将备份文件同步至对象存储或异地磁盘
- 恢复演练:定期验证备份可恢复性
依赖关系分析
- 应用配置与连接:
- config/config.php 提供连接参数
- DbConnectionAdapterPdo.php 根据 adapter 构建 DSN 并建立连接
- 升级工具与字符集:
- upgrade_v1.9.php 在连接后设置字符集为 utf8mb4,保证写入与显示一致
- 表结构与数据:
- 系统表结构由系统表结构.sql 定义
- 模块数据由模块 backup SQL 提供
graph LR
CFG["config/config.php"] --> ADP["DbConnectionAdapterPdo.php"]
ADP --> DB["MySQL"]
UPG["upgrade_v1.9.php"] --> DB
SQL["系统表结构.sql"] --> DB
MOD["模块数据 SQL"] --> DB
性能考虑
- 连接复用:
- 可使用持久连接减少握手开销(根据业务负载评估)
- 查询优化:
- 避免 SELECT *,仅取必要字段
- 合理使用分页与缓存
- 存储引擎:
- 使用 InnoDB,开启事务与外键约束
- 字符集:
- 统一 utf8mb4,避免隐式转换导致索引失效
故障排查指南
- 连接失败:
- 检查 host、port、username、password 是否正确
- 确认防火墙与安全组放行数据库端口
- 查看升级工具的报错信息以定位连接问题
- 字符集乱码:
- 确认数据库、表、列与应用层均为 utf8mb4
- 升级工具中已设置 set_charset('utf8mb4')
- 权限不足:
- 为数据库用户授予必要的 SELECT/INSERT/UPDATE/DELETE/CREATE/DROP 权限
- 表不存在或前缀不一致:
- 核对 config/config.php 中的 prefix 与 SQL 中的前缀是否一致
结论
通过正确配置数据库连接、导入系统表结构与模块数据、统一字符集与权限管理,并结合性能优化与备份策略,可以稳定高效地部署与运维 DouPHP。多站点隔离可根据实际规模选择“每站一库”或“同库不同前缀”的方案。
附录
- 常用命令参考:
- 导入系统表结构:mysql -u 用户名 -p 数据库名 < 系统表结构.sql
- 导入模块数据:mysql -u 用户名 -p 数据库名 < area_china.sql
- 执行增量脚本:mysql -u 用户名 -p 数据库名 < distribution_level_log.sql
- 注意事项:
- 执行前备份现有数据
- 生产环境谨慎操作,先在测试环境验证