一、核心概念:实例、数据库、Schema 傻傻分不清?
1.1 先看一张图
┌─────────────────────────────────────────────────────────────┐
│ CERDB 实例(数据库服务) │
│ 监听端口:5432 │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 数据库 A │ │ 数据库 B │ │ 数据库 C │ │
│ │ (cerdb_app) │ │ (postgres) │ │ (test_db) │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ Schema: │ │ │ │ Schema: │ │ │ │ Schema: │ │ │
│ │ │ public │ │ │ │ public │ │ │ │ public │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ ┌─────────────┐ │ │ │ │ │ │
│ │ │ Schema: │ │ │ │ │ │ │
│ │ │ business │ │ │ │ │ │ │
│ │ └─────────────┘ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2 用一个超市类比来理解
| 概念 | 技术术语 | 通俗类比 |
|---|---|---|
| 实例 | 数据库服务进程 | 整个超市(开门营业,员工到岗) |
| 数据库 | 独立的数据集合 | 超市里的不同货架区域(生鲜区、日用品区) |
| Schema | 数据库内的命名空间 | 货架上的分类格子(蔬菜格、水果格) |
| 表 | 数据存储单元 | 格子里的具体商品(苹果、香蕉) |
1.3 关键点总结
- 实例 = 数据库服务:它是个"活"的进程,负责接收请求、处理数据
- 数据库:存储在硬盘上的数据文件,需要实例才能访问
- Schema:数据库内部的"文件夹",用于组织表
- public:每个数据库默认自带的 Schema,不指定 Schema 时表就放这里
一句话记忆:
实例是服务,数据库是仓库,Schema 是仓库里的货架。
二、CERDB 单库备份与恢复
2.1 什么是单库备份?
单库备份是指只备份某一个指定的数据库,不包含其他数据库和全局用户信息。
适用场景:
- 日常数据备份
- 数据迁移(将 A 数据库迁移到 B 服务器)
- 表结构导出
- 开发测试环境数据准备
2.2 备份前准备
bash
# 1. 切换至 cerdb 用户(必须)
sudo -i -u cerdb
# 2. 创建备份目录
mkdir -p /home/cerdb/backup
# 3. 检查磁盘空间
df -h /home/cerdb/backup
这里强烈建议使用cerdb用户进行备份相关操作。
2.3 单库备份命令(gs_dump)
基本格式:
bash
gs_dump -h IP地址 -p 端口 -U 用户名 -d 数据库名 -Fc -f /备份路径/文件名.dump
参数说明:
| 参数 | 说明 |
|---|---|
-h |
数据库服务器 IP |
-p |
端口号(默认5432) |
-U |
用户名 |
-d |
要备份的数据库名 |
-Fc |
输出为压缩格式(推荐) |
-f |
备份文件路径 |
2.4 实操示例
示例1:备份业务数据库
bash
gs_dump -h 192.168.1.100 -p 5432 -U cerdb_app -d cerdb_app -Fc -f /home/cerdb/backup/cerdb_app_20250604.dump
示例2:带日期命名的备份(推荐)
bash
gs_dump -h 192.168.1.100 -p 5432 -U cerdb_app -d cerdb_app -Fc -f /home/cerdb/backup/cerdb_app_$(date +%Y%m%d_%H%M%S).dump
有些版本不支持-d参数,实践结果如下所示:
bash
/data/cerdb/app/product/1.1.1.3/dbhome/bin/gs_dump \
-h 127.0.0.1 \
-p 5432 \
-U cerdb_root \
-Fc \
-C \
-Z 9 \
-f /home/cerdb/backup/cerdb_root_$(date +%Y%m%d_%H%M%S).dump cerdb_root(这个是数据库名字)
示例3:备份指定 Schema
bash
# 只备份 public 这个 Schema
gs_dump -h 192.168.1.100 -p 5432 -U cerdb_app -d cerdb_app -n public -f /home/cerdb/backup/public_backup.sql
2.5 单库恢复(gs_restore)
基本格式:
bash
gs_restore -h IP地址 -p 端口 -U 用户名 -d 目标数据库名 备份文件.dump
实操示例:
bash
# 先创建目标数据库(如果需要)
gsql -h 192.168.1.100 -p 5432 -U postgres -c "CREATE DATABASE cerdb_app_restore;"
# 执行恢复
gs_restore -h 192.168.1.100 -p 5432 -U postgres -d cerdb_app_restore /home/cerdb/backup/cerdb_app_20250604.dump
验证恢复结果:
bash
gsql -h 192.168.1.100 -p 5432 -U postgres -d cerdb_app_restore -c "\dt"
2.6 单库备份小贴士
- ✅ 普通用户可以备份自己有权限的数据库
- ✅ 备份文件是压缩格式,节省空间
- ⚠️ 单库备份不包含用户/角色定义,恢复时需要先用管理员创建用户
- ⚠️ 如果出现权限警告,忽略即可,不影响数据
三、CERDB 整库备份与恢复
3.1 什么是整库备份?
整库备份是指备份整个数据库实例中的所有数据库,以及全局对象(用户、角色、表空间等)。
适用场景:
- 完整服务器迁移
- 灾难恢复
- 搭建测试环境(需要完整用户权限)
3.2 单库 vs 整库,一张表看懂
| 对比项 | 单库备份(gs_dump) | 整库备份(gs_dumpall) |
|---|---|---|
| 备份范围 | 仅一个数据库 | 所有数据库 + 全局对象 |
| 是否包含用户 | ❌ 不包含 | ✅ 包含 |
| 是否包含角色 | ❌ 不包含 | ✅ 包含 |
| 输出格式 | 支持压缩(-Fc) | 仅纯文本 SQL |
| 所需权限 | 普通用户即可 | 需要管理员权限 |
| 恢复方式 | gs_restore |
gsql -f |
3.3 整库备份命令(gs_dumpall)
基本格式:
bash
gs_dumpall -h IP地址 -p 端口 -U 管理员用户名 -f /备份路径/文件名.sql
实操示例:
bash
# 执行整库备份
gs_dumpall -h 192.168.1.100 -p 5432 -U postgres -f /home/cerdb/backup/alldb_$(date +%Y%m%d).sql
# 查看备份文件大小
ls -lh /home/cerdb/backup/alldb_*.sql
# 压缩备份文件(推荐)
gzip /home/cerdb/backup/alldb_*.sql
3.4 整库恢复
基本格式:
bash
gsql -h IP地址 -p 端口 -U 管理员用户名 -d postgres -f 备份文件.sql
实操示例:
bash
# 如果压缩过,先解压
gunzip /home/cerdb/backup/alldb_20250604.sql.gz
# 执行恢复
gsql -h 192.168.1.100 -p 5432 -U postgres -d postgres -f /home/cerdb/backup/alldb_20250604.sql
3.5 整库恢复注意事项
- ⚠️ 恢复前请确认目标服务器是空实例,避免数据冲突
- ⚠️ SQL 文件通常较大,恢复需要较长时间
- ⚠️ 恢复过程中可能出现用户已存在等报错,可忽略
四、备份策略最佳实践
4.1 推荐的备份策略
| 备份类型 | 频率 | 保留周期 | 用途 |
|---|---|---|---|
| 单库备份 | 每天 | 7天 | 快速恢复单个数据库 |
| 整库备份 | 每周 | 30天 | 完整环境恢复 |
| 归档日志 | 实时 | 7天 | 时间点恢复 |
4.2 自动备份脚本
创建一个自动备份脚本 auto_backup.sh:
bash
#!/bin/bash
# ============================================
# CERDB 单库备份脚本(cron 兼容版)
# 适用数据库:CERDB / openGauss
# ============================================
# ---------- 配置参数(请根据实际情况修改)----------
DB_HOST="127.0.0.1" # 数据库地址
DB_PORT="5432" # 数据库端口
DB_USER="yonghuming" # 数据库用户名
DB_PASS="mima" # 数据库密码(请修改)
DB_NAME="yonghuming" # 要备份的数据库名
# CERDB 安装路径(根据实际安装位置修改)
CERDB_HOME="/data/cerdb/app/product/1.1.1.3/dbhome"
# 备份目录和保留天数
BACKUP_DIR="/data/cerdb"
RETAIN_DAYS=7
# 日志文件
LOG_FILE="${BACKUP_DIR}/backup.log"
# ------------------------------------------------
# ---------- 加载环境变量(解决 cron 环境问题)----------
# 加载用户环境变量
if [ -f /home/cerdb/.bashrc ]; then
source /home/cerdb/.bashrc
fi
# 显式设置 PATH(确保 gs_dump 等命令可用)
export PATH=${CERDB_HOME}/bin:$PATH
# 设置动态库路径
export LD_LIBRARY_PATH=${CERDB_HOME}/lib:$LD_LIBRARY_PATH
# ----------------------------------------------------
# ---------- 定义日志函数 ----------
log_info() {
# 确保日志目录存在
mkdir -p $(dirname ${LOG_FILE})
echo "$(date +'%Y-%m-%d %H:%M:%S') $1" | tee -a ${LOG_FILE}
}
# --------------------------------
# 导出密码(避免交互输入)
export PGPASSWORD=$DB_PASS
# 生成带日期时间的备份文件名(压缩格式)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).dump"
# 创建备份目录(如不存在)
mkdir -p ${BACKUP_DIR}
# ========== 开始备份 ==========
log_info "========================================="
log_info "开始备份数据库: ${DB_NAME}"
log_info "使用备份命令: ${CERDB_HOME}/bin/gs_dump"
# 执行备份
${CERDB_HOME}/bin/gs_dump \
-h ${DB_HOST} \
-p ${DB_PORT} \
-U ${DB_USER} \
-Fc \
-C \
-Z 9 \
-f ${BACKUP_FILE} ${DB_NAME}
# 检查备份是否成功
if [ $? -eq 0 ]; then
BACKUP_SIZE=$(du -h ${BACKUP_FILE} | cut -f1)
log_info "备份成功!文件:${BACKUP_FILE}(大小:${BACKUP_SIZE})"
else
log_info "备份失败!请检查日志"
unset PGPASSWORD
exit 1
fi
# ========== 清理过期备份 ==========
log_info "开始清理 ${RETAIN_DAYS} 天前的备份文件"
DELETED_COUNT=$(find ${BACKUP_DIR} -name "${DB_NAME}_*.dump" -mtime +${RETAIN_DAYS} -delete -print | wc -l)
log_info "清理完成,共删除 ${DELETED_COUNT} 个过期文件"
# 清理密码环境变量
unset PGPASSWORD
log_info "备份任务完成"
log_info "========================================="
exit 0
4.3 配置定时任务
bash
# 编辑 crontab
crontab -e
# 每天凌晨 2 点执行备份
0 2 * * * /home/cerdb/auto_backup.sh >> /home/cerdb/backup/backup.log 2>&1
五、常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
gs_dump: command not found |
环境变量未加载 | source ~/.bashrc 或使用绝对路径 |
permission denied |
权限不足 | 使用管理员账户 postgres |
WARNING: current user is not a superuser |
普通用户备份 | 忽略警告,不影响数据 |
| 备份文件为空 | 数据库无数据或权限问题 | 检查数据库是否存在 |
恢复时报 database already exists |
数据库已存在 | 先删除或使用不同名称 |
六、快速参考卡
| 操作 | 命令 |
|---|---|
| 单库备份 | gs_dump -h IP -p 5432 -U 用户 -d 数据库名 -Fc -f 备份.dump |
| 单库恢复 | gs_restore -h IP -p 5432 -U 用户 -d 数据库名 备份.dump |
| 整库备份 | gs_dumpall -h IP -p 5432 -U 管理员 -f 备份.sql |
| 整库恢复 | gsql -h IP -p 5432 -U 管理员 -d postgres -f 备份.sql |
| 查看备份 | ls -lh /home/cerdb/backup/ |
| 查看实例状态 | gs_ctl status -D /data/cerdb |
本文基于 CERDB(openGauss)编写,适用版本:openGauss 5.0+ / CERDB 1.1+