国测 vexdb

-- cn: 50000 -- dn1: 50005 -- dn2: 50010 vsql -d postgres -p 50000 -r SELECT * FROM PG_DIST_NODE; CREATE TABLE t1(c1 INT, c2 TEXT); SELECT create_distributed_table('t1', 'c1'); -- 创建8个分片,dn1和dn2,每个dn有4个分片,即4个表,表名为 t1_$oid SELECT * FROM pg_dist_shard; -- min和max是hash之后的值 SELECT * FROM pg_dist_shard_placement; SELECT * FROM pg_dist_partition; INSERT INTO t1 VALUES(1, 'aa'), (3, 'bb'), (7, 'cc'), (10, 'dd'); vsql -d postgres -p 50005 -r SELECT oid,relname FROM pg_class WHERE relname like '%t1%'; vsql -d postgres -p 50010 -r SELECT oid,relname FROM pg_class WHERE relname like '%t1%'; # cn SELECT create_distributed_table('t1', 'c1'); # --> shard 1 (dn1) SELECT worker_apply_shard_ddl_command (12042, 'CREATE TABLE public.t1 (c1 integer, c2 text) WITH (orientation=row, compression=no, fillfactor=80)'); # dn1 worker_apply_shard_ddl_command ddlnode = ParseTreeNode(sql) RelayEventExtendNames(ddlnode, sharid) # 在语法解析树中,把t1名称,修改为t1_$shardid ProcessUtilityParseTree SELECT worker_apply_shard_ddl_command (12042, 'ALTER TABLE public.t1 OWNER TO shenkun'); # --> shard 2 (dn2) SELECT worker_apply_shard_ddl_command (12043, 'CREATE TABLE public.t1 (c1 integer, c2 text) WITH (orientation=row, compression=no, fillfactor=80)'); SELECT worker_apply_shard_ddl_command (12043, 'ALTER TABLE public.t1 OWNER TO shenkun'); # --> shared 3 (dn1) ... # --> 一共8个分片,每个分片2条SQL! # cn INSERT INTO t1 VALUES(1,'aa'),(3,'bb'),(7,'cc'),(10,'dd'); exec_simple_query pg_parse_query pg_analyze_and_rewrite pg_plan_query [planner hook] distributed_planner CreateDistributedPlan CreateModifyPlan RouterInsertJob (deferredPruning=true) # 返回 CustomScan PortalStart ExecutorStart [DVecExecutorStart] DVecExecutorStart BeginCustomScan → DVecBeginScan DVecBeginModifyScan RegenerateTaskListForInsert BuildRoutesForInsert FindShardInterval ActiveShardPlacementList RebuildQueryStrings DeparseTaskQuery AppendShardIdToName # 生成改名后SQL PortalRun ExecutorRun [ExecutorRun_hook] DVecExecutorRun ExecCustomScan DVecExecScan AdaptiveExecutor RunDistributedExecution ... SendRemoteCommand StartRemoteTransactionBegin BeginTransactiionCommand # 生成:BEGIN ISOLATION LEVEL READ COMMITTED; AssignDistributedTransactionIdCommand # 生成:SELECT assign_distributed_transaction_id(0,20,'...'); SendRemoteCommand # 一次发送2条事务SQL SendRemoteCommand PQsendQuery # INTO t1_$shardid .. CoordinatedRemoteTransactionsPrepare .. SendRemoteCommand # 发送 REPARE TRANSACTION .. SendRemoteCommand # 发送 COMMIT PREPARED .. # --> shard 1 (dn1) BEGIN ISOLATION LEVEL READ COMMITTED; SELECT assign_distributed_transaction_id(0,20,'...'); INSERT INTO public.t1_12042 AS dvec_table_alias (c1, c2) VALUES (1,'aa'::text) REPARE TRANSACTION 'dvecx_...'; COMMIT PREPARED 'dvecx_...'; # 执行分布式事务 INSERT INTO public.t1_12042 AS dvec_table_alias (c1, c2) VALUES (1,'aa'::text) # --> shard 2 (dn2) INSERT INTO public.t1_12043 AS dvec_table_alias (c1, c2) VALUES (10,'dd'::text) # --> shared 3 (d1) ... # --> 一共8个分片,其中4个分片,各收到1条INSERT语句 # 多行在同一分片,INSERT语句合并 # cn SELECT * FROM t1 WHERE c1 > 10; exec_simple_query pg_parse_query pg_analyze_and_rewrite pg_plan_query [planner hook] distributed_planner CreateDistributedPlan GetRouterPlanType (一造 multi-shard fan-out(非 router 计划)) MultiLogicalPlanCreate (logical planner:建逻辑计划) CreatePhysicalDistributedPlan (physical planner) ├─ 为命中的每个分片建一个 Task(本表 8 个分片 → 8 个 Task) UpdateTaskQueryString DeparseTaskQuery deparse_shard_query AppendShardIdToName # t1 → t1_<shardId> # SELECT * + c1,c2 ; WHERE c1>10 → (c1 OPERATOR(pg_catalog.>) 10) # 包成 CustomScan 返回 PortalStart ExecutorStart [DVecExecutorStart] DVecExecutorStart BeginCustomScan → DVecBeginScan PortalRun ExecutorRun [ExecutorRun_hook] DVecExecutorRun ExecCustomScan DVecExecScan AdaptiveExecutor RunDistributedExecution AssignTasksToConnectionsOrWorkerPool # 8 个 Task 分给 DN1/DN2 的连接 ConnectionStateMachine StartRemoteTransactionBegin *发送: BEGIN + assign(每条 DN 连接首次用,只发一次) BeginTransactionCommand # 生成: BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED AssignDistributedTransactionIdCommand # 生成: SELECT assign_distributed_transaction_id(...) SendRemoteCommand → PQsendQuery *两条合并成一条发出 # 发送: SELECT c1,c2 FROM t1_<shardId> WHERE (c1>10) # DN1 上 4 条 (12042/12044/12046/12048), DN2 上 4 条 (COMMIT) RemoteTransactionCommit SendRemoteCommand → PQsendQuery # 只读 → 普通 COMMIT(无 PREPARE/COMMIT PREPARED,无 2PC) # COMMIT # --> shard 1 (dn1) SELECT c1, c2 FROM public.t1_12042 t1 WHERE (c2 OPERATOR(pg_catalog.>) 'cc'::text) SELECT * FROM t1 WHERE c2 > 'cc'; 密态: cn CREATE TABLE t1 (c1 ..) INSERT INTO t1 VALUES (..) SELECT c1,c2 FROM t1 WHERE .. dn CREATE TABLE t1_$shardid (c1 ..) INSERT INTO t1_$shardid VALUES (..) # values的值不变 SELECT c1,c2 FROM t1_$shardid WHERE .. # WHERE子句不变

