国产数据库CERDB 数据库实战:核心概念与备份恢复全攻略

一、核心概念:实例、数据库、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+

相关推荐
计算机安禾1 小时前
【算法分析与设计】第44篇:随机化复杂度类:RP、BPP与去随机化猜想
java·数据结构·数据库·算法·机器学习
Leon-Ning Liu2 小时前
Oracle恢复DELETE数据的PACKAGE(介绍篇)(仅做研究使用)
数据库·oracle
l1t2 小时前
DeepSeek总结的从 DeepSeek 到 Quack:分布式 DuckDB 的梦想何时开始变得真实
数据库·分布式
小猿姐2 小时前
MongoDB Kubernetes Operator 实测对比:Community、Percona 与 KubeBlocks,谁更适合团队落地?
数据库·mongodb·kubernetes
zyl837212 小时前
Matplotlib/Seaborn:数据可视化
数据库·oracle
赵渝强老师2 小时前
【赵渝强老师】MongoDB的视图
数据库·mongodb
这个DBA有点耶2 小时前
死锁排查进阶:从日志到根因的完整分析链
java·开发语言·数据库·sql·运维开发·学习方法·dba
A-刘晨阳2 小时前
数据库挂了服务就瘫?我用PostgreSQL主从流复制搭了高可用架构,cpolar打通远程访问
数据库·postgresql·架构