Skip to content

基于Docker的人大金仓PG数据库数据恢复操作

约 1181 字大约 4 分钟

Docker人大金仓

2025-11-19

1、Docker部署人大金仓PG数据库

1.1、下载镜像

https://www.kingbase.com.cn/download.html 下载: KingbaseES_V009R001C010B0004_x86_64_Docker.tar

备用地址: https://pan.baidu.com/s/1iFxoTZ6p0O436GnrC7Rdxg?pwd=vuwe 提取码: vuwe

1.2、导入镜像

使用 orbStack 导入镜像,得到镜像名: kingbase_v009r001c010b0004_single_x86:v1

1.3、运行容器

docker run -tid \
 --privileged \
 --platform linux/amd64 \
 -e NEED_START=yes \
 -e DB_USER=kingbase \
 -e DB_PASSWORD=Sunday@666 \
 -e DB_MODE=pg \
 -p 54321:54321 \
 -v /Users/dftshine/Career/LocalDATA/nepsp_db_datas:/home/kingbase/bakdata \
 --name kingbase \
 kingbase_v009r001c010b0004_single_x86:v1 \
 /usr/sbin/init

注: 挂载文件夹,用于存放服务器备份出的 备份sql文件,以便后续恢复。

2、服务器备份人大金仓数据库

2.1、进入到server/bin 目录

C:\app\kingbase\ES\V8\KESRealPro\V008R006C009B0014\Server\bin>

在人大金仓(KingbaseES)中,使用 sys_dump 命令时若未通过 -F 参数指定格式(即不指定 -Fc-Fp),默认导出格式为 纯文本 SQL 格式(Plain Text),与 -Fp 效果一致。(即使文件后缀为 .dmp,本质仍是文本格式,可通过记事本等工具打开查看)。

2.2、执行sys_dump 导出 dmp

C:\app\kingbase\ES\V8\KESRealPro\V008R006C009B0014\Server\bin>sys_dump -h 10.83.1.52 -p 54321 -d middleware -Fp -c -U kingbase -f 20251020.sql >> 20251020.log 2>&1
口令:

解释:

-h 10.83.1.52 —— kingbase 所在服务器IP

-p 54321 —— kingbase 端口号

-d middleware —— 准备导出备份的数据库名

-Fc 或者 --format=c —— 压缩格式, 如果使用了这个参数,可以使用sys_restore恢复

-Fp 默认,适用于不同版本数据库软件间的备份恢复,兼容性更强。

-c 若需导出脚本自带 “先删后建” 逻辑,可在导出时添加 -c--clean)参数,生成的 SQL 会包含 DROP TABLE IF EXISTS 等语句,恢复时无需手动清理

-U kingbase —— 用户名

-f 20251020.sql —— 输出的文件名

20251020.log —— 日志

3、Docker环境下的人大金仓数据库恢复备份

3.1、Docker宿主机上,复制备份文件到挂载文件夹中

mv 20251020.sql /Users/dftshine/Career/LocalDATA/nepsp_db_datas/

注意: 在容器内的文件夹/home/kingbase/bakdata下可以看到20251020.sql

3.2、进入容器

docker exec -it kingbase /bin/bash

3.3、进入命令所在bin目录

cd /home/kingbase/install/kingbase/bin

3.4、进入ksql,创建数据库(如果没有备份对应的数据库)

ksql -U kingbase -W -h 192.168.215.2 -p 54321 -d test
-- 创建数据库(含关键参数,避免中文乱码和排序问题)
CREATE DATABASE "middleware"
  WITH 
    OWNER = kingbase  -- 数据库所有者(默认超级用户,可改为业务用户)
    ENCODING = 'UTF8'  -- 字符集(推荐UTF8,支持中文/特殊字符)
    LC_COLLATE = 'en_US.UTF-8'  -- 排序规则(避免中文排序异常)
    LC_CTYPE = 'en_US.UTF-8'  -- 字符分类(与编码一致,确保字符处理正确)
    TABLESPACE = sys_default  -- 表空间(默认即可,如需自定义可修改)
    CONNECTION LIMIT = -1;  -- 连接数限制(-1表示无限制)

-- 创建模式 Nacos
CREATE DATABASE "nacos_config" 
WITH OWNER = kingbase ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TABLESPACE = sys_default CONNECTION LIMIT = -1;

3.5、执行恢复

ksql -U kingbase -W -h 192.168.215.2 -p 54321 -d middleware -f 20251020.sql

注: 没有-W(强制提示密码交互) ,可以 -w(强制不提示密码交互)或者没有 -w

4、知识点

4.1、ksql命令不专门输入密码

如果不想专门输入密码,可设置环境变量,比如临时设置密码,然后执行恢复

export KINGBASE_PASSWORD="Sunday@666"
ksql -U kingbase -h 192.168.215.2 -p 54321 -d middleware -f 20251020.sql

4.2、删除数据库下所有对象

如果备份时命令没有带参数 -c, 而docker数据库中有对应对象,且不想删除数据库后重建。

进入ksql

ksql -U kingbase -W -h 192.168.215.2 -p 54321 -d middleware

获取删除资源的sql

-- 在ksql中执行,将生成的所有删除语句保存到文件(覆盖原文件)
\o /home/kingbase/bakdata/drop_all_tables_views_seqs.sql

-- 1. 生成删除视图的语句(视图依赖表,优先删除)
SELECT 'DROP VIEW IF EXISTS "' || schemaname || '"."' || viewname || '" CASCADE;' 
FROM pg_views 
WHERE schemaname IN ('nacos_config') 
  AND viewname NOT LIKE 'pg_%'  -- 排除系统视图
ORDER BY viewname;

-- 2. 生成删除索引的语句(索引依附于表,次优先删除)
SELECT 'DROP INDEX IF EXISTS "' || schemaname || '"."' || indexname || '" CASCADE;' 
FROM pg_indexes 
WHERE schemaname IN ('nacos_config') 
  AND indexname NOT LIKE 'pg_%'  -- 排除系统索引
  AND tablename NOT LIKE 'pg_%'  -- 排除系统表的索引
ORDER BY indexname;

-- 3. 生成删除表的语句(原逻辑保留,最后删除表)
SELECT 'DROP TABLE IF EXISTS "' || schemaname || '"."' || tablename || '" CASCADE;' 
FROM pg_tables 
WHERE schemaname IN ('nacos_config') 
  AND tablename NOT LIKE 'pg_%'  -- 排除系统表
ORDER BY tablename;

-- 4. 生成删除序列的语句(补充:原脚本未处理序列,避免残留)
SELECT 'DROP SEQUENCE IF EXISTS "' || schemaname || '"."' || sequencename || '" CASCADE;' 
FROM pg_sequences 
WHERE schemaname IN ('nacos_config') 
  AND sequencename NOT LIKE 'pg_%'  -- 排除系统序列
ORDER BY sequencename;

-- 关闭输出重定向
\o

检查生成的 "删除语句文件"(新窗口 或者退出ksql后查看)

[kingbase@59f2e8654312 bin]$ more /home/kingbase/bakdata/drop_all_tables.sql

执行生成的删除表sql (ksql中)

-- 执行删除脚本
\i /home/kingbase/bakdata/drop_all_tables_views_seqs.sql