基于Docker的人大金仓PG数据库数据恢复操作
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/bash3.3、进入命令所在bin目录
cd /home/kingbase/install/kingbase/bin3.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.sql4.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