前言#
随着数字化转型与信创替代持续推进,数据库国产化已经从“选型验证”逐步走向“规模落地”。海量数据库 Vastbase G100 作为国产数据库产品中的重要代表,近几年在产品成熟度、生态建设和企业落地方面都取得了较快进展。Vastbase G100 v2.2 于 2023 年 12 月通过国测,Vastbase G100 v3.0 又于 2024 年 9 月再次通过国测;同时,本人所在单位的部分系统也已经迁移到 Vastbase G100,并保持了较为平稳的运行状态。
过去一段时间,很多 DBA 和开发人员在学习 Vastbase G100 时,最大的痛点之一并不是产品本身,而是安装包获取不便、资料分散、实操案例不足。如今,官网知识中心逐步完善,安装介质、操作指南、数据迁移和应用开发等资料也更加完整,这使得学习和验证 Vastbase G100 的门槛明显降低。
本文将结合一次真实安装过程,基于 CentOS 7.9 单机场景,系统梳理 Vastbase G100 V3 的安装与验证流程。内容包括安装前环境准备、第三方依赖安装、系统参数配置、静默安装参数编写、installer 执行、数据库启停验证,以及连接数据库后的基本操作。希望通过这篇文章,为初次接触 Vastbase G100 的 DBA、运维人员和开发人员提供一份可参考、可复现、可排错的实战笔记。
软件下载#
可以登录官网的软件下载,下载海光、英特尔x86_Linux 版本:V3.0.8PSU4。介质名称:Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar

安装环境与目标#
本次部署目标是:在 Linux 单机环境中,使用脚本完成 Vastbase G100 V3 安装、初始化、启动和基础验证。
| CPU | 内存 | 硬盘 | 操作系统 | 安装目录 | 数据目录 | 默认端口 |
|---|---|---|---|---|---|---|
| 2c | 8G | 50G | CentOS 7.9 | /home/vastbase/local/vastbase | /home/vastbase/data/vastbase | 5432 |
准备安装#
本文介绍使用installer安装单机版Vastbase前需要完成的环境准备和相关配置。
挂载本地源#
在根目录创建 mnt 目录用于挂载本地镜像。
mkdir /mnt在 /etc/yum.repos.d 目录下创建 repo 配置。
cat >> /etc/yum.repos.d/local.repo << "EOF"
[local]
name=Local Repository
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF将安装镜像挂载到 mnt 目录。
mount -o loop CentOS-7-x86_64-Everything-2009.iso /mnt清除 yum 缓存并生成新的缓存。
yum clean all
yum makecache第三方依赖包#
yum install -y zlib-devel libaio libuuid readline-devel krb5-libs libicu libxslt tcl perl openldap pam openssl-devel libxml2 bzip2系统和环境配置#
防火墙配置#
在普遍场景中,数据库的业务服务和数据库节点的网络联通都是在安全域内完成数据交互。
为了保证Vastbase的正常使用,需要将节点间的访问端口打通才可以保证读写请求、数据心跳等信息的正常传输。如果没有特殊安全的要求,建议关闭目标节点的防火墙。
检查防火墙状态(以 CentOS 7 操作系统为例,不同操作系统的命令可能不同)。
sudo firewall-cmd --state
sudo systemctl status firewalld.service关闭防火墙服务。
sudo systemctl stop firewalld.service关闭防火墙自动启动服务。
sudo systemctl disable firewalld.service关闭透明大页#
开启透明大页可能会对数据库性能产生负面影响。编辑 service 文件,将如下内容放入文件中。
vi /etc/systemd/system/disable-thp.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"
[Install]
WantedBy=multi-user.target修改完成后,执行如下命令加载系统服务,并设置开机自启动。
systemctl daemon-reload
systemctl start disable-thp
systemctl enable disable-thp查看THP状态,当返回结果均为always madvise [never]时表示成功设置透明大页永久关闭。
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag时区配置#
数据库默认时区为中国时区,如果操作系统时区和数据库默认时区不一致,会导致数据库日志显示时间和实际时间不一致。
可通过以下命令查看操作系统当前的时区。
timedatectl将/usr/share/zoneinfo/目录下的时区文件拷贝为/etc/localtime文件,从而设置时区和时间。
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeIPC参数配置#
当RemoveIPC=yes时,操作系统会在用户退出时,删除该用户的IPC资源(共享内存段和信号量),从而使得 Vastbase服务器使用的IPC资源被清理,可能引发数据库宕机,所以需要设置 RemoveIPC 参数为no。
进入/etc/systemd/logind.conf文件,在配置文件末尾新增配置RemoveIPC=no,若文件中已设置则跳过本步骤。
vi /etc/systemd/logind.conf进入/usr/lib/systemd/system/systemd-logind.service文件,新增或修改配置RemoveIPC=no,若文件中已设置则跳过本步骤。
vi /usr/lib/systemd/system/systemd-logind.service重新加载配置参数。
systemctl daemon-reload
systemctl restart systemd-logind检查修改是否生效。
由于CentOS操作系统环境的removeIPC默认为关闭,则执行如下语句是无返回结果的。用户在确保步骤1至步骤3已执行的前提下,可正常安装数据库。
loginctl show-session | grep RemoveIPC
systemctl show systemd-logind | grep RemoveIPC内核参数配置#
为了优化系统性能、确保稳定性,并满足数据库对资源管理的特殊需求。用户应该对操作系统的内核参数配置进行合理配置,这关系到数据库的启动和使用时的资源配置。
设置内核参数前需参考,结合实际情况调节参数大小,否则会影响数据库的安装部署,以下示例仅供参考。
(root 用户执行)编译内核参数配置文件/etc/sysctl.conf,将内核信息写入文件末尾。
其中关键配置项含义如下,建议用户在配置时着重关注:
vm.dirty_background_bytes:该参数表示触发回刷的脏页数据量,超过该参数,脏页刷到磁盘,单位:Btye。
kernel.shmmin参数用于设置系统可以创建的共享内存段的数量。通常取默认值:4096,单位:个。
kernel.shmall 参数用于设置一个共享内存段内可以分配的共享内存页的最大数量。共享内存页是共享内存段中的最小可管理单元。建议取值为:系统内存*0.8/PAGE_SIZE,单位为 Byte。
0.8 为推荐配置,
注意事项:该参数设置太小有可能导致数据库启动报错。若 kernel.shmall 设置的过小,可能会导致操作系统无法为 Vastbase数据库分配其所需的共享内存,导致数据库启动失败。
kernel.shmmax参数用于设置单个共享内存段可拥有的最大尺寸。建议取值为:系统内存*0.5,单位:Byte。
注意事项:
- 数据库参数设置 Vastbase数据库需要使用的共享内存大小,建议 kernel.shmmax 设置的单个共享内存段大小可覆盖Vastbase数据库需要使用的共享内存大小。
- 数据库参数设置 Vastbase数据库可用的最大物理内存,此值与 Vastbase所需的共享内存共同决定 Vastbase数据库在运行时可以使用的内存总量,若设置不合理可能导致操作系统OOM (Out of Memory) 问题。
cat >> /etc/sysctl.conf << "EOF"
#Vastbase setting
fs.aio-max-nr=1048576
fs.file-max= 76724600
kernel.sem = 4096 2097152000 4096 512000
kernel.shmall = 26843545 # pages, 80% MEM or higher
kernel.shmmax = 68719476736 # bytes, 50% MEM or higher
kernel.shmmin = 819200
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 5
vm.dirty_background_bytes = 409600000
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 80
vm.dirty_writeback_centisecs = 50
vm.overcommit_memory = 0
vm.swappiness = 0
net.ipv4.ip_local_port_range = 40000 65535
fs.nr_open = 20480000
EOF重载配置,使其在不关机的情况下生效。
sysctl -pSELinux配置#
若为开启状态则临时关闭SELinux。/etc/selinux/config将 SELINUX=enforcing 修改为 SELINUX=disabled。
setenforce 0
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
sestatus设置主机名#
#根据您的ip地址主机名进行相应修改
hostnamectl set-hostname testdb-host
cat >> /etc/hosts << "EOF"
192.168.18.133 testdb-host
EOF远程登录配置#
集群部署时需要 root 帐户远程登录访问权限,可以通过如下步骤设置使用 root 用户远程登录。
修改 PermitRootLogin 配置,允许用户远程登录。打开 sshd_config 文件。将 PermitRootLogin no 注释。将 PermitRootLogin 改为 yes。
vi /etc/ssh/sshd_config
#PermitRootLogin no
PermitRootLogin yes重启ssh使命令生效。
service sshd restart命令行安装#
静默安装#
静默安装简化了标准命令行安装,省去了程序与用户的交互过程。用户可预先将安装参数配置到参数文件db_install.rsp中,即新增并编辑静默安装参数文件,并指定参数文件的路径,在安装时程序自动读取文件以获取安装参数,完成数据库安装。
静默交互安装支持 实例化 与 非实例化 两种模式:
- 实例化:安装数据库,并进行初始化。
- 非实例化:仅安装数据库所需的二进制文件,不进行数据库初始化。
本次安装 以 实例化 为主要流程进行介绍。
创建数据库安装用户和目录#
以root用户登录操作系统。创建数据库安装用户(可自定义),设定初始密码(需要重复输入2次且完全一致)。
useradd -m vastbase
passwd vastbase创建数据库coredump目录。
mkdir -p /home/vastbase/data/db_coredump
chmod 770 /home/vastbase/data
chown vastbase:vastbase /home/vastbase/data创建数据库数据目录(可自定义)。如果不执行,则安装数据库时将采用默认安装目录。
mkdir -p /home/vastbase/data/vastbase
chmod 700 /home/vastbase/data/vastbase
chown -R vastbase:vastbase /home/vastbase/data/vastbase创建数据库软件目录(可自定义)。如果不执行,则安装数据库时将采用默认安装目录。
mkdir -p /home/vastbase/local/vastbase
chown -R vastbase:vastbase /home/vastbase修改资源限制#
以root用户登录操作系统。执行 vi /etc/security/limits.conf ,在文件末尾添加如下内容,保存退出。
vi /etc/security/limits.conf
vastbase soft nproc unlimited
vastbase hard nproc unlimited
vastbase soft stack unlimited
vastbase hard stack unlimited
vastbase soft core unlimited
vastbase hard core unlimited
vastbase soft memlock unlimited
vastbase hard memlock unlimited
vastbase soft nofile 1024000
vastbase hard nofile 1024000解压安装包#
以root用户登录操作系统。创建目录(/soft/vb),解压安装包,以root用户赋予数据库安装用户vastbase操作的权限。
将获取的安装包(本安装以Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar为例,实际安装以获取安装包名称为准)和license文件上传到/soft/vb(路径可自定义,如果有的话)。
mkdir -p /soft/vb
cd /soft/vb
tar -xf Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar
chown -R vastbase:vastbase /soft/vb/
chmod -R 775 /soft/vb/新增并编辑静默安装参数文件#
参数文件所在路径可自定义,本文以参数文件路径取/soft/vb/进行实例化安装为例。用户需根据实际安装情况修改参数文件取值。
编辑参数文件db_install.rsp。
cd /soft/vb/
vi db_install.rsp
vastbase_password=Vbase@123
encryption_key=Aa123456
vastbase_home=/home/vastbase/local/vastbase
vastbase_data=/home/vastbase/data/vastbase
port=5432
max_connections=100
shared_buffers=200
db_compatibility=A
isinitdb=true参数说明
以下列出了静默安装支持修改的参数,如果用户在参数文件中配置了其他参数,为无效值。
参数文件名必须为
db_install.rsp,参数文件格式以步骤4配置示例为准,若名称或格式不对,则将出现报错并退出静默安装。参数文件的末尾不能有空行。
vastbase_password
指定实例化数据库时默认用户的密码。
必填项,如果未配置则将报错并退出静默安装。
密码有效值必须满足如下条件:
- 包含大写字母、小写字母和数字。
- 长度不能小于8。
- 不能与用户名相同。
encryption_key
指定数据库加密密钥。
选填项,未配置时则默认使用vastbase_password的值。
密码有效值必须满足如下条件:
- 包含大写字母、小写字母和数字。
- 长度不能小于8。
- 不能与用户名相同。
vastbase_home
指定数据库安装目录。
选填项。若配置的目录不是绝对路径,则在安装程序(即vastbase_installer)当前所在的目录新建该目录。未配置时默认值为
/home/用户名/local/vastbase。用户指定配置的目录或默认目录
/home/用户名/local/vastbase,需满足如下条件:- 若目录存在则必须为空。
- 该目录必须为安装用户有读写权限的目录。
vastbase_data
指定数据库安装目录。
选填项。若配置的目录不是绝对路径,则在安装程序当前所在的目录新建该目录。未配置时默认值为
/home/用户名/data/vastbase。用户指定配置的目录或默认目录
/home/用户名/data/vastbase,需满足如下条件:- 若目录存在则必须为空。
- 该目录必须为安装用户有读写权限的目录。
port
指定数据库端口号。
选填项。默认值为5432。
该参数值必须是大于0,小于65535的整数。
max_connections
指定数据库最大连接数。
选填项,默认值为500.
该参数值必须是大于0的整数。
shared_buffers
指定共享内存大小,单位为MB。
选填项,默认为安装数据库的机器内存的四分之一。
该参数值不能小于0。
isinitdb
指定是否初始化数据库实例。
必填项,如果未配置则将报错并退出静默安装。
取值包括如下两种:
- true:表示进行实例化安装。
- false:表示进行非实例化安装。
执行安装脚本#
切换到数据库安装用户vastbase。执行安装程序,程序流程参见安装过程。
su - vastbase
cd /soft/vb/vastbase-installer/
./vastbase_installer --silent -responseFile /soft/vb/db_install.rsp./vastbase_installer 后面可以指定不同的参数,具体说明如下:
| 参数 | 说明 |
|---|---|
| –silent | 必须通过-responseFile指定静默安装的参数文件,且必须是绝对路径。 |
| -multi-pkg | 用于安装可选page size的数据库,此类数据库的安装包名称带有multi标识。若执行上述命令,则安装过程的第一步为选择page size,可选值有8/16/32,其中8为默认值。 |
| –uninstall | 卸载数据库(不可与其他参数同时使用) |
当
./vastbase_installer后不指定参数时,即默认为交互式安装。
回显信息#
在安装过程中,包括如下流程:
1、程序检查安装包完整性。
2、检查静默安装参数是否正确,当参数取值不正确或不属于允许修改的参数时,程序会做出相应提醒。

