简介:面向数据库管理员、开发人员及信创项目交付者,这份 VASTDATA Vastbase G100 V2.2 用户手册是国产化数据库 Vastbase 的官方操作指南,系统讲解从逻辑结构到实际使用的完整路径。资源包仅含 1 个 PDF 文件,大小 8.76MB,目录从概述、数据库使用到管理工具逐级展开,结构清晰便于按需检索。已有 198 人学习下载,适合正在部署、迁移或运维 Vastbase 的团队参考。手册重点介绍了数据库逻辑结构、数据查询请求处理过程、管理事务等核心概念,并详细演示了连接数据库的多种方式,包括配置服务端远程连接、使用 vsql 以及应用程序接口;同时涵盖关闭数据库、创建与管理表空间、规划存储模型、列存数据压缩等实操内容,能帮助读者快速掌握 Vastbase 的日常管理和 SQL 实践。由于文档由 OCR 识别生成,个别字可能存在误差,但结合上下文仍可顺畅阅读。
1. 这本用户手册把数据库落地成可用资源的关键在哪
信创数据库选型时,Vastbase 是少见的把“内核机制说明”和“可直接照抄的命令”写进同一本手册的方案,这份 V2.2 用户手册把逻辑结构、查询处理路径、连接配置、表与对象管理、应用接口、安全认证全部压缩进了一本文档。对从传统商业数据库转过来的团队来说,最值钱的不是目录里那些概念名词,而是能从“怎么连库”一路对应到“权限在哪配、备份怎么恢复”的完整链路。它不解决“要不要选”的问题,但能把“选完怎么落地”的阻力降一大截。适合正在做数据库替换评估的 DBA、需要对接 JDBC 与 ODBC 的应用开发,以及刚接手 Vastbase 环境的一线运维。
2. 从逻辑结构到连接:查询路径、vsql 与远程认证
拿到手册先不要急着看建表语法,第一步应该把逻辑结构图和查询请求处理过程读明白。Vastbase 的排障思路基本都能落到这两个图里:连不上先查监听和认证,SQL 慢先看统计信息和执行计划,权限奇怪先查 schema 和行级策略。
2.1 逻辑结构:实例、数据库与对象的关系
逻辑结构图描述的是数据从上到下怎么组织:数据库下挂表空间,表空间里放 schema,schema 下再挂表、索引、视图、序列和约束。这套层级和 Oracle 的“实例-表空间-段”不完全一样,更接近 PostgreSQL 的“数据库-模式-对象”模型。
实际排障里最容易踩的坑是 schema 默认路径。刚创建的用户如果没设置默认 schema,登录后查表会直接在自身同名 schema 里找,找不到就报 relation does not exist。手册的逻辑结构图已经暗示了这一点,但很多人直到被这条报错卡住才回去看。用 vsql 登录后先执行SELECT current_schema();,看返回的是不是预期值,这个习惯能省很多时间。
实例与数据库之间也不是一一对应绑定。Vastbase 一个实例可以管理多个数据库,每个数据库持有独立的系统表和对象集合,备份和恢复也是以数据库为基本单位的。理解这一点之后,看到vb_basebackup备份出来的目录结构就不会困惑。
2.2 数据查询请求处理过程
手册用了一整节描述查询请求的流转:客户端发送 SQL 后,服务端依次做词法语法解析、查询重写、基于统计信息的路径规划、执行算子、返回结果。这五个环节里,最影响实际体验的是路径规划。
新装库最典型的案例:一张列存表刚导入 2000 万行,没跑 ANALYZE,查询条件列上明明有索引,执行计划却走了全表扫描。原因就是统计信息为空,规划器不知道这个列上有多少不同值,更不知道索引选择性有多高。排查步骤很固定:
ANALYZE verbose t_olap; EXPLAIN (ANALYSE, BUFFERS) SELECT count(*) FROM t_olap WHERE create_date >= '2024-01-01';逻辑说明:ANALYZE负责刷新统计信息,EXPLAIN的ANALYSE选项会把实际执行时间和估计值一起打出来,方便对比。参数说明:BUFFERS会额外显示缓存命中情况,第二次跑同一查询如果命中数明显上升,说明数据已经进了 shared_buffers,这时候比较耗时才有参考价值。
事务管理那节也有实用信息。Vastbase 的事务默认自动提交,但显式事务才是批量导入的正确姿势:
BEGIN; INSERT INTO t_oltap VALUES (generate_series(1,10000), md5(random()::text)); COMMIT;逻辑说明:BEGIN开启一个事务块,所有 INSERT 在 COMMIT 前都是可见性隔离的,任何一个语句报错都可以 ROLLBACK 回滚,避免半截数据。参数说明:大批量写入时尽量把零散语句合并到一个事务里,减少提交日志刷盘次数,这也是手册反复强调的管理事务的核心价值。
2.3 配置服务端远程连接
远程连不上是实施阶段最高频的问题,根源通常不在防火墙,而在服务端两个配置文件没改透。手册 3.2.1 章节把服务端远程连接单独拎出来讲,说明这是官方也认为的必经关卡。
第一个要改的是监听地址和端口,在数据目录下的配置文件里:
listen_addresses = '0.0.0.0' port = 5440 password_encryption_type = 1用vb_ctl restart重启后,用ss -lnt |grep 5440确认监听是否生效。参数说明:listen_addresses设成0.0.0.0表示监听所有网卡,生产环境建议改成具体业务网段 IP,不要图省事全部放开;port建议避开默认端口,减少扫描器的无差别探测。
第二个是客户端接入认证文件。Vastbase 的认证模型兼容 PostgreSQL 的风格,每行格式为“连接类型 数据库 用户 地址 认证方式”。远程连接常见配置:
host all all 192.168.1.0/24 sha256这一行表示允许 192.168.1.0/24 网段的客户端以 sha256 密码认证方式访问所有数据库和用户。改完这个文件不需要重启,但要 reload 让配置生效,常见做法是用vb_ctl reload。
判断到底是监听问题还是认证问题有个经验:用telnet 服务端IP 5440如果能通,说明监听没问题,再往后基本就是认证文件或密码加密方式不对。如果 telnet 都拒连,就不用折腾客户端了,回去改服务端。
2.4 用 vsql 连接数据库与关闭数据库
vsql 是 Vastbase 自带的交互式客户端,用法和 pg 系生态保持一致,但连接参数值得记牢:
vsql -h 192.168.1.10 -p 5440 -U vastbase -d postgres -W参数说明:-h指定服务端 IP,-p指定端口,-U指定用户名,-d指定数据库名,-W表示连接后交互式输入密码。如果服务端配置了 SSL,还需要追加sslmode=require,这在第 6 章会展开。
连上后第一件事建议执行\l看数据库列表,\dn看 schema 列表,\d+ 表名看表结构。这些反斜杠命令在 pg 系工具里通用,不需要记 SQL 也能快速摸清环境。
关闭数据库有三种常见操作路径:一是用 SQL 语句执行SHUTDOWN,适合在已连接的会话里直接优雅停机;二是用vb_ctl stop工具关闭;三是vb_ctl stop -m fast强制中断活跃事务后关闭。生产环境一般不用第三种,除非事务卡死且无法通过杀会话解决。关闭前记得先CHECKPOINT把脏页刷到磁盘,否则重启恢复时间会明显变长。
3. 存储模型与表对象:列存压缩、表空间、分区表与临时表
存储模型的选择直接影响查询性能,而这是建表之前就要定的,后面再改就是大工程。手册把“规划存储模型”和“列存下的数据压缩”放到建表前的位置,顺序本身就是在提醒你先想清楚再动手。
3.1 行存与列存怎么选
Vastbase 同时支持行存和列存两种存储模型,建表时通过WITH子句指定。行存适合 OLTP 场景,特点是单行内所有列连续存放,点查、更新、删除都很快;列存适合 OLAP 场景,特点是同一列的数据连续存放,做聚合分析和范围扫描时 IO 量大幅减少。选错的典型后果是列存表做高频单行更新,性能比行存差一到两个数量级。
CREATE TABLE t_oltp ( id integer, user_name text, create_time timestamp ) WITH (orientation=row); CREATE TABLE t_olap ( region_code varchar(8), sale_amount numeric, sale_date date ) WITH (orientation=column);逻辑说明:orientation=row建行存表,orientation=column建列存表。参数说明:列存表在建表时会自动为每个列建立独立的存储文件段,后续做压缩和按列扫描时会发挥优势;但列存表对 DML 的代价更高,不是所有表都适合列存。
判断依据可以概括成一句话:写多读少、事务性强的表用行存;读多写少、分析性查询为主的表用列存。混合负载场景里,同一份数据可以建行存表给业务用,再建列存表给报表查询用,通过定时任务同步,这是防止两类查询互相拖累的常见做法。
3.2 列存压缩的配置与验证
手册 3.6 章节专门讲列存下的数据压缩,这节很容易被当成“知道了有这个功能”就跳过,实际它直接决定磁盘成本和分析查询的 IO 效率。Vastbase 列存表的压缩可以在建表时指定,也可以后期修改存储参数。
CREATE TABLE t_olap_compress ( sale_date date, region_code varchar(8), sale_amount numeric ) WITH ( orientation=column, compression=yes, compress_level=3 );逻辑说明:compression=yes开启列存压缩,compress_level=3指定压缩级别。参数说明:压缩级别越高,磁盘占用越小,但写入和读取时的 CPU 开销越大。实施经验里,级别 3 到 5 是性价比区间,级别 9 只建议用于冷数据归档表。
验证压缩效果不要只看建表语句,要实际查表的存储占用:
SELECT pg_size_pretty(pg_total_relation_size('t_olap_compress'));逻辑说明:pg_total_relation_size返回表数据、索引、TOAST 等所有关联对象的合计大小,pg_size_pretty把字节数格式化成可读字符串。对比压缩前后的大小,能直观看到列存配合压缩后的存储节省比例。某次导入 5 亿行流水数据,行存未压缩占 400GB,列存压缩后只剩 60GB,后续分析查询还快了 3 倍。
压缩参数调整后,需要对表执行一次VACUUM FULL或重建表才能彻底重写数据文件,这点手册没明说,但实操中必须知道,否则新参数不生效,容易误判为配置失败。
3.3 表空间规划与建表落盘
表空间的意义不只是“把表放到哪个目录”,而是让不同生命周期的数据落到不同物理设备上。热数据放 NVMe 盘,归档数据放 SATA 盘,备份目录和 WAL 目录单独放,避免 WAL 写入和业务查询争抢磁盘 IO。
mkdir -p /data/vastbase/ts_fast chown vastbase:vastbase /data/vastbase/ts_fastCREATE TABLESPACE fast_dev LOCATION '/data/vastbase/ts_fast'; CREATE TABLE t_business_log ( log_id bigint, content text ) TABLESPACE fast_dev;逻辑说明:先建操作系统目录并授权给运行 Vastbase 的系统账号,再通过CREATE TABLESPACE在数据库内注册,最后建表时用TABLESPACE子句指定。参数说明:LOCATION对应的目录必须为空或不存在,且服务进程需要有写权限,否则建表空间直接报错。
表空间管理的翻车场景多出现在删除阶段。直接DROP TABLESPACE会被拒绝,必须先清空该表空间下的所有对象,或者用DROP TABLE删掉表后再执行删除。手册在表空间章节没写清理顺序,很多人因此卡住。经验法是先查询依赖对象:
SELECT tablespace_name, tablename FROM pg_tables WHERE tablespace_name = 'fast_dev';这条 SQL 列出该表空间下所有表,逐个处理后再删表空间就不报错了。
3.4 分区表与 default 分区的边界条件
分区表在 Vastbase 里是处理海量数据的标准手段,手册 3.8.8 重点讲到了支持 default 分区。默认分区的存在意义是捕获不匹配任何已有分区的数据,避免因数据越界导致插入失败。但 default 分区是双刃剑,数据一旦大量落入 default,分区裁剪就失效,查询性能会断崖式下降。
CREATE TABLE order_history ( order_id bigint, create_date date, amount numeric ) PARTITION BY RANGE(create_date) ( PARTITION p_2023 VALUES LESS THAN ('2024-01-01'), PARTITION p_2024 VALUES LESS THAN ('2025-01-01'), PARTITION p_default VALUES DEFAULT );逻辑说明:PARTITION BY RANGE按日期范围分区,VALUES LESS THAN定义每个分区的上界,VALUES DEFAULT创建默认分区。参数说明:数据写入时,Vastbase 根据create_date自动路由到对应分区;某个日期值超出所有命名分区范围时,会进入 default 分区。
管理上,default 分区最好只作为兜底,定期检查 default 分区是否有数据,有的话就要排查为什么会有数据落入这里。常见原因有两个:一是新扩展的分区没跟上数据写入节奏,二是分区键有脏数据。定期巡检 SQL 可以这样写:
SELECT count(*) FROM order_history PARTITION (p_default);如果 count 持续增长,说明分区策略本身有问题,不是运行时偶然落入。新增分区的动作要提前做,建议预留未来一个月的分区。
3.5 全局临时表与闪回表的正确使用方式
全局临时表在很多迁移场景里被误解为普通表的替代品,实际上它有严格的可见性范围。Vastbase 的全局临时表分两种:会话级和事务级。会话级临时表的数据在整个会话内可见,事务级临时表只在当前事务内可见,事务结束后数据被清空。
CREATE GLOBAL TEMPORARY TABLE temp_session_data ( batch_id integer, item_name text ) ON COMMIT PRESERVE ROWS; CREATE GLOBAL TEMPORARY TABLE temp_tx_data ( batch_id integer, item_name text ) ON COMMIT DELETE ROWS;逻辑说明:ON COMMIT PRESERVE ROWS表示事务结束保留数据,适合会话内多次查询复用;ON COMMIT DELETE ROWS表示事务提交后清空,适合只需要在单事务内使用的中间结果。参数说明:临时表的表结构对所有会话可见,但数据只对创建者可见,这一点和普通表有本质区别,不注意就会在多会话并发场景下读出空结果。
闪回表是误删数据的后悔药。手册 3.8.6 的闪回机制允许通过时间戳查询历史版本,但前提是目标表没有被 VACUUM 清理掉旧版本。闪回查询的常见姿势:
SELECT * FROM order_history AS OF TIMESTAMP '2024-06-01 10:00:00';逻辑说明:AS OF TIMESTAMP指定历史时间点,返回该时刻表的数据快照。参数说明:闪回的时间点必须落在事务可见性窗口内,如果表刚刚执行过 VACUUM FULL,旧版本已被物理清理,闪回会直接报错。把闪回查询当验证手段用,而不是当备份策略用,真正的兜底仍然要靠第 4 章的备份。
4. 对象管理:schema、索引、约束与备份排查
对象管理章节是日常操作最密集的部分,也是手册篇幅最大的位置。schema 决定可见性,索引决定查询速度,约束决定数据质量,备份决定最后的退路。这四个环节相互独立,但任何一个出问题都会直接影响业务。
4.1 schema 划分与 search_path 的作用范围
多应用共用一个数据库实例时,用 schema 做隔离比拆数据库更轻量。手册里 schema 的管理动作很简单,但真正的难点在登录后的默认生效范围。
CREATE SCHEMA app_order AUTHORIZATION app_user; SET search_path TO app_order, public;逻辑说明:CREATE SCHEMA创建独立命名空间,AUTHORIZATION指定属主;SET search_path把该 schema 加入当前会话的搜索路径。参数说明:搜索路径里排在前面的 schema 优先被扫描,所以如果两个 schema 下有同名表,实际命中的是路径里靠前的那个。这是“我明明查询了表 A,结果数据不对”类问题的头号来源。
给应用账号固定搜索路径,更规范的做法是修改账号属性,让每次登录都自动生效:
ALTER USER app_user SET search_path TO app_order, public;这样不需要应用端每个会话手动执行 SET,也防止连接池复用会话时路径被串掉。排查可见性问题时先执行SHOW search_path;,再执行\dn看 schema 属主,基本十分钟内能定位。
4.2 索引设计:什么时候建、什么时候别建
手册 3.11.2 讲索引管理时没有强调一个核心原则:索引是给查询优化器提供选择路径的,不是每个查询条件都要建索引。建多了不仅占用磁盘,还拖慢写入和 VACUUM。
CREATE INDEX idx_orders_create_date ON order_history(create_date); CREATE INDEX idx_orders_compound ON order_history(region_code, create_date);逻辑说明:单列索引用于等值或范围过滤,复合索引用于多条件组合查询。参数说明:复合索引的列顺序有讲究,最常用的过滤条件放在最前面,否则索引选择性很差,优化器可能放弃走索引。经验判断是:条件列区分度低于 5% 时,全表扫描成本反而比索引扫描低。
列存表的索引和行存表有些差别。列存表本身按列存储,单列聚合不需要索引也能高效执行,但在 where 过滤的等值条件上,索引仍有价值。在列存表上建索引时要意识到,索引维护代价比行存表更高,因为列存的数据写入路径本来就是批量的,频繁单条插入时索引刷新会放大写入放大。迁移项目里最常见的问题是把 Oracle 里的所有索引原样搬过来,结果写入性能崩了,原因是 Oracle 的表组织和 Vastbase 列存表差异很大。
4.3 视图与序列:逻辑封装与并发安全的取号
视图的价值在权限控制而非单纯简化 SQL。通过视图暴露表的子集,底层表结构变更时应用层 SQL 不用改。手册 3.11.3 对此着墨不多,但实际使用时要注意视图权限是跟着属主走的。
CREATE VIEW v_sales_summary AS SELECT region_code, sum(sale_amount) AS total_amount FROM t_olap GROUP BY region_code;逻辑说明:视图把聚合查询封装成虚拟表,应用查询视图时自动执行背后的 SQL。参数说明:如果视图属主有底层表权限但查询用户没有,查询用户可以正常查视图,这就是常用的权限收敛套路。但反过来,如果视图定义了security_barrier,行为会更严格,不适合普通业务直接套用。
序列的坑大多出在缓存参数上。CACHE值越大,获取下一个序列号越快,但数据库异常退出时会丢失缓存中未使用的编号,导致序列号出现空洞。业务侧如果要求订单号严格连续,就不能开缓存;如果只要求唯一,开 20 以上的缓存更合适。
CREATE SEQUENCE seq_order_id START 100001 INCREMENT 1 CACHE 20;参数说明:START指定起始值,INCREMENT指定步长,CACHE指定缓存个数。使用序列时建议通过nextval('seq_order_id')取号,不要手动插入数字,否则并发场景下极易出现主键冲突。
4.4 约束的五种类型与启用禁用的边界
手册 3.11.5 把检查约束、非空约束、唯一约束、主键、外键分成了五个小节,这五种约束在业务建模时各有不同的适用位置。但比创建更值得注意的,是约束的启用与禁用操作。
ALTER TABLE order_detail DISABLE CONSTRAINT fk_order_id; ALTER TABLE order_detail ENABLE CONSTRAINT fk_order_id;逻辑说明:DISABLE CONSTRAINT暂停约束检查,ENABLE CONSTRAINT恢复。参数说明:禁用约束期间写入的脏数据,在重新启用约束时如果校验失败,命令会直接报错。这意味着禁用外键做了数据清洗后,启用才是真正开始数据质量核查的时刻。
检查约束推荐写命名规则,不要用系统自动生成的匿名约束。匿名约束在排障时很难辨认,报错信息只有约束 OID,得反查系统表才能定位。
ALTER TABLE order_detail ADD CONSTRAINT ck_amount_positive CHECK (amount > 0);参数说明:ck_amount_positive是约束名,后续要禁用或删除时可以用名字精确操作,而不是先查系统表。唯一约束与 NULL 的关系也是常见盲区:Vastbase 默认允许多个 NULL 同时存在,这和某些商业数据库“唯一约束下 NULL 也唯一”的语义不同,迁移时如果不改应用层逻辑,会出现重复空值。
4.5 vb_basebackup 备份与恢复验证
手册 3.11.6 和 3.11.7 讲 vb_basebackup 的 tar 格式备份,这是物理备份的核心手段。相比逻辑导出,物理备份更快,适合全量恢复场景。
vb_basebackup -Ft -D /backup/full_20240601 -h 127.0.0.1 -p 5440 -U backup_user参数说明:-Ft表示输出 tar 格式,-D指定备份文件输出目录,-h和-p指定连接信息,-U指定执行备份的账号。备份过程中会在目录下生成多个 tar 包,分别对应数据文件、WAL 日志等,恢复时需要把 tar 包先展开到目标数据目录。
表空间备份时有个容易漏掉的细节:表空间目录是单独备份的,恢复时必须先把表空间目录重建并授权,再执行恢复流程,否则数据文件路径找不到。
mkdir -p /data/vastbase/ts_fast chown vastbase:vastbase /data/vastbase/ts_fast备份完成后必须做恢复演练,这是唯一的后悔药验证方式。常见做法是在测试实例上完整走一遍恢复流程,然后对比表数量、行数、序列当前值。只备份不验证,等于把数据安全寄托在一堆从来没跑过的 tar 包上,风险不可控。
5. 应用开发:JDBC 参数、游标、连接池与大数据类型
手册第四章的应用开发教程占了很大篇幅,JDBC、ODBC、libpq 三个方向都覆盖了。对多数集成项目来说,JDBC 是最优先级,ODBC 用于报表工具,libpq 则是 C 语言子系统接入的唯一选择。
5.1 第一个 JDBC 连接的完整写法
手册 4.2.4 强调先设置驱动再连接数据库,这个顺序不能反。驱动没加载就直接 getConnection,会报找不到类。推荐写法:
Class.forName("com.vastbase.jdbc.Driver"); String url = "jdbc:vastbase://192.168.1.10:5440/postgres"; String user = "app_user"; String password = "xxxx"; try (Connection conn = DriverManager.getConnection(url, user, password)) { System.out.println("connection ok"); }代码说明:第一行通过反射加载驱动类,确保驱动注册进 DriverManager;第二行构造连接 URL,协议是jdbc:vastbase,后面依次是地址、端口、数据库名。逻辑说明:try-with-resources会在块结束时自动关闭连接,避免手工 close 遗漏导致连接泄漏。参数说明:连接 URL 里可以追加ssl=true和sslmode=require,启用加密连接;如果应用部署在与数据库同一台机器上,也可以用/tmp的 unix socket 连接以跳过 TCP 网络开销。
JDK 兼容性要提前确认。手册 4.2.2 列了 JDBC 与 JDK 的兼容矩阵,老版本 JDK 连接新版服务端时,可能因为 TLS 版本协商失败而报握手错误。遇到这类问题,优先升级驱动而不是降低服务端安全等级。
5.2 查询结果与游标的使用边界
查询结果的读取方式决定了内存使用模式。默认情况下,JDBC 会把查询结果一次性拉回客户端,数据量大时应用内存会瞬间飙升。游标方式是分批取数,适合边取边处理的场景。
PreparedStatement ps = conn.prepareStatement( "SELECT order_id, amount FROM order_detail WHERE create_date >= ?", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); ps.setDate(1, java.sql.Date.valueOf("2024-01-01")); ps.setFetchSize(500); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getLong("order_id")); }代码说明:setFetchSize(500)告诉驱动每次从服务端取 500 行,而不是一次性全量拉取。逻辑说明:游标方式在遍历期间会占用一个服务端会话的资源,处理完必须立即关闭 ResultSet 和 PreparedStatement,否则连接池里的连接被无结果释放,容易撑爆数据库的最大连接数。参数说明:TYPE_FORWARD_ONLY表示结果集只能向后遍历,如果业务需要来回跳行,就得改成TYPE_SCROLL_INSENSITIVE,但内存消耗也会加大。
执行更新类 SQL 时,建议开启批量模式,减少网络往返耗时:
ps.addBatch(); ps.executeBatch();代码说明:addBatch把多条更新语句放进一批,executeBatch一次性提交到服务端执行。参数说明:批量大小建议控制在 500 到 1000 条之间,太大会让单次网络包过长,太小则批量优势出不来。批量执行过程中任何一条失败,整个批次回滚与否取决于是否显式开启了事务,所以批量之前先conn.setAutoCommit(false),结束时统一commit()。
5.3 连接池配置与参数边界
连接池是应用侧保护数据库的关键。手册 4.2.9 把连接池讲成了标准功能,但落地时最需要盯的是连接池最大值和服务端max_connections之间的关系。
initialSize=5 maxTotal=50 maxIdle=10 minIdle=5 maxWaitMillis=3000 testOnBorrow=true validationQuery=select 1参数说明:initialSize是启动时预建的连接数,maxTotal是池上限,maxIdle是空闲保留数,maxWaitMillis是在连接耗尽时最长的等池时间,超过则抛异常。逻辑说明:连接池的maxTotal绝对不能超过服务端max_connections减去后台任务预留连接数,否则高峰期连接被池占满而对端又拒绝新连接,故障雪崩式扩散。
testOnBorrow=true配合validationQuery=select 1会在每次借出连接时做一次探活,能及时发现被服务端断掉的空连接,代价是每次借出多一次网络交互。如果对性能敏感,可以改为testWhileIdle=true加timeBetweenEvictionRunsMillis=60000,只对空闲连接做后台检测,借出时不再额外探活。
5.4 大数据类型与二进制字段的存取
二进制数据存储是应用开发里容易写崩的地方。Vastbase 的二进制类型是bytea,通过 JDBC 的setBytes和getBytes直接存取。
byte[] fileData = readFileToBytes("/tmp/model.bin"); PreparedStatement ps = conn.prepareStatement( "INSERT INTO file_store (file_name, file_content) VALUES (?, ?)"); ps.setString(1, "model.bin"); ps.setBytes(2, fileData); ps.executeUpdate();代码说明:setBytes把字节数组写入 bytea 字段,getBytes读取。逻辑说明:bytea 字段在服务端默认有 TOAST 机制,大对象会被压缩后存储在单独扩展表里,应用层不需要手工处理。参数说明:超过 1GB 的文件不建议直接塞进数据库,应存在对象存储里,数据库只保存访问路径,这也是手册 4.2.8 隐含的设计原则——数据库类型能存,不代表应该存。
字符串类型里,超长文本用text而不是varchar(n),避免在建表时预估长度过短,上线后业务报数据超长错误。手册 4.2.8.2 的字符串类型章节也提示了这一点,实际实施里很多迁移问题就出在把 Oracle 的VARCHAR2长度语义原样带过来,造成大量字段长度核对工作。
5.5 ODBC 与 libpq 的配置要点
ODBC 主要用于 BI 工具或 Windows 平台的报表系统接入。配置路径是安装 unixODBC、替换驱动、配置数据源、测试连通性。实际项目中,BI 工具连不上通常不是因为驱动没装好,而是数据源里的协议版本或字符编码与服务端不一致。
libpq 是 C 语言的客户端接口,连接参数以 key-value 形式传字符串,性能好但排查链路长。手册 4.4 节的调试手段是打开客户端日志,把连接参数打出来后逐个核对。这里有一条血泪经验:libpq 连接参数里的host如果写的是 socket 路径而不带/,有些版本会当成 TCP 地址解析,结果是连接超时而不是立即报错,排错时非常迷惑。
6. 安全权限与最后要避开的坑:接入认证、SSL、行级访问控制
安全配置在运维顺序里永远应该放在业务上线之前。手册第五章把客户端接入认证、配置文件参考、SSL 证书管理、用户权限机制、三权分立、行级访问控制完整铺开,这套内容在执行层面要比建表索引更敏感。
6.1 接入认证与 SSL 的落地姿势
客户端接入认证文件是连接的第一道关卡,配置格式为“连接类型 数据库 用户 地址 认证方式”。线上环境建议按最小化原则逐行放行,不要直接写0.0.0.0/0加trust,那是裸奔。
行级访问控制是数据权限管理的利器,适合同一张表对不同角色返回不同数据行的场景:
CREATE ROW LEVEL SECURITY POLICY rls_region ON t_olap USING (region_code = current_user); ALTER TABLE t_olap ENABLE ROW LEVEL SECURITY;逻辑说明:CREATE ROW LEVEL SECURITY POLICY定义一个策略,USING子句返回真时该行可见;ENABLE ROW LEVEL SECURITY打开表级开关。参数说明:一旦开启行级安全,默认所有用户只能看到策略表达式为真的行,连表属主也受限,除非额外给属主建绕过策略。
6.2 三个值得写进检查清单的坑
现象一:远程连接的客户端反复报认证失败,密码明明是对的。原因:认证文件里匹配到的是前面的trust或reject行,后面的 sha256 行根本没执行到。解决:把更严格的认证规则放在文件前面,并确认没有多余的模糊匹配行。
现象二:SSL 配置完成后,客户端连接抓包发现还是明文传输。原因:服务端ssl=on配置没生效,数据库没有重启。解决:修改配置文件后执行vb_ctl restart,客户端连接串必须显式指定sslmode=require,否则驱动默认优先明文连接。
现象三:用户被授予了整表权限,但查询时仍然一行数据都看不到。原因:表启用了行级访问控制,策略表达式对当前用户恒为假。解决:检查系统表确认策略定义,调整USING表达式或临时禁用策略验证数据可见性。从那以后我每次切换环境,都强制走一遍认证文件检查加行级策略验证清单,希望帮到你。
本文还有配套的精品资源,点击获取