• [技术干货] kettle连接openGauss 5.0.0 数据库
    Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。Pentaho Data Integration以Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。openGuass 5.0.0 的安装openGauss 5.0.0 安装 《基于openEuler 22.03LTS 安装 单机openGauss 5.0.0企业版数据库》2、openGauss 3.1.0 安装《手把手教你安装openGauss 3.1.0》:cid:link_4kettle的安装下载 下载pdi-ce-9.4.0.0-343.zip社区版下载地址:cid:link_0官方文档地址:cid:link_1安装kettle 操作系统:centos7.9(1)先决条件需要64位 Java SE 版本 jave SE 11到18都可以对于 Linux/Ubuntu 安装,还需要安装 libwebkitgtk-1.0-0 才能使 PDI 正常运行。安装一些依赖包yum -y install epel-release yum -y install webkitgtk yum -y install redhat-lsb 下载安装xulrunner:cid:link_3mkdir /root/xulrunner tar jxvf xulrunner-1.9.2.28pre.en-US.linux-x86_64.tar.bz2 cd xulrunner ./xulrunner -register-global (2)解压安装包创建目录并解压mkdir /root/kettle unzip pdi-ce-9.4.0.0-343.zip -d /root/kettle 查看文件启动kettle到图形化界面下执行cd /root/kettle/data-integration ./kitchen.sh ./spoon.sh & 启动过程启动完成配置连接下载jar包 openGauss jar包下载地址:cid:link_2把openGauss-5.0.0-JDBC.tar.gz解压到data-integration/lib下面添加配置 在data-integration/simple-jndi/jdbc.properties加入以下内容##openGauss postgres/type=javax.sql.DataSource postgres/driver=org.opengauss.Driver postgres/url=jdbc:opengauss://192.168.10.10:15400/postgres postgres/user=qmttest postgres/password=qoqoqooq 3. 在图形化中配置 点击connect点击Repository Manager点击 Add点击 Database Repository填写display name点击 Create填写下面内容点击测试连接成功后面依次点击确认和save连接openGauss数据库 点击 connect 、然后选择刚才创建的名称输入默认用户密码:admin/admin点赞2
  • [技术干货] Navicat连接openGauss 5.0.0 企业版数据库
    在当今互联网时代,数据成为企业和组织的重要资产。为了更好地管理和分析数据,数据库管理工具起到至关重要的作用。openGauss是一款开源关系型数据库管理系统,提供了高性能、高可用性和可扩展性,它还具有安全性和数据保护的特性,包括数据加密、访问控制和审计等功能,已广泛应用于各个行业。Navicat是一款广泛使用的数据库管理工具,具有直观友好的界面和丰富的功能,可以方便地连接、管理和操作各种类型的数据库。Navicat支持主流的数据库系统,如MySQL、PostgreSQL等。它提供了一个集成的环境,用于管理和操作多个数据库,可以执行数据导入导出、数据同步、查询和报表等功能。Navicat具有直观易用的用户界面和强大的功能,适用于数据库开发人员、管理员和分析师等各种角色。环境准备 openGauss_5.0.0 企业版Navicat 16.0.11openEuler-22.03-LTS-SP2MobaXterm 22.1服务器名称:node0,IP地址:192.168.192.129openGauss服务设置查看数据库启动状态 (1)切换至omm用户[root@node0 ~]# su ommWelcome to 5.10.0-153.12.0.92.oe2203sp2.x86_64System information as of time: Sat Jul 22 04:10:52 PM CST 2023System load: 0.01 Processes: 170 Memory used: 5.5% Swap used: 0% Usage On: 7% IP address: 192.168.192.129 Users online: 1 To run a command as administrator(user "root"),use "sudo ". [omm@node0 root]$(2)查看数据库启动状态[omm@node0 root]$ gs_om -t status --detail [ Cluster State ]cluster_state : Unavailable redistributing : No current_az : AZ_ALL[ Datanode State ]node node_ip port instance state1 node0 192.168.192.129 15400 6001 /opt/huawei/install/data/dn P Primary Manually stopped(3)启动openGauss[omm@node0 root]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] node0 2023-07-22 16:21:31.942 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:21:31.942 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:21:31.945 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3301 Mbytes) is larger. ========================================= Successfully started.停止openGaussgs_om -t stop修改pg_hba.conf文件 企业版所在目录:/opt/huawei/install/data/dn[omm@node0 dn]$ pwd /opt/huawei/install/data/dn [omm@node0 dn]$ [omm@node0 dn]$ ll total 5044 drwx------ 6 omm dbgrp 4096 Jul 20 23:49 base -rw------- 1 omm dbgrp 4399 Jul 20 23:48 cacert.pem -rw------- 1 omm dbgrp 72 Jul 22 16:21 gaussdb.state drwx------ 3 omm dbgrp 4096 Jul 22 16:21 global -rw------- 1 omm dbgrp 354 Jul 20 23:49 gs_gazelle.conf -rw------- 1 omm dbgrp 4915200 Jul 20 23:49 gswlm_userinfo.cfg -rw------- 1 omm dbgrp 21016 Jul 20 23:49 mot.conf drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_clog drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_csnlog -rw------- 1 omm dbgrp 0 Jul 22 16:21 pg_ctl.lock drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_errorinfo -rw------- 1 omm dbgrp 4611 Jul 21 23:05 pg_hba.conf -rw------- 1 omm dbgrp 4587 Jul 20 23:49 pg_hba.conf.bak -rw------- 1 omm dbgrp 1024 Jul 20 23:49 pg_hba.conf.lock -rw------- 1 omm dbgrp 1636 Jul 20 23:49 pg_ident.conf drwx------ 4 omm dbgrp 4096 Jul 20 23:49 pg_llog drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_location drwx------ 2 omm dbgrp 4096 Jul 22 16:24 pg_logical drwx------ 4 omm dbgrp 4096 Jul 20 23:49 pg_multixact drwx------ 2 omm dbgrp 4096 Jul 22 16:21 pg_notify drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_replslot drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_serial drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_snapshots drwx------ 2 omm dbgrp 4096 Jul 22 16:25 pg_stat_tmp drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_tblspc drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_twophase -rw------- 1 omm dbgrp 4 Jul 20 23:49 PG_VERSION drwx------ 3 omm dbgrp 4096 Jul 20 23:49 pg_xlog -rw------- 1 omm dbgrp 36058 Jul 21 23:07 postgresql.conf -rw------- 1 omm dbgrp 36083 Jul 20 23:49 postgresql.conf.guc.bak -rw------- 1 omm dbgrp 1024 Jul 20 23:49 postgresql.conf.lock -rw------- 1 omm dbgrp 71 Jul 22 16:21 postmaster.opts -rw------- 1 omm dbgrp 88 Jul 22 16:21 postmaster.pid -rw------- 1 omm dbgrp 0 Jul 20 23:49 postmaster.pid.lock -rw------- 1 omm dbgrp 4402 Jul 20 23:48 server.crt -rw------- 1 omm dbgrp 1766 Jul 20 23:48 server.key -rw------- 1 omm dbgrp 56 Jul 20 23:48 server.key.cipher -rw------- 1 omm dbgrp 24 Jul 20 23:48 server.key.rand drwx------ 5 omm dbgrp 4096 Jul 20 23:49 undo [omm@node0 dn]$[omm@node0 dn]$ vi pg_hba.conf 增加需要访问计算机的IP地址对所有IP地址进行开放:0.0.0.0/0修改trust替换成md5加密方式PostgreSQL Client Authentication Configuration File===================================================Refer to the "Client Authentication" section in the PostgreSQLdocumentation for a complete description of this file. A shortsynopsis follows.......TYPE DATABASE USER ADDRESS METHOD"local" is for Unix domain socket connections onlylocal all all trust host all omm 192.168.192.129/32 trustIPv4 local connections:host all all 127.0.0.1/32 trust host all all 192.168.192.129/32 md5 host all all 0.0.0.0/0 md5IPv6 local connections:host all all ::1/128 trust...... 输入 :wq! 退出修改postgresql.conf文件 (1)修改监听地址和加密方式[omm@node0 dn]$ vi postgresql.conf-----------------------------------------------------------------------------postgresql_single.conf.sampleConfiguration file for centralized environmentPortions Copyright (c) 1996-2012, PostgreSQL Global Development Group......listen_addresses = '*' # what IP address(es) to listen on;comma-separated list of addresses;defaults to 'localhost'; use '*' for all(change requires restart)local_bind_address = '192.168.192.129' port = 15400 # (change requires restart) max_connections = 5000 # (change requires restart)......#failed_login_attempts = 10 #Enter the wrong password reached failed_login_attempts times, the current account will be locked password_encryption_type = 0 #Password storage type, 0 is md5 for PG, 1 is sha256 + md5, 2 is sha256 only #password_min_length = 8 #The minimal password length(6-999) #password_max_length = 32 #The maximal password length(6-999) #password_min_uppercase = 0 #The minimal upper character number in password(0-999) #password_min_lowercase = 0 #The minimal lower character number in password(0-999) #password_min_digital = 0 #The minimal digital character number in password(0-999) #password_min_special = 0 #The minimal special character number in password(0-999) #password_effect_time = 90d #The password effect time(0-999) #password_notify_time = 7d #The password notify time(0-999)......重启服务 [omm@node0 dn]$ gs_om -t stop Stopping cluster. ========================================= Successfully stopped cluster. ========================================= End stop cluster. [omm@node0 dn]$ [omm@node0 dn]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] node0 2023-07-22 16:55:05.897 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:55:05.897 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:55:05.901 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3301 Mbytes) is larger. ========================================= Successfully started.创建远程连接角色 [omm@node0 dn]$ gsql -d postgres -p 15400 gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:37:13 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.openGauss=# create user testuser password 'openGauss!666'; NOTICE: The encrypted password contains MD5 ciphertext, which is not secure. CREATE ROLE防火墙开放端口 防火墙为未启动状态,略过此步骤;查看firewalld状态systemctl status firewalld把端口加入防火墙firewall-cmd --zone=public --add-port=15400/tcp --permanent重新加载防火墙systemctl reload firewalldNavicat连接 打开Navicat,新建PostgreSQL连接方式;在“新建连接(PostgreSQL)”窗口中,输入连接名、主机IP地址、端口号、用户名、密码等参数端口号默认为5432,根据实际情况动态调整;点击“测试连接”按钮,提示连接成功,完成Navicat连接openGauss数据库;问题 fatal:forbid remote connection with initial user在连接openGauss数据库时,提示:Forbid remote connection with initial user,意思是禁止用初始用户进行远程连接,即不要使用数据库默认的omm用户访问。总结 本文就使用Navicat连接openGauss数据库的实践方法做了说明,在实际应用中,应根据实际情况进行调整和优化。使用Navicat连接openGauss数据库,可以方便地进行数据管理和维护操作。可以轻松地执行数据导入导出、数据备份和恢复等任务。此外,Navicat还提供了强大的数据编辑功能,方便对数据库中的数据进行修改和更新。附录 记录在openEuler-22.03中安装openGauss_5.0.0企业版在VMware 17.0.2虚拟机中安装openEuler-22.03-LTS-SP2:cid:link_0
  • [技术干货] openGauss CM支持两节点部署特性
    什么是CM CM(Cluster Manager)是一款数据库管理模块。支持自定义资源监控,提供了数据库主备的状态监控、网络通信故障监控、文件系统故障监控、故障自动主备切换等能力。提供了丰富的数据库管理能力,如节点、实例级的启停,数据库实例状态查询、主备切换、日志管理等。提供了通过REST接口远程查询和接收集群状态的能力。 CM 特点 从5.0开始CM支持2节点部署,CM集群和数据库集群都能实现高可用,RPO=0CM集群高可用 基于网关IP实现:备实例基于与网关IP的连通性判定自身是否升主,主实例基于与其与网关IP的连通性判定自身是否降备。目前支持自动故障切换和手工故障切换。数据库集群高可用 备实例是否failover的判定除去基于流复制状态,额外增加对数据库集群VIP(选配参数)的连通性的探测,以此降低主实例故障的误判概率,进而降低脑裂故障概率。为了确保脑裂故障时数据库集群的数据一致性,提供可配参数支持自动故障恢复和手工故障恢复。手工故障恢复需要按照特定文档及工具执行差异数据合并。CM两节点部署的XML root@k8s-node1 cm_server]# vi /home/omm/cluster_config.xmlcm日常运维命令 --cm命令查看集群状态[omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : No current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Standby Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Primary Normalcm切换primary库命令 [omm@k8s-master ~]$ cm_ctl switchover -n 1 -D /dbms/huawei/opengauss/install/data/dn .... cm_ctl: switchover successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : Yes current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Primary Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Standby Normal--停止集群 [omm@k8s-master ~]$ cm_ctl stop cm_ctl: stop cluster. cm_ctl: stop nodeid: 1 cm_ctl: stop nodeid: 2 ......... cm_ctl: stop cluster successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Down 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Down--启动集群 [omm@k8s-master ~]$ cm_ctl start cm_ctl: checking cluster status. cm_ctl: checking cluster status. cm_ctl: checking finished in 366 ms. cm_ctl: start cluster. cm_ctl: start nodeid: 1 cm_ctl: start nodeid: 2 ............ cm_ctl: start cluster successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : Yes current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Primary Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Standby Normal CM两节点特性-配置前提条件 --cm集群故障自动切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_network_isolation_timeout = 20--cm集群故障手工切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = false cms_network_isolation_timeout = 20--数据库集群故障自动切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_enable_db_crash_recovery = on--数据库集群故障手工切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_enable_db_crash_recovery = off CM 在openGauss5.0 新增的特性高可用:CM支持VIP管理 通过VIP可以直接找到主机,连接重连更准更快(毫秒级别);支持主机故障,CM选出新主时,VIP漂移到新的主上;当出现双主时,依然可以通过VIP访问到唯一一个主机,降低了双主丢数据的风险。高可用:CM支持两节点部署 通过引入第三方网关IP,有效解决CM集群两节点部署模式下自仲裁问题,支持CMS和DN均为2节点的部署;同时支持动态配置CM集群故障切换策略和数据库集群脑裂故障恢复策略,从而能够尽可能确保集群数据的完整性和一致性。高可用:CM磁盘只读检测能力增强 只读状态从数据库获取,保证准确性;只读仲裁只仲裁当前超过阈值的实例,其他节点不受影响;主机只读保护后自动主备切换,选可用备机升主保证集群能正常提供工作。高可用:CM易用性提升 支持一键式关闭CM集群服务;支持和内核的安装部署解耦;支持按事件调用用户自定义脚本;支持CM组件单独升级,增强数据库集群可靠性;CM根据配置信息,支持用户自定义组件的监控和管理
  • [技术干货] 编译入门那些事儿(10):RISC-V Vector 概述
    随着 AI 技术发展,向量指令在微处理器上逐渐显现出它的重要性,例如自动驾驶、图像识别,这些技术都需要使用矩阵和向量进行运算。相较于标量单时钟周期内只能一次计算,矢量处理能够对多组数据进行成批计算,意味着矢量毫无疑问成为未来的发展方向。RISC-V 属于一种基于既定精简指令集计算机(RISC)原理的开放标准指令集架构,始于2010年加州大学伯克利分校。在众多的指令架构中,RISC-V 由于他的开放性和可扩展性吸引了一大批编译器开发者,其中矢量指令集 RISC-V Vector 指令集由此诞生。与传统 Arm 的 SIMD 指令不同,RISC-V Vector 指令更加灵活,且对开发工程师更加友好。RISC-V 常见扩展有:• M. Integer multiplication and division (mul, div, rem, …)• A. Atomic instructions(load reserve + store conditional, atomic read-modify-write)• F. Single-Precision Floating-Point (IEEE 754 Binary32)• D. Double-Precision Floating-Point (IEEE 754 Binary64)• C. Compressed Instructions (16-bit encodings for common I/F/D instructions)• Zb*. RISC-V Bit-Manipulation ISA-extensions• Zfh*. "Zfh" and "Zfhmin" Standard Extensions for Half-Precision Floating-Point完整详见cid:link_0RISC-V Vector 基本介绍 RISC-V Vector 拥有其他架构矢量指令没有的两大优点:硬件维护方便与指令长度可变。对于某一个矢量操作,即使硬件中的寄存器长度变化,代码也不需要作更改,相反的,在同一硬件中,即使指令长度作相应改变,代码也不需要更改。这意味着任何 RISC-V 兼容处理器编写的代码在其余 RISC-V 处理器上依然适用,这对于用户来说,简易性直线上升。此两大优点得益于 RISC-V Vector 的 vset(i)vl(i) 指令机制,在面对不同的寄存器大小以及数据长度的时候,vset(i)vl(i) 指令会设置其中的 vl 以及 vtype 来面对不同情况。其中 RISC-V Vector 通过7个 CSR 寄存器来共同处理指令的多样性,分别为 vstart、vxsat、vxrm、vcsr、vl、vtype、vlenb。vstart:开始位置的索引vxsat:定点饱和标志vxrm:定点数舍入模式vcsr:矢量状态控制寄存器vl:矢量长度寄存器vtype:矢量数据属性寄存器vlenb:矢量寄存器长度其中,vl 以及 vtype 是用户涉及最多的寄存器,vl 通过 vset(i)vl(i) 来计算指令向量长度,vtype 则是包含 vill、vma、vta、vlmul、vsew 几个字段来表示各指令中元素属性,例如:vill 是非法标志符,如果值为1,则其他几个字段失效;vma 掩码位;vmul 段代表向量寄存器分组,可以是分数可以是整数,整数n代表n个寄存器为一组进行计算,分数1/n代表1个寄存器拆分成n个寄存器进行计算;vsew 代表元素宽度。vtype 中 vlmul 和 vsew 主要影响 vlmax 的值,而 vlmax 影响每次处理元素的数量,vl = min (vlmax, AVL)。其中 AVL 全称 Application Vector Length,表示应用程序指定要处理的元素总数。vset(i)vl(i) 这类指令在使用上一般是 vl 或者 vtype 发生改变时才会去使用。但是实际上 LLVM 在这一块处理并不完善,如果写 instrinsic 测试就会发现,如果指令可能涉及 vl 或者 vtype 变动,它很有可能会在变动前插入一条 vset(i)vl(i) 来保证正确性,即使现已存在 VSRVLI pass 判断 vtype 块前块后是否一致来减少部分 vset(i)vl(i) 插入,但反向推导的过程中可以发现一些 vset(i)vl(i) 是冗余的,所以这块社区还在不断地演进中。对于 RISC-V Vector 指令的应用现有 NX27V 芯片、C906 芯片、SG2042 芯片、siFive Performance 系列芯片等,其中 NX27V 芯片、siFive Performance 系列芯片支持 RISC-V Vector 1.0 版本,但是 C906、SG2042 芯片支持的是 RISC-V Vector SPEC 0.7.1版本,与现在上游编译器 RISC-V Vector SPEC 1.0 版本不兼容。现社区有 RISC-V Vector rollback 脚本,可将 RISC-V Vector Extension v1.0 的汇编代码转换为 v0.7.1,因此上游编译器代码编出的 .s 中的 RVV SPEC v1.0 版本指令可通过此脚本转换成 RISC-V Vector SPEC v0.7.1 标准指令,这样就可以将代码最终执行在 C906、SG2042 芯片上。当然,其他架构也存在矢量指令,例如 Arm 架构的 Neon,虽然 Neon 和 RISC-V Vector 同为矢量指令,但是 Neon 是固定长度的矢量指令,这会存在一个问题,即指令越加越多,复杂度提升,且需要绑定特定的硬件配置,而 RISC-V Vector 相较于 Neon,它有 vsetvli 可以适配宽度和判断循环次数,只需在执行前给予总的数据量即可。例如一段 memory copy 对于 Arm 的代码部分,LDP 和 STP 分别为128位宽的 load 和 store 操作,每次循环操作96个字节。宽度固定,数据变化代码可能就需大改(Arm SVE 解决这个问题)。RISC-V Vector 在 LLVM 社区中演进 从2019年底开始,LLVM 社区开始实现 RISC-V Vector SPEC 功能,从汇编侧开始,从IR向后端,最后延至前端。至 LLVM15 已基本实现 RISC-V Vector 1.0 全部内容。从使用上来看,从 LLVM12 开始支持 RISC-V Vector Intrinsic,前端接口使用 tablegen 进行生成,在 riscv_vector.td 中定义前端指令生成 builtin 接口,此接口头文件会存在工具链的 lib/clang/12.0.1/include/riscv_vector.h,此文件包含 RISC-V Vector 所有的前端 builtin 接口(只是生成所有接口,但部分接口的功能还不能完整支持),直至 LLVM 12.0.1 版本已经能正常支持 RISC-V Vector 0.10版本的大部分指令,此时 v 指令还是处于试验阶段,所以需要加入选项 -menable-experimental-extensions 进行支持,此时半精度浮点 float 16 支持是存在一定的问题。但由于此文件将所有类型全部写在头文件中,导致头文件巨大。对于一些无返回值的接口,即使使用变量接收返回值也是不会报错的只会报 warning,到 LLVM15 时 return-type 已设置成 error 了,所以当遇到此错误时,需要把返回类型改成 void 或者加上 -Wno-return-type。升级至 LLVM15 后,RISC-V Vector 采用 OpenCL 动态检验接口方式,原先的 riscv_vector.h 接口只有类型没有完整的静态接口,只是因为 RISC-V Vector 现在根据 tablegen 生成的 clang/Basic/riscv_vector_builtin_sema.inc 文件去读取指令前缀,然后在运行时通过 clang/lib/Sema/SemaRISCVVectorLookup.cpp 文件中 InitRVVIntrinsic 函数进行拼接加入到 map 中以此生成 RISC-V Vector 接口表,此函数会自动为接口添加 builtin_rvv ,所以在使用时不能再添加,否则会重复添加导致找不到接口,例如 vrgather_vv_i8mf8(op1, index, vl),而不是 _builtin_rvv_vrgather_vv_i8mf8(op1, index, vl),和以前的接口使用是有差异的,此时文件很小,这个优化方式不仅减小了最后的编译器工具链大小,也加快了运行时编译速度。此时,已实现 RISC-V Vector 1.0 版本,半精度浮点和矢量中的半精度浮点,分别需要开启 zfh 和 zvfh0P1,因为 zvfh 还在试验性阶段所以需要加 -menable-experimental-extensions,具体可参考 clang/test/CodeGen/RISCV/rvv-intrinsics/vfclass.c 测试用例,用到了 zvfh。另外,一部分指令也根据 SPEC 演进做了相应的更改,例如:vmandot 和 vmornot 已更改为 vmandn 和 vmorn 等。自动矢量化 虽然 LLVM15 版本已经支持了 RISC-V Vector Intrinsic,但是对于大工程来说,将代码转换成 RISC-V Vector Intrinsic 接口使用是一件非常繁杂的事情,这时候支持自动向量化是一件非常有意义的事情。相关选项 选项说明-fno-vectorize循环矢量化开关,默认开启--riscv-v-vector-bits-min指定 zvl 最小的 VLEN,不能低于配置的最大 zvl 数(因为 v 自动开启 zvl128b,所以没指定具体 v 扩展时此选项需要开启128以上)-force-vector-width向量化宽度(VF)-force-vector-interleave向量化展开因子(UF)-Rpass=loop-vectorize开启将提示能矢量化的循环-Rpass-analysis=loop-vectorize开启将提示各种错过矢量化机会的原因-Rpass-missed=loop-vectorize开启将提示不能矢量化的循环自动矢量化要求 LLVM15 以后开始支持 RISC-V 自动矢量化,其中需要3个条件:(1)开启自动矢量化需要开启 -O1 以上选项(2)添加 -mllvm --riscv-v-vector-bits-min 配置 VLEN(3)march 选项中加入 v自动矢量化主要是循环向量化居多,所以尽量将循环写法维持在可矢量化状态。调试过程中可以通过 -Rpass=loop-vectorize、-Rpass-analysis=loop-vectorize、-Rpass-missed=loop-vectorize 去查看分析 loop 过程中的矢量化。矢量化代码格式要求 使用简单的循环。避免复杂的循环终止条件——迭代上限在循环中必须是不变的。void test(int *a, int *b, int *c) { for (int i = 0; i <= a[i]; i++) c[i] = b[i]; } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:loop not vectorized: could not determine number of loop iterations 迭代上限变化时无法确定迭代次数,如果在循环中加入 break、return,亦是无法向量化的,向量化循环需要单进单出。避免使用分支语句,或者使用大多数函数调用。void test1();void test(int n, int *a, int *b) { for (int i = 0; i <= n; i++) { test1(); a[i] = b[i]; } } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:loop not vectorized: call instruction cannot be vectorized 循环中有调用无法进行矢量化。避免循环迭代之间的依赖关系,或者至少避免写后读取依赖关系。void test(int n, int *a) { for (int i = 0; i <= n; i++) { a[i] += a[i - 1]; } } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:value that could not be identified as reduction is used outside the loop 这是因为循环中,多次迭代如果同时执行,后序读取数据的迭代可能在前一次写入之前,这可能会导致不正确的结果。自动矢量化流程 首先中端部分用的是公共矢量化分析,这一块 LLVM 有两种类型的自动矢量化实现:SLP 矢量化器和循环矢量化器。SLP Vectorizer 将多个标量指令聚合为一条向量指令,该指令通常在单个基本块上运行。而循环向量化器则扩大循环体内的标量指令以一次执行多个迭代。在这项工作中,我们将自动矢量化算法集成到循环矢量化器中,以通过扫描循环并行化循环。(自动矢量化分析可以参考编译器优化那些事儿(12):LLVM 自动向量化 RISC-V 后端转 RISC-V Vector 通过多种优化组合进行转换,首先依靠插入 vmv 来进行标量矢量转换,然后对于转换后的数据中的 load、store 转化为 vse、vle 来进行矢量存读,当然,其中的 add 指令也转化为 ADD_VL,smin 转化成 SMIN_VL 进行矢量运算。例如:Legalizing: t28: ch = store<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, t78, t2, undef:i32, test.c:7:8 Legalizing store operation Optimizing float store operations Trying custom lowering Creating constant: t83: i32 = TargetConstant<8428> Creating new node: t84: ch = llvm.riscv.vse<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, TargetConstant:i32<8428>, t77, t2, Constant:i32<8>, test.c:7:8 ... replacing: t28: ch = store<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, t78, t2, undef:i32, test.c:7:8 with: t84: ch = llvm.riscv.vse<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, TargetConstant:i32<8428>, t77, t2, Constant:i32<8>, test.c:7:8 最后在 insertVSETVLI pass 中分析在指令中插入 vset(i)vl(i) 来保证结果正确性。RISCV自动矢量化前后对比 以下例子分析矢量化前后差异: void test(int n, int *a, int *b) { for (int i = 0; i <= n; i++) { a[i] = b[i]; } } 以下左边为开启 v 的自动矢量化生成的汇编文件,右边没有开启矢量化左边命令: clang -march=rv32imfdcv -O2 -w -S -mllvm --riscv-v-vector-bits-min=128右边命令: clang -march=rv32imfdc -O2 -w -S可以看出,左边开启自动矢量化时因为向量长度不可知,所以导致还是存在尾部用原指令处理的问题。中间矢量化序列的 vsetivli 中可以看出,因为我们开启的是 vlen=128,用两个寄存器拼接长度为256,元素大小为32,所以相当于一次处理8个数据,而右边一次处理一个数据。从整体看来,codesize 膨胀近3倍,但是可以分析看出来左边 .LBB0_3 块进行循环一次相当于右边 .LBB0_2 块循环8次,只需要总循环为8次以上,左边整体的指令数就能低于右边。RISC-V Vector 优劣分析 RISC-V Vector 优点很多,但是现有的功能方面存在不足,如 predication/mask,向量长度不可知向量化支持不完善导致尾部处理存在问题。RISC-V Vector 有三种主要的循环向量化方法:使用时总是占满整个矢量寄存器组,当固定长度的 SIMD 用,缺点是存在尾循环。此方式可利用 Loop Vectorizer 实现,因此相对简单,不需要特殊的 LLVM IR,但会丢失 RISC-V Vector 的许多特性。(现在LLVM就是使用这种方法)将尾循环合并到向量循环中。(相当于每次使用前用 vsetvl) 这种是通过在每次选代中设置向量长度来实现的。这会在循环的所有向量指令上产生配置指令,需要一些特殊的IR,这里使用 LLVM VP (Vector Predication) intrinsics。一种折中方法就是在向量体中使用整个寄存器,然后设置 vl 执行剩下的。(相当于每次用整个,当用不了整个的时候,设置 vl 执行剩下的)总结 本文简单介绍了 RISC-V Vector 的发展情况以及 LLVM 演进过程,介绍了自动矢量化的大致过程,主要的矢量化还是依靠中端的分析,后端还在不断优化中。总而言之,向量化大势所趋,但优化之路还很漫长。
  • 飞腾平台编译安装openGauss数据库
     环境检查 1. 检查OS版本 openGauss支持的操作系统:  CentOS 7.6(x86_64 架构)  openEuler-20.03-LTS(aarch64 架构)  openEuler-20.03-LTS(x86_64架构)  Kylin-V10(aarch64 架构)  Kylin-V10(x86_64 架构)  Asianux 7.6(x86_64架构)  FusionOS 22 (aarch64 架构)  FusionOS 22 (x86 架构)  cat /etc/os-release  操作系统为openEuler-20.03-LTS(aarch64 架构)  2. 检查cpu型号 lscpu | grep "Vendor ID" 安装平台Vendor ID:0x70为飞腾CPU   3. 禁用防火墙和selinux 禁用防火墙  systemctl status firewalld systemctl stop firewalld systemctl disable firewalld systemctl is-enabled firewalld 禁用SELINUX  /usr/sbin/sestatus -v 如果selinux为enable状态,则修改/etc/selinux/config文件:  SELINUX=disabled  或使用下面命令:  sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config 并重启服务器  4. 配置yum源并安装依赖包 上传操作系统iso到/tmp目录 配置本地yum源  mkdir /mnt/iso mount -o loop /tmp/openeuler20.03LTS.iso /mnt/iso cd /etc/yum.repos.d vi media.repo [InstallMedia] name=openeuler20.03LTS gpgcheck=0 enabled=1 baseurl=file:///mnt/iso yum clean all yum makecache yum list yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch openeuler-lsb readline-devel unzip dos2unix vim git wget lrzsz net-tools bzip2 gcc tree zlib* 5. 安装Python3 建议安装Python3.6+  yum install python3 python3-pip  软链接python命令为python3.7  ln -s /usr/bin/python3.7 /usr/bin/python  python -V   6. 设置字符集参数 vi /etc/profile export LANG=en_US.UTF-8 7. 设置时区和时间 [root@localhost ~] timedatectl set-timezone Asia/Shanghai [root@localhost ~] timedatectl status 下载软件包 cd /soft2/ git clone https://gitee.com/opengauss/openGauss-server.git openGauss-server -b 5.0.0 wget -c https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/binarylibs/openGauss-third_party_binarylibs_openEuler_arm.tar.gz 脚本编译安装 1. openGauss-server编译 tar -xvf openGauss-third_party_binarylibs_openEuler_arm.tar.gz mv openGauss-third_party_binarylibs_openEuler_arm binarylibs cd openGauss-server/ sh build.sh -m debug -3rd /soft/binarylibs -pkg -m [debug | release | memcheck]表示可选择三种目标版本: release:代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生产环境或性能测试环境。 debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。 memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。  显示如下内容,表示编译成功。   生成的安装包会存放在./output目录下。  编译和打包日志为:./build/script/makemppdb_pkg.log。  编译后验证 编译结束后,可按以下方式对编译后的openGauss进行验证:  1. 创建用户 groupadd dbgrp useradd omm -g dbgrp passwd omm 2. 使用omm用户,在~/.bashrc中增加以下环境变量 su - omm vi ~/.bashrc 使环境变量生效  source .bashrc 3. 建立数据目录和日志目录 su - root chown -R omm:dbgrp /soft2/openGauss-server su - omm mkdir ~/data mkdir ~/log 4. 数据库初始化 su - omm gs_initdb -D /home/omm/data --nodename=db1 初始化日志如下:  The files belonging to this database system will be owned by user “omm”. This user must also own the server process. The database cluster will be initialized with locale “en_US.UTF-8”. The default database encoding has accordingly been set to “UTF8”. The default text search configuration will be set to “english”. fixing permissions on existing directory /home/omm/data … ok creating subdirectories … in ordinary occasionok creating configuration files … ok selecting default max_connections … 100 selecting default shared_buffers … 1024MB Begin init undo subsystem meta. [INIT UNDO] Init undo subsystem meta successfully. creating template1 database in /home/omm/data/base/1 … The core dump path is an invalid directory 2023-07-20 16:10:19.012 [unknown] [unknown] localhost 281468516106256 0[0:0#0] [BACKEND] WARNING: macAddr is 64174/3171074048, sysidentifier is 4205755650/3221270315, randomNum is 96513835ok initializing pg_authid … ok setting password … ok initializing dependencies … ok loading PL/pgSQL server-side language … ok creating system views … ok creating performance views … ok loading system objects’ descriptions … ok creating collations … ok creating conversions … ok creating dictionaries … ok setting privileges on built-in objects … ok initialize global configure for bucketmap length … ok creating information schema … ok loading foreign-data wrapper for distfs access … ok loading foreign-data wrapper for log access … ok loading hstore extension … ok loading foreign-data wrapper for MOT access … ok loading security plugin … ok update system tables … ok creating snapshots catalog … ok vacuuming database template1 … ok copying template1 to template0 … ok copying template1 to postgres … ok freezing database template0 … ok freezing database template1 … ok freezing database postgres … ok WARNING: enabling “trust” authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or –auth-local and --auth-host, the next time you run gs_initdb. Success. You can now start the database server of single node using: gaussdb -D /home/omm/data --single_node or gs_ctl start -D /home/omm/data -Z single_node -l logfile 5. 启动数据库 su - omm gs_ctl start -D /home/omm/data -Z single_node -l /home/omm/log/opengauss.log 启动完毕后可通过 ps -ef | grep gaussdb检查数据库进程情况,或通过 gs_ctl query -D /home/omm/data检查数据库状态,或使用 gsql -d postgres 进入gsql命令行查看数据库的相关信息。   FAQ 编译安装过程中遇到的问题  FAQ 1:python版本需要3.6+以上版本,操作系统自带的python2.7不符合要求,需要安装python3.7,不然编译脚本错误。  解决方案:  yum安装Python3.7  yum install python3 python3-pip 软链接python命令为python3.7  ln -s /usr/bin/python3.7 /usr/bin/python FAQ 2:一键式脚本编译build.sh使用 -m release编译release版本的二进制程序,初始化数据库报错。  解决方案:  目前还未解决,绕过方案使用-m debug编译debug版本的二进制程序.可以初始化数据库成功。  sh build.sh -m debug -3rd /soft/binarylibs -pkg -m [debug | release | memcheck]表示可选择三种目标版本: release:代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生产环境或性能测试环境。  debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。  memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 
  • [技术干货] 云原生可观测洞察及openEuler社区实践
    应用可观测性可以对企业运营产生的实际数据进行分析,可观测性将成为企业数据驱动决策的最强支撑。云原生时代的基础设施更复杂,也暴露出可观测性存在一些问题,包括基础设施观测能力不足,缺乏应用视角的基础设施观测数据等,这些都为下一代云原生可观测提供了机会与挑战。openEuler社区项目gala-gopher[1] 基于 eBPF 技术完成一系列全栈可观测实践工作。eBPF及其对可观测的意义 eBPF是一个能够在内核运行沙箱程序的技术,提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,使得非内核开发人员也可以对内核进行控制。随着内核的发展,eBPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等。原理:eBPF 由事件驱动,通过 Hook 方式在数据流中执行 eBPF 程序。Linux 内核中预定义了一系列常用的 Hook 点(用户态也有 uprobe、USDT 的动静态 Hook 点)。eBPF利用 Just-in-Time (JIT) 技术可以使eBPF代码的运行效率媲美内核原生代码和内核模块;Verification 机制可以保障eBPF 代码安全地运行,不会导致内核崩溃或进入死循环;eBPF Helper机制使 eBPF代码可以访问内核、应用的运行态数据、状态。可观测性:通过Hook内核、用户态程序,由数据流、系统事件等驱动 eBPF 沙箱内观测程序,可以灵活、按需的观测业务、系统状态,同时给可观测带来低负载、高安全、无侵入等技术特点。云原生场景运维带来的变化与挑战 云原生场景运维带来的变化与挑战:变化1:虚拟化单一架构中“一刀切”分层运维(基础设施、应用分层)向云原生场景融合式运维发展,需要提供全栈观测、运维能力;变化2:云原生多技术体系(Linux、CNCF 等)、快速演进等特点,要求可观测性解决方案与其应用/基础设施技术栈解耦,提供非侵入观测能力;变化3:云原生高密度、分布式部署方式,要求具备集群运维视角,从业务集群视角逐层/级定界、定位至具体问题根因。云原生上述技术特征使得可观测能力的构筑,天然应下沉至基础软件之内,而 eBPF 技术在基础软件(尤其是内核)的可观测性方面尤为突出。因为其技术特征天然与云原生可观测要求完美吻合:无侵入:通过 eBPF 字节注入技术可以快速地进行可编程无侵入式观测逻辑注入,轻松应对云原生场景快速迭代的场景特征。可移植&跨平台:通过标准eBPF ISA、CO-RE 等技术可以实现不同 Linux 版本、不同 ISA 架构、不同平台之间兼容相同 eBPF Program,可以轻松应对云原生场景中不同平台、系统混合部署的场景。全栈:通过 eBPF + USDT、eBPF + Tracepoint、eBPF + kprobe 等技术,可以覆盖内核、运行时、基础库等大部分基础软件,轻松应对云原生多语言、多网络协议、厚重软件栈的场景特征。业界洞察 可观测性在 K8S 场景逐渐重要,2023年云原生报告显示[2],云原生集群内辅助类应用工作负载上升至 63%,其中近 80% 的企业部署可观测性方案(同比增长 29%)。下面介绍几款业界较成熟的云原生运维系统:Deepflow 以网络为中心展开云原生场景运维工作,围绕 eBPF 构建可观测技术,在此基础上构建四大能力特性[3]:Universal Map:非侵入方式实时构建集群拓扑,全链路时延观测。Continuous Profiling:在线持续性代码性能剖析能力。Distributed Tracing:非侵入全链路分布式跟踪,覆盖ServiceMesh、数据库、DNS、NIC 等基础设施。无缝集成:数据存储可以无缝与Prometheus、Skywalking 等生态软件对接;数据采集侧可以无缝接入生态采集探针(OLTP等);观测数据携带 K8S、VPC等云平台上下文信息。Pixie Pixie 围绕 Kubernetes应用程序可观测性工具[4],基于 eBPF 技术构建,可以查看K8S集群运行状态(ServiceMap、集群资源、应用流量),还可以深入查看更详细的视图(pod 状态、火焰图、单个应用请求)。主要特性包括:(1)网络监控:K8S集群内网络流量监控,DNS 监控,TCP质量监控(丢包、重传、拥塞等)。(2)基础设施监控:Pod、Node、Namespace 等不同维度的资源(CPU、内存、网络、存储等)监控。(3)Service Performance:K8S Service 拓扑构建,Service 性能(覆盖 HTTP1.X,PGSQL,gRPC,Redis 等)监控,性能包括时延、吞吐量、错误率等。(4)应用性能Profiling:应用性能持续性能剖析,支持多语言栈的性能火焰图分析能力。(5)中间件监控(DB、Kafka 等):提供中间件关键数据流的观测能力,包括 DB 访问过程的观测,Kafka topic 生产/消费过程的观测等。eBPF的局限性及解决方案 在一些有独立运行时的高级语言场景中(尤其是 java),eBPF 的可观测性存在一些局限性,主要表现在:加密流(由JSSE 类库完成加减密)的可观测无法通过 eBPF + uprobe 方式完成观测,导致无法完成加密场景的网络可观测;语言堆栈信息不完整,比如无法有效获取JVM 堆内的软件栈信息,导致在性能Profiling时,堆栈信息不完整,不利于问题定位。解决方案:针对java场景的特殊性,结合java agent + eBPF技术,综合完成非侵入的可观测能力。例如 java 应用性能 Profiling 的解决思路如下:openEuler的实践情况介绍 openEuler社区项目gala-gopher[1]围绕eBPF 技术,并充分考虑多种观测技术的结合,采取探针式架构,通过集成探针快速构建观测能力,其观测全景图如下:关键特性 探针框架:提供 eBPF 探针框架,负责管理探针生命周期,以及探针任务管理、数据上报等工作。性能观测:以火焰图、timeline 图表形式辅助定位应用/系统的内存泄漏、死锁、CPU 调度等疑难故障。应用观测:提供进程粒度全栈性能观测能力,覆盖应用、容器、基础库/中间件、内核等。网络流量观测:提供云原生场景全流程跟踪能力,具备网络流拓扑构建能力(覆盖各种云原生网络场景),提供L4、L7 层流量各种指标采集能力。架构及关键技术特征 扩展性:探针式架构,按需开启采集范围&能力,亦可快速对接第三方探针。非侵入&多语言:应用/容器镜像零修改,无需重启;支持对多语言应用的观测,覆盖C/C++、Go、Java、Python 等主流语言。生态:支持OpenTelemetry生态接口,支持对接多种开源运维软件(Prometheus、ES等)。丰富的上下文:提供自动化标签能力,所有数据数据应用标签(进程信息、容器信息等)、Node 标签(IP、Machine ID等)、K8S 标签(POD 信息、Namespace 信息)等。详细能力可以参考社区文档[5]。相关链接 [1]gala-gopher gitee 源码仓:cid:link_4[2] 2023年云原生报告:cid:link_2[3] Deepflow 介绍:cid:link_1[4] Pixie 介绍:cid:link_3[5]gala-gopher 详细能力介绍:cid:link_0
  • [问题求助] Docker部署openGauss出现的问题
    我这边自己创建镜像,但是通过该镜像创建出的容器在运行几秒后就会自动关闭,其产生的错误日志如下:2024-04-25 21:11:52 [2024-04-25 13:11:52.569][176][][gs_ctl]: gs_ctl started,datadir is /var/lib/opengauss/data 2024-04-25 21:11:52 [2024-04-25 13:11:52.591][176][][gs_ctl]: waiting for server to start...2024-04-25 21:11:52 .0 LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Host Name: ffc7af174a53 2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Host IP: ffc7af174a53. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Get ENV GS_CLUSTER_NAME failed!2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 572024-04-25 21:11:52 2024-04-25 21:11:52 0 WARNING: failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.2024-04-25 21:11:52 0 WARNING: failed to parse feature control file: gaussdb.version.2024-04-25 21:11:52 0 WARNING: Failed to load the product control file, so gaussdb cannot distinguish product version.2024-04-25 21:11:52 The core dump path is an invalid directory2024-04-25 21:11:52 2024-04-25 13:11:52.644 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: when starting as multi_standby mode, we couldn't support data replicaton.2024-04-25 21:11:52 gaussdb.state does not exist, and skipt setting since it is optional.2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host Name: ffc7af174a53 2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host IP: ffc7af174a53. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Get ENV GS_CLUSTER_NAME failed!2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 572024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: loaded library "security_plugin"2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: reserved memory for backend threads is: 220 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: reserved memory for WAL buffers is: 128 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: Set max backend reserve memory is: 348 MB, max dynamic memory is: 8142 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: shared memory 3285 Mbytes, memory context 8490 Mbytes, max process memory 12288 Mbytes2024-04-25 21:11:52 2024-04-25 13:11:52.690 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [CACHE] LOG: set data cache size(402653184)2024-04-25 21:11:52 2024-04-25 13:11:52.712 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [SEGMENT_PAGE] LOG: Segment-page constants: DF_MAP_SIZE: 8156, DF_MAP_BIT_CNT: 65248, DF_MAP_GROUP_EXTENTS: 4175872, IPBLOCK_SIZE: 8168, EXTENTS_PER_IPBLOCK: 1021, IPBLOCK_GROUP_SIZE: 4090, BMT_HEADER_LEVEL0_TOTAL_PAGES: 8323072, BktMapEntryNumberPerBlock: 2038, BktMapBlockNumber: 25, BktBitMaxMapCnt: 5122024-04-25 21:11:52 2024-04-25 13:11:52.726 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: gaussdb: fsync file "/var/lib/opengauss/data/gaussdb.state.temp" success2024-04-25 21:11:52 2024-04-25 13:11:52.726 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: create gaussdb state file success: db state(STARTING_STATE), server mode(Normal), connection index(1)2024-04-25 21:11:52 2024-04-25 13:11:52.884 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: max_safe_fds = 976, usable_fds = 1000, already_open = 142024-04-25 21:11:52 The core dump path is an invalid directory2024-04-25 21:11:52 2024-04-25 13:11:52.886 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: user configure file is not found, it will be created.2024-04-25 21:11:52 2024-04-25 13:11:52.893 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: the configure file /usr/local/opengauss/etc/gscgroup_omm.cfg doesn't exist or the size of configure file has changed. Please create it by root user!2024-04-25 21:11:52 2024-04-25 13:11:52.893 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: Failed to parse cgroup config file.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] WARNING: Failed to obtain environment value $GAUSSLOG!2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] DETAIL: N/A2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] CAUSE: Incorrect environment value.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] ACTION: Please refer to backend log for more details.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] FATAL: ERROR: could not create instr log directory "pg_perf": Permission denied2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.920 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: FiniNuma allocIndex: 0.2024-04-25 21:11:53 [2024-04-25 13:11:53.593][176][][gs_ctl]: waitpid 179 failed, exitstatus is 256, ret is 22024-04-25 21:11:53 2024-04-25 21:11:53 [2024-04-25 13:11:53.594][176][][gs_ctl]: stopped waiting2024-04-25 21:11:53 [2024-04-25 13:11:53.594][176][][gs_ctl]: could not start server但是我直接在CentOS内本地安装却不会产生任何问题,因此这里求助各位大神,这种情况我需要做些什么?
  • [问题求助] OpenGauss:如何在函数/存储过程中对大批量插入中间数据的临时表做动态采样以确保仔细计划正确?
    我们写了一些函数/存储过程用来展现报表数据,为了存储中间数据用了临时表,并且临时表在运行过程中insert的数据量有时候会很大(百万级),因此在后续对这些临时表引用的时候,需要对这些表做动态采样,否则会导致执行计划有问题。在Oralce中,我们在函数/存储过程中在对临时表做关联查询的时候,采用 SELECT /*+ opt_param('OPTIMIZER_DYNAMIC_SAMPLING',6) */ 这样的hint 来要求做动态采样。在Opengauss中,我们先是尝试在INSERT 临时表数据后,通过ANALYZE tablename;来更新该临时表的统计信息,但是ANALYZE无法在函数/存储过程中执行,否则会报”ANALYZE cannot run inside a transaction block”。请问是否有其它办法可以在函数/存储过程中对临时表做动态采样?
  • [用户实践] OpenGauss 5.0 LTS低成本部署至华为云ECS CentOS8.2实操教程
    1 前言OpenGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统,然而其全功能部署对系统要求非常高。本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将OpenGauss部署到华为云的ECS上,以便快速进行功能验证以及小规模数据库应用开发。本教程预计实现的目标:开通安装有CentOS 8.2的华为云ECS安装并启动OpenGauss 5.0.0 LTS放通公网访问(本文部署到25432端口)能够使用Navicat等数据库软件以PostgreSQL兼容的方式进行连接本教程仅供实验测试使用,安全性较低,请勿在生产环境按该教程部署2 开通华为云ECS在华为云控制台中搜索弹性云服务器产品并购买相关参数解释说明与推荐区域:服务器所在的区域,不同区域定价差异较大,可以选择成本较低的区域如西南-贵阳一计费模式:若需要长期部署应用(如课程作业开发),推荐选择包月规格:服务器的配置,为了运行OpenGauss,内存必须2GB以上,推荐至少4GB,经测试若配置过低会导致数据库无法安装、运行或中途崩溃。成本较低的可以选择通用计算型s6(s6.medium.4),基础报价约86元每月。镜像:服务器预装的操作系统,OpenGauss只支持OpenEuler和CentOS系列。考虑到一些软件的支持性,本教程采用CentOS 8.2 64bit,尽管官方只说明能够在CentOS7.6上运行,但实测该系统也能够正常运行部署。系统盘:服务器运行的硬盘,若要节省成本可以选择高IO点击下一步(网络配置)网络、子网:保持默认配置即可安全组:为了能够使服务器能够在外网访问数据库端口,我们必须预先放通相关端口,本教程以部署在25432端口为例(修改了默认的端口以降低扫描器发现并爆破密码的几率),此外我们可以顺便放通22、80等常用端口(使用“一键放通常用端口”按钮)IP:为了公网访问,必须购买弹性IP。若服务器应用流量不大,推荐按流量计费,带宽可以选最高的(300M),建议勾选“随实例释放”避免在服务器过期后继续计费。按带宽计费成本非常高,不建议测试使用。点击下一步(高级配置)登录凭证:自行设定云备份:为节省成本可以关闭(不购买)支付:拥有基座课程代金券的同学可以使用代金券连续购买多个月,节省部署成本。(按流量计费的服务器产生的流量可能仍会额外消耗余额)至此,华为云ECS已经创建完成3 安装OpenGauss创建数据库专用账户OpenGauss的安全性设计必须以root以外的用户运行首先用刚才的凭证使用root用户连接到服务器在终端中运行以下命令groupadd dbgroup useradd -g dbgroup omm passwd omm 输入你的omm账户密码这创建了一个omm账户以及一个用户组下载OpenGauss下载、解压并调整相关文件权限curl -o opengauss.tar.gz https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/x86/openGauss-5.0.0-CentOS-64bit-all.tar.gz mkdir /opt/software/ mkdir /opt/software/openGauss tar -xvf opengauss.tar.gz -C /opt/software/ cd /opt/software/ tar -jxf openGauss-5.0.0-CentOS-64bit.tar.bz2 -C /opt/software/openGauss chown -R omm /opt/software/安装依赖对于本文档中的CentOS 8,由于已经停止支持,我们需要切换yum源,以清华大学源为例minorver=8.5.2111 sudo sed -e "s|^mirrorlist=|#mirrorlist=|g" \ -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/$minorver|g" \ -i.bak \ /etc/yum.repos.d/CentOS-*.repoCentOS 8安装供CentOS 7.6使用的OpenGauss会遇到一些问题,我们必须安装一些依赖yum install -y readline-devel libaio libnsl compat-openssl10 cd /usr/lib64 ln -s libreadline.so.7 libreadline.so.6安装以下的命令将OpenGauss安装到25432端口,密码请在命令行中“设定的高强度密码”修改su omm cd /opt/software/openGauss/simpleInstall sh install.sh -w 设定的高强度密码 -p 25432 vim ~/.bashrc # *注释*ulimit那行(在行最前加一个#)若没有可以忽略 source ~/.bashrc配置兼容、外网访问众所周知,OpenGauss拥有PostgreSQL兼容的接口,若在此进行相关修改便可以在应用处无需修改使用主流软件的PG驱动连接数据库服务器使用。我们下面来修改默认配置使其兼容PG的连接器。cd /opt/software/openGauss/data/single_node vim postgresql.conf添加/取消注释以下行listen_addresses = '*' local_bind_address = '0.0.0.0' password_encryption_type = 0vim pg_hba.confhost all all 0.0.0.0/0 md5启动或重启数据库(omm用户)gs_ctl restart -D $GAUSSHOME/data/single_node进入数据库命令行(omm用户)创建一个名为postgres的管理用户(因为默认的omm用户无法从外部登录),密码请在命令行中定义gsql -d postgres -p 25432create user postgres password '你的高强度密码'; GRANT ALL PRIVILEGES TO postgres; \q 退出至此,你已经可以使用Navicat等软件连接到数据库了。若提示找不到gs_ctl、gsql等命令,请在/opt/software/openGauss/下找到bin目录,并将其加入Path至此,本教程结束~欢迎各位同学交流学习
  • [技术干货] openGauss数据库常用sql指令
    openGauss数据库作为一款基于SQL标准的关系型数据库管理系统,支持广泛的SQL指令进行数据操作、查询、管理以及权限控制。以下是openGauss数据库中一些常用的SQL指令示例,涵盖了数据定义(DDL)、数据操纵(DML)、数据查询(DQL)和数据控制(DCL)等方面:数据定义(DDL)创建数据库CREATE DATABASE db_name;创建用户CREATE USER username WITH PASSWORD 'password';创建表CREATE TABLE table_name ( column1 datatype, column2 datatype, ... constraint_name constraint_type (column_list) ); -- 示例 CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, department VARCHAR(50), salary DECIMAL(10, 2) );修改表结构ALTER TABLE table_name ADD COLUMN new_column datatype; -- 或 ALTER TABLE table_name DROP COLUMN column_to_remove;创建索引CREATE INDEX idx_name ON table_name (column_to_index);数据操纵(DML)插入数据INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); -- 示例 INSERT INTO employees (id, name, department, salary) VALUES (1, 'John Doe', 'Sales', 50000.00);更新数据UPDATE table_name SET column1 = new_value1, column2 = new_value2, ... WHERE condition; -- 示例 UPDATE employees SET salary = salary * 1.1 WHERE department = 'Sales';删除数据DELETE FROM table_name WHERE condition; -- 示例 DELETE FROM employees WHERE department = 'Marketing';数据查询(DQL)基本查询SELECT column1, column2, ... FROM table_name WHERE condition ORDER BY column1 [ASC|DESC] LIMIT limit_count OFFSET offset_count; -- 示例 SELECT id, name, salary FROM employees WHERE department = 'IT' ORDER BY salary DESC LIMIT 10;聚合函数SELECT COUNT(*), AVG(salary), MAX(salary), MIN(salary) FROM employees;连接查询SELECT e.id, e.name, d.department_name FROM employees e JOIN departments d ON e.department = d.department_id;数据控制(DCL)授予权限GRANT privilege_list ON object TO user; -- 示例 GRANT SELECT, INSERT, UPDATE ON employees TO user1;撤销权限REVOKE privilege_list ON object FROM user;提交与回滚事务BEGIN TRANSACTION; -- 执行一系列操作... COMMIT; -- 提交事务,永久保存更改 -- 或 ROLLBACK; -- 回滚事务,取消所有未提交的更改会话管理ALTER SESSION SET parameter_name = value; -- 示例 ALTER SESSION SET search_path = 'public, my_schema';系统管理-- 查看数据库状态 SELECT pg_stat_activity FROM pg_catalog.pg_stat_activity; -- 重启数据库 SELECT pg_ctl restart;
  • [技术干货] 探索openGauss:一款国产高性能、高安全关系型数据库
    引言在数字化浪潮席卷全球的当下,数据库作为数据存储与管理的核心组件,其选择直接影响着企业的数据处理效能、业务连续性以及信息安全水平。其中,openGauss作为一款由华为公司主导研发的开源关系型数据库,凭借其卓越的性能、高度的安全性、灵活的部署选项以及积极的社区建设,正逐渐成为众多企业与开发者关注的焦点。本文将详细介绍openGauss的特点、优势以及在实际应用中可能遇到的挑战,以助读者全面认识这一国产数据库翘楚。openGauss概览起源与发展openGauss起源于华为公司在数据库领域的深厚积累与实践经验,以PostgreSQL为基础进行深度定制与优化,旨在为企业级应用场景提供稳定、高效且易于维护的关系型数据库解决方案。项目于2020年正式开源,采用木兰宽松许可证v2发行,鼓励社区贡献与合作,致力于构建一个开放、活跃的生态系统。核心技术特性高性能多核优化:openGauss专为现代多核架构设计,通过并发控制技术和硬件(如华为鲲鹏处理器)深度优化,实现显著的性能提升。TPCC Benchmark测试结果显示,在两路鲲鹏环境下,openGauss可达到150万tpmc的高水平性能。NUMA-aware设计:针对非一致性内存访问(NUMA)架构,openGauss内核关键结构采用NUMA-aware数据结构,减少跨NUMA节点的数据交换,降低延迟,提高大规模并行处理效率。智能引擎:提供Sql-bypass智能快速引擎和融合引擎技术,前者用于简化查询路径,后者则融合多种处理机制,优化复杂查询性能。高可用与容灾多样化的部署模式:支持主备同步、异步复制以及级联备机部署,可根据业务需求选择合适的冗余级别和数据同步策略,确保数据的实时性与一致性。自动故障恢复:通过数据页CRC校验机制检测数据完整性,一旦发现损坏,能够利用备机自动修复,保障业务连续性。数据安全访问控制:精细的权限管理体系,涵盖系统权限与对象权限,确保用户访问权限的精确控制。控制权与访问权分离:特别针对系统管理员角色,实现表对象控制权与访问权的分离,增强普通用户数据安全性,限制不必要的管理员权限。智能运维与调优基于AI的调优:集成AI算法,实现自动化性能监控与智能调优,减轻数据库管理员的工作负担,持续优化数据库运行状态。高效运维工具:提供丰富的运维管理工具和接口,如ODBC与JDBC接口支持,方便用户快速迁移业务并进行日常运维。openGauss的优势国产化支持:作为国内自主研发的数据库产品,openGauss积极响应国家信息技术自主创新战略,有助于企业降低对外依赖,符合数据安全与合规要求。卓越性能:通过多核优化、NUMA-aware设计以及智能引擎技术,openGauss在处理大规模并发访问与复杂查询方面表现出色,满足高负载业务需求。高可用与容错能力:多样化的部署模式与自动故障恢复机制,确保在硬件故障、网络中断等情况下业务连续运行,数据零丢失。深度安全防护:严格的访问控制体系与创新的安全设计,有效防范数据泄露、恶意攻击等风险,保障企业核心数据资产安全。开放生态与社区支持:作为开源项目,openGauss鼓励社区参与,共享资源与知识,加速产品迭代与问题解决,形成良好的用户与开发者生态。openGauss的挑战与局限尽管openGauss具备诸多优点,但作为新兴的数据库产品,也面临着一些挑战与潜在局限:市场成熟度与认知度:相较于成熟的商业数据库或广为人知的开源数据库,openGauss在市场知名度与用户基数上可能稍逊一筹,需要持续推广与案例积累以增强市场认可度。生态系统完善程度:尽管openGauss社区在快速发展,但与久经考验的大型开源项目相比,周边工具、插件、文档资料、第三方集成等生态系统要素可能还不够丰富,用户在特定场景下可能需要更多自研或寻求社区支持。特定功能与兼容性:尽管openGauss基于PostgreSQL开发,但在某些高级特性和特定行业的功能支持上,可能与原生PostgreSQL存在差异,用户在迁移或集成现有应用时需关注兼容性问题。专业服务与支持:虽然有社区支持,但对于需要高级技术支持或定制化服务的企业,可能需要评估华为及其他合作伙伴提供的专业服务覆盖范围与响应速度是否能满足自身需求。总结来说,openGauss作为一款国产高性能、高安全的关系型数据库,凭借其强大的技术实力与开放的社区生态,为各行业用户提供了一种可靠的国产化替代选项。在考虑采用openGauss时,企业应结合自身业务需求、技术栈现状、数据安全要求以及未来发展规划,进行全面评估与测试,以确保其能够成为驱动业务发展的坚实数据基石。
  • [运维管理] openEuler系统通过shell脚本安装opengauss 5.0.0企业版
    上次提到的开机自启动的配置,获得了LD的称赞,然而LD的要求,都是“既得陇复望蜀”的,他又期望我们能实现opengauss安装的“自动化”,于是尝试了下用shell脚本部署,附件中的脚本实测有效,openEuler 20.03 LTS通过shell脚本建议操作部署opengauss 5.0.0企业版成功。说明:除了安装opengauss的shell脚本外,还需要准备两个配置文件,一个是opengauss集群的配置文件:cluster_config.xml;另外一个是openeuler的repo文件,yum源需要用到。这两个并非安装脚本内容,因此不多做介绍。安装过程和手工安装基本类似,因此下面简单描述下脚本执行的过程,供参考和指正!1. 执行前首先创建好安装包存放的路径,下载好安装包,并且把安装的shell脚本,以及cluster_config文件,以及openeuler的repo文件,都copy到系统中的某个文件夹下,如:/opt/software/opengaussshellinstall。当然也可以通过wget下载安装包,朋友们感兴趣可以自己调整脚本。其中的...zhaofeng.tar文件为安装成功后需要restore的备份数据。2. 注意安装脚本copy后可能会没有执行权限,需要执行chmod +x shelltest.sh(脚本文件名),修改权限。3. 脚本通过变量读取安装包所在的位置,因此执行命令时需要附上安装包所在的路径:./bin/shelltest.sh /opt/software/opengaussshellinstall4. 脚本大致分为下面几部分:4.1 检查并修改python版本;4.2 安装三方依赖件expect, libaio等,包括脚本中用到的tar以及net-tools;4.3 修改performance.conf文件(本步可选);4.4 修改profile文件,增加opengauss相关的环境变量;4.5 创建opengauss安装路径,copy安装包,cluster配置文件等到opengauss安装路径,默认为/opt/software/opengauss,可根据需要修改脚本,也可以做成变量,感兴趣可以自行调整;4.6 修改cluster文件,替换本机ip地址及hostname,替换app, log等路径;4.7 解压安装包;4.8 preinstall4.9 install4.10 修改postgresql.conf和pg_hba.conf文件,使数据库可以被远程连接;4.11 创建数据库,创建用户,restore之前备份的数据。4.12 重启数据库。如此则整个过程完成。
  • openGauss数据库的启动、连接和退出
    ​ 1. 在openEular中执行“su - omm”切换到omm用户。su - omm输入用户名和密码登入openEular系统; 在命令行执行“su - omm”切换到omm用户; 在命令行执行“gs_om -t start”,启动cluster终端; 在命令行执行“gsql -d postgres -p 26000 -r”与数据库取得连接并设置超时时间; Postgres是系统默认的公共数据库,有时要进入自己创建的数据库还需执行“\c 数据库名”切换到指定数据库中。 “\q”退出数据库。2. 执行“gs_om -t start”,启动数据库服务。gs_om -t start3.  使用gsql命令执行“gsql -d postgres -p 26000”连接数据库。gsql -d postgres -p 260004.  执行“\q”退出数据库。\q通过openGauss数据库的上机实践,我总结启动opengauss数据库的方法为:输入用户名和密码登入openEular系统; 在命令行执行“su - omm”切换到omm用户; 在命令行执行“gs_om -t start”,启动cluster终端; 在命令行执行“gsql -d postgres -p 26000 -r”与数据库取得连接并设置超时时间; Postgres是系统默认的公共数据库,有时要进入自己创建的数据库还需执行“\c 数据库名”切换到指定数据库中。 “\q”退出数据库。 ​
  • Navicat连接openGauss
    navicat连接openGauss配置pg_hba.confsu - ommvi /gauss/data/db1/pg_hba.conf通过cmd ipconfig指令查询客户端ip地址在配置文件中# IPv4 local connection下加入下列行,加密方式修改为md5host all all [客户端ip] md5修改密码加密方式vi /gauss/data/db1/postgresql.conf找到注释password_encryption_type = 2 ,解除注释将值改为0,表示修改加密方式为md5重启openGaussgs_om -t restart修改用户密码,使之用默认的加密方式重新加密连接到openGaussgsql -d postgres -p 26000 -r修改密码,注意新旧密码不能相同alter user [用户名] identified by ‘新密码’;打开Navicat,选择新建连接-postgresql,主机、端口填写openGauss服务器的ip和端口初始数据库选择postgres,用户名密码填刚刚更改后用md5加密的,点击新建连接
  • [技术干货] OpenGauss对数据进行完整性控制
     主要为创建触发器和建立约束创建约束创建主键约束(以在school模式下创建Manager基本表并为Muid添加主键约束为例)。​2、创建唯一性约束。将STUDENT表中的SNAME列设为唯一键约束。​COURSE表中的CNAME列设为唯一键约束。​3、创建外键约束为学生选课表SC的Sno添加来自学生表STUDENT的Sno的外键约束。​4、创建检查约束为管理员表MANAGER的Sex属性添加检查是否为男或女的约束。​实验内容二 创建触发器创建在学生表STUDENT更新学生学号Sno时触发的触发器。​测试触发器。​
总条数:63 到第
上滑加载中