Skip to main content

关系型数据库服务器-OpenGauss

关系型数据库服务器-OpenGauss

简介

openGauss是关系型数据库,采用客户端/服务器模式和单进程多线程架构;支持单机和一主多备部署方式,备机可读;支持双机高可用和读扩展。

:::note

■本示例以openGauss-1.1.0 ARM版本为例,进行安装介绍。

■操作系统升级后,需要将对应版本的openGauss数据库也一并进行升级,详情请参见“注意事项”。

■物理机或者虚拟机安装openGauss数据库时需要物理CPU支持sse4.2等指令集。

■虚拟机安装openGauss数据库时,需要在xml中配置host-passthrough模式,如下所示: :::

安装

sw_64架构暂不支持

153执行如下命令,创建临时目录并修改目录权限。

mkdir -p /opt/software/openGauss

chmod 755 -R /opt/software

154执行如下命令,将上传后的安装包解压。

cd /opt/software/openGauss

tar -xf /opt/software/openGauss/openGauss-1.1.0-UOS-64bit-all.tar.gz

tar -xf /opt/software/openGauss/openGauss-1.1.0-UOS-64bit-om.tar.gz

:::note 安装包请联系统信软件售后服务人员获取并上传至对应的目录。 :::

155执行如下命令,添加用户。

useradd omm

groupadd dbgrp

echo "123456 123456" | passwd omm

156执行如下命令,创建安装目录并修改目录权限。

mkdir -p /opt/huawei/install/

chmod -R 777 /opt/huawei/

chown omm.dbgrp -R /opt/huawei/

chown omm.dbgrp -R /opt/software/

chmod 755 -R /opt/software/

mkdir -p /opt/huawei/install/

chmod -R 777 /opt/huawei/

userdel -fr omm

cd /opt/software/openGauss/script

sh -x auto_config.sh

157执行如下命令,修改“/opt/software/openGauss/clusterconfig.xml”中的IP地址为本机IP地址。

sed -i "s/localhost/xx.xx.xx.xx/g" /opt/software/openGauss/clusterconfig.xml

158执行如下命令,执行预安装。

./gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml

chown omm.dbgrp -R /opt/software/

159执行如下命令,开始安装。

su - omm

cd /opt/software/openGauss/script

./gs_install -X /opt/software/openGauss/clusterconfig.xml

:::note

■如果这一步出现"/opt/huawei/install/om/script/local/../gspylib/component/Kernel/Kernel.py", line 87, in start等报错,请用root权限执行如下命令。 :::

sed -i "s/#enable_numa.*/enable_numa = false/g" /opt/huawei/install/data/db1/mot.conf

if numactl --hardware |grep "size.*0 MB";then

sed -i "s/#enable_numa.*/enable_numa = false/g" /opt/huawei/install/data/db1/mot.conf

fi

  • 如发生不能分配内存片导致的错误,如Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (1341 Mbytes) is larger.,说明内存不足,可以执行如下命令。

sync;echo 1 > /proc/sys/vm/drop_caches

  • 执行上述命令后,将强制释放cache。此时,再执行如下命令,减少shared_buffers,然后去数据目录下找到postgressql.conf修改对应参数,如/opt/huawei/install/data/db1/postgresql.conf。

#max_process_memory = 3GB ###之前是2GB,无法运行

#shared_buffers = 256KB ###修改后需要重启安装程序

160执行如下命令,启动服务并查看状态。

#gs_om -t start

#gs_om -t status --detail

基本用法

  • 启动openGauss:以操作系统用户omm登录数据库主节点,使用gs_om -t start命令启动openGauss。

[omm@node1 ~]$ gs_om -t start

Starting cluster.

=========================================

=========================================

Successfully started.

  • 停止openGauss:以操作系统用户omm登录数据库主节点,使用gs_om -t stop命令停止openGauss。

[omm@node1 ~]$ gs_om -t stop

Stopping cluster.

=========================================

Successfully stopped cluster.

=========================================