July 27, 2026 · 3 min · 517 words · Me

Vastbase SSL安全传输

1 基于SSL证书实现身份认证 在应用与数据库传输数据时,为避免攻击者对数据进行窃听、篡改、伪造、重放等攻击,Vastbae支持采用SSL协议保障数据机密性与完整性。在SSL协议协商密钥的过程中,应用与数据库需通过证书验证对方身份,同时,该证书也可作为登入数据库的身份凭证。 此处介绍生成证书,并基于证书配置SSL协议,同时基于证书实现身份认证,操作流程可分为以下3个阶段: 一、生成私钥与证书 二、数据库端配置证书与私钥 三、应用端配置证书与私钥 一、生成私钥与证书 此处介绍基于openssl工具,生成自签名证书的流程 创建存放私钥与证书的文件夹 mkdir cadir cd cadir mkdir ./demoCA ./demoCA/newcerts ./demoCA/private echo '01'>./demoCA/serial touch ./demoCA/index.txt 配置openssl工具 从Vastbase安装包中,获取openssl工具以及openss配置文件。假设Vastbae安装包存放在$GAUSSHOME目录。 cp $GAUSSHOME/bin/openssl ./ export PATH=`pwd`:$PATH which openssl # 确保openssl来源于Vastbase安装包,避免因版本不同造成证书不可用 openssl version cp $GAUSSHOME/share/sslcert/gsql/openssl.cnf ./ export OPENSSL_CONF=`pwd`/openssl.cnf 创建CA私钥、CA证书 openssl ecparam -genkey -name SM2 -out demoCA/private/cakey.pem openssl req -new -config openssl.cnf -key demoCA/private/cakey.pem -subj /C=CN/ST=BJ/L=HaiDian/O=VAST/OU=SEC/CN=CA -out cacert.req openssl ca -selfsign -config openssl.cnf -batch -keyfile demoCA/private/cakey.pem -in cacert.req -out demoCA/cacert.pem 创建数据库私钥、数据库证书 ...

August 28, 2025 · 6 min · 1153 words · Me

e100

./configure --prefix=$PG_HOME --enable_debug --with-openssl --enable-cassert make -sj 6 && make install alias pmake='make -sj 6 && make install -sj' alias pinit='rm -rf $PG_HOME/data && initdb -D $PG_HOME/data' alias pstart='pg_ctl start -D $PG_HOME/data -l logfile' alias pstop='pg_ctl stop -D $PG_HOME/data -l logfile'

July 29, 2025 · 1 min · 41 words · Me

pg_dump

1 使用方式 vsql -d vastbase -r CREATE USER u1 PASSWORD 'u1.password'; CREATE USER u2 SYSADMIN PASSWORD 'u2.password'; CREATE USER u3 SUPERUSER PASSWORD 'u3.password'; SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname; vsql -d vastbase -c "SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;" # 导出 vb_dumpall --roles-only -f ./u.sql # 清理 vsql -d vastbase -c " DROP USER IF EXISTS u1,u2,u3; " # 恢复 vsql -d vastbase -f ./u.sql vsql -d vastbase -c "SELECT rolname,rolsuper,rolsystemadmin FROM pg_authid ORDER BY rolname;"

July 29, 2025 · 1 min · 78 words · Me

libpq

1 libpq编程 1.1 配置数据库 安装数据库 # 假设安装目录为 $PG_HOME 启动数据库 # 假设数据目录为 $PG_HOME/data 配置数据库 echo 'host all u1 0.0.0.0/0 md5' >> $PG_HOME/data/pg_hba.conf echo "listen_addresses='0.0.0.0'" >> $PG_HOME/data/postgresql.conf pg_ctl reload -D $PG_HOME/data 创建用户 psql -d postgres -c "create user u1 password 'u1.password';" # 验证一下 psql -h 127.0.0.1 -p 5432 -d postgres -U u1 -W 'u1.password' -c '\d' 1.2 编写libpq demo 生成源文件 touch pq.c # 复制 1.3 章节的源码 到 pq.c中 # 配置环境变量 export LD_LIBRARY_PATH=$PG_HOME/lib:$LD_LIBRARH_PATH 编译 gcc pq.c -o pq -I$PG_HOME/include -L$PG_HOME/lib -lpq 执行 ...

July 28, 2025 · 1 min · 204 words · Me

jdbc

1 使用JDBC的流程 准备java环境 准备jdbc驱动 编写java代码 执行java代码 2 使用JDBC 2.1 准备java环境 安装java工具包 sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel 验证java安装成功 java -version # openjdk version "1.8.0_382" : 8表示java 8 执行java demo # 编写代码 echo ' public class Demo { public static void main(String[] args) { System.out.println("Hello World"); } } ' >> Demo.java # 编译代码 javac Demo.java # 执行 java Demo 2.2 准备jdbc驱动 touch jdbc cd jdbc mkdir jars cd jars wget https://jdbc.postgresql.org/download/postgresql-42.7.7.jar 目录架构: |-- jdbc |-- jars |-- postgresql-42.7.7.jar https://polydistortion.net/bc/index.html ...

