快速安装openGauss
本文基于centOS7.6环境,目的是简单快速安装openGauss企业版本,官方安装文档有更加详细步骤和说明 。
官方安装文档地址https://docs.opengauss.org/zh/docs/6.0.0/docs/InstallationGuide
安装前准备
关闭防火墙
systemctl disable firewalld.service
systemctl stop firewalld.service
关闭SELINUX
vim etc/selinux/config
SELINUX=disabled 修改“SELINUX”的值“disabled
reboot复制
(1)安装依赖包
yum install openssl* -y
yum install python3* -y
yum install libaio-devel readline-devel expect -y复制
(2)下载和解压安装包
登录https://opengauss.org/zh/download/ 下载企业版
mkdir -p opt/software/openguass 上传到此目录
解压
tar -xzvf openGauss-All-6.0.1-CentOS7-x86_64.tar.gz
tar -xzvf openGauss openGauss-OM-6.0.1-CentOS7-x86_64.tar.gz复制
(3)修改主机名
hostnamectl set-hostname node1
vi etc/hosts
{ip} node1复制
(4)配置库环境变量
export LD_LIBRARY_PATH=/opt/software/openGauss/script/gspylib/clib:$LD_LIBRARY_PATH
复制
(5)编辑配置文件
clusterconfig.xml文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。 用户需根据不同场景配置对应的XML文件。
vi opt/software/openguass/clusterconfig.xml
需要修改的地方只有nodeNames的值,改为第3步的主机名,还有修改为自己的主机IP地址<?xml version="1.0" encoding="UTF-8"?><ROOT> <!-- openGauss整体信息 --> <CLUSTER> <!-- 数据库名称 --> <PARAM name="clusterName" value="dbCluster" /> <!-- 数据库节点名称(hostname) --> <PARAM name="nodeNames" value="node1" /> <!-- 数据库安装目录--> <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" /> <!-- 日志目录--> <PARAM name="gaussdbLogPath" value="/var/log/omm" /> <!-- 临时文件目录--> <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp" /> <!-- 数据库工具目录--> <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" /> <!-- 数据库core文件目录--> <PARAM name="corePath" value="/opt/huawei/corefile" /> <!-- 节点IP,与数据库节点名称列表一一对应 --> <!-- 如果用ipv6 替换ipv4地址即可 如:<PARAM name="backIp1s" value="2407:xxxx:xxxx:xxxx:xxxx:xxxx:caa:2335"/> --> <PARAM name="backIp1s" value="10.1.20.8"/> </CLUSTER> <!-- 每台服务器上的节点部署信息 --> <DEVICELIST> <!-- 节点1上的部署信息 --> <DEVICE sn="node1"> <!-- 节点1的主机名称 --> <PARAM name="name" value="node1"/> <!-- 节点1所在的AZ及AZ优先级 --> <PARAM name="azName" value="AZ1"/> <PARAM name="azPriority" value="1"/> <!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> <!-- 用ipv6安装部署时 换上ipv6地址即可,后面xml文件示例也是同样操作 --> <PARAM name="backIp1" value="10.1.20.8"/> <PARAM name="sshIp1" value="10.1.20.8"/> <!--dbnode--> <PARAM name="dataNum" value="1"/> <PARAM name="dataPortBase" value="26000"/> <PARAM name="dataNode1" value="/opt/huawei/install/data/dn"/> <PARAM name="dataNode1_syncNum" value="0"/> </DEVICE> </DEVICELIST></ROOT>复制
(6)初始化安装环境
该步骤用root用户执行
cd /opt/software/openGauss/script
./gs_preinstall -U omm -G dbgrp -X opt/software/openGauss/clusterconfig.xml
这步会创建omm用户,需要设置omm密码复制
(7)使用gs_install安装openGauss
chmod -R 755 opt/software/openGauss/script/
chown -R omm:dbgrp opt/software/openGauss/script/
cp ../clusterconfig.xml .
gs_install -X opt/software/openGauss/script/clusterconfig.xml
需要设置密码 aaAA11__
Successfully started cluster.
Successfully installed application.
end deploy..复制
(8)登录
gsql -d postgres -p 26000 -r
openGauss=#复制
openGauss内存结构

本地内存区
maintenance_work_mem:维护操作 vacuum,reindex使用
temp_buffers:临时表使用
work_mem:order by 和distinct 操作对元组进行排序,通过merge-join 和hash join 操作对表进行连接时使用复制
共享内存区
shared_buffers:控制行存缓冲区大小
建议设置为内存的25~40%(没有单位以块为单位)
cstore_buffers:控制列存缓冲区大小
建议设置为内存/节点个数*0.4*0.25
wal_buffers:wal log数据的缓冲区
设置为-1 为自动调节大小
MOT buffer:全局内存,是一个长期内存池,包含MOT的数据和索引。平均分布在NUMA节点,由所有CPU核共享。复制
openGauss线程结构