End stop cluster.

  • 查看openGauss:以操作系统用户omm登录数据库主节点,使用gs_om -t status --detail命令查询openGauss各实例情况。

[omm@node1 ~]$ gs_om -t status --detail

distName:UOS version:20 idNum:

[ Cluster State ]

cluster_state : Normal

redistributing : No

current_az : AZ_ALL

[ Datanode State ]

node node_ip instance state


1 node1 192.168.0.128 6001 /opt/huawei/install/data/db1 P Primary Normal

如上部署了数据库主节点实例的服务器IP地址为192.168.0.128,数据库主节点数据路径为“/opt/huawei/install/data/db1”。

在查询到的数据库主节点数据路径下的“postgresql.conf”文件中查看端口号信息,示例如下:

[omm@node1 ~]$ cat /opt/huawei/install/data/db1/postgresql.conf | grep port

(change requires restart)

port = 26000

amount of data between renegotiations, no longer supported

#ssl_renegotiation_limit = 0

Assigned by installation (change requires restart)

#comm_sctp_port = 1024

Assigned by installation (change requires restart)

#comm_control_port = 10001

supported by the operating system:

The heartbeat thread will not start if not set localheartbeatport and remoteheartbeatport.

:::note 26000为数据库主节点的端口号。 :::

数据库连接

gsql是openGauss提供的在命令行下运行的数据库连接工具。此工具除了具备操作数据库的基本功能,还提供了若干高级特性,便于用户使用。本节只介绍如何使用gsql连接数据库,关于gsql使用方法的更多信息请参考gsql。

  • 使用gsql本地连接

161以操作系统用户omm登录数据库主节点。

162使用gsql本地连接数据库。

gsql -d postgres -p 26000

163连接成功后,系统显示类似如下信息表示数据库连接成功。

[omm@localhost ~]$ gsql -d postgres -p 26000

gsql ((openGauss 1.1.0 build 392c0438) compiled at 2020-12-31 20:08:06 commit 0 last mr )

Non-SSL connection (SSL connection is recommended when requiring high-security)

  Type "help" for help.

postgres=#

其中,postgres为openGauss安装完成后默认生成的数据库,初始可以连接到此数据库进行新数据库的创建。26000为数据库主节点的端口号,需根据openGauss的实际情况做替换。

164首次登录需要修改密码,原始密码为安装openGauss数据库时手动输入的密码。下方创建了一个用户名为omm、密码为uoserpasswd的用户。

ALTER ROLE omm IDENTIFIED BY 'uoserpasswd' REPLACE '123456';

  • 使用gsql远程连接

◆通过gs_guc配置白名单

165以操作系统用户omm登录数据库主节点。

166配置客户端认证方式,允许客户端以“jack”用户连接到本机,此处远程连接禁止使用“omm”用户(即数据库初始化用户)。例如,下面示例中配置允许IP地址为192.168.0.127的客户端访问本机,先本地连接数据库,并在数据库中使用如下语句建立“jack”用户。

postgres=# CREATE USER jack PASSWORD 'Test@123';

167配置白名单。

[omm@node1 ~]$ gs_guc set -N all -I all -h "host all jack 192.168.0.127/32 sha256"

Begin to perform the total nodes: 1.

Popen count is 1, Popen success count is 1, Popen failure count is 0.

Begin to perform gs_guc for datanodes.

Command count is 1, Command success count is 1, Command failure count is 0.

Total instances: 1. Failed instances: 0.

ALL: Success to perform gs_guc!

:::note

■-N:all表示openGauss的所有主机。

■-I:all表示主机的所有实例。

■-h:表示指定需要在“pg_hba.conf”增加的语句。

■all:表示允许客户端连接到任意的数据库。

■jack:表示连接数据库的用户。 :::

168按照以下格式手动修改本地“pg_hba.conf”文件。

host DATABASE USER ADDRESS METHOD

192.168.x.x/32表示只允许IP地址为192.168.x.x的主机连接。此处的IP地址不能为openGauss内的IP地址,在使用过程中,请根据用户的网络进行配置修改。32表示子网掩码为1的位数,即255.255.255.255。sha256表示连接时jack用户的密码使用sha256算法加密,如果写成trust,则会报以下错误:

