codecamp

数据库配置指南

# 数据库配置指南 ## 数据库选择 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; ```
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }