模块 C 应用系统迁移 — 详细配置过程(按操作顺序)

执行机器:Server2(172.16.50.12)
执行账号:root / openEuler12#$
系统环境:openEuler 22.03 LTS SP4
数据库版本:openGauss 5.0.1

说明:题号保持题目原样不变,但按实际操作先后顺序排列(例如必须先创建用户、初始化数据库,才能修改配置文件)。


目录(按实际操作顺序)


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

踩坑提示

  1. 不能用 root 跑 gs_initdb,会报 cannot be run as root,必须先 su 到普通用户。
  2. 如果报 directory exists but is not empty,说明之前初始化过,删掉重建:
rm -rf /home/opengauss/data
gs_initdb -D /home/opengauss/data --nodename=dn1
  1. 如果 su - opengauss 报用户条目字段不完整,但 id opengauss 能查到用户,删掉用户重建:
userdel -r opengauss
useradd opengauss
echo 'openGauss#2026' | passwd --stdin opengauss
  1. 如果报 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

命令解析

参数作用
gsqlopenGauss 命令行客户端
-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_skint4主键
c_eng_idvarchar(16)唯一,非空
c_namevarchar(32)非空
c_teamvarchar(32)非空
c_phonevarchar(16)非空
c_levelvarchar(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_skint4主键
c_eng_skint4外键,关联 tb_engineer(c_eng_sk)
c_duty_datedate非空
c_shiftvarchar(8)非空
c_remarkvarchar(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_dumpopenGauss 导出工具题目要求导出
-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
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