gsql: FATAL: Forbid remote connection with trust method!

FATAL: Forbid remote connection with trust method!

同时,由于all代表所有用户,也包括了jack,所以要将jack那行写在all上面,否则也会走到all的配置里。

:::note 修改此配置文件不用重启数据库 :::

◆安装gsql客户端并连接数据库

169以root登录客户端,上传客户端工具包并配置gsql的执行环境变量。

170执行如下命令,创建“/tmp/tools”目录。

mkdir /tmp/tools

171将软件安装包中的“openGauss-1.1.0-ODBC.tar”上传到“/tmp/tools”路径下。软件包相对位置为安装时所放位置,请根据实际情况填写。不同的操作系统,工具包文件名称会有差异,请根据实际情况选择对应的工具包。

172执行如下命令,解压文件。

cd /tmp/tools

tar -zxvf openGauss-1.1.0-ODBC.tar

173执行如下命令,登录数据库主节点所在的服务器,拷贝数据库安装目录下的bin目录到客户端“/tmp/tools”路径下。随后继续登录客户端执行步骤6操作。

scp -r /opt/huawei/install/app/bin root@192.168.0.127:/tmp/tools

其中,“/opt/huawei/install/app”为“clusterconfig.xml”文件中配置的{gaussdbAppPath}路径,192.168.0.127为客户端的IP地址。

174执行如下命令,设置环境变量。(在客户端操作)

vi ~/.bashrc

175执行如下命令,使环境变量配置生效。(在客户端操作)

source ~/.bashrc

176执行如下命令,连接数据库。(在客户端操作)

gsql -d postgres -h 192.168.0.128 -U jack -p 26000 -W Test@123

) SSL onnection (cipher:DHE-RSA-AES128-GCM-SHA256, bits:128) Type "help" for help. postgres=>)

:::note

■postgres为需要连接的数据库名称,192.168.0.128为数据库主节点所在的服务器IP地址,jack为连接数据库的用户,26000为数据库主节点的端口号,Test@123为连接数据库的用户jack的密码。

■连接openGauss的机器与openGauss不在同一网段时,-h指定的IP地址应为Manager界面上所设的coo.cooListenIp2(应用访问IP)的取值。

■禁止使用omm用户进行远程连接数据库。

■数据库安装完成后,默认生成名称为postgres的数据库,第一次连接数据库时可以连接到此数据库。 :::

创建和管理表

表是建立在数据库中的,在不同的数据库中可以存放相同的表,甚至可以通过使用模式在同一个数据库中创建相同名称的表。

  • 创建表:执行如下命令创建表。

postgres=# CREATE TABLE customer_t1(

c_customer_sk             integer,

c_customer_id             char(5),

c_first_name              char(6),

c_last_name               char(8));

其中c_customer_sk、c_customer_id、c_first_name和c_last_name是表的字段名,integer、char(5)、char(6)和char(8)分别是这些字段名的类型。

  • 向表中插入数据:向表customer_t1中插入一行,数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。

postgres=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');

'hello','Grace'); INSERT 01)

◆如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如,以下命令与上面的命令效果相同。

postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');

◆如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:

postgres=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');

postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello');

◆用户也可以对独立的字段或者整个行明确缺省值。例如:

postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);

postgres=# INSERT INTO customer_t1 DEFAULT VALUES;

◆如果需要在表中插入多行,请使用以下命令:

postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES

(6885, 'maps', 'Joes'),

(4321, 'tpcds', 'Lily'),

(9527, 'world', 'James');

