数据库配置指南
# 数据库配置指南
## 数据库选择
DoraCMS 支持两种数据库:
- **MongoDB**:文档型数据库,适合快速开发和内容管理
- **MariaDB**:关系型数据库,适合需要强事务支持的场景
## MongoDB 配置
### 1. 安装 MongoDB
#### macOS 安装
```bash
# 使用 Homebrew 安装
brew tap mongodb/brew
brew install mongodb-community@7.0
# 启动 MongoDB 服务
brew services start mongodb-community@7.0
# 验证安装
mongosh --version
```
#### Ubuntu 安装
```bash
# 导入公钥
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
# 添加源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
# 更新并安装
sudo apt-get update
sudo apt-get install -y mongodb-org
# 启动服务
sudo systemctl start mongod
sudo systemctl enable mongod
```
#### Docker 安装
```bash
# 启动 MongoDB 容器
docker run -d \
--name mongodb \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=admin123 \
-v mongodb_data:/data/db \
mongo:7.0
# 验证运行状态
docker ps | grep mongodb
```
### 2. 创建数据库和用户
```bash
# 连接到 MongoDB
mongosh
# 切换到 admin 数据库
use admin
# 创建管理员用户(如果需要)
db.createUser({
user: "admin",
pwd: "your_admin_password",
roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]
})
# 创建 DoraCMS 数据库
use doracms3
# 创建应用用户
db.createUser({
user: "doracms_user",
pwd: "your_password",
roles: ["readWrite"]
})
# 退出
exit
```
### 3. 配置连接
在 `.env` 文件中配置 MongoDB 连接:
```env
# 数据库类型
DATABASE_TYPE=mongodb
# MongoDB 连接配置
MONGODB_HOST=127.0.0.1
MONGODB_PORT=27017
MONGODB_DATABASE=doracms3
MONGODB_USERNAME=doracms_user
MONGODB_PASSWORD=your_password
# 连接选项
MONGODB_OPTIONS=authSource=doracms3&retryWrites=true&w=majority
```
### 4. 验证连接
```bash
# 测试连接
mongosh "mongodb://doracms_user:your_password@127.0.0.1:27017/doracms3"
# 或使用连接字符串
mongosh "mongodb://doracms_user:your_password@127.0.0.1:27017/doracms3?authSource=doracms3"
```
## MariaDB 配置
### 1. 安装 MariaDB
#### macOS 安装
```bash
# 使用 Homebrew 安装
brew install mariadb
# 启动服务
brew services start mariadb
# 安全配置
mysql_secure_installation
```
#### Ubuntu 安装
```bash
# 安装 MariaDB
sudo apt-get update
sudo apt-get install mariadb-server
# 启动服务
sudo systemctl start mariadb
sudo systemctl enable mariadb
# 安全配置
sudo mysql_secure_installation
```
#### Docker 安装
```bash
# 启动 MariaDB 容器
docker run -d \
--name mariadb \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root_password \
-e MYSQL_DATABASE=doracms3 \
-e MYSQL_USER=doracms_user \
-e MYSQL_PASSWORD=user_password \
-v mariadb_data:/var/lib/mysql \
mariadb:10.11
# 验证运行状态
docker ps | grep mariadb
```
### 2. 创建数据库和用户
```bash
# 连接到 MariaDB
mysql -u root -p
# 创建数据库
CREATE DATABASE doracms3 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 创建用户
CREATE USER 'doracms_user'@'localhost' IDENTIFIED BY 'your_password';
CREATE USER 'doracms_user'@'%' IDENTIFIED BY 'your_password';
# 授权
GRANT ALL PRIVILEGES ON doracms3.* TO 'doracms_user'@'localhost';
GRANT ALL PRIVILEGES ON doracms3.* TO 'doracms_user'@'%';
# 刷新权限
FLUSH PRIVILEGES;
# 退出
EXIT;
```
### 3. 配置连接
在 `.env` 文件中配置 MariaDB 连接:
```env
# 数据库类型
DATABASE_TYPE=mariadb
# MariaDB 连接配置
MARIADB_HOST=127.0.0.1
MARIADB_PORT=3306
MARIADB_DATABASE=doracms3
MARIADB_USERNAME=doracms_user
MARIADB_PASSWORD=your_password
# 启用 Repository 模式(推荐)
REPOSITORY_ENABLED=true
```
### 4. 验证连接
```bash
# 测试连接
mysql -h 127.0.0.1 -P 3306 -u doracms_user -p doracms3
# 查看数据库
SHOW DATABASES;
USE doracms3;
SHOW TABLES;
```
## 数据库初始化
### MongoDB 初始化
DoraCMS 会在首次启动时自动创建必要的集合和索引:
```javascript
// 主要集合
- users // 用户信息
- articles // 文章内容
- categories // 分类信息
- tags // 标签信息
- comments // 评论数据
- settings // 系统设置
```
### MariaDB 初始化
启用 Repository 模式后,系统会自动创建数据表:
```sql
-- 主要数据表
CREATE TABLE users (
id VARCHAR(36) PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE articles (
id VARCHAR(36) PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content LONGTEXT,
author_id VARCHAR(36),
category_id VARCHAR(36),
status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
```
## 数据库切换
### 从 MongoDB 切换到 MariaDB
1. **备份 MongoDB 数据**:
```bash
mongodump --db doracms3 --out ./backup
```
2. **修改配置**:
```env
DATABASE_TYPE=mariadb
REPOSITORY_ENABLED=true
```
3. **启动应用**:
```bash
# Docker 方式
docker-compose --profile mariadb up -d
# 本地开发
pnpm dev
```
### 从 MariaDB 切换到 MongoDB
1. **备份 MariaDB 数据**:
```bash
mysqldump -u doracms_user -p doracms3 > backup.sql
```
2. **修改配置**:
```env
DATABASE_TYPE=mongodb
REPOSITORY_ENABLED=false
```
3. **启动应用**:
```bash
# Docker 方式
docker-compose up -d
# 本地开发
pnpm dev
```
## 性能优化
### MongoDB 优化
#### 索引优化
```javascript
// 常用索引
db.articles.createIndex({ "title": "text", "content": "text" })
db.articles.createIndex({ "status": 1, "created_at": -1 })
db.articles.createIndex({ "author_id": 1 })
db.articles.createIndex({ "category_id": 1 })
db.users.createIndex({ "username": 1 })
db.users.createIndex({ "email": 1 })
```
#### 配置优化
```yaml
# mongod.conf
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 2
collectionConfig:
blockCompressor: snappy
net:
maxIncomingConnections: 1000
operationProfiling:
slowOpThresholdMs: 100
```
### MariaDB 优化
#### 配置优化
```ini
# my.cnf
[mysqld]
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
max_connections = 1000
query_cache_size = 256M
query_cache_type = 1
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
```
#### 索引优化
```sql
-- 常用索引
CREATE INDEX idx_articles_status_created ON articles(status, created_at);
CREATE INDEX idx_articles_author ON articles(author_id);
CREATE INDEX idx_articles_category ON articles(category_id);
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_email ON users(email);
-- 全文索引
CREATE FULLTEXT INDEX idx_articles_fulltext ON articles(title, content);
```
## 备份策略
### MongoDB 备份
```bash
# 完整备份
mongodump --db doracms3 --out ./backup/$(date +%Y%m%d)
# 增量备份(需要开启 oplog)
mongodump --db doracms3 --oplog --out ./backup/incremental
# 恢复
mongorestore --db doracms3 ./backup/20240101/doracms3
```
### MariaDB 备份
```bash
# 完整备份
mysqldump -u doracms_user -p doracms3 > backup_$(date +%Y%m%d).sql
# 只备份结构
mysqldump -u doracms_user -p --no-data doracms3 > structure.sql
# 只备份数据
mysqldump -u doracms_user -p --no-create-info doracms3 > data.sql
# 恢复
mysql -u doracms_user -p doracms3 < backup_20240101.sql
```
## 监控和维护
### MongoDB 监控
```javascript
// 查看数据库状态
db.stats()
// 查看集合状态
db.articles.stats()
// 查看慢查询
db.getProfilingStatus()
db.system.profile.find().sort({ts: -1}).limit(5)
// 查看连接数
db.serverStatus().connections
```
### MariaDB 监控
```sql
-- 查看数据库大小
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'doracms3';
-- 查看表状态
SHOW TABLE STATUS FROM doracms3;
-- 查看连接数
SHOW STATUS LIKE 'Connections';
SHOW STATUS LIKE 'Threads_connected';
-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SHOW STATUS LIKE 'Slow_queries';
```
## 常见问题
### 连接问题
**MongoDB 连接超时**:
```bash
# 检查服务状态
brew services list | grep mongodb
sudo systemctl status mongod
# 检查端口
lsof -i :27017
netstat -an | grep 27017
```
**MariaDB 连接被拒绝**:
```bash
# 检查服务状态
brew services list | grep mariadb
sudo systemctl status mariadb
# 检查端口
lsof -i :3306
netstat -an | grep 3306
```
### 权限问题
**MongoDB 认证失败**:
```javascript
// 检查用户权限
use doracms3
db.getUsers()
// 重新授权
db.grantRolesToUser("doracms_user", ["readWrite"])
```
**MariaDB 访问被拒绝**:
```sql
-- 检查用户权限
SELECT User, Host FROM mysql.user WHERE User = 'doracms_user';
SHOW GRANTS FOR 'doracms_user'@'localhost';
-- 重新授权
GRANT ALL PRIVILEGES ON doracms3.* TO 'doracms_user'@'%';
FLUSH PRIVILEGES;
```