1、先部署数据库
bash
1.#导入镜像
[root@node1 ~]# docker load -i kdb_x86_64_V009R001C002B0014.tar
2.#改标签
[root@node1 ~]# docker tag kingbase_v009r001c002b0014_single_x86:v1 kingbase:v1
[root@node1 ~]# docker images
3.#修改默认路径
#找到 Docker 实际的数据目录
[root@node1 ~]# docker info | grep -i "docker root dir"
Docker Root Dir: /apps/docker
# 编辑/创建daemon.json文件
vim /etc/docker/daemon.json
{
"data-root" : "/var/lib/docker",
"insecure-registries" : ["10.3.90.106:8081"]
}
#迁移原有 Docker 数据到新目录
mkdir /var/lib/docker
mv /apps/docker/* /var/lib/docker/
# 设置正确的权限(必须是root:root)
chown -R root:root /var/lib/docker
chmod -R 700 /var/lib/docker
# 重启Docker服务
systemctl daemon-reload
systemctl restart docker
2、运行实例
bash
#完整启动命令示例
docker run -tid --privileged \
-p 4321:54321 \
-v /mnt/data:/home/kingbase/userdata/ \
-e NEED_START=yes \
-e DB_USER=kingbase \
-e DB_PASSWORD=123456 \
-e DB_MODE=mysql \
--name kingbase \
kingbase:v1 /usr/sbin/init
[root@node1 ~]# docker logs kingbase
[root@node1 ~]# ps -ef |grep data
kingbase 5095 4998 1 23:24 ? 00:00:00 /home/kingbase/install/kingbase/bin/kingbase -D /home/kingbase/userdata/data
3、升级前
bash
[root@node1 ~]# docker exec -it kingbase /bin/bash
Welcome to 3.10.0-1160.el7.x86_64
System information as of time: Fri 13 Mar 2026 03:04:24 PM UTC
System load: 0.06
Processes: 19
Memory used: 34.1%
Swap used: 0.3%
Usage On: 19%
Users online: 0
[kingbase@900578af4dec ~]$ ksql
Type "help" for help.
kingbase=# select version();
version
----------------------------------------------------------------------------------------------------------------------
KingbaseES V009R001C002B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 row)
kingbase=# select build_version;
build_version
---------------
1100651784c
(1 row)
kingbase=# show database_mode;
database_mode
---------------
mysql
4、升级中
bash
1.#停机备份
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@900578af4dec ~]$ sys_ctl -D /home/kingbase/userdata/data/ stop
[kingbase@900578af4dec ~]$ exit
[root@node1 ~]# mkdir /mnt/data_bak
[root@node1 ~]# cp -r /mnt/data/ /mnt/data_bak/
#备份容器内程序目录到宿主机
#格式:docker cp 容器名:容器内路径 宿主机目标路径
[root@node1 ~]# docker cp kingbase:/home/kingbase/install/ /mnt/data_bak/
2.#升级(容器内直接访问升级包(无需拷贝))
#进入容器查看共享目录里的升级包
[root@node1 ~]# cp /kdb_install/kingbase-server-V009R001C002B0014PS055-linux-x86_64.tar /mnt/data
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@900578af4dec ~]$ ls -l /home/kingbase/userdata/
# 能看到升级包,直接解压/使用即可
[root@node1 ~]# cp /kdb_install/kingbase-server-V009R001C002B0014PS055-linux-x86_64.tar /mnt/data
[kingbase@900578af4dec ~]$ tar xf /home/kingbase/userdata/kingbase-server-V009R001C002B0014PS055-linux-x86_64.tar -C /home/kingbase/install/kingbase/
[kingbase@900578af4dec ~]$ sys_ctl -D /home/kingbase/userdata/data/ start
5、升级后
bash
[kingbase@900578af4dec ~]$ ksql
Type "help" for help.
kingbase=# select version();
version
---------------------------------------------------------------------------------------------------------------------------
KingbaseES V009R001C002B0014PS055 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 row)
kingbase=# select build_version;
build_version
---------------
9a3e44a1414
(1 row)
kingbase=# show database_mode;
database_mode
---------------
mysql
(1 row)
与升级无关,就是测试删除是否可以恢复(容器被删)
创建测试数据
bash
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@900578af4dec ~]$ ksql
create table t1(id int);
insert into t1 values (1),(2),(3);
select * from t1;
id
----
1
2
3
(3 rows)
[kingbase@900578af4dec ~]$ sys_ctl -D /home/kingbase/userdata/data/ stop
[root@node1 ~]# mkdir /backup
[root@node1 ~]# cp -r /mnt/data/ /backup/
[root@node1 ~]# docker cp kingbase:/home/kingbase/install/ /backup/
bash
#重新创建容器 + 恢复备份
[root@node1 ~]# docker rm -f kingbase
kingbase
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
步骤 1:#重新创建和原配置一致的容器(核心)
#用原来的启动参数重新创建容器(先不启动数据库,仅创建容器):
docker run -tid --privileged \
-p 4321:54321 \
-v /mnt/data:/home/kingbase/userdata/ \
-e NEED_START=no \
-e DB_USER=kingbase \
-e DB_PASSWORD=123456 \
-e DB_MODE=mysql \
--name kingbase \
kingbase:v1 /usr/sbin/init
#注意:把 NEED_START=yes 改为 no,避免容器创建时自动启动数据库(此时数据 / 程序还没恢复,启动会报错)。
步骤 2:#恢复程序目录(从宿主机备份到新容器)
#1.清空新容器内默认的程序目录(避免冲突)
[root@node1 ~]# docker exec -it kingbase rm -rf /home/kingbase/install/
#2.从宿主机备份恢复程序目录
[root@node1 ~]# docker cp /backup/install/ kingbase:/home/kingbase/
#3.修复程序目录权限
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@1fefb4bc37d7 ~]$ sudo su
[root@1fefb4bc37d7 ~]#
[root@1fefb4bc37d7 ~]# chown -R kingbase:kingbase /home/kingbase/install/
[root@1fefb4bc37d7 ~]# chmod -R 755 /home/kingbase/install/
步骤 3:#恢复数据目录(挂载模式,直接恢复宿主机)
#1.清空宿主机挂载目录(/mnt/data)的旧数据
[root@node1 ~]# rm -rf /mnt/data/*
#2.拷贝 /mnt/data
[root@node1 ~]# cp -r /backup/data/ /mnt/
#3.修复数据目录权限
#宿主机权限
[root@node1 ~]# chown -R root:root /mnt/data/
#容器内权限
[root@1fefb4bc37d7 ~]# chown -R kingbase:kingbase /home/kingbase/userdata/
步骤 4:#启动数据库并验证(和你原验证步骤一致)
# 1. 进入容器启动数据库
[kingbase@1fefb4bc37d7 ~]$ sys_ctl -D /home/kingbase/userdata/data start
# 2. 验证数据库是否正常(核心验证步骤)
[kingbase@1fefb4bc37d7 ~]$ ksql
Type "help" for help.
kingbase=# select * from t1;
id
----
1
2
3
(3 rows)
#3.(可选)把 NEED_START 改回 yes,确保容器重启后自动启动数据库
#需修改容器启动参数(或直接重启容器时指定)
[root@node1 ~]# docker rm -f kingbase
# 重新创建容器,改回 NEED_START=yes
docker run -tid --privileged \
-p 4321:54321 \
-v /mnt/data:/home/kingbase/userdata/ \
-e NEED_START=yes \
-e DB_USER=kingbase \
-e DB_PASSWORD=123456 \
-e DB_MODE=mysql \
--name kingbase \
kingbase:v1 /usr/sbin/init
#再次验证
[root@node1 ~]# docker exec -it kingbase /bin/bash
Welcome to 3.10.0-1160.el7.x86_64
System information as of time: Fri 13 Mar 2026 04:04:26 PM UTC
System load: 0.32
Processes: 19
Memory used: 32.2%
Swap used: 2.2%
Usage On: 21%
Users online: 0
[kingbase@9915999ed0ee ~]$ ksql
Type "help" for help.
kingbase=# select * from t1 ;
id
----
1
2
3
(3 rows)
官网下载的容器镜像有问题(待解决)
https://www.kingbase.com.cn/download.html#database_list?packageDrivenToolId=9
V9R1C2B14、KingbaseES_Dcoker镜像、X64
bash
#查看日志,报错解决
[root@node1 ~]# docker logs kingbase
/bin/bash: error while loading shared libraries: libtinfo.so.6: cannot open shared object file: Permission denied