(6885,'maps',"Joes'), (4321,"'tpcds","Lily'), (9527,'world',"James):postgres-#postgres-#postgres-#postgres-#postgres-#postgres -# INSERT 03)

如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现,但是使用此命令可以提升效率。

◆如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。

postgres=# CREATE TABLE customer_t2

(

c_customer_sk             integer,

c_customer_id             char(5),

c_first_name              char(6),

c_last_name               char(8)

);

postgres=# INSERT INTO customer_t2 SELECT * FROM customer_t1;

c_first_name char(6), C_last_name char(8) ):postgres-#postgres#postgres(#postgres(#postgres(#postgres(#postgres(#postgres(#po stgres(#postgres(#postgres(#postgres(# CREATE TABLE postgres=#NSER INT customer_t2 SELECT* FROM customer_t1; INSERT04)

◆从指定表插入数据到当前表时,若指定表与当前表对应的字段数据类型之间不存在隐式转换,则这两种数据类型必须相同。

  • 删除表:执行如下命令删除表。

postgres=# DROP TABLE customer_t2 CASCADE;

在删除表的时候,若当前需删除的表与其他表有依赖关系,需先删除关联的表,然后再删除当前表。

  • 更新表中数据:修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行;还可以独立更新每个字段,而其他字段则不受影响。使用UPDATE命令更新现有行,需要提供以下三种信息:

◆表的名称和要更新的字段名。

◆字段的新值。

◆要更新哪些行。

SQL通常不会为数据行提供唯一标识,因此无法直接声明需要更新哪一行。但是可以通过声明一个被更新的行必须满足的条件。只有在表里存在主键的时候,才可以通过主键指定一个独立的行。

建立表和插入数据的步骤请参考创建表和向表中插入数据。

需要将表customer_t1中c_customer_sk为9527的地域重新定义为9876:

postgres=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527;

postgres=# UPDATE customer_t1 SET c_customer_sk=9876 WHERE _customer_sk=9527; UPDATE 1 postgres=# SELECT* FROM customer_t1; customer_sk|_customer_id |c_first_name|c_last_name 3769| hello Grace 6885 Joes maps 4321 tpcds Lily 9876 world James (4roWs))

这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值,新的字段值不仅可以是常量,也可以是变量表达式。例如,把所有c_customer_sk的值增加100:

postgres=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100;

在这里省略了WHERE子句,表示表中的所有行都要被更新。如果出现了WHERE子句,那么只有匹配其条件的行才会被更新。

在SET子句中的等号是一个赋值,而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试,许多其他的操作符也可以使用。

用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,例如:

postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;

批量更新或删除数据后,会在数据文件中产生大量的删除标记,查询过程中标记删除的数据也是需要扫描的。故多次批量更新/删除后,标记删除的数据量过大会严重影响查询的性能。建议在批量更新/删除业务会反复执行的场景下,定期执行VACUUM FULL以保持查询性能。

  • 查看表中的数据

◆执行如下命令,使用系统表pg_tables查询数据库所有表的信息。

postgres=# SELECT * FROM pg_tables;

◆执行如下命令,使用gsql的\d+命令查询表的属性。

postgres=# \d+ customer_t1;

◆执行如下命令,查询表customer_t1的数据量。

postgres=# SELECT count(*) FROM customer_t1;

count (1row))

◆执行如下命令,查询表customer_t1的所有数据。

postgres=# SELECT * FROM customer_t1;

◆执行如下命令,只查询字段c_customer_sk的数据。

postgres=# SELECT c_customer_sk FROM customer_t1;

◆执行如下命令,过滤字段c_customer_sk的重复数据。

postgres=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1;

◆执行如下命令,查询字段c_customer_sk为3869的所有数据。

postgres=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869;

◆执行如下命令,按照字段c_customer_sk进行排序。

postgres=# SELECT * FROM customer_t1 ORDER BY c_customer_sk;

  • 删除表中数据:在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。SQL不能直接访问独立的行,只能通过声明被删除行匹配的条件进行。如果表中有一个主键,用户可以指定准确的行。用户可以删除匹配条件的一组行或者一次删除表中的所有行。

◆使用DELETE命令删除行,例如删除表customer_t1中所有c_customer_sk为3869的记录:

postgres=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869;

◆执行如下命令之一,会删除表中所有的行。

postgres=# DELETE FROM customer_t1;

或

postgres=# TRUNCATE TABLE customer_t1;