July 24, 2025 · 1 min · 164 words · Me

openGauss 升级

virtCCA 1 升级的流程 升级分类: 就地升级:暂停业务 灰度升级:不暂停业务,一次升级所有节点 节点升级:基于灰度升级,可升级部分节点 升级流程:(此处的命令是简化版命令,不能直接执行) 准备升级:检查安装包 开始升级:停止、启动集群,修改系统表 mkdir new_pkg gs_preinstall -X config.xml gs_upgradectl -t auto-upgrade -X config.xml --grey 验证升级 gsql -V gaussdb -V gsql -d postgres -p 5432 -c 'select working_version_num();' # 旧版本 提交升级 gs_upgradectl -t commit-upgrade -X config.xml --grey 回滚升级 gs_upgradectl -t auto-rollback -X config.xml 2 升级的原理 安装包 |-- install |-- share |-- postgresql |-- postgresql.conf.sample |-- postgres.bki |-- system_views.sql |-- extension |-- ... main parseCommandLine checkParameter initGlobalInfos initClusterInfo UpgradeImplOLAP run Upgrade.run UpgradeImpl.run # UpgradeImpl.py initGlobalInfos commonCheck if 'auto_upgrade' doGreyBinaryUpgrade distributeXml checkUpgrade # 检查环境变量 'Local_Check_Upgrade -t action -R oldapppath -l locallog -N newapppath -X config.xml' doHealthCheck checkClusterStatus checkConnection chooseUpgradeNodes prepareGreyUpgrade createBakPath 'mkdir upgradeBackupPath' initNodeStepInCsv 'touch upgrade_step.csv_bak' initUpgradeProcessStatus recordNodeStepInplace recordDirFile 'touch record_app_directory' writeFile('oldClusterAppPath') copyBakVersion 'cp oldapppath/bin/upgrade_version upgradeBackupPath/upgrade_version' installNewBin 'Local_Install -t install_cluster -U user:group -R newapppath -P tmpdir -c clustername -l locallog -X config.cml -T -u' cpDolphinUpgradeScript 'cp oldapppath/share/postgresql/extension/dolphin* newapppath/share/postgresql/extension/' prepareUpgradeSqlFolder # catalog upgrade_sql.tar.gz, including guc 'Local_Upgrade_Utility -t prepare_upgrade_sql_folder -U user --upgrade_bak_path upgradeBackupPath -X config.xml -l locallog' updateCatalog 'cp upgradeBackupPath/upgrade_sql/ {upgrade-post, upgrade, rollback-post, rollback}' doUpgradeCatalog setUpgradeFromParam 'gs_guc set -Z cmagent -N all -I all -c upgrade_from=working_grand_version' reload_cm_proc setUpgradeMode(2) reloadCmAgent killKernalSnapshotThread execRollbackUpgradedCatalog('rollback') execRollbackUpgradedCatalog('upgrade') pgxcNodeUpdateLocalhost("upgrade") rebuild_pg_proc_proname_args_nsp_new_index upgradeAgain greySyncGuc 'Local_Upgrade_Utility -t grey_sync_guc -U user --upgrade_bak_path=upgradeBackupPath -l logcallog' greySyncGuc # script/local/UpgradeUtility.py readDeleteGuc greySyncInstanceGuc greyUpgradeSyncOldConfigToNew 'Local_Upgrade_Utility -t grey_upgrade_config_sync -U user -V oldversionnumber --old_cluster_app_path=oldapppath --new_cluster_app_path=newapppath -l locallog' greyUpgradeSyncConfig # 适配点, 参考 setUpradeModeGuc( getOneDNInst switchBin 'Local_Upgrade_Utility -t switch_bin -U user -l localog -R new?oldapppath' restore_origin_disaster_user_file setNewVersionGuc switchExistsProcess _check_and_start_cluster 'gs_om -t start' createCheckpoint switchDn waitClusterNormalDegrade doHealthCheck waitClusterForNormal backupGlobalRelmapFile printPrecommitBannervstart elif 'commit': doGreyCommitUpgrade 参考 opengauss om源码:https://gitee.com/opengauss/openGauss-OM opengauss升级:https://docs.opengauss.org/zh/docs/latest/docs/DatabaseOMGuide/upgrade.html