postmaster进程
1.数据库初始化时,为后端线程设置共享内存结构;
2.数据库的启停;
3.监听客户端连接,为每个客户端连接调用单独的服务线程;
4.管理与数据库运行相关的辅助线程;
5.线程垃圾回收,当后端服务线程紧急退出或者内核dump时,清理后端线程;
6.错误报告;复制
BgWriter
把共享内存中的脏页写到磁盘上的线程。
正常状态下,bgwriter在刷新完缓存后,会等待时长bgwriter_delay(默认10秒)。当连续两次都没有要刷新的缓存,那么就会进入冬眠状态,等待时长变为50*bgwriter_delay。复制
PageWriter
负责将脏页数据拷贝至双写(double-writer)区域并落盘,然后将脏页转发给bgwriter子线程进行数据落盘操作。
复制
autovacuum launcher 和 autovacuum worker
自动清理回收垃圾进程
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
• 触发vacuum-->
表上新增变化(update,delete) >= autovacuum_vacuum_scale_factor* reltuples(表上记录数) + autovacuum_vacuum_threshold
• 触发vacuum analyze-->
表上新增(insert,update,delte) >= autovacuum_analyze_scale_factor* reltuples(表上记录数) + autovacuum_analyze_threshold
• 触发vacuum freeze-->
指定表上事务的最大年龄配置参数autovacuum_freeze_max_age,默认为2亿,达到这个阀值将触发
autovacuum进程,从而避免wraparound复制
wal writer
定期将wal_buffers缓冲区的日志写入磁盘
延迟写入,最多是wal_writer_delay周期时间的三倍。复制
checkpointer
数据库采用wal机制,日志落盘,内存数据异步落盘,数据库重启时,内存还没落盘导致数据丢失,所以需要重放wal日志恢复内存中的数据,不过wal日志会累计变大,导致恢复时间很长,用checkpoint机制,定期将缓存刷新到磁盘。数据的恢复只需要从刷新点开始重放wal日志。
触发条件
1.时间触发:距离上次执行时间间隔超过指定值(checkpoint_timeout)
2.wal日志:当最新的wal日志和上次checkpoint的刷新点的距离大于指定值checkpoint_complete_target
3.手动触发
4.数据库关闭
5.基础备份
6.数据库崩溃修复复制
其他线程
archiver
将wal日志拷贝备份目录
StatCollector
统计信息收集线程
SysLogger
日志线程,将消息或错误信息写入日志
auditor
审计线程复制
openGauss存储结构
安装后目录
根据配置文件中的内容,主要目录如下
openGauss安装目录 /opt/huawei/install/app
openGauss数据目录 /opt/huawei/install/data/dn
openGauss日志目录 /var/log/omm/用户名
openGauss系统工具目录 /opt/huawei/install/om
openGauss临时文件目录 opt/huawei/tmp
/opt/huawei/install/data/dn/
global 元数据、数据字典 存放目录
base 默认表空间
pg_tblspc 用户指定表空间
oid和relfilenode
oid不变,relfilenode会变
openGauss=# select oid,relfilenode from pg_class where relname='t1';
oid | relfilenode -------+------------- 16384 | 16384(1 row)oopenGauss=# select pg_relation_filepath('t1'::regclass); pg_relation_filepath ---------------------- base/15741/16384(1 row)create tablespace test_tbs relative location 'tablespace/testtbs01';select oid,* from pg_tablespace;16390create table t2 (id number) tablespace test_tbs;openGauss=# select oid,relfilenode from pg_class where relname='t2'; oid | relfilenode -------+------------- 16391 | 16391(1 row)openGauss=# select pg_relation_filepath('t2'::regclass); pg_relation_filepath ------------------------------------------------------ pg_tblspc/16390/PG_9.2_201611171_dn_6001/15741/16391(1 row)openGauss=# truncate table t2;TRUNCATE TABLEopenGauss=# select oid,relfilenode from pg_class where relname='t2'; oid | relfilenode -------+------------- 16391 | 16397(1 row)复制
t1表没有指定表空间,所以创建在base目录下,t2表指定了表空间,所以在pg_tblspc目录下,对表t2进行truncate操作后,relfilenode变化。
oid 类似身份证号,relfilenode 户口本上的户号。地址变了,户号就会变。 truncate,vacuum full ,删除重建表都会导致relfilenode 变化。
日志和文件
告警日志位置(结合配置文件看)
/var/log/omm/omm/pg_log/dn_6001操作系统日志 vim var/log/messages日志收集gs_collector --begin-time="20250320 01:01" --end-time="20250320 11:11"解压tar -xzvf collector_20250320_111114.tar.gz控制文件/opt/huawei/install/data/dn/pg_controlpg_controldata opt/huawei/install/data/dn/访问控制文件pg_hba.conf复制
openGauss日常运维
数据库启停
查看服务状态
ps -ef |grep gaussgs_om -t status --detailgs_ctl status -D opt/huawei/install/data/dn启动gs_om -t startgs_ctl start -D opt/huawei/install/data/dn停止gs_om -t stop gs_ctl stop -D opt/huawei/install/data/dn -m f 一致性gs_ctl stop -D opt/huawei/install/data/dn -m i 非一致性复制
vacuum操作
表膨胀
有效数据量不变,表越来越大,扫描的效率变低。是因为opengauss的MVCC机制问题,在写数据时,旧数据不删除,把新数据插入,将旧数据标记为无效,清理之前一直占用空间。执行update的话就是insert+delete的原理,依然会导致表膨胀。vacuum的作用磁盘清理dead tuple ;更新统计信息;重组数据;解决事务ID回卷问题。vacuum : 不要求获得排它锁,找到那些旧的“死”数据,标记为可用状态,不进行空间合并vacuum full: 就是除了vacuum,进行空间合并,它需要lock tablevacuum analyze: 更新统计信息,使得优化器能够选择更好的方案执行sqlvacuum freeze: 表记录冻结,可解决事务id回卷的问题vacuum做了什么1、清除update或delete 操作后留下的死元组2、跟踪表块中可用空间,更新free space map3、更新visibility map,index only scan 以及后续vacuum都会利用到4、冻结表中的行,防止事务ID回卷5、配合analyze ,定期更新统计信息FSM简单来说,就是vacuum只是清理死元组,利用FSM可以高效的将空间管理起来,方便查找和重新使用。visibility mapall_visible为t表示全部可见,不包含死元组,作用是加快vacuum,进行vacuum时,当扫描到all_visible为t时,则直接跳过。复制
检查openGauss状态
检查实例状态
gs_check -U omm -i CheckClusterState复制
检查锁信息
锁机制是数据库保证数据一致性的重要手段,检查相关信息可以检查数据库的事务和运行状况。
查询数据库中的锁信息
openGauss=# SELECT * FROM pg_locks;
查询等待锁的线程状态信息
openGauss=# SELECT * FROM pg_thread_wait_status WHERE wait_status = 'acquire lock';复制
统计事件数据
SQL语句长时间运行会占用大量系统资源,用户可以通过查看事件发生的时间,占用内存大小来了解现在数据库运行状态。
查询事件的线程启动时间、事务启动时间、SQL启动时间以及状态变更时间。
openGauss=# SELECT backend_start,xact_start,query_start,state_change FROM pg_stat_activity;
查询当前服务器的会话计数信息
openGauss=# SELECT count(*) FROM pg_stat_activity;
查询当前使用内存最多的会话信息。
openGauss=# SELECT * FROM pv_session_memory_detail() ORDER BY usedsize desc limit 10;复制
对象检查
表、索引、分区、约束等是数据库的核心存储对象
查看表的详细信息 openGauss=# \d+ table_name 查询表统计信息 openGauss=# SELECT * FROM pg_statistic;查看索引的详细信息 openGauss=# \d+ index_name查询分区表信息 openGauss=# SELECT * FROM pg_partition;查询约束信息 openGauss=# SELECT * FROM pg_constraint;复制
备份
指定用户导出数据库
gs_dump dbname -p port -f out.sql -U user_name -W password
导出schema
gs_dump dbname -p port -n schema_name -f out.sql
导出table
gs_dump dbname -p port -t table_name -f out.sql复制
检查数据库性能
1. 以操作系统用户omm登录数据库主节点。
2. 执行如下命令对openGauss数据库进行性能检查。gs_checkperf[omm@node1 15741]$ gs_checkperfCluster statistics information: Host CPU busy time ratio : 2.92 % MPPDB CPU time % in busy time : 57.95 % Shared Buffer Hit ratio : 60.06 % In-memory sort ratio : 0 Physical Reads : 530109 Physical Writes : 16200 DB size : 67 MB Total Physical writes : 16200 Active SQL count : 4 Session count复制
kill空闲连接
执行如下SQL语句,查看state字段等于idle,且state_change字段长时间没有更新过的连接信息。
openGauss=# SELECT * FROM pg_stat_activity where state='idle' order by state_change;
释放空闲的连接数。
查看每个连接,并与此连接的使用者确认是否可以断开连接,或执行如下SQL语句释放连接。其中,pid为上一步查询中空闲连接所对应的pid字段值。
openGauss=# SELECT pg_terminate_backend(140390132872976);复制
重建索引
如果数据发生大量删除后,索引页面上的索引键将被删除,但索引页面并不会直接删除,即索引页面数量并不会减少,因此会造成索引膨胀。重建索引可回收浪费的空间。
新建的索引中逻辑结构相邻的页面,通常在物理结构中也是相邻的,所以一个新建的索引比更新了多次的索引访问速度要快。
重建索引有以下两种方式:
- 先运行DROP INDEX语句删除索引,再运行CREATE INDEX语句创建索引。
在删除索引过程中,会在父表上增加一个短暂的排他锁,阻止相关读写操作。在创建索引过程中,会锁住写操作但是不会锁住读操作,此时读操作只能使用顺序扫描。
- 使用REINDEX语句重建索引。
- 使用REINDEX TABLE语句重建索引,会在重建过程中增加排他锁,阻止相关读写操作。
- 使用REINDEX INTERNAL TABLE语句重建desc表(包括列存表的cudesc表)的索引,会在重建过程中增加排他锁,阻止相关读写操作。
复制
