数据库是动态应用的心脏——选错了架构或配置不当,轻则性能低下,重则数据丢失。本指南覆盖 MySQL、PostgreSQL、Redis 三大主流数据库的完整部署方案,从安全加固到性能调优,帮您构建稳健的数据存储层。
📊 选型对比:MySQL / PostgreSQL / Redis
三者各有定位,大多数 Web 应用会同时使用其中两种(如 MySQL + Redis)。先了解各自的核心差异,再做选择:
| 维度 | 🐬 MySQL / MariaDB | 🐘 PostgreSQL | ⚡ Redis |
|---|---|---|---|
| 定位 | 通用 Web 应用数据库 | 企业级、复杂查询 | 内存缓存 / 消息队列 |
| 数据模型 | 关系型(行存储) | 关系型 + JSON + 数组 + 地理信息 | 键值对(支持多种数据结构) |
| 适用场景 | WordPress / 论坛 / 常规 CRUD | 金融 / GIS / 数据分析 / 高并发写 | Session 存储 / 热点缓存 / 排行榜 |
| SQL 标准 | 部分支持(有方言) | 严格遵守 ANSI SQL / ACID | 非 SQL(自有命令集) |
| 资源占用 | 中(默认配置约 200-400MB) | 中(默认约 100-300MB) | 极低(纯内存,通常 < 50MB) |
| 生态社区 | 最大,教程文档最丰富 | 技术氛围浓厚,扩展插件极丰富 | 专注高性能,官方文档清晰 |
💡 一句话选型: 不知道选什么?MySQL + Redis 是大多数 Web 应用的黄金组合。MySQL 负责持久化存储结构化数据,Redis 缓存热点查询结果和 Session。只有当您需要复杂 SQL(窗口函数、JSON 查询、全文检索、地理信息)时才选 PostgreSQL。
🐬 MySQL 8:安装、配置与安全加固
安装 MySQL
# ── Ubuntu / Debian ──────────────────────────────────────────────────────────
sudo apt update && sudo apt install mysql-server -y
# 启动并设置开机自启
sudo systemctl enable --now mysql
# 验证安装(查看版本)
mysql --version 安全初始化(安装后必做!)
# 运行官方安全初始化脚本(安装后必做!)
# 脚本会引导您设置 root 密码、移除匿名用户、禁止 root 远程登录、删除测试数据库
sudo mysql_secure_installation
# 建议选择:
# VALIDATE PASSWORD component: Y(开启密码强度验证)
# Password level: 2(STRONG,至少 8 位含大小写+数字+特殊字符)
# Remove anonymous users: Y
# Disallow root login remotely: Y(禁止 root 远程登录,最重要!)
# Remove test database: Y
# Reload privilege tables: Y 创建应用数据库与专用用户
# 以 root 登录(Ubuntu/Debian 安装后默认无密码,直接 sudo mysql)
sudo mysql
-- 创建应用数据库
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 为每个应用创建独立用户,权限最小化(不用 root!)
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY '高强度密码_至少16位';
-- 只授予该用户访问 myapp 库的权限
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
-- 刷新权限(立即生效)
FLUSH PRIVILEGES;
-- 验证:查看用户权限
SHOW GRANTS FOR 'myapp_user'@'localhost';
EXIT; 核心配置:字符集 + 慢查询日志 + 性能参数
# 文件路径:/etc/mysql/mysql.conf.d/mysqld.cnf
# 在 [mysqld] 区块下添加以下配置
[mysqld]
# ── 字符集(必须设置,避免中文和 emoji 乱码)──────────────────────────────
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# ── 慢查询日志(排查性能瓶颈的必备工具)──────────────────────────────────────
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 超过 1 秒的 SQL 都记录
log_queries_not_using_indexes = 1 # 未用索引的查询也记录(非常有价值)
# ── 核心性能参数(根据服务器内存调整)────────────────────────────────────────
# 2GB 内存服务器参考值:
innodb_buffer_pool_size = 1G # 物理内存的 50%
max_connections = 300 # 最大并发连接数
innodb_log_file_size = 256M # Redo Log 大小
# 重启 MySQL 使配置生效
# sudo systemctl restart mysql 🐘 PostgreSQL:安装、配置与安全加固
安装 PostgreSQL
# ── Ubuntu / Debian(使用官方源获取最新版本)────────────────────────────────
sudo apt install -y postgresql postgresql-contrib
# 启动并设置开机自启
sudo systemctl enable --now postgresql
# 验证(查看版本)
psql --version
# ── CentOS / AlmaLinux(使用 PostgreSQL 官方 YUM 源)──────────────────────
# 参考:https://www.postgresql.org/download/linux/redhat/
sudo dnf install -y postgresql16-server
sudo postgresql-16-setup initdb
sudo systemctl enable --now postgresql-16 初始配置:修改密码与创建应用数据库
# ── 切换到 postgres 系统用户(PostgreSQL 的管理用户)──────────────────────
sudo -i -u postgres
# 进入数据库命令行(psql)
psql
-- 修改 postgres 超级管理员密码(必做!)
password postgres
-- 创建应用数据库
CREATE DATABASE myapp ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' TEMPLATE template0;
-- 创建专用用户(不使用超级用户 postgres 连接应用!)
CREATE USER myapp_user WITH ENCRYPTED PASSWORD '高强度密码_至少16位';
-- 授予数据库权限
GRANT ALL PRIVILEGES ON DATABASE myapp TO myapp_user;
-- 退出
q
# 退出 postgres 系统用户
exit 安全加固:pg_hba.conf 认证配置
# ── 修改 pg_hba.conf 控制访问认证方式 ───────────────────────────────────────
# 文件路径(PostgreSQL 16):/etc/postgresql/16/main/pg_hba.conf
# 每一行格式:类型 数据库 用户 地址 认证方式
# 默认配置(local peer 允许本地系统用户无密码登录)保留不动
# local all postgres peer
# 修改远程连接认证方式为 scram-sha-256(最安全的密码认证)
# host all all 0.0.0.0/0 scram-sha-256 # ← 不推荐开放所有 IP
# host all all 1.2.3.4/32 scram-sha-256 # ← 只允许特定 IP(推荐)
# ── 修改 postgresql.conf 绑定地址 ────────────────────────────────────────────
# 文件路径:/etc/postgresql/16/main/postgresql.conf
# 默认只监听本地(推荐保持)
listen_addresses = 'localhost'
# 如需远程访问,改为(并配合防火墙限制 IP):
# listen_addresses = '*'
# 修改后重启服务
sudo systemctl restart postgresql ⚡ Redis:缓存部署与持久化策略
Redis 是基于内存的高性能键值数据库,在 Web 应用中主要承担:Session 存储(避免分布式 Session 问题)、热点数据缓存(减轻 MySQL 压力)、计数器/排行榜(原子操作天然支持)、消息队列(List/Stream 数据结构)。
安装 Redis
# ── Ubuntu / Debian ──────────────────────────────────────────────────────────
sudo apt update && sudo apt install redis-server -y
sudo systemctl enable --now redis-server
# 验证安装(查看版本)
redis-cli --version
# 测试连通性
redis-cli ping # 应返回:PONG 安全配置(必做!Redis 默认无密码极度危险)
⚠️ 血泪教训: Redis 默认无密码,一旦 6379 端口暴露在公网,攻击者可在几分钟内利用 CONFIG SET 命令写入 SSH 公钥,实现免密登录,完全接管服务器。务必设置强密码并只绑定 127.0.0.1。
# 文件路径:/etc/redis/redis.conf
# 修改以下关键配置(使用 sudo nano /etc/redis/redis.conf)
# ── 安全:绑定地址(只允许本地访问)──────────────────────────────────────────
bind 127.0.0.1 ::1
# ── 安全:设置强密码(绝对不能省略!)───────────────────────────────────────
requirepass 高强度密码_至少20位随机字符
# ── 安全:禁用危险命令(防止攻击者执行 FLUSHALL 清空数据)────────────────────
rename-command FLUSHALL "" # 禁用 FLUSHALL
rename-command FLUSHDB "" # 禁用 FLUSHDB
rename-command CONFIG "CONF_SAFE" # 重命名为难猜的名字(用于管理工具)
rename-command DEBUG ""
# ── 内存限制(防止 Redis 无限消耗内存导致系统 OOM)────────────────────────────
maxmemory 256mb # 最多使用 256MB 内存
maxmemory-policy allkeys-lru # 内存满时:淘汰最久未使用的 key(推荐缓存场景)
# ── 持久化(见下方说明)──────────────────────────────────────────────────────
appendonly yes # 开启 AOF 持久化(数据安全性更高)
appendfsync everysec # 每秒同步一次(性能与安全的平衡)
# 重启生效
# sudo systemctl restart redis-server 持久化模式对比:RDB vs AOF
📸RDB(快照模式)
- 文件体积小,恢复速度快
- 对性能影响小(fork 子进程)
- 适合定期全量备份
注意:快照间隔期间的数据会丢失(如每 5 分钟一次,最多丢 5 分钟数据)
save 900 1 # 900 秒内有 1 次写操作就快照 save 300 10 # 300 秒内有 10 次写操作就快照
📝AOF(追加写日志)
- 数据安全性最高(appendfsync everysec 最多丢 1 秒数据)
- 日志是可读的写入命令序列
注意:文件体积大于 RDB,恢复速度慢于 RDB
appendonly yes appendfsync everysec # 推荐:每秒同步一次
💡 推荐方案: 同时开启 RDB + AOF(配置 appendonly yes 不影响 RDB 快照)。Redis 重启时优先使用 AOF 恢复(数据更完整),RDB 文件用于快速全量备份。
🐳 进阶:Docker Compose 一键部署数据库
如果您已经完成第 15 篇的 Docker 学习,可以用 Docker Compose 快速部署全套数据库环境。相比原生安装,容器化方案的优势在于:版本升级无侵入、多环境隔离、迁移时只需复制 compose 文件和数据卷。
docker-compose.yml(MySQL + PostgreSQL + Redis)
# 文件路径:/opt/databases/docker-compose.yml
# 一次性部署 MySQL + PostgreSQL + Redis 三大数据库
# 所有数据库端口只绑定 127.0.0.1,不对外暴露
services:
# ── MySQL 8 ────────────────────────────────────────────────────────────────
mysql:
image: mysql:8.0
container_name: db_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql # 数据目录(命名卷,高 I/O)
- ./mysql/conf.d:/etc/mysql/conf.d # 自定义配置文件目录
ports:
- "127.0.0.1:3306:3306" # 只绑定本地,不对外暴露!
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# ── PostgreSQL 16 ──────────────────────────────────────────────────────────
postgres:
image: postgres:16-alpine
container_name: db_postgres
restart: unless-stopped
environment:
POSTGRES_DB: ${PG_DATABASE}
POSTGRES_USER: ${PG_USER}
POSTGRES_PASSWORD: ${PG_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
# ── Redis 7 ────────────────────────────────────────────────────────────────
redis:
image: redis:7-alpine
container_name: db_redis
restart: unless-stopped
command: >
redis-server
--requirepass ${REDIS_PASSWORD}
--appendonly yes
--maxmemory 256mb
--maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
ports:
- "127.0.0.1:6379:6379"
volumes:
mysql_data:
pg_data:
redis_data: .env 配置文件(密码隔离)
# 文件路径:/opt/databases/.env
# 敏感配置统一存放,不提交到 Git(.gitignore 中加入 .env)
MYSQL_ROOT_PASSWORD=MySQL_ROOT强密码_随机20位
MYSQL_DATABASE=myapp_db
MYSQL_USER=myapp_user
MYSQL_PASSWORD=MySQL应用密码_随机16位
PG_DATABASE=myapp_pg
PG_USER=pg_user
PG_PASSWORD=PostgreSQL密码_随机16位
REDIS_PASSWORD=Redis密码_随机20位随机字符
# 启动:cd /opt/databases && docker compose up -d
# 查看状态:docker compose ps
# 进入 MySQL:docker exec -it db_mysql mysql -u root -p 🚇 进阶:SSH 隧道安全远程可视化连接
很多新手为了用图形化工具(Navicat / DBeaver / DataGrip)管理数据库,会把 3306 端口开放到公网——这极其危险,暴力破解工具会在几小时内尝试数万次密码。正确做法是 SSH 隧道:端口对公网完全关闭,通过已有的 SSH 连接建立加密通道。
🖥️ GUI 工具配置方法(Navicat / DBeaver)
- 在连接设置中找到 "SSH 隧道" 标签页
- 填入 VPS 的 IP、SSH 端口(如 22 或自定义端口)、用户名和密钥文件
- 回到 "常规" 标签页,主机填
127.0.0.1,端口填3306 - 填入数据库用户名和密码,连接测试
工具会自动建立 SSH 连接,再通过隧道访问数据库——对防火墙来说,只有 SSH 端口被访问。
⌨️ 命令行建立 SSH 隧道
# 将本地 13306 端口转发到远程的 127.0.0.1:3306 ssh -N -L 13306:127.0.0.1:3306 user@服务器IP -p 22 # 建立隧道后,在本地用 mysql 客户端连接: mysql -h 127.0.0.1 -P 13306 -u myapp_user -p
本地 13306 端口 → SSH 加密通道 → 服务器 127.0.0.1:3306,安全且无需开放防火墙。
⚡ 性能调优:MySQL 核心参数
MySQL 的默认配置非常保守(设计为在 128MB 内存的服务器上也能运行)。在现代 VPS 上,调整以下参数可以显著提升性能:
| 参数名 | 建议值 | 说明 |
|---|---|---|
| innodb_buffer_pool_size | 物理内存的 50-70% | InnoDB 最关键参数:缓存表数据和索引,值越大查询越快,设小了每次查询都要读磁盘 |
| max_connections | 300-500 | 最大并发连接数,默认 151 在高流量下会报 'Too many connections',需根据内存调大 |
| query_cache_size | 0(MySQL 8 已移除) | MySQL 8 已彻底移除查询缓存,保留此项会报警告,应删除或设为 0 |
| slow_query_log | ON + long_query_time=1 | 开启慢查询日志,记录执行超过 1 秒的 SQL,是定位性能瓶颈的必备工具 |
| innodb_log_file_size | 256M-1G | Redo Log 文件大小,写密集型应用建议调大,减少 checkpoint 频率提升写性能 |
| character-set-server | utf8mb4 | 字符集,必须设为 utf8mb4(而非 utf8),否则 emoji 表情存储会报错 |
💾 备份与恢复:mysqldump / pg_dump
MySQL 自动备份脚本
#!/bin/bash
# 文件路径:/usr/local/bin/db-backup.sh
# 功能:自动备份 MySQL 所有数据库,保留 14 天,支持压缩
set -euo pipefail
BACKUP_DIR="/var/backups/mysql"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG="/var/log/db-backup.log"
KEEP_DAYS=14
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"; }
mkdir -p "$BACKUP_DIR"
log "开始 MySQL 全量备份..."
# 使用 ~/.my.cnf 存储密码(避免明文出现在命令行)
# ~/.my.cnf 内容:[client]
password=your_password
mysqldump --single-transaction # InnoDB 热备,不锁表
--routines # 包含存储过程和函数
--triggers # 包含触发器
--events # 包含事件调度
--all-databases # 备份所有数据库
| gzip -9 > "${BACKUP_DIR}/mysql_all_${TIMESTAMP}.sql.gz"
log "备份完成:${BACKUP_DIR}/mysql_all_${TIMESTAMP}.sql.gz($(du -sh ${BACKUP_DIR}/mysql_all_${TIMESTAMP}.sql.gz | cut -f1))"
# 清理超过保留期的旧备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime "+${KEEP_DAYS}" -delete
log "已清理 ${KEEP_DAYS} 天前的旧备份"
# 添加到 Crontab(每天凌晨 2:30 自动执行):
# 30 2 * * * /usr/local/bin/db-backup.sh PostgreSQL 备份与恢复(pg_dump)
# ── pg_dump:备份单个 PostgreSQL 数据库 ──────────────────────────────────────
sudo -u postgres pg_dump myapp | gzip > /var/backups/pg/myapp_$(date +%Y%m%d).sql.gz
# ── pg_dumpall:备份所有数据库(含角色和全局设置)────────────────────────────
sudo -u postgres pg_dumpall | gzip > /var/backups/pg/all_$(date +%Y%m%d).sql.gz
# ── 恢复备份 ──────────────────────────────────────────────────────────────────
# 恢复单库(先创建空数据库,再导入)
sudo -u postgres createdb myapp_restored
gunzip -c /var/backups/pg/myapp_20260316.sql.gz | sudo -u postgres psql myapp_restored
# 恢复全部(pg_dumpall 格式)
gunzip -c /var/backups/pg/all_20260316.sql.gz | sudo -u postgres psql postgres
# ── 验证备份完整性 ────────────────────────────────────────────────────────────
# 检查备份文件是否可以解压(不解压完整文件,只测试头部)
gzip -t /var/backups/pg/myapp_20260316.sql.gz && echo "备份文件完好" ❓ 常见问题解答
MySQL 和 MariaDB 有什么区别?可以互相替换吗?
MariaDB 是 MySQL 的社区分支,由 MySQL 原始开发团队在 Oracle 收购 MySQL 后创建,保持完全的 API 和协议兼容性。对于绝大多数 Web 应用(WordPress、Laravel 等),两者可以完全互换。主要差异:① MariaDB 在某些场景下性能更好(线程池、并行复制);② MariaDB 的 JSON 支持与 MySQL 8 略有差异;③ MariaDB 是完全开源的,MySQL 企业版某些功能需要付费。推荐:如果使用 Docker 部署,选 MySQL 8(官方镜像维护更积极);如果是原生安装,在 Debian/Ubuntu 上 apt install mariadb-server 是更快的选择(仓库直接提供,无需添加额外源)。
数据库应该安装在应用服务器上还是独立服务器上?
对于个人项目和中小流量站点,部署在同一台服务器上是完全合理的选择——省钱、延迟最低(本地 socket 通信,比网络快 10-100 倍)、运维简单。什么时候需要独立数据库服务器:① 数据库的 CPU 或 I/O 已经影响到 Web 服务的响应;② 需要主从复制实现高可用;③ 数据库需要独立扩容(专用高 I/O NVMe SSD 服务器)。典型判断阈值:单台 2-4 核 4-8GB 内存的 VPS,日活 10 万以下的站点通常可以满足。超过这个量级时考虑分离,或直接用 PlanetScale / Supabase 等托管数据库服务。
MySQL 报错 "Too many connections",如何快速解决?
这个错误意味着并发连接数超过了 max_connections 的限制(默认 151)。临时解决(立即生效,无需重启):登录 MySQL 执行 SET GLOBAL max_connections = 500;。永久解决:在 mysqld.cnf 中设置 max_connections = 300 并重启。根本原因排查:用 SHOW PROCESSLIST; 查看当前连接,通常会发现大量 "Sleep" 状态的连接——这是应用的数据库连接池没有正确释放连接。应该在应用层配置连接池(如 PHP 的 persistent connection、Node.js 的 mysql2 pool)并设置合理的连接复用超时,而非无限制提高 max_connections(每个连接约消耗 1-2MB 内存)。
Redis 的 maxmemory-policy 应该怎么选?各种策略有什么区别?
主要策略:noeviction(默认):内存满后拒绝写入,返回错误——适合需要精确控制数据的场景,但会导致应用报错,生产环境慎用。allkeys-lru:淘汰最久未被访问的 key——最推荐用于纯缓存场景,内存满时自动清理冷数据,应用无感知。volatile-lru:只淘汰设置了过期时间的 key 中最久未访问的——适合混合场景(既有永久数据又有缓存数据)。allkeys-random:随机淘汰,性能最好但不智能,不推荐。结论:纯缓存用 allkeys-lru;缓存+持久数据混用时用 volatile-lru 并确保需要保留的 key 不设过期时间。
Docker 容器内的 MySQL 数据库如何备份?和原生安装有什么区别?
Docker 内的 mysqldump 需要通过 docker exec 执行:
docker exec db_mysql mysqldump -u root -p"密码" --all-databases | gzip > /root/backups/mysql_$(date +%Y%m%d).sql.gz
若使用 Named Volume,还可以直接备份数据卷:
docker run --rm -v mysql_data:/data -v /root/backups:/backup alpine tar czf /backup/mysql_vol_$(date +%Y%m%d).tar.gz /data
区别:原生安装可以直接调用 mysqldump 命令;容器化需要通过 docker exec 在容器内执行,或者在 Compose 文件中加入一个 backup 服务容器定期运行。两者导出的 SQL 文件格式完全相同,可以互相恢复。
PostgreSQL 的 pg_hba.conf 配置错了,数据库连不上了怎么办?
pg_hba.conf 配置错误会导致所有连接被拒绝,包括本地管理员连接。紧急恢复方法:① 切换到 postgres 系统用户:sudo -i -u postgres;② 编辑 pg_hba.conf,在文件最顶部添加一行 local all all trust(允许本地所有连接无密码);③ 重载配置:pg_ctlcluster 16 main reload;④ 进入 psql 修正错误配置;⑤ 删除刚才添加的 trust 行并再次 reload。预防措施:修改 pg_hba.conf 后先用 pg_hba_ctl check 或手动测试新开一个连接验证,再关闭当前连接——始终保留一个已登录的 psql 会话作为保险。
慢查询日志里找到了慢 SQL,如何分析和优化?
找到慢 SQL 后,用 EXPLAIN 命令分析执行计划:EXPLAIN SELECT * FROM orders WHERE customer_name = 'Zhang San';。重点看 type 字段:ALL(全表扫描,最差)→ index → range → ref → eq_ref → const(最佳)。看到 type=ALL 且 rows 很大,说明需要加索引:CREATE INDEX idx_orders_customer_name ON orders(customer_name);。优化顺序:① 加合适的索引(解决 90% 的慢查询);② 避免 SELECT *(只查需要的列);③ 分页查询用 WHERE id > 上次最大ID LIMIT 100 代替 LIMIT 10000, 100(深分页性能极差);④ 大表考虑归档旧数据。第 12 篇日志分析中有更详细的 mysqldumpslow 分析工具使用说明。
应该用 Redis 替代数据库 Session 还是把 Session 存在数据库里?
推荐 Redis 存储 Session,原因:① 性能:Redis 读写速度比 MySQL 快 100 倍以上,每次 HTTP 请求都要验证 Session,这个操作越快越好;② 自动过期:Redis 的 TTL(过期时间)机制天然适合 Session 过期管理,MySQL 需要定期清理过期行;③ 扩展性:多台 Web 服务器共享 Redis 中的 Session,实现水平扩展(MySQL 也能做但需要额外配置)。例外情况:如果您的应用已有 MySQL,且并发量很低(日活 < 1000),把 Session 存在 MySQL 也完全没问题,不需要为此专门引入 Redis。引入新组件就是增加复杂度,在不必要时保持简单。
学完数据库后,下一步应该按什么顺序继续?
按本站 30 篇路径,第 16 篇(本篇)→ 第 17 篇(personal-cloud-storage)→ 第 18 篇(mail-server-setup)是应用部署板块的自然延伸。关联逻辑:第 17 篇的 Nextcloud 私有网盘部署会用到 MySQL/PostgreSQL 作为其后端数据库,以及 Redis 作为文件预览缓存——本篇的 Docker Compose 数据库部署与第 15 篇的容器编排知识在此完美汇合;第 18 篇的邮件服务器同样需要数据库(Mailcow 使用 MySQL + Redis)。完成这三篇后,您将拥有一套完整的自托管基础设施(云盘 + 邮件 + 数据存储),是真正意义上掌控自己数据的第一步。
mysqldump 备份很慢,有没有更快的备份方案?
mysqldump 是逻辑备份,对大数据库(50GB+)确实很慢,因为它要逐行导出 SQL 语句。更快的方案:① Percona XtraBackup:物理级热备份,直接复制 InnoDB 数据文件,速度是 mysqldump 的 10-50 倍,支持增量备份。适合 GB 级以上的生产数据库;② rsync 复制数据目录(停机时):停止 MySQL 后直接复制 /var/lib/mysql/,恢复时复制回去重启即可。速度最快但需要停服;③ 主从复制 + 从库备份:在从库上执行 mysqldump 或 XtraBackup,不影响主库性能;④ Docker 数据卷快照:如果用 Docker + 支持快照的存储(如 LVM、ZFS),可以对数据卷做瞬间快照,几乎不影响性能。对于 10GB 以下的中小型数据库,mysqldump 完全够用,凌晨低峰期执行即可。