March 6, 2025 · 2 min · 250 words · Me

openGauss 身份认证 GUC参数

1 身份认证 身份认证 大部分数据库都支持基于口令的身份认证,以vastbase为例,身份认证的流程如下: 高权限用户创建新用户 CREATE USER u1 PASSWORD 'u1.pass1'; 数据库在pg_authid系统表中存储用户以及密码的哈希 SELECT oid, rolname, rolvalidbegin, rolpassword FROM pg_authid WHERE rolname = 'u1'; oid | rolname | rolvalidbegin | rolpassword -------+---------+---------------+-------------------------------------------------------------------------- 24576 | u1 | | sha2565e3b533ca5db32acdffdb6aea03395af163ac3cfdc9ddb....... 数据库在pg_auth_history系统表中存储密码创建时间 SELECT roloid, passwordtime FROM pg_auth_history; oid | passwordtime -------+------------------------------- 24576 | 2025-02-11 12:17:02.969642+08 新用户登录数据库 gsql -d postgres -U u1 -W 'u1.pass1' -r 数据库校验新用户信息:数据库接收用户建立连接的请求时,会进行一系列身份鉴别操作,包括:检查用户提供的密码与pg_authid中的值是否匹配,检查pg_auth_history中记录的密码生成日期与当前日期是否间隔较久等 ...

February 28, 2025 · 5 min · 864 words · Me

mysql 1 安装mysql

1 安装mysql # root yum -y install wget cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel yum -y install cmake3 # 普通用户 cd ~ mkdir mysql && cd mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.17.tar.gz tar -zxvf mysql-boost-8.0.17.tar.gz mkdir backup && mv *.tar.gz backup mkdir install data boost cd mysql-boost* cmake3 . -DCMAKE_INSTALL_PREFIX=`pwd`/../install -DMYSQL_DATADIR=`pwd`/../data -DSYSCONFDIR=`pwd`/../data -DMYSQL_TCP_PORT=3306 -DWITH_BOOST=`pwd`/../boost \ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=ON -DWITH_INNODB_MEMCACHED=ON -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1

February 24, 2025 · 1 min · 64 words · Me

openGauss 1 安装openGauss

1 安装wsl 请自行在网上了解wsl是什么,以及如何在wsl中安装centos 7: 在windows 11中,启用wsl 下载centos 7的wsl 安装包 在wsl中,安装centos 7 进入centos 7,创建普通用户,建议使用mobaxterm直接登录wsl中的centos系统 配置centos 7的yum源 2 准备环境 下载opengauss源码 git clone -b master git@gitee.com:opengauss/openGauss-server.git 下载第三方库 wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc10.3/openGauss-third_party_binarylibs_Centos7.6_x86_64.tar.gz 解压第三方库 # 解压压缩包 tar -zxvf openGauss-third* # 归档压缩包 mkdir tmp mv *.tar.gz tmp # 重命名压缩包 mv openGauss-third* third 下载依赖库 yum install -y libaio-devel flex bison ncurses-devel patch readline-devel # 单独安装 glibc-devel yum install glibc-devel # 如果报错,提示安装了.i686版本的glibc-devel,则修改yum配置文件: # echo "exclude=*.i686" >> /etc/yum.conf # 如果报错,提示glibc-devel与glibc-common不匹配,则降级glibc和glibc-common # yum downgrade glibc glibc-devel glibc-common glibc-headers # 降级后,再重新安装 glibc-devel 即可 # yum install glibc-devel 设置环境变量 首先,请确保目录结构如下: ...

February 20, 2025 · 2 min · 249 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