◆删除全表的场景下,建议使用truncate清空表数据,不建议使用delete。

postgres=# TRUNCATE TABLE customer_t1;

postgres=#)

◆执行如下命令,删除创建的表。

postgres=# DROP TABLE customer_t1;

其他操作

  • 查看系统表:除了创建的表以外,数据库还包含很多系统表。这些系统表包含openGauss安装信息以及openGauss上运行的各种查询和进程的信息。可以通过查询系统表来收集有关数据库的信息。“查看系统表和系统视图”中每个表的说明指出了表是对所有用户可见还是只对初始化用户可见。必须以初始化用户身份登录才能查询只对初始化用户可见的表。openGauss提供了以下类型的系统表和视图:

◆继承自PG的系统表和视图,这类系统表和视图具有PG前缀。

◆openGaussl新增的系统表和视图,这类系统表和视图具有GS前缀。

◆查看数据库中包含的表。例如,在PG_TABLES系统表中查看public schema中包含的所有表。

SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public';

结果类似如下这样:

tablename


err_hr_staffs

test

err_hr_staffs_ft3

web_returns_p1

mig_seq_table

films4

(6 rows)

  • 查看数据库用户:查询PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。

SELECT * FROM pg_user;

  • 查看和停止正在运行的查询语句:通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句,方法是设置参数track_activities为on。

SET track_activities = on;

◆当track_activities为on时,数据库系统才会收集当前活动查询的运行信息,查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例:

SELECT datname, usename, state,pid FROM pg_stat_activity;

datname | usename | state | pid

----------+---------+--------+-----------------

postgres | Ruby | active | 140298793514752

postgres | Ruby | active | 140298718004992

postgres | Ruby | idle | 140298650908416

postgres | Ruby | idle | 140298625742592

postgres | omm | active | 140298575406848

(5 rows)

如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。

◆如果仅需要查看非空闲的查询语句,则使用如下命令查看:

SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle';

◆若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID结束会话。

SELECT PG_TERMINATE_BACKEND(139834759993104);

显示类似如下信息,表示结束会话成功。

显示类似如下信息,表示用户执行了结束当前会话的操作。

FATAL: terminating connection due to administrator command

FATAL: terminating connection due to administrator command

gsql客户端使用PG_TERMINATE_BACKEND函数结束当前会话后台线程时,客户端不会退出而是自动重连。即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”。

FATAL: terminating connection due to administrator command

FATAL: terminating connection due to administrator command

The connection to the server was lost. Attempting reset: Succeeded.

  • 创建和管理视图:当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。

◆创建视图:执行如下命令,创建新视图MyView。

postgres=# CREATE OR REPLACE VIEW MyView AS SELECT * FROM customer_t1 WHERE c_customer_id >1000;

CREATE VIEW

CREATE VIEW中的OR REPLACE可有可无,当存在OR REPLACE时,表示若以前存在该视图就进行替换。

◆查询视图:执行如下命令,查询MyView视图。

postgres=# SELECT * FROM MyView;

◆查看某视图的具体信息:执行如下命令,查询dba_users的详细信息。

postgres=# \d+ dba_users

View "PG_CATALOG.DBA_USERS"

Column | Type | Modifiers | Storage | Description

----------+-----------------------+-----------+----------+-------------

USERNAME | CHARACTER VARYING(64) | | extended |

View definition:

SELECT PG_AUTHID.ROLNAME::CHARACTER VARYING(64) AS USERNAME

FROM PG_AUTHID;

i "I WGTV OTES #=SPSo)

◆删除视图:执行如下命令,删除MyView视图。

postgres=# DROP VIEW MyView;

DROP VIEW

注意事项

由于版本差异,操作系统升级后,请重新获取对应版本的openGauss数据库安装包进行安装。安装前请做好数据备份。

参考

其他操作,如创建schema、创建分区表、创建索引等,请参考opengauss官网的指导:https://opengauss.org/zh/docs/1.1.0/docs/Technicalwhitepaper/Technicalwhitepaper.html