21- 数据库服务基础(MariaDB / PostgreSQL) 🗃️
前提条件 ✅
- 已完成 Web 服务配置(Apache2 或 Nginx 已运行,80/443 端口开放)
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm
- 防火墙已放行数据库端口(MariaDB 默认 3306/tcp,PostgreSQL 默认 5432/tcp)
- 建议:/data 目录使用 LVM 逻辑卷(上一阶段已准备好),用于存放数据库数据文件
详细步骤 🛠️
- MariaDB(MySQL 兼容分支,推荐大多数 Web 应用)
安装:
sudo apt update
sudo apt install -y mariadb-server mariadb-client
安全初始化(强烈推荐首次运行):
sudo mysql_secure_installation
交互式回答建议: - Enter current password for root:回车(Debian 默认无密码) - Switch to unix_socket authentication:n - Change the root password:y → 设置强密码 - Remove anonymous users:y - Disallow root login remotely:y(生产建议) - Remove test database:y - Reload privilege tables now:y
启动并启用:
sudo systemctl enable --now mariadb
sudo systemctl status mariadb
创建测试数据库与用户:
sudo mysql -u root -p
在 mysql 提示符下执行:
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON testdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
测试连接:
mysql -u appuser -p -e "SELECT 1"
远程访问(生产慎用,建议通过 SSH 隧道或 VPN): - 编辑 /etc/mysql/mariadb.conf.d/50-server.cnf - 修改 bind-address = 0.0.0.0 - 重启 mariadb - ufw allow 3306(仅限特定 IP)
- PostgreSQL(功能强大、标准 SQL 遵守度高,推荐企业级应用)
安装:
sudo apt install -y postgresql postgresql-contrib
启动并启用:
sudo systemctl enable --now postgresql
sudo systemctl status postgresql
创建数据库与用户:
sudo -u postgres psql
在 psql 提示符下:
CREATE USER appuser WITH ENCRYPTED PASSWORD 'StrongPass123!';
CREATE DATABASE testdb OWNER appuser;
GRANT ALL PRIVILEGES ON DATABASE testdb TO appuser;
\q
测试连接:
psql -U appuser -d testdb -h localhost -W
远程访问配置(生产慎用): - 编辑 /etc/postgresql/15/main/postgresql.conf - listen_addresses = '*' - 编辑 /etc/postgresql/15/main/pg_hba.conf - 添加:host all all 192.168.1.0/24 md5 - 重启 postgresql - ufw allow 5432(仅限特定 IP)
- 数据目录迁移到 /data(生产推荐,使用 LVM)
以 MariaDB 为例:
sudo systemctl stop mariadb
sudo rsync -av /var/lib/mysql/ /data/mysql/
sudo mv /var/lib/mysql /var/lib/mysql.bak
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
修改:
datadir = /data/mysql
权限修复:
sudo chown -R mysql:mysql /data/mysql
sudo systemctl start mariadb
PostgreSQL 同理(datadir = /data/postgresql/15/main)
- 备份与安全最佳实践
- 定期备份:使用 mysqldump / pg_dump + cron
- 启用二进制日志(MariaDB)/ WAL(PostgreSQL)用于 PITR
- 最小权限原则:不要用 root/postgres 账号跑应用
- AppArmor 策略(已启用):默认对 mysqld/postgresql 生效
实践任务 🎯
- 安装 MariaDB,运行 mysql_secure_installation,创建 testdb 和 appuser
- 安装 PostgreSQL,创建同名数据库和用户,测试 psql 连接
- 将 MariaDB 数据目录迁移到 /data/mysql,重启服务确认正常
- 用 mysqldump / pg_dump 导出 testdb 到 /backup,验证备份文件可读
自测问题 ❓
- mysql_secure_installation 脚本主要做了哪些安全加固?
- PostgreSQL 中 pg_hba.conf 文件的作用是什么?
- 为什么生产环境建议将数据库数据目录迁移到独立 LVM 卷?
- 如何让 MariaDB / PostgreSQL 只监听本地(不接受远程连接)?
总结 📌
MariaDB 适合快速部署的 Web 应用,PostgreSQL 适合需要复杂查询、事务完整性、扩展性的业务。
本章建立了数据库基础环境 + 安全初始化 + 数据目录优化,为后续 Web + 数据库联动(如 WordPress、Django、Node.js 应用)奠定基础。
后续邮件服务、VPN 等章节也将可能用到数据库作为后端存储。