C模块详细配置过程(按题号)(2)
模块 C 应用系统迁移 — 详细配置过程(按操作顺序)
执行机器:Server2(172.16.50.12)
执行账号:root / openEuler12#$
系统环境:openEuler 22.03 LTS SP4
数据库版本:openGauss 5.0.1说明:题号保持题目原样不变,但按实际操作先后顺序排列(例如必须先创建用户、初始化数据库,才能修改配置文件)。
目录(按实际操作顺序)
- 9.1 安装 openGauss 数据库软件及必要组件
- 9.3 创建系统用户 opengauss 并初始化数据库实例
- 9.2 配置监听端口、密码连接、systemd 开机自启
- 9.4 创建 SYSADMIN 管理员 gaussdb
- 9.5 创建数据库用户 dutyadmin
- 9.6 创建数据库 db_duty(UTF8)
- 9.7 创建模式 sche_duty 并设置拥有者
- 9.8 配置 dutyadmin 默认查询模式
- 9.9 两张表属主为 dutyadmin
- 9.10 创建表 tb_engineer
- 9.11 创建表 tb_duty_log
- 9.12 向 tb_engineer 插入 5 条数据
- 9.13 向 tb_duty_log 插入至少 6 条记录
- 9.14 导出 db_duty 到 /data/db_duty.sql
- 10.1 gs_dump 备份 db_duty
- 10.2 创建数据库 db_restore
- 10.3 将备份恢复到 db_restore
- 10.4 crontab 每日 02:30 定时备份
- 10.5 备份脚本要求检查
- 10.6 脚本内命令限制检查
- 10.7 gs_dump 参数限制检查
9. openGauss 数据库环境配置
9.1 安装 openGauss 数据库软件及必要组件
题目要求:安装 openGauss 数据库软件及必要组件。
命令
# 使用本地 yum 源安装 openGauss
dnf install -y opengauss --disablerepo=* --enablerepo=local
命令解析
| 部分 | 作用 | 为什么这么用 |
|---|---|---|
dnf install | 安装软件包 | openEuler 用 dnf 作为包管理器 |
-y | 自动回答 yes | 不用手动确认,一条命令装完 |
opengauss | 要安装的软件名 | 本地源里的 openGauss 包名 |
--disablerepo=* | 禁用所有在线源 | 比赛环境没有外网,防止去联网找包 |
--enablerepo=local | 只启用本地源 | 用光盘/本地 yum 源安装 |
预期输出
Last metadata expiration check: 0:10:20 ago on ...
Dependencies resolved.
=====================================================================
Package Architecture Version Repository
=====================================================================
Installing:
opengauss x86_64 5.0.1-15.oe2203sp4 local
Transaction Summary
=====================================================================
Install 1 Package
Total download size: 85 M
Installed size: 250 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : opengauss-5.0.1-15.oe2203sp4.x86_64 1/1
Running scriptlet: opengauss-5.0.1-15.oe2203sp4.x86_64 1/1
Verifying : opengauss-5.0.1-15.oe2203sp4.x86_64 1/1
Installed:
opengauss-5.0.1-15.oe2203sp4.x86_64
Complete!
验证安装结果
# 查询已安装的 openGauss 包
rpm -q opengauss
预期输出:
opengauss-5.0.1-15.oe2203sp4.x86_64
9.3 创建系统用户 opengauss 并初始化数据库实例
题目要求:以系统用户 opengauss 运行数据库实例,该用户密码为 openGauss#2026;数据库初始用户为 opengauss。
操作顺序说明:这步排在 9.2 前面,因为必须先创建用户、初始化数据目录,配置文件才会存在,才能去修改监听端口等配置。
9.3.1 创建系统用户
# 创建系统用户 opengauss
useradd opengauss
# 设置密码
echo 'openGauss#2026' | passwd --stdin opengauss
命令解析
| 命令 | 作用 | 为什么这么用 |
|---|---|---|
useradd opengauss | 创建名为 opengauss 的系统用户 | openGauss 不能用 root 运行,需要专用普通用户 |
echo '密码' | 输出密码字符串 | 准备好要设置的密码 |
| | 管道符,把前面的输出传给后面 | 将 echo 的密码传给 passwd |
passwd --stdin opengauss | 从标准输入读取密码来设置 | 不用交互式输两次,一条命令搞定 |
预期输出
passwd: 所有的身份验证令牌已经成功更新。
验证并确保家目录存在(踩坑必查)
# 查看家目录是否存在
ls -ld /home/opengauss
如果报 No such file or directory,说明家目录没创建,用 root 手动创建:
# 创建家目录
mkdir -p /home/opengauss
# 设置属主
chown opengauss:opengauss /home/opengauss
踩坑提示:useradd 有时不会自动创建家目录,导致 gs_initdb 报
Permission denied。初始化数据库前必须确认家目录存在且属主正确。
9.3.2 切换用户并配置环境变量
# 切换到 opengauss 用户
su - opengauss
# 将环境变量写入该用户的 .bashrc 永久生效
cat >> ~/.bashrc <<'EOF'
export PATH=/usr/local/opengauss/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opengauss/lib:$LD_LIBRARY_PATH
export GAUSSHOME=/usr/local/opengauss
EOF
# 立即生效
source ~/.bashrc
命令解析
| 环境变量 | 作用 | 不配置会怎样 |
|---|---|---|
PATH | 让系统找到 gsql、gs_ctl、gs_dump 等命令 | 报"未找到命令" |
LD_LIBRARY_PATH | 让程序找到 libpq 等动态链接库 | 报 cannot open shared object file |
GAUSSHOME | 告诉 openGauss 自己的安装目录 | 报 GAUSSHOME is not set |
为什么写进 ~/.bashrc:每次登录自动加载,不用手动 export,实现永久生效。
9.3.3 初始化数据库实例
# 初始化数据库,指定数据目录和节点名
gs_initdb -D /home/opengauss/data --nodename=dn1
命令解析
| 参数 | 作用 | 为什么这么用 |
|---|---|---|
gs_initdb | 初始化数据库实例的命令 | openGauss 5.0 没有 gs_install,用这个 |
-D /home/opengauss/data | 指定数据存放目录 | 数据放在 opengauss 用户家目录下 |
--nodename=dn1 | 指定节点名称 | openGauss 强制要求节点名,不写会报错 |
预期输出(最后几行)
Success. You can now start the database server using:
gs_ctl start -D /home/opengauss/data
踩坑提示
- 不能用 root 跑 gs_initdb,会报
cannot be run as root,必须先 su 到普通用户。 - 如果报
directory exists but is not empty,说明之前初始化过,删掉重建:
rm -rf /home/opengauss/data
gs_initdb -D /home/opengauss/data --nodename=dn1
- 如果
su - opengauss报用户条目字段不完整,但id opengauss能查到用户,删掉用户重建:
userdel -r opengauss
useradd opengauss
echo 'openGauss#2026' | passwd --stdin opengauss
- 如果报
could not create directory "/home/opengauss": Permission denied,说明家目录不存在或属主不对,用 root 修复:
mkdir -p /home/opengauss
chown -R opengauss:opengauss /home/opengauss
9.2 配置监听端口、密码连接、systemd 开机自启
题目要求:数据库实例监听 127.0.0.1 的 5432 端口,端口写入实例配置文件;数据库用户可经 127.0.0.1 以密码方式连接;实例以开机自启的 systemd 服务运行。
9.2.1 配置监听地址和端口(postgresql.conf)
# 编辑数据库实例配置文件
vi /home/opengauss/data/postgresql.conf
找到并修改(去掉前面的 # 注释):
listen_addresses = '127.0.0.1'
port = 5432
命令解析
| 配置项 | 作用 | 为什么这么写 |
|---|---|---|
listen_addresses | 数据库监听哪些 IP 地址 | 题目要求监听 127.0.0.1,只允许本机连接 |
port | 数据库监听端口 | 题目要求 5432,写进配置文件 |
重要踩坑提示:openGauss 5.0 安装后默认端口是 7654,不是 5432。配置文件按题目要求写 5432,但实际启动后用
ss -tlnp查到的端口可能仍是 7654,后续连接命令以实际端口为准。
9.2.2 配置密码方式连接(pg_hba.conf)
# 编辑客户端认证配置文件
vi /home/opengauss/data/pg_hba.conf
找到对应行,确认或修改为:
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 md5
命令解析
| 配置项 | 作用 | 为什么这么写 |
|---|---|---|
host | 允许通过 TCP/IP 连接 | 对应题目"经 127.0.0.1 连接" |
all | 所有数据库、所有用户 | 不限制具体库和用户 |
127.0.0.1/32 | 只允许本机 IP 连接 | 题目要求经 127.0.0.1 |
md5 | 密码认证方式 | 题目要求"以密码方式连接",md5 表示需要输密码 |
9.2.3 启动数据库实例
# 启动数据库(单机模式)
gs_ctl start -D /home/opengauss/data -Z single_node
命令解析
| 参数 | 作用 |
|---|---|
gs_ctl start | 启动数据库实例 |
-D | 指定数据目录 |
-Z single_node | 以单机模式运行 |
预期输出
[gs_ctl]: done
[gs_ctl]: server started (/home/opengauss/data)
验证端口监听
# 查看数据库监听端口
ss -tlnp | grep gaussdb
预期输出
LISTEN 0 128 127.0.0.1:7654 0.0.0.0:* users:(("gaussdb",pid=...))
LISTEN 0 128 127.0.0.1:7655 0.0.0.0:* users:(("gaussdb",pid=...))
9.2.4 配置 systemd 开机自启服务
# 切到 root
exit
# 创建 systemd 服务文件
cat > /etc/systemd/system/opengauss.service <<'EOF'
[Unit]
Description=openGauss Database
After=network.target
[Service]
Type=forking
User=opengauss
Group=opengauss
ExecStart=/usr/local/opengauss/bin/gs_ctl start -D /home/opengauss/data
ExecStop=/usr/local/opengauss/bin/gs_ctl stop -D /home/opengauss/data
ExecReload=/usr/local/opengauss/bin/gs_ctl restart -D /home/opengauss/data
Restart=always
[Install]
WantedBy=multi-user.target
EOF
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
cat > 文件 <<'EOF' | 把内容写入文件 | 比 vi 手动敲更快捷,不易出错 |
[Unit] | 服务基本信息 | systemd 服务的标准开头 |
After=network.target | 网络启动后再启动数据库 | 数据库依赖网络 |
Type=forking | 服务启动后会 fork 子进程 | gs_ctl 启动后会后台运行 |
User=opengauss | 用 opengauss 用户运行 | 题目要求以该用户运行,不能用 root |
ExecStart | 启动命令 | 调用 gs_ctl start |
ExecStop | 停止命令 | 调用 gs_ctl stop |
Restart=always | 异常退出自动重启 | 保证服务持续运行 |
WantedBy=multi-user.target | 多用户模式下启动 | 系统正常启动状态 |
启用服务
# 重新加载 systemd 配置
systemctl daemon-reload
# 设置开机自启
systemctl enable opengauss
# 启动服务
systemctl start opengauss
预期输出
Created symlink /etc/systemd/system/multi-user.target.wants/opengauss.service → /etc/systemd/system/opengauss.service.
验证服务状态
# 查看服务运行状态
systemctl status opengauss
预期输出:
● opengauss.service - openGauss Database
Loaded: loaded (/etc/systemd/system/opengauss.service; enabled; vendor preset: disabled)
Active: active (running) since ...
看到 enabled(开机自启)和 active (running)(正在运行)就对了。
9.4 创建 SYSADMIN 管理员 gaussdb
题目要求:创建具有 SYSADMIN 权限的数据库管理员 gaussdb,密码为 GaussDB#2026。
连接数据库
# 切换到 opengauss 用户
su - opengauss
# 用初始用户连接 postgres 库
gsql -d postgres -p 7654
命令解析
| 参数 | 作用 |
|---|---|
gsql | openGauss 命令行客户端 |
-d postgres | 连接默认的 postgres 数据库 |
-p 7654 | 指定端口(实际监听端口) |
先给初始用户设置数据库密码
-- 初始用户必须先设密码才能做其他操作
ALTER ROLE opengauss PASSWORD 'openGauss#2026';
命令解析
openGauss 安全机制要求初始用户先设置密码,否则直接建用户会报错。
预期输出:
ALTER ROLE
创建管理员 gaussdb
-- 创建具有 SYSADMIN 权限的管理员
CREATE USER gaussdb WITH SYSADMIN PASSWORD 'GaussDB#2026';
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
CREATE USER | 创建数据库用户 | 题目要求创建管理员 |
gaussdb | 用户名 | 题目指定的用户名 |
WITH SYSADMIN | 授予系统管理员权限 | 题目要求 SYSADMIN 权限 |
PASSWORD '...' | 设置登录密码 | 题目指定密码 |
预期输出:
CREATE USER
9.5 创建数据库用户 dutyadmin
题目要求:创建数据库用户 dutyadmin,密码为 Dutyadm#2026。
-- 创建普通业务用户
CREATE USER dutyadmin PASSWORD 'Dutyadm#2026';
命令解析
| 部分 | 作用 |
|---|---|
CREATE USER dutyadmin | 创建名为 dutyadmin 的用户 |
| 不加 SYSADMIN | 这是普通业务用户,不需要管理员权限 |
PASSWORD | 设置题目指定的密码 |
预期输出:
CREATE USER
验证用户列表
-- 查看所有数据库用户
\du
预期输出:
Role name | Attributes
-------------------+------------------------------------------------------------
dutyadmin |
gaussdb | Sysadmin
opengauss | Sysadmin
9.6 创建数据库 db_duty(UTF8)
题目要求:创建数据库 db_duty,字符集为 UTF8。
-- 创建数据库,指定拥有者和字符集
CREATE DATABASE db_duty OWNER dutyadmin ENCODING 'UTF8';
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
CREATE DATABASE db_duty | 创建名为 db_duty 的数据库 | 题目指定库名 |
OWNER dutyadmin | 设置数据库拥有者 | 题目后续要求 dutyadmin 是拥有者 |
ENCODING 'UTF8' | 字符集为 UTF8 | 题目明确要求 |
预期输出:
CREATE DATABASE
验证数据库列表
-- 查看所有数据库
\l
预期输出:
Name | Owner | Encoding
----------------+----------+----------
db_duty | dutyadmin| UTF8
postgres | opengauss| UTF8
template0 | opengauss| UTF8
template1 | opengauss| UTF8
9.7 创建模式 sche_duty 并设置拥有者
题目要求:在 db_duty 下创建模式 sche_duty,并设置 dutyadmin 为 db_duty 和 sche_duty 的拥有者。
用 dutyadmin 连接 db_duty
# 退出当前 gsql
\q
# 用 dutyadmin 连接 db_duty
gsql -d db_duty -U dutyadmin -p 7654
命令解析
| 参数 | 作用 |
|---|---|
-d db_duty | 连接 db_duty 数据库 |
-U dutyadmin | 用 dutyadmin 用户登录 |
-p 7654 | 指定端口 |
创建模式
-- 创建模式并指定拥有者
CREATE SCHEMA sche_duty AUTHORIZATION dutyadmin;
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
CREATE SCHEMA sche_duty | 创建名为 sche_duty 的模式 | 题目指定模式名 |
AUTHORIZATION dutyadmin | 模式拥有者为 dutyadmin | 题目要求设置拥有者 |
预期输出:
CREATE SCHEMA
9.8 配置 dutyadmin 默认查询模式
题目要求:配置 dutyadmin 登录数据库 db_duty 后默认查询模式为 sche_duty。
-- 修改 dutyadmin 的默认搜索路径
ALTER ROLE dutyadmin SET search_path TO sche_duty;
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
ALTER ROLE dutyadmin | 修改 dutyadmin 用户的属性 | 针对该用户配置 |
SET search_path TO sche_duty | 设置默认搜索路径 | 登录后查表不用写 sche_duty. 前缀 |
预期输出:
ALTER ROLE
9.9 两张表属主为 dutyadmin
题目要求:以下两张表的属主为 dutyadmin。
说明:当前就是用 dutyadmin 用户登录并创建表,建出来的表默认属主就是 dutyadmin,自动满足这一要求。
查看表属主
-- 查看表的属主
SELECT tablename, tableowner FROM pg_tables WHERE schemaname = 'sche_duty';
预期输出:
tablename | tableowner
-------------+------------
tb_engineer | dutyadmin
tb_duty_log | dutyadmin
9.10 创建表 tb_engineer
题目要求:在 sche_duty 中创建表 tb_engineer。
| 字段名 | 数据类型 | 约束 |
|---|---|---|
| c_eng_sk | int4 | 主键 |
| c_eng_id | varchar(16) | 唯一,非空 |
| c_name | varchar(32) | 非空 |
| c_team | varchar(32) | 非空 |
| c_phone | varchar(16) | 非空 |
| c_level | varchar(8) | 非空 |
建表命令
-- 创建工程师信息表
CREATE TABLE sche_duty.tb_engineer (
c_eng_sk int4 PRIMARY KEY,
c_eng_id varchar(16) UNIQUE NOT NULL,
c_name varchar(32) NOT NULL,
c_team varchar(32) NOT NULL,
c_phone varchar(16) NOT NULL,
c_level varchar(8) NOT NULL
);
命令解析
| 字段/约束 | 作用 | 为什么这么写 |
|---|---|---|
sche_duty.tb_engineer | 在 sche_duty 模式下建表 | 题目要求在该模式中创建 |
PRIMARY KEY | 主键,唯一标识每条记录 | 题目要求主键约束 |
UNIQUE | 值不能重复 | 题目要求唯一约束 |
NOT NULL | 不能为空 | 题目要求非空 |
预期输出:
CREATE TABLE
9.11 创建表 tb_duty_log
题目要求:在 sche_duty 中创建表 tb_duty_log。
| 字段名 | 数据类型 | 约束 |
|---|---|---|
| c_duty_sk | int4 | 主键 |
| c_eng_sk | int4 | 外键,关联 tb_engineer(c_eng_sk) |
| c_duty_date | date | 非空 |
| c_shift | varchar(8) | 非空 |
| c_remark | varchar(64) | 可为空 |
建表命令
-- 创建值班记录表
CREATE TABLE sche_duty.tb_duty_log (
c_duty_sk int4 PRIMARY KEY,
c_eng_sk int4 REFERENCES sche_duty.tb_engineer(c_eng_sk),
c_duty_date date NOT NULL,
c_shift varchar(8) NOT NULL,
c_remark varchar(64)
);
命令解析
| 字段/约束 | 作用 | 为什么这么写 |
|---|---|---|
PRIMARY KEY | 主键 | 题目要求 |
REFERENCES sche_duty.tb_engineer | 外键,关联工程师表 | 必须写完整模式名,否则报表不存在 |
date NOT NULL | 日期类型,非空 | 题目要求 |
c_remark 不写 NOT NULL | 允许为空 | 题目要求可为空 |
预期输出:
CREATE TABLE
验证表结构
-- 查看模式下的所有表
\dt sche_duty.*
预期输出:
List of relations
Schema | Name | Type | Owner
-----------+-------------+-------+----------
sche_duty | tb_duty_log | table | dutyadmin
sche_duty | tb_engineer | table | dutyadmin
9.12 向 tb_engineer 插入 5 条数据
题目要求:按照题目表格向 tb_engineer 插入 5 条数据。
-- 批量插入 5 条工程师数据
INSERT INTO sche_duty.tb_engineer VALUES
(1, 'ENG-001', 'Alice', 'SysTeam', '13800000001', 'P3'),
(2, 'ENG-002', 'Bob', 'NetTeam', '13800000002', 'P2'),
(3, 'ENG-003', 'Carol', 'DBTeam', '13800000003', 'P3'),
(4, 'ENG-004', 'David', 'SecTeam', '13800000004', 'P2'),
(5, 'ENG-005', 'Eric', 'AppTeam', '13800000005', 'P1');
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
INSERT INTO ... VALUES | 向表中插入数据 | SQL 标准插入语法 |
| 多组括号逗号分隔 | 一次插入多条 | 比一条一条插打字少 |
| 字段顺序 | 严格按建表顺序对应 | 不写字段名时按顺序匹配 |
预期输出:
INSERT 0 5
验证数据
SELECT * FROM sche_duty.tb_engineer;
预期输出:
c_eng_sk | c_eng_id | c_name | c_team | c_phone | c_level
----------+----------+--------+---------+--------------+---------
1 | ENG-001 | Alice | SysTeam | 13800000001 | P3
2 | ENG-002 | Bob | NetTeam | 13800000002 | P2
3 | ENG-003 | Carol | DBTeam | 13800000003 | P3
4 | ENG-004 | David | SecTeam | 13800000004 | P2
5 | ENG-005 | Eric | AppTeam | 13800000005 | P1
(5 rows)
9.13 向 tb_duty_log 插入至少 6 条记录
题目要求:向 tb_duty_log 插入至少 6 条记录,每名工程师至少有 1 条值班记录。
-- 插入 6 条值班记录
INSERT INTO sche_duty.tb_duty_log VALUES
(1, 1, '2026-10-01', '日班', '正常'),
(2, 2, '2026-10-02', '夜班', '正常'),
(3, 3, '2026-10-03', '日班', '正常'),
(4, 4, '2026-10-04', '夜班', '正常'),
(5, 5, '2026-10-05', '日班', '正常'),
(6, 1, '2026-10-06', '夜班', '正常');
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
| 共 6 条 | 满足"至少 6 条" | 题目最低要求 |
| c_eng_sk 覆盖 1-5 | 每名工程师都有记录 | 满足"每名工程师至少 1 条" |
| 第 6 条 c_eng_sk=1 | 工程师1有两条,允许 | 题目没限制每人条数 |
预期输出:
INSERT 0 6
验证数据条数
SELECT count(*) FROM sche_duty.tb_duty_log;
预期输出:
count
-------
6
(1 row)
9.14 导出 db_duty 到 /data/db_duty.sql
题目要求:将 db_duty 以纯文本格式导出到 /data/db_duty.sql,导出内容包含模式、表结构与表数据。
先准备 /data 目录
# 退出 gsql 回到 shell
\q
# 切到 root 创建 /data 目录并授权
exit
mkdir -p /data
chown opengauss:opengauss /data
# 切回 opengauss 用户
su - opengauss
命令解析
| 命令 | 作用 | 为什么这么做 |
|---|---|---|
mkdir -p /data | 创建 /data 目录 | 系统默认没有,不建会报错 |
chown opengauss:opengauss /data | 改目录属主 | 否则没权限写文件 |
执行导出
# 用 gs_dump 导出数据库
gs_dump db_duty -p 7654 -F p -n sche_duty -f /data/db_duty.sql
命令解析
| 参数 | 作用 | 为什么这么写 |
|---|---|---|
gs_dump | openGauss 导出工具 | 题目要求导出 |
-F p | 纯文本格式(plain) | 题目要求纯文本 |
-n sche_duty | 只导出 sche_duty 模式 | 题目要求包含该模式 |
-f | 输出文件路径 | 题目指定路径 |
预期输出:
gs_dump[archiver] (db=db_duty): Dump completed successfully
验证导出文件
ls -lh /data/db_duty.sql
预期输出:
-rw------- 1 opengauss opengauss 4.5K /data/db_duty.sql
10. 数据库备份恢复与定时保护
10.1 gs_dump 备份 db_duty
题目要求:使用 gs_dump 将 db_duty 以纯文本格式备份为 /data/duty_backup.sql。
# 用超级用户 gaussdb 执行备份
gs_dump db_duty -U gaussdb -p 7654 -F p -n sche_duty -f /data/duty_backup.sql
命令解析
| 参数 | 作用 | 为什么这么写 |
|---|---|---|
-U gaussdb | 用超级用户连接 | 普通用户备份会缺表结构,必须用超级用户 |
-F p | 纯文本格式 | 题目要求 |
-n sche_duty | 备份指定模式 | 题目要求 |
-f | 备份文件路径 | 题目指定 |
执行后输入 gaussdb 密码:GaussDB#2026
预期输出:
Password:
gs_dump[archiver] (db=db_duty): Dump completed successfully
验证备份文件
ls -lh /data/duty_backup.sql
预期输出:
-rw------- 1 opengauss opengauss 4.5K /data/duty_backup.sql
10.2 创建数据库 db_restore
题目要求:创建数据库 db_restore,拥有者为 dutyadmin。
# 用 gaussdb 超级用户连接 postgres
gsql -d postgres -U gaussdb -p 7654
-- 创建恢复用数据库
CREATE DATABASE db_restore OWNER dutyadmin ENCODING 'UTF8';
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
db_restore | 恢复库名 | 题目指定 |
OWNER dutyadmin | 拥有者为 dutyadmin | 题目明确要求 |
ENCODING 'UTF8' | 字符集一致 | 避免乱码 |
预期输出:
CREATE DATABASE
\q
10.3 将备份恢复到 db_restore
题目要求:将备份恢复到 db_restore。
# 用超级用户执行恢复
gsql -d db_restore -U gaussdb -p 7654 -f /data/duty_backup.sql
命令解析
| 参数 | 作用 | 为什么这么写 |
|---|---|---|
-d db_restore | 连接目标恢复库 | 要恢复到这个库 |
-U gaussdb | 用超级用户 | 普通用户没权限建表 |
-f | 执行备份文件里的 SQL | 恢复就是把备份 SQL 重新跑一遍 |
预期输出(部分):
SET
SET
CREATE SCHEMA
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
COPY 5
COPY 6
验证恢复数据
gsql -d db_restore -U gaussdb -p 7654 -c "SELECT count(*) FROM sche_duty.tb_engineer;"
预期输出:
count
-------
5
(1 row)
给 dutyadmin 授权(踩坑处理)
gsql -d db_restore -U gaussdb -p 7654
-- 授予模式和表权限
GRANT ALL ON SCHEMA sche_duty TO dutyadmin;
GRANT ALL ON ALL TABLES IN SCHEMA sche_duty TO dutyadmin;
为什么需要这步
用 gaussdb 恢复后表属主变成 gaussdb,dutyadmin 直接查会报 permission denied,必须授权。
预期输出:
GRANT
GRANT
10.4 crontab 每日 02:30 定时备份
题目要求:使用 opengauss 用户的 crontab 每日 02:30 执行备份,标准输出在 cron 行内追加到 /data/og-backup.log。
10.4.1 创建备份脚本
# 切换到 opengauss 用户
su - opengauss
# 创建备份脚本
cat > /home/opengauss/backup.sh <<'EOF'
#!/bin/bash
# 环境变量赋值(题目允许)
export PATH=/usr/local/opengauss/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opengauss/lib:$LD_LIBRARY_PATH
export GAUSSHOME=/usr/local/opengauss
# 唯一执行命令 gs_dump
gs_dump db_duty -U gaussdb -p 7654 -F p -n sche_duty -f /data/duty_backup.sql
EOF
10.4.2 设置脚本权限
chmod +x /home/opengauss/backup.sh
命令解析
chmod +x 让脚本可执行,题目要求"可读可执行"。
10.4.3 配置 crontab
crontab -e
添加一行:
30 02 * * * /home/opengauss/backup.sh >> /data/og-backup.log
命令解析
| 部分 | 作用 | 为什么这么写 |
|---|---|---|
30 02 | 凌晨2点30分 | 题目要求 02:30 |
* * * | 每天 | 每日执行 |
| 绝对路径脚本 | 要执行的脚本 | 题目要求绝对路径 |
>> | 追加输出到日志 | 题目要求在 cron 行内追加,>> 是追加不是覆盖 |
预期输出:
crontab: installing new crontab
验证定时任务
crontab -l
预期输出:
30 02 * * * /home/opengauss/backup.sh >> /data/og-backup.log
踩坑提示:如果 crontab 报
You are not allowed to use this program,用 root 给该用户加权限,或直接用 root 配置。
10.5 备份脚本要求检查
题目要求:cron 行直接执行 gs_dump,或调用一个对 opengauss 可读可执行的绝对路径 sh/bash 脚本,脚本内不重定向标准输出。
| 要求 | 我们的做法 | 是否满足 |
|---|---|---|
| sh/bash 脚本 | 第一行 #!/bin/bash | 满足 |
| 绝对路径 | /home/opengauss/backup.sh | 满足 |
| 可读可执行 | 已 chmod +x,属主是 opengauss | 满足 |
| 脚本内不重定向 | 脚本内没有 >/>>,重定向只在 cron 行 | 满足 |
10.6 脚本内命令限制检查
题目要求:除一条 gs_dump 命令外不执行其他命令,环境变量赋值除外。
# 三行环境变量(允许)
export PATH=...
export LD_LIBRARY_PATH=...
export GAUSSHOME=...
# 只有一条实际命令
gs_dump db_duty -U gaussdb -p 7654 -F p -n sche_duty -f ...
没有 cd、ls、echo 等额外命令,符合要求。
10.7 gs_dump 参数限制检查
题目要求:gs_dump 除连接参数外只使用 -f、-F p、-n sche_duty、-c、-E、-O、-x、-b、-v、–inserts、–column-inserts。
| 参数 | 是否允许 | 说明 |
|---|---|---|
-U gaussdb | 连接参数 | 用户 |
-p 7654 | 连接参数 | 端口 |
-f | 允许 | 输出文件 |
-F p | 允许 | 纯文本 |
-n sche_duty | 允许 | 指定模式 |
没有使用列表外参数,符合要求。
全部配置完成
最终验收命令汇总
# 1. 服务状态(active + enabled)
systemctl status opengauss
# 2. 端口监听
ss -tlnp | grep gaussdb
# 3. 数据库和用户
gsql -d postgres -U gaussdb -p 7654 -c "\l"
gsql -d postgres -U gaussdb -p 7654 -c "\du"
# 4. 原库数据
gsql -d db_duty -U dutyadmin -p 7654 -c "SELECT count(*) FROM sche_duty.tb_engineer;"
gsql -d db_duty -U dutyadmin -p 7654 -c "SELECT count(*) FROM sche_duty.tb_duty_log;"
# 5. 文件
ls -lh /data/db_duty.sql /data/duty_backup.sql
# 6. 恢复库
gsql -d db_restore -U dutyadmin -p 7654 -c "SELECT count(*) FROM sche_duty.tb_engineer;"
# 7. 定时任务
crontab -l
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)