3、显示系统配置信息、依赖检查结果和安装环境准备结果。检查IPC参数、CPU指令。

4、安装数据库并检查磁盘IO调度算法。显示安装概要信息。

5、安装完成。

设置Core_Pattern#
为记录数据库异常停机信息,执行如下命令设定Core_pattern路径为vastbase组用户可写的路径。以root用户登录操作系统。执行如下操作完成设置。
echo "/omTmp/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern本语句中
/omTmp/corefile/为系统自动创建的默认coredump目录。用户可手动创建的coredump目录(此目录应提前创建,且vastbase组用户可写),此时需对应修改echo语句中路径:
echo "自定义目录/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
初始化环境变量#
以vastbase用户登录操作系统。执行如下命令初始化数据库环境变量。
source ~/.bashrc启动Vastbase#
vb_ctl start停止数据库服务
vb_ctl stop重启数据库服务
vb_ctl restart显示数据库状态
vb_ctl status连接Vastbase#
配置远程连接数据库#
如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。详情请参阅管理员指南的配置客户端接入认证。
配置文件(默认名称为pg_hba.conf)存放在数据库的数据目录里。hba(host-based authentication)表示是基于主机的认证。
vi $PGDATA/pg_hba.conf
#如下为示例配置,表示配置允许来自IP地址xx.xx.xx.xx的客户端通过vastbase用户连接到所有数据库,并且连接方式为trust,即不需要密码验证。
host all vastbase xx.xx.xx.xx/32 trust使用vsql连接数据库#
使用vsql连接数据库,已确认连接信息,包括连接的IP、数据库名称与数据库端口。运行以下命令连接数据库。数据库安装完成后,默认存在名为postgres的数据库。第一次连接数据库时可以连接到此数据库。
vsql -d postgres -p 5432
开始使用Vastbase#
在开始使用数据库之前,确保您已经顺利安装、启动并连接到数据库。
创建数据库#
创建一个新的数据库testdb1。
CREATE DATABASE testdb1;创建数据库testdb2,并指定所有者为dbuser。
创建用户。
CREATE USER dbuser PASSWORD 'Vbase@123';创建数据库。
CREATE DATABASE testdb2 OWNER dbuser TEMPLATE template0;查看数据库列表(vsql客户端可用)
\l清理测试环境
DROP DATABASE testdb1;
DROP DATABASE testdb2;
DROP USER dbuser;创建表#
创建普通表。
CREATE TABLE customer_t1
(
c_customer_sk integer not null,
c_customer_id char(6) not null,
c_first_name varchar(20) ,
c_last_name varchar(20) ,
c_country varchar(20)
);创建表,并指定c_state字段的缺省值为GA。
CREATE TABLE customer_t2
(
c_customer_sk integer not null,
c_customer_id char(6) not null,
c_first_name varchar(20) ,
c_last_name varchar(20) ,
c_state CHAR(2) DEFAULT 'GA',
c_country varchar(20)
);执行元命令列举表。常见的查看对象元命令可参考查看对象。
\dt执行元命令查看表结构。
\d tablename创建一个有主键约束的表。
CREATE TABLE customer_t3
(
c_customer_sk integer PRIMARY KEY,
c_customer_id char(6) not null,
c_first_name varchar(20) ,
c_last_name varchar(20) ,
c_country varchar(20)
);定义一个检查列约束。
CREATE TABLE public.customer_t4
(
c_customer_sk integer CHECK (c_customer_sk > 0),
c_customer_id char(6) not null,
c_first_name varchar(20) CHECK (c_first_name is not null),
c_last_name varchar(20) ,
c_country varchar(20)
);向表中增加一个varchar列。
ALTER TABLE customer_t1 ADD c_company varchar(30);给表增加一个检查约束。
ALTER TABLE customer_t2 ADD CONSTRAINT c_CONSTR_KEY4 CHECK (c_customer_sk >10);给一个已存在字段添加非空约束。
ALTER TABLE customer_t3 ALTER COLUMN c_country SET NOT NULL;重命名已存在的表。
ALTER TABLE customer_t4 RENAME TO newtab;清理测试环境。
DROP TABLE customer_t1;
DROP TABLE customer_t2;
DROP TABLE customer_t3;
DROP TABLE newtab;本文简单介绍如何向表中插入数据和更新表中数据等相关操作。
向表中插入数据#
在创建一个表后,表中并没有数据,在使用这个表之前,需要向表中插入数据。
创建表customer36。
CREATE TABLE customer36 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6));向表customer36中插入一行数据。
方法一:数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。
INSERT INTO customer36(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');方法二:如果已经知道表中字段的顺序,也可无需列出表中的字段。
INSERT INTO customer36 VALUES (3769, 'hello', 'Grace');方法三:如果不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。
INSERT INTO customer36 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');向表中插入多行数据。
INSERT INTO customer36 (c_customer_sk, c_customer_id, c_first_name) VALUES(6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James');如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现,但是建议使用此命令可以提升效率。
从指定表插入数据到当前表。例如,在数据库中创建了一个表customer36的备份表customer37,现在需要将表customer36中的数据插入到表customer37中,则可以执行如下命令。
CREATE TABLE customer37 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6) ); INSERT INTO customer37 SELECT * FROM customer36;
更新表中数据#
根据需要,可以更新单独一行,所有行或者指定部分行的表中数据。还可以独立更新每个字段,其他字段则不受影响。
SQL通常不会为数据行提供唯一标识,因此无法直接声明需要更新哪一行,但可以声明一个被更新的行必须满足的条件。如果表中有一个主键,可以指定准确的行。
更新表customer36中c_customer_sk为9527的地域为9876。
UPDATE customer36 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527;更新表中c_customer_sk字段的所有值为增加100。
UPDATE customer36 SET c_customer_sk = c_customer_sk + 100;在这里省略了WHERE子句,表示表中的所有行都要被更新。如果出现了WHERE子句,那么只有匹配其条件的行才会被更新。在SET子句中的等号是一个赋值,而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试,许多其他的操作符也可以使用。
更新表中的多个字段。
UPDATE customer36 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;
查看数据#
在查看数据之前,确保已经完成本文示例中向表中插入数据和更新表中数据的操作。
查询表customer36的数据行数。
SELECT count(*) FROM customer36;返回结果如下:
count ------- 6 (1 row)查询表customer36的所有数据。如果没有完成向表中插入数据中重复插入数据的操作,以下步骤的返回结果可能略有差异。
SELECT * FROM customer36;返回结果如下:
c_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace 6985 | maps | Joes 9976 | world | James 4421 | Admin | Local (6 rows)查询字段c_customer_sk的数据。
SELECT c_customer_sk FROM customer36;返回结果如下:
c_customer_sk --------------- 3869 3869 3869 6985 9976 4421 (6 rows)过滤字段c_customer_sk的重复数据。
SELECT DISTINCT( c_customer_sk ) FROM customer36;返回结果如下:
c_customer_sk --------------- 9976 6985 3869 4421 (4 rows)查询字段c_customer_sk为3869的所有数据。
SELECT * FROM customer36 WHERE c_customer_sk = 3869;返回结果如下:
c_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace (3 rows)按照字段c_customer_sk进行排序。
SELECT * FROM customer36 ORDER BY c_customer_sk;返回结果如下:
c_customer_sk | c_customer_id | c_first_name ---------------+---------------+-------------- 3869 | hello | Grace 3869 | hello | Grace 3869 | | Grace 4421 | Admin | Local 6985 | maps | Joes 9976 | world | James (6 rows)
删除表中数据#
在删除表中数据之前,确保已经完成本文示例中向表中插入数据和更新表中数据的操作。
根据需要可以删除匹配条件的一组行或者一次删除表中的所有行。
SQL不能直接访问独立的行,只能通过声明被删除的行匹配的条件。如果表中有一个主键,可以指定准确的行。
删除表customer36中所有c_customer_sk为3869的记录。
DELETE FROM customer36 WHERE c_customer_sk = 3869;删除表中所有的行。建议使用truncate,详情可参考TRUNCATE。
DELETE FROM customer37;或者
TRUNCATE TABLE customer37;清理测试环境。
DROP TABLE customer36,customer37;
查看对象#
vsql工具提供了元命令可帮助管理员查看数据库对象信息。有关元命令的详细信息,常用的查看对象元命令如下:
| 描述 | 元命令 |
|---|---|
| 查看帮助信息 | ? |
| 查看数据库 | \l |
| 列举表 | \dt |
| 查看表结构 | \d tablename |
| 列举schema | \dn |
| 查看索引 | \di |
| 切换数据库 | \c dbname |
查看帮助信息#
使用\? 查看所有可执行的命令,使用此命令输出结果较多,会分屏显示,可以按空格键分页,按q退出当前内容查看。
\?查看数据库#
\l列举表#
\dt查看表结构#
\d tablename列举schema#
\dn查看索引#
\di切换数据库#
\c dbname总结#
本文围绕 Vastbase G100 V3 单机场景,完整梳理了从环境准备到安装验证的全过程,包括本地源挂载、第三方依赖安装、防火墙与透明大页处理、时区与 IPC 参数配置、内核参数调整、SELinux 与主机名设置等关键前置步骤;随后介绍了安装用户与目录创建、静默安装参数文件 db_install.rsp 的编写、vastbase_installer 的执行方式,以及安装完成后的环境变量初始化、数据库启停、远程连接和 vsql 基本使用方法。
总体来说,Vastbase G100 V3 已经具备了较完整的安装资料和操作路径。对于希望学习国产数据库、参与信创项目,或者正在做数据库替代验证的技术人员来说,单机安装是最合适的入门方式。建议先通过单机环境把安装、启停、连接和基础对象操作跑通,再进一步深入到性能调优、备份恢复、高可用和迁移改造等更高阶场景。
另赠送Vastbase G100 V3 for Linux 单机一键静默安装脚本
#!/usr/bin/env bash
# ============================================================
# Vastbase G100 3.0.x for Linux 单机一键静默安装脚本(EL7 优化最终版)
# 适用:CentOS/RHEL/OL 7.x(也可兼容多数 RHEL 系)
# 特性:
# 1) 完整日志:控制台 + 文件双写
# 2) 出错自动打印行号、命令、关键上下文
# 3) 自动探测安装包路径(PKG_DIR / 当前目录 / 脚本目录)
# 4) 修复安装器需在自身目录启动的问题
# 5) 避免 db_install.rsp 被解压步骤删除
# 6) EL7 兼容:RemoveIPC / THP / sysctl / locale 处理
# 7) 默认附带小内存启动参数,适合 4GB 测试机
#
# 用法:
# chmod +x install_vastbase_g100_v3_final_el7.sh
# ./install_vastbase_g100_v3_final_el7.sh
# ============================================================
set -Eeuo pipefail
# ------------------------------
# 可配置参数
# ------------------------------
VB_USER="vastbase"
VB_GROUP="vastbase"
# 安装包常用位置:
# 1) PKG_DIR/${PKG_FILE}
# 2) 当前执行目录/${PKG_FILE}
# 3) 脚本所在目录/${PKG_FILE}
PKG_DIR="/opt/vastbase_pkg"
PKG_FILE="Vastbase-G100-3.0_Build8_29407-Linux-x86_64-no_mot-202512072036.tar"
BASE_DIR="/home/${VB_USER}"
WORK_DIR="/opt/vastbase_work"
VB_HOME="${BASE_DIR}/local/vastbase"
VB_DATA="${BASE_DIR}/data/vastbase"
VB_CORE="${BASE_DIR}/corefile"
RSP_FILE="${BASE_DIR}/db_install.rsp"
PORT="5432"
DB_COMPATIBILITY="A"
IS_INITDB="true"
OPEN_REMOTE_ACCESS="yes"
INSTALLER_CMD=""
# 小内存测试机默认值(建议保守)
# 4GB 虚拟机建议保持以下值;内存 >= 8GB 可自行调大
MAX_CONNECTIONS="10"
SHARED_BUFFERS="64" # installer 应答文件通常写整数,单位 MB
LOW_MEM_MODE="yes"
MAX_PROCESS_MEMORY="3072MB"
CSTORE_BUFFERS="16MB"
WAL_BUFFERS="4MB"
MAX_LOCKS_PER_TRANSACTION="16"
MAX_PRED_LOCKS_PER_TRANSACTION="16"
WORK_MEM="1MB"
MAINTENANCE_WORK_MEM="32MB"
MAX_PREPARED_TRANSACTIONS="0"
# 请自行修改密码
VB_PASSWORD='Aa123456!'
ENCRYPTION_KEY='Aa123456!'
# 日志目录
LOG_DIR="/var/log/vastbase"
LOG_FILE="${LOG_DIR}/install_vastbase_$(date +%F_%H%M%S).log"
INSTALLER_LOG="${LOG_DIR}/vastbase_installer_$(date +%F_%H%M%S).log"
# ------------------------------
# 日志与错误处理
# ------------------------------
COLOR_INFO='[1;32m'
COLOR_WARN='[38;5;208m'
COLOR_ERRO='[1;31m'
COLOR_RESET='[0m'
timestamp() {
date "+%F %T"
}
init_logging() {
mkdir -p "${LOG_DIR}"
touch "${LOG_FILE}"
chmod 600 "${LOG_FILE}"
exec > >(tee -a "${LOG_FILE}") 2>&1
echo -e "============================================================"
echo -e "${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 日志文件: ${LOG_FILE}"
echo -e "${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 安装器日志: ${INSTALLER_LOG}"
echo -e "${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) 脚本路径: $0"
echo -e "============================================================"
}
log() { echo -e "${COLOR_INFO}[INFO]${COLOR_RESET} $(timestamp) $*"; }
warn() { echo -e "${COLOR_WARN}[WARN]${COLOR_RESET} $(timestamp) $*"; }
err() { echo -e "${COLOR_ERRO}[ERRO]${COLOR_RESET} $(timestamp) $*" >&2; }
run_step() {
local step_name="$1"
shift
log ">>> 开始: ${step_name}"
"$@"
log "<<< 完成: ${step_name}"
}
dump_files() {
echo "---------------- FILE SNAPSHOT BEGIN ----------------"
echo "PKG_DIR=${PKG_DIR}"
echo "PKG_FILE=${PKG_FILE}"
echo "WORK_DIR=${WORK_DIR}"
echo "VB_HOME=${VB_HOME}"
echo "VB_DATA=${VB_DATA}"
echo "RSP_FILE=${RSP_FILE}"
echo
ls -ld "${PKG_DIR}" 2>/dev/null || true
ls -l "${PKG_DIR}" 2>/dev/null || true
ls -ld "${WORK_DIR}" 2>/dev/null || true
ls -l "${WORK_DIR}" 2>/dev/null || true
ls -ld "${VB_HOME}" 2>/dev/null || true
ls -ld "${VB_DATA}" 2>/dev/null || true
[[ -f "${RSP_FILE}" ]] && ls -l "${RSP_FILE}" || true
echo "---------------- FILE SNAPSHOT END ------------------"
}
dump_context() {
echo "---------------- CONTEXT BEGIN ----------------"
echo "TIME: $(timestamp)"
echo "USER: $(id -un)"
echo "PWD : $(pwd)"
echo "SHELL: ${SHELL:-unknown}"
echo
dump_files
echo
echo "[INFO] 主日志最后 80 行:"
tail -n 80 "${LOG_FILE}" 2>/dev/null || true
echo
echo "[INFO] 安装器日志最后 80 行:"
tail -n 80 "${INSTALLER_LOG}" 2>/dev/null || true
echo "---------------- CONTEXT END ------------------"
}
on_error() {
local exit_code=$?
local line_no=${1:-unknown}
err "脚本执行失败,退出码=${exit_code},失败行号=${line_no},失败命令=${BASH_COMMAND}"
dump_context
exit "${exit_code}"
}
trap 'on_error $LINENO' ERR
# ------------------------------
# 工具函数
# ------------------------------
require_root() {
if [[ "$(id -u)" -ne 0 ]]; then
err "请使用 root 执行该脚本。"
exit 1
fi
}
detect_pm() {
if command -v dnf >/dev/null 2>&1; then
PM="dnf"
elif command -v yum >/dev/null 2>&1; then
PM="yum"
else
PM=""
fi
}
detect_locale_value() {
if locale -a 2>/dev/null | grep -qi '^en_US\.UTF-8$'; then
echo "en_US.UTF-8"
elif locale -a 2>/dev/null | grep -qi '^en_US\.utf8$'; then
echo "en_US.utf8"
elif locale -a 2>/dev/null | grep -qi '^C\.UTF-8$'; then
echo "C.UTF-8"
else
echo "C"
fi
}
find_package() {
local script_dir
script_dir=$(cd "$(dirname "$0")" && pwd)
local candidates=(
"${PKG_DIR}/${PKG_FILE}"
"$(pwd)/${PKG_FILE}"
"${script_dir}/${PKG_FILE}"
)
local c
for c in "${candidates[@]}"; do
if [[ -f "${c}" ]]; then
echo "${c}"
return 0
fi
done
return 1
}
# 注释掉已有参数,避免重复值误导
comment_out_key() {
local file="$1"
local key="$2"
if [[ -f "${file}" ]]; then
sed -ri "/^[[:space:]#]*${key}[[:space:]]*=/ s/^/# old by script: /" "${file}" || true
fi
}
set_conf() {
local file="$1"
local key="$2"
local val="$3"
comment_out_key "${file}" "${key}"
echo "${key} = ${val}" >> "${file}"
}
# ------------------------------
# 安装前准备
# ------------------------------
install_deps() {
detect_pm
if [[ -z "${PM}" ]]; then
warn "未检测到 yum/dnf,跳过依赖自动安装,请手工补齐依赖。"
return 0
fi
log "安装常见依赖包..."
# EL7 不再安装 glibc-langpack-en,避免 No package 错误
${PM} install -y \
tar gzip which hostname sudo \
zlib-devel libaio libuuid readline-devel \
krb5-libs libicu libxslt tcl perl \
openldap pam openssl-devel libxml2 bzip2
}
create_user_and_dirs() {
log "创建用户与目录..."
getent group "${VB_GROUP}" >/dev/null || groupadd "${VB_GROUP}"
id "${VB_USER}" >/dev/null 2>&1 || useradd -m -g "${VB_GROUP}" "${VB_USER}"
mkdir -p "${PKG_DIR}" "${WORK_DIR}" "${VB_HOME}" "${VB_DATA}" "${VB_CORE}"
chown -R "${VB_USER}:${VB_GROUP}" "${BASE_DIR}" "${PKG_DIR}" "${WORK_DIR}"
chmod 755 "${PKG_DIR}" "${WORK_DIR}"
}
set_limits() {
log "配置资源限制..."
cat >/etc/security/limits.d/99-vastbase.conf <<EOF2
${VB_USER} soft nproc unlimited
${VB_USER} hard nproc unlimited
${VB_USER} soft nofile 1024000
${VB_USER} hard nofile 1024000
${VB_USER} soft stack unlimited
${VB_USER} hard stack unlimited
${VB_USER} soft core unlimited
${VB_USER} hard core unlimited
${VB_USER} soft memlock unlimited
${VB_USER} hard memlock unlimited
EOF2
}
set_sysctl() {
log "配置内核参数..."
cat >/etc/sysctl.d/99-vastbase.conf <<'EOF2'
fs.aio-max-nr=1048576
fs.file-max= 76724600
kernel.sem = 4096 2097152000 4096 512000
kernel.shmall = 26843545 # pages, 80% MEM or higher
kernel.shmmax = 68719476736 # bytes, 50% MEM or higher
kernel.shmmni = 819200
net.core.netdev_max_backlog = 10000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 5
vm.dirty_background_bytes = 409600000
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 80
vm.dirty_writeback_centisecs = 50
vm.overcommit_memory = 0
vm.swappiness = 0
net.ipv4.ip_local_port_range = 40000 65535
fs.nr_open = 20480000
EOF2
sysctl --system
}
disable_firewall_selinux() {
log "关闭防火墙与 SELinux..."
systemctl disable --now firewalld 2>/dev/null || warn "firewalld 未运行或关闭失败,已忽略"
if command -v setenforce >/dev/null 2>&1; then
setenforce 0 2>/dev/null || warn "setenforce 0 执行失败,已忽略"
fi
if [[ -f /etc/selinux/config ]]; then
sed -ri 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config || warn "修改 /etc/selinux/config 失败,已忽略"
fi
}
disable_thp() {
log "关闭透明大页 THP..."
cat >/etc/systemd/system/disable-thp.service <<'EOF2'
[Unit]
Description=Disable Transparent Huge Pages
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'test -f /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/enabled || true'
ExecStart=/bin/sh -c 'test -f /sys/kernel/mm/transparent_hugepage/defrag && echo never > /sys/kernel/mm/transparent_hugepage/defrag || true'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF2
systemctl daemon-reload
systemctl enable disable-thp.service || warn "enable disable-thp.service 失败,已忽略"
systemctl start disable-thp.service || warn "start disable-thp.service 失败,已忽略"
}
set_removeipc() {
log "配置 RemoveIPC=no ..."
# 1) /etc/systemd/logind.conf
if [[ -f /etc/systemd/logind.conf ]]; then
sed -ri 's/^[#[:space:]]*RemoveIPC=.*/RemoveIPC=no/' /etc/systemd/logind.conf || true
grep -q '^RemoveIPC=no$' /etc/systemd/logind.conf || echo 'RemoveIPC=no' >> /etc/systemd/logind.conf
else
cat >/etc/systemd/logind.conf <<'EOF2'
[Login]
RemoveIPC=no
EOF2
fi
# 2) /etc/systemd/logind.conf.d/
mkdir -p /etc/systemd/logind.conf.d
cat >/etc/systemd/logind.conf.d/vastbase.conf <<'EOF2'
[Login]
RemoveIPC=no
EOF2
# 3) /usr/lib/systemd/system/systemd-logind.service
if [[ -f /usr/lib/systemd/system/systemd-logind.service ]]; then
if grep -q '^RemoveIPC=' /usr/lib/systemd/system/systemd-logind.service; then
sed -ri 's/^[#[:space:]]*RemoveIPC=.*/RemoveIPC=no/' /usr/lib/systemd/system/systemd-logind.service || true
else
sed -ri '/^\[Service\]/a RemoveIPC=no' /usr/lib/systemd/system/systemd-logind.service || true
fi
fi
systemctl daemon-reload
systemctl restart systemd-logind || warn "restart systemd-logind 失败,已忽略"
log "验证 RemoveIPC 配置..."
grep -n 'RemoveIPC' /etc/systemd/logind.conf 2>/dev/null || true
grep -n 'RemoveIPC' /etc/systemd/logind.conf.d/vastbase.conf 2>/dev/null || true
grep -n 'RemoveIPC' /usr/lib/systemd/system/systemd-logind.service 2>/dev/null || true
}
set_profile() {
log "配置 ${VB_USER} 环境变量..."
local profile_file="${BASE_DIR}/.bashrc"
local locale_value
locale_value=$(detect_locale_value)
grep -q "VASTBASE ENV BEGIN" "${profile_file}" 2>/dev/null || cat >>"${profile_file}" <<EOF2
# ===== VASTBASE ENV BEGIN =====
export GAUSSHOME=${VB_HOME}
export VB_HOME=${VB_HOME}
export PGDATA=${VB_DATA}
export VB_DATA=${VB_DATA}
export PGPORT=${PORT}
export PATH=\$GAUSSHOME/bin:\$PATH
export LD_LIBRARY_PATH=\$GAUSSHOME/lib:\$LD_LIBRARY_PATH
export LANG=${locale_value}
export LC_ALL=${locale_value}
# ===== VASTBASE ENV END =====
EOF2
chown "${VB_USER}:${VB_GROUP}" "${profile_file}"
}
# ------------------------------
# 解包与安装
# ------------------------------
write_rsp() {
log "生成静默安装应答文件 ${RSP_FILE} ..."
cat >"${RSP_FILE}" <<EOF2
vastbase_password=${VB_PASSWORD}
encryption_key=${ENCRYPTION_KEY}
vastbase_home=${VB_HOME}
vastbase_data=${VB_DATA}
port=${PORT}
max_connections=${MAX_CONNECTIONS}
shared_buffers=${SHARED_BUFFERS}
db_compatibility=${DB_COMPATIBILITY}
isinitdb=${IS_INITDB}
EOF2
chown "${VB_USER}:${VB_GROUP}" "${RSP_FILE}"
chmod 600 "${RSP_FILE}"
}
unpack_pkg() {
local pkg
pkg=$(find_package) || {
err "未找到安装包:${PKG_FILE}"
err "请把安装包放在以下任一位置:"
err " 1) ${PKG_DIR}/${PKG_FILE}"
err " 2) $(pwd)/${PKG_FILE}"
err " 3) $(cd "$(dirname "$0")" && pwd)/${PKG_FILE}"
exit 1
}
log "解压安装包:${pkg}"
rm -rf "${WORK_DIR:?}/"*
tar -xf "${pkg}" -C "${WORK_DIR}"
chown -R "${VB_USER}:${VB_GROUP}" "${WORK_DIR}"
}
detect_installer() {
if [[ -n "${INSTALLER_CMD}" ]]; then
echo "${INSTALLER_CMD}"
return 0
fi
local candidates=(
"${WORK_DIR}/vastbase-installer/vastbase_installer"
"${WORK_DIR}/vastbase_installer"
"${WORK_DIR}/installer/vastbase_installer"
"${WORK_DIR}/script/vastbase_installer"
"${WORK_DIR}/install/vastbase_installer"
)
local f
for f in "${candidates[@]}"; do
if [[ -x "${f}" ]]; then
echo "${f}"
return 0
fi
done
f=$(find "${WORK_DIR}" -maxdepth 4 -type f \( -name "vastbase_installer" -o -name "install.sh" \) | head -n 1 || true)
if [[ -n "${f}" ]]; then
chmod +x "${f}" || true
echo "${f}"
return 0
fi
return 1
}
run_installer() {
local installer installer_dir installer_name
installer=$(detect_installer) || {
err "未探测到安装器,请先手工查看 ${WORK_DIR} 下的实际安装入口。"
exit 1
}
installer_dir=$(dirname "${installer}")
installer_name=$(basename "${installer}")
log "使用安装器:${installer}"
log "安装器目录:${installer_dir}"
log "安装器日志:${INSTALLER_LOG}"
[[ -f "${RSP_FILE}" ]] || {
err "应答文件不存在:${RSP_FILE}"
exit 1
}
if [[ -d "${installer_dir}/locales" ]]; then
log "检测到 locales 目录:${installer_dir}/locales"
else
warn "未检测到 locales 目录:${installer_dir}/locales"
ls -l "${installer_dir}" || true
fi
# 注意:必须切到安装器目录执行,否则可能报 locales 目录不存在
if [[ "${installer_name}" == "vastbase_installer" ]]; then
su - "${VB_USER}" -c "cd '${installer_dir}' && ./'${installer_name}' --silent -responseFile '${RSP_FILE}'" \
2>&1 | tee -a "${INSTALLER_LOG}"
else
su - "${VB_USER}" -c "cd '${installer_dir}' && ./'${installer_name}' --silent -responseFile '${RSP_FILE}'" \
2>&1 | tee -a "${INSTALLER_LOG}"
fi
}
post_install_check() {
[[ -x "${VB_HOME}/bin/vsql" ]] || { err "安装未完成:${VB_HOME}/bin/vsql 不存在"; exit 1; }
[[ -x "${VB_HOME}/bin/vb_ctl" ]] || { err "安装未完成:${VB_HOME}/bin/vb_ctl 不存在"; exit 1; }
}
# ------------------------------
# 安装后配置
# ------------------------------
post_install_tune() {
local conf="${VB_DATA}/postgresql.conf"
if [[ ! -f "${conf}" ]]; then
warn "未找到 postgresql.conf,跳过安装后调优"
return 0
fi
log "执行安装后参数调优..."
if [[ "${LOW_MEM_MODE}" == "yes" ]]; then
log "启用小内存模式参数..."
set_conf "${conf}" "max_process_memory" "${MAX_PROCESS_MEMORY}"
set_conf "${conf}" "shared_buffers" "${SHARED_BUFFERS}MB"
set_conf "${conf}" "cstore_buffers" "${CSTORE_BUFFERS}"
set_conf "${conf}" "max_connections" "${MAX_CONNECTIONS}"
set_conf "${conf}" "max_prepared_transactions" "${MAX_PREPARED_TRANSACTIONS}"
set_conf "${conf}" "wal_buffers" "${WAL_BUFFERS}"
set_conf "${conf}" "max_locks_per_transaction" "${MAX_LOCKS_PER_TRANSACTION}"
set_conf "${conf}" "max_pred_locks_per_transaction" "${MAX_PRED_LOCKS_PER_TRANSACTION}"
set_conf "${conf}" "work_mem" "${WORK_MEM}"
set_conf "${conf}" "maintenance_work_mem" "${MAINTENANCE_WORK_MEM}"
fi
if [[ "${OPEN_REMOTE_ACCESS}" == "yes" ]]; then
set_conf "${conf}" "listen_addresses" "'*'"
fi
}
post_config() {
local hba="${VB_DATA}/pg_hba.conf"
if [[ "${OPEN_REMOTE_ACCESS}" == "yes" && -f "${hba}" ]]; then
log "放通远程 md5 接入..."
grep -q "host all all 0.0.0.0/0 md5" "${hba}" 2>/dev/null || echo "host all all 0.0.0.0/0 md5" >> "${hba}"
grep -q "host all all ::/0 md5" "${hba}" 2>/dev/null || echo "host all all ::/0 md5" >> "${hba}"
chown "${VB_USER}:${VB_GROUP}" "${hba}"
fi
}
start_and_verify() {
log "启动数据库并验证..."
su - "${VB_USER}" -c "
source ~/.bashrc
vb_ctl start
sleep 5
vb_ctl status
vsql -d postgres -p ${PORT} -c 'select version();'
"
}
print_summary() {
log "安装流程执行完毕。"
log "主日志:${LOG_FILE}"
log "安装器日志:${INSTALLER_LOG}"
log "常用命令:"
echo " su - ${VB_USER}"
echo " source ~/.bashrc"
echo " vb_ctl start"
echo " vb_ctl stop"
echo " vb_ctl restart"
echo " vb_ctl status"
echo " vsql -d postgres -p ${PORT}"
}
main() {
init_logging
run_step "检查 root" require_root
run_step "安装依赖" install_deps
run_step "创建用户和目录" create_user_and_dirs
run_step "配置 limits" set_limits
run_step "配置 sysctl" set_sysctl
run_step "关闭防火墙和 SELinux" disable_firewall_selinux
run_step "关闭 THP" disable_thp
run_step "配置 RemoveIPC" set_removeipc
run_step "配置环境变量" set_profile
run_step "解压安装包" unpack_pkg
run_step "生成应答文件" write_rsp
run_step "执行安装器" run_installer
run_step "安装后检查" post_install_check
run_step "安装后调优" post_install_tune
run_step "放通远程访问" post_config
run_step "启动并验证" start_and_verify
print_summary
}
main "$@"