openGauss维护管理之基本操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openGauss维护管理之基本操作相关的知识,希望对你有一定的参考价值。
一、概述
二、数据库开发试验
1、登录数据库
su - omm
[omm@gsdb01 ~]$ gsql -d postgres -p 26000 -r
gsql ((openGauss 3.1.1 build 70980198) compiled at 2023-01-06 09:27:09 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
2、创建和管理用户
1、创建用户
通过CREATE USER创建的用户,默认具有LOGIN权限;
通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;
用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。
系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。
创建用户jim,登录密码为Bigdata@123。
openGauss=# create user jim password Bigdata@123;
NOTICE: The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
同样的下面语句也可以创建用户。
openGauss=# create user dim identified by Bigdata@123;
如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。
openGauss=# create user kim createdb password Bigdata@123;
2、管理用户
将用户jim的登录密码由Bigdata@123修改为Abcd@123。
alter user jim identified by Abcd@123 replace Bigdata@123;
为用户jim追加CREATEROLE权限。
alter user jim createrole;
将enable_seqscan的值设置为on,设置成功后,在下一会话中生效。
alter user jim set enable_seqscan to on;
锁定jim帐户。
alter user jim account lock;
删除用户。
openGauss=# drop user jim cascade;
openGauss=# drop user dim cascade;
openGauss=# drop user kim cascade;
3、创建和管理表空间
1、创建和管理表空间
步骤 1 执行如下命令创建用户jack。
create user jack identified by Bigdata@123;
步骤 2 执行如下命令创建表空间。
create tablespace fastspace relative location tablespace/tablespace_1;
CREATE TABLESPACE
其中“fastspace”为新创建的表空间,“数据库节点数据目录pg_location/tablespace/tablespace_1”是用户拥有读写权限的空目录,
如 /opt/huawei/install/data/dn01/pg_location/tablespace/tablespace_1/。
步骤 3 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限赋予数据用户jack。
grant CREATE on TABLESPACE fastspace to jack;
2、管理表空间
查询表空间
方式1:检查pg_tablespace系统表。如下命令可查到系统和用户定义的全部表空间。
openGauss=# select spcname from pg_tablespace ;
spcname
------------
pg_default
pg_global
fastspace
(3 rows)
方式2:使用gsql程序的元命令查询表空间。
openGauss=# \\db
List of tablespaces
Name | Owner | Location
------------+-------+-------------------------
fastspace | omm | tablespace/tablespace_1
pg_default | omm |
pg_global | omm |
(3 rows)
查询表空间使用率
步骤 1 查询表空间的当前使用情况。
openGauss=# select pg_tablespace_size(fastspace);
pg_tablespace_size
--------------------
4096
(1 row)
其中4096表示表空间的大小,单位为字节。
步骤 2 计算表空间使用率。
表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小。
3、修改表空间
执行如下命令对表空间fastspace重命名为fspace。
alter tablespace fastspace rename to fspace;
4、删除表空间
执行如下命令删除用户jack。
drop user jack cascade;
执行如下命令删除表空间fspace。
drop tablespace fspace;
说明:用户必须是表空间的owner或者系统管理员才能删除表空间。
4、创建和管理数据库
1、创建数据库
步骤 1 使用如下命令创建一个新的表空间tpcds_local。
create tablespace tpcds_local relative location tablespace/tablespace_2;
步骤 2 使用如下命令创建一个新的数据库db_tpcc。
create database db_tpcc with tablespace = tpcds_local ;
2、管理数据库
查看数据库
使用\\l元命令查看数据库系统的数据库列表(l表示list)。
openGauss=# \\l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
db_test | joe | UTF8 | en_US.utf8 | en_US.utf8 |
db_tpcc | omm | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | omm | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +
| | | | | omm=CTc/omm
template1 | omm | UTF8 | en_US.utf8 | en_US.utf8 | =c/omm +
| | | | | omm=CTc/omm
(5 rows)
使用如下命令通过系统表pg_database查询数据库列表。
openGauss=# select datname from pg_database;
datname
-----------
template1
db_test
template0
db_tpcc
postgres
(5 rows)
3、修改数据库
用户可以使用如下命令修改数据库属性(比如:owner、名称和默认的配置属性)。
使用以下命令为数据库设置默认的模式搜索路径。
alter database db_tpcc set search_path to pa_catalog,public;
使用如下命令为数据库重新命名。
alter database db_tpcc rename to human_tpcds;
4、删除数据库
用户可以使用DROP DATABASE命令删除数据库。此命令删除了数据库中的系统目录,并且删除了带有数据的磁盘上的数据库目录。
用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时,删除操作会失败。删除数据库时请先连接到其他的数据库。
使用如下命令删除数据库:
drop database human_tpcds ;
5、创建和管理表
1、创建表
表是建立在数据库中的,在不同的数据库中可以存放相同的表。甚至可以通过使用模式在同一个数据库中创建相同名称的表。
执行如下命令创建表。
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)分别是这四字段名称的类型。
2、向表中插入数据
向表customer_t1中插入一行数据
数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。
insert into customer_t1(c_customer_sk,c_customer_id,c_first_name) values(3769,hello,Grace);
如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。
INSERT INTO customer_t1 VALUES (3769, hello, Grace);
如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:
INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, Grace);
或
INSERT INTO customer_t1 VALUES (3769, hello);
用户也可以对独立的字段或者整个行明确缺省值:
INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, hello, DEFAULT);
或
INSERT INTO customer_t1 DEFAULT VALUES;
向表中插入多行数据
命令如下:
INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES
(6885, maps, Joes),
(4321, tpcds, Lily),
(9527, world, James);
如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令可以提升效率。
从指定表插入数据到当前表
如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表
customer_t2中,则可以执行如下命令。
CREATE TABLE customer_t2
(
c_customer_sk integer,
c_customer_id char(5),
c_first_name char(6),
c_last_name char(8)
);
插入数据:
INSERT INTO customer_t2 SELECT * FROM customer_t1;
删除备份表:
DROP TABLE customer_t2 CASCADE;
3、更新表中数据
修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行,所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。
需要将表customer_t1中c_customer_sk为9527的字段重新定义为9876:
update customer_t1 set c_customer_sk=9876 where c_customer_sk=9527;
这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是
变量表达式。比如,把所有c_customer_sk的值增加100:
update customer_t1 set c_customer_sk=c_customer_sk+100;
用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如:
update customer_t1 set c_customer_id=Admin,c_first_name=local where c_customer_sk=4421;
4、查看数据
使用系统表pg_tables查询数据库所有表的信息。
select * from pg_tables;
使用gsql的\\d+命令查询表的结构。
\\d+ customer_t1
执行如下命令查询表customer_t1的数据量。
select count(*) from customer_t1 ;
执行如下命令查询表customer_t1的所有数据。
select * from customer_t1 ;
执行如下命令只查询字段c_customer_sk的数据。
select c_customer_sk from customer_t1 ;
执行如下命令过滤字段c_customer_sk的重复数据。
select distinct(c_customer_sk) from customer_t1 ;
执行如下命令查询字段c_customer_sk为3869的所有数据。
select * from customer_t1 where c_customer_sk=3869;
执行如下命令按照字段c_customer_sk进行排序。
select * from customer_t1 order by c_customer_sk;
执行如下命令查询ROWNUM伪列。
select rownum,c_customer_sk,c_customer_id from customer_t1 ;
rownum | c_customer_sk | c_customer_id
--------+---------------+---------------
1 | 3869 | hello
2 | 6985 | maps
3 | 9976 | world
4 | 4421 | Admin
(4 rows)
执行如下命令使用别名进行查询(CNB、CSK、CID为列别名,T 为表别名)。
openGauss=# select rownum CNB,c_customer_sk CSK,c_customer_id CID from customer_t1 ;
cnb | csk | cid
-----+------+-------
1 | 3869 | hello
2 | 6985 | maps
3 | 9976 | world
4 | 4421 | Admin
(4 rows)
5、删除表中数据
在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。
使用DELETE命令删除行,如果删除表customer_t1中所有c_customer_sk为3869的记录:
delete from customer_t1 where c_customer_sk=3869;
如果执行如下命令之一,会删除表中所有的行。
delete from customer_t1 ;
或:
TRUNCATE TABLE customer_t1;
全表删除的场景下,建议使用truncate,不建议使用delete。
删除创建的表:
drop table customer_t1 ;
6、创建和管理schema
1、创建schema
执行如下命令来创建一个schema。
create schema myschema;
如果需要在模式中创建或者访问对象,其完整的对象名称由模式名称和具体的对象名称组成。中间由符号“.”隔开。例如:myschema.table。
执行如下命令在创建schema时指定owner。
CREATE SCHEMA myschema AUTHORIZATION omm;
2、使用schema
在特定schema下创建对象或者访问特定schema下的对象,需要使用有schema修饰的对象名。该名称包含schema名以及对象名,他们之间用“.”号分开。
执行如下命令在myschema下创建mytable表。
create table myschema.mytable(id int,name varchar(20));
如果在数据库中指定对象的位置,就需要使用有schema修饰的对象名称。
执行如下命令查询myschema下mytable表的所有数据。
select * from myschema.mytable;
3、schema的搜索路径
可以设置search_path配置参数指定寻找对象可用schema的顺序。在搜索路径列出的第一个schema会变成默认的schema。如果在创建对象时不指定
schema,则会创建在默认的schema中。
执行如下命令查看搜索路径。
openGauss=# show search_path;
search_path
----------------
"$user",public
(1 row)
执行如下命令将搜索路径设置为myschema、public,首先搜索myschema。
set search_path to myschema,public;
openGauss=# select * from mytable;
id | name
----+------
(0 rows)
4、schema的权限控制
默认情况下,用户只能访问属于自己的schema中的数据库对象。如果需要访问其他schema的对象,则该schema的所有者应该赋予他对该schema的
usage权限。
通过将模式的CREATE权限授予某用户,被授权用户就可以在此模式中创建对象。注意默认情况下,所有角色都拥有在public模式上的USAGE权限,但是
普通用户没有在public模式上的CREATE权限。普通用户能够连接到一个指定数据库并在它的public模式中创建对象是不安全的,如果普通用户具有在
public模式上的CREATE权限,则建议通过如下语句撤销该权限。
撤销PUBLIC在public模式下创建对象的权限,下面语句中第一个“public”是模式,第二个“PUBLIC”指的是所有角色。
postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
使用以下命令查看现有的schema:
openGauss=# select current_schema();
current_schema
----------------
myschema
(1 row)
执行如下命令创建用户jack,并将myschema的usage权限赋给用户jack。
create user jack identified by Bigdata@123;
grant usage on schema myschema to jack;
将用户jack对于myschema的usage权限收回。
revoke usage on schema myschema from jack;
5、删除schema
当schema为空时,即该schema下没有数据库对象,使用DROP SCHEMA命令进行删除。例如删除名为nullschema的空schema。
openGauss=# drop schema if exists nullschema;
NOTICE: schema "nullschema" does not exist, skipping
DROP SCHEMA
当schema非空时,如果要删除一个schema及其包含的所有对象,需要使用CASCADE关键字。例如删除myschema及该schema下的所有对象。
openGauss=# drop schema myschema cascade;
NOTICE: drop cascades to table mytable
DROP SCHEMA
执行如下命令删除用户jack。
openGauss=# drop user jack cascade;
DROP ROLE
7、创建和管理分区表
1、创建分区表
步骤 1 创建schema。
CREATE SCHEMA tpcds;
步骤 2 创建表空间。
create tablespace example1 relative location tablespace1/tablespace_1;
create tablespace example2 relative location tablespace2/tablespace_2;
create tablespace example3 relative location tablespace3/tablespace_3;
create tablespace example4 relative location tablespace4/tablespace_4;
步骤 3 创建分区表并插入数据。
CREATE TABLE tpcds.web_returns_p2
(
ca_address_sk integer NOT NULL ,
ca_address_id character(16) NOT NULL ,
ca_street_number character(10) ,
ca_street_name character varying(60) ,
ca_street_type character(15) ,
ca_suite_number character(10) ,
ca_city character varying(60) ,
ca_county character varying(30) ,
ca_state character(2) ,
ca_zip character(10) ,
ca_country character varying(20) ,
ca_gmt_offset numeric(5,2) ,
ca_location_type character(20)
)
TABLESPACE example1
PARTITION BY RANGE (ca_address_sk)
(
PARTITION P1 VALUES LESS THAN(5000),
PARTITION P2 VALUES LESS THAN(10000),
PARTITION P3 VALUES LESS THAN(15000),
PARTITION P4 VALUES LESS THAN(20000),
PARTITION P5 VALUES LESS THAN(25000),
PARTITION P6 VALUES LESS THAN(30000),
PARTITION P7 VALUES LESS THAN(40000),
PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2
)
ENABLE ROW MOVEMENT;
插入数据。
insert into tpcds.web_returns_p2 values(1, a, 1, a, a, a, a, a, a, a, a, 1.0, a),
(2, b, 2, b, b, b, b, b, b, b, b, 1.1, b),
(5050, c, 300, c, c, c, c, c, c, c, c, 1.2, c),
(14888, d, 400, d, d, d, d, d, d, d, d, 1.5, d);
2、管理分区表
修改分区表行迁移属性
alter table tpcds.web_returns_p2 disable row movement;
删除分区P8
alter table tpcds.web_returns_p2 drop partition P8;
增加分区P8,范围为 40000<= P8<=MAXVALUE
alter table tpcds.web_returns_p2 add partition P8 values less than (maxvalue);
重命名分区P8为P_9。
alter table tpcds.web_returns_p2 rename partition P8 to P_9;
重命名分区P_9为P8。
alter table tpcds.web_returns_p2 rename partition for (40000) to P8;
修改分区P6的表空间为example3。
alter table tpcds.web_returns_p2 move partition P6 tablespace example3;
修改分区P4的表空间为example4。
alter table tpcds.web_returns_p2 move partition P4 tablespace example4;
3、查询分区
select * from tpcds.web_returns_p2 partition(P1);
ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_
location_type
---------------+------------------+------------------+----------------+-----------------+-----------------+---------+-----------+----------+------------+------------+---------------+------
----------------
1 | a | 1 | a | a | a | a | a | a | a | a | 1.00 | a
2 | b | 2 | b | b | b | b | b | b | b | b | 1.10 | b
(2 rows)
4、删除分区表和表空间
drop table tpcds.web_returns_p2 ;
drop tablespace example1;
drop tablespace example2;
drop tablespace example3;
drop tablespace example4;
8、创建和管理索引
1、准备工作
步骤 1 创建表空间
create tablespace example1 relative location tablespace1/tablespace_1;
create tablespace example2 relative location tablespace2/tablespace_2;
create tablespace example3 relative location tablespace3/tablespace_3;
create tablespace example4 relative location tablespace4/tablespace_4;
步骤 2 创建表并在表中插入数据。
CREATE TABLE tpcds.web_returns_p2
(
ca_address_sk integer NOT NULL ,
ca_address_id character(16) NOT NULL ,
ca_street_number character(10) ,
ca_street_name character varying(60) ,
ca_street_type character(15) ,
ca_suite_number character(10) ,
ca_city character varying(60) ,
ca_county character varying(30) ,
ca_state character(2) ,
ca_zip character(10) ,
ca_country character varying(20) ,
ca_gmt_offset numeric(5,2) ,
ca_location_type character(20)
)
TABLESPACE example1
PARTITION BY RANGE (ca_address_sk)
(
PARTITION P1 VALUES LESS THAN(5000),
PARTITION P2 VALUES LESS THAN(10000),
PARTITION P3 VALUES LESS THAN(15000),
PARTITION P4 VALUES LESS THAN(20000),
PARTITION P5 VALUES LESS THAN(25000),
PARTITION P6 VALUES LESS THAN(30000),
PARTITION P7 VALUES LESS THAN(40000),
PARTITION P8 VALUES LESS THAN(MAXVALUE) TABLESPACE example2
)
ENABLE ROW MOVEMENT;
插入数据。
insert into tpcds.web_returns_p2 values
(1, a, 1, a, a, a, a, a, a, a, a, 1.0, a),
(2, b, 2, b, b, b, b, b, b, b, b, 1.1, b),
(5050, c, 300, c, c, c, c, c, c, c, c, 1.2, c),
(14888, d, 400, d, d, d, d, d, d, d, d, 1.5, d);
2、创建索引
创建分区表索引tpcds_web_returns_p2_index1,不指定索引分区的名称。#指定创建的分区索引为LOCAL索引。
create index tpcds_web_returns_p2_index1 on tpcds.web_returns_p2 (ca_address_id) local;
创建分区索引tpcds_web_returns_p2_index2,并指定索引分区的名称。
CREATE INDEX tpcds_web_returns_p2_index2 ON tpcds.web_returns_p2 (ca_address_sk) LOCAL
(
PARTITION web_returns_p2_P1_index,
PARTITION web_returns_p2_P2_index TABLESPACE example3,
PARTITION web_returns_p2_P3_index TABLESPACE example4,
PARTITION web_returns_p2_P4_index,
PARTITION web_returns_p2_P5_index,
PARTITION web_returns_p2_P6_index,
PARTITION web_returns_p2_P7_index,
PARTITION web_returns_p2_P8_index
) TABLESPACE example2;
2、管理索引
修改索引分区的表空间
修改索引分区web_returns_p2_P2_index的表空间为example1。
alter index tpcds.tpcds_web_returns_p2_index2 move partition web_returns_p2_P2_index tablespace example1;
修改索引分区web_returns_p2_P3_index的表空间为example2。
alter index tpcds.tpcds_web_returns_p2_index2 move partition web_returns_p2_P3_index tablespace example3;
执行如下命令对索引分区web_returns_p2_P8_index重命名web_returns_p2_P8_index_new。
alter index tpcds.tpcds_web_returns_p2_index2 rename partition web_returns_p2_P8_index to web_returns_p2_P8_index_new;
3、查询索引
执行如下命令查询系统和用户定义的所有索引。
select relname from pg_class where relkind=i;
执行如下命令查询指定索引的信息。
openGauss=# \\di+ tpcds.tpcds_web_returns_p2_index1
List of relations
Schema | Name | Type | Owner | Table | Size | Storage | Description
--------+-----------------------------+-------+-------+----------------+-------+---------+-------------
tpcds | tpcds_web_returns_p2_index1 | index | omm | web_returns_p2 | 88 kB | |
(1 row)
4、删除索引
drop index tpcds.tpcds_web_returns_p2_index1;
drop index tpcds.tpcds_web_returns_p2_index2;
5、索引创建举例
openGauss支持4种创建索引的方式:唯一索引、多字段索引、部分索引、表达式索引。
步骤 1 创建一个普通表。
CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.web_returns_p2;
步骤 2 创建普通索引。
如果对于tpcds.customer_address_bak表,需要经常进行以下查询。
SELECT ca_address_sk FROM tpcds.customer_address_bak WHERE ca_address_sk=14888;
使用以下命令创建索引。
CREATE INDEX index_wr_returned_date_sk ON tpcds.customer_address_bak (ca_address_sk);
步骤 3 创建多字段索引
假如用户需要经常查询表tpcds.customer_address_bak中ca_address_sk是5050,且ca_street_number小于1000的记录,使用以下命令进行查
询。
SELECT ca_address_sk,ca_address_id FROM tpcds.customer_address_bak WHERE ca_address_sk = 5050 AND ca_street_number
< 1000;
使用以下命令在字段ca_address_sk和ca_street_number上定义一个多字段索引。
CREATE INDEX more_column_index ON tpcds.customer_address_bak(ca_address_sk ,ca_street_number);
步骤 4 创建部分索引
如果只需要查询ca_address_sk为5050的记录,可以创建部分索引来提升查询效率。
CREATE INDEX part_index ON tpcds.customer_address_bak(ca_address_sk) WHERE ca_address_sk = 5050;
步骤 5 创建表达式索引
假如经常需要查询ca_street_number小于1000的信息,执行如下命令进行查询。
SELECT * FROM tpcds.customer_address_bak WHERE trunc(ca_street_number) < 1000;
可以为上面的查询创建表达式索引:
CREATE INDEX para_index ON tpcds.customer_address_bak (trunc(ca_street_number));
步骤 6 删除tpcds.customer_address_bak表。
postgres=# DROP TABLE tpcds.customer_address_bak;
9、创建和管理视图
1、创建视图
执行如下命令创建普通视图MyView。
create or replace view MyView as select * from tpcds.web_returns_p2 where trunc(ca_address_sk) > 10000;
执行如下命令创建物化视图MV_MyView。
create materialized view MV_MyView as select * from tpcds.web_returns_p2 where trunc(ca_address_sk) > 5000;
物化视图使用场景:报表统计、大表统计等,定期固化数据快照, 避免对多表重复跑相同的查询。
物化视图使用注意事项:
不可以在临时表或全局临时表上创建。
当基表数据发生变化时,需要使用刷新命令保持物化视图与基表同步。
2、管理视图
执行如下命令查询MyView视图。
select * from myview ;
查看普通图的具体信息
执行如下命令查询MyView视图的详细信息。
openGauss=# \\d+ myview
View "public.myview"
Column | Type | Modifiers | Storage | Description
------------------+-----------------------+-----------+----------+-------------
ca_address_sk | integer | | plain |
ca_address_id | character(16) | | extended |
ca_street_number | character(10) | | extended |
ca_street_name | character varying(60) | | extended |
ca_street_type | character(15) | | extended |
ca_suite_number | character(10) | | extended |
ca_city | character varying(60) | | extended |
ca_county | character varying(30) | | extended |
ca_state | character(2) | | extended |
ca_zip | character(10) | | extended |
ca_country | character varying(20) | | extended |
ca_gmt_offset | numeric(5,2) | | main |
ca_location_type | character(20) | | extended |
View definition:
SELECT *
FROM tpcds.web_returns_p2
WHERE trunc(web_returns_p2.ca_address_sk::double precision) > 10000::double precision;
查询物化视图
执行如下命令查询MV_MyView视图。
openGauss=# select * from mv_myview ;
ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_
location_type
---------------+------------------+------------------+----------------+-----------------+-----------------+---------+-----------+----------+------------+------------+---------------+------
----------------
5050 | c | 300 | c | c | c | c | c | c | c | c | 1.20 | c
14888 | d | 400 | d | d | d | d | d | d | d | d | 1.50 | d
(2 rows)
查看物化图的具体信息
执行如下命令查询MyView视图的详细信息。
openGauss-# \\d+ mv_myview
Materialized view "public.mv_myview"
Column | Type | Modifiers | Storage | Stats target | Description
------------------+-----------------------+-----------+----------+--------------+-------------
ca_address_sk | integer | | plain | |
ca_address_id | character(16) | | extended | |
ca_street_number | character(10) | | extended | |
ca_street_name | character varying(60) | | extended | |
ca_street_type | character(15) | | extended | |
ca_suite_number | character(10) | | extended | |
ca_city | character varying(60) | | extended | |
ca_county | character varying(30) | | extended | |
ca_state | character(2) | | extended | |
ca_zip | character(10) | | extended | |
ca_country | character varying(20) | | extended | |
ca_gmt_offset | numeric(5,2) | | main | |
ca_location_type | character(20) | | extended | |
Rules:
"_RETURN" AS
ON SELECT TO mv_myview DO INSTEAD SELECT web_returns_p2.ca_address_sk,
web_returns_p2.ca_address_id, web_returns_p2.ca_street_number,
web_returns_p2.ca_street_name, web_returns_p2.ca_street_type,
web_returns_p2.ca_suite_number, web_returns_p2.ca_city,
web_returns_p2.ca_county, web_returns_p2.ca_state, web_returns_p2.ca_zip,
web_returns_p2.ca_country, web_returns_p2.ca_gmt_offset,
web_returns_p2.ca_location_type
FROM tpcds.web_returns_p2
WHERE trunc(web_returns_p2.ca_address_sk::double precision) > 5000::double precision
Replica Identity: NOTHING
Has OIDs: no
Options: orientation=row, compression=no
给基表新增二条记录,然后刷新物化视图。
insert into tpcds.web_returns_p2 values
(7050, c, 300, c, c, c, c, c, c, c, c, 1.2, c),
(8888, d, 400, d, d, d, d, d, d, d, d, 1.5, d);
查询,如果不刷新,物化视图是不变的
openGauss=# select * from mv_myview ;
ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_
location_type
---------------+------------------+------------------+----------------+-----------------+-----------------+---------+-----------+----------+------------+------------+---------------+------
----------------
5050 | c | 300 | c | c | c | c | c | c | c | c | 1.20 | c
14888 | d | 400 | d | d | d | d | d | d | d | d | 1.50 | d
(2 rows)
由于基表数据变更过,可以执行如下命令刷新物化视图MV_MyView。
refresh materialized view mv_myview ;
再查看物化视图MV_MyView,发现多了二条记录。
openGauss=# select * from mv_myview ;
ca_address_sk | ca_address_id | ca_street_number | ca_street_name | ca_street_type | ca_suite_number | ca_city | ca_county | ca_state | ca_zip | ca_country | ca_gmt_offset | ca_
location_type
---------------+------------------+------------------+----------------+-----------------+-----------------+---------+-----------+----------+------------+------------+---------------+------
----------------
5050 | c | 300 | c | c | c | c | c | c | c | c | 1.20 | c
7050 | c | 300 | c | c | c | c | c | c | c | c | 1.20 | c
8888 | d | 400 | d | d | d | d | d | d | d | d | 1.50 | d
14888 | d | 400 | d | d | d | d | d | d | d | d | 1.50 | d
(4 rows)
3、删除视图
执行如下命令删除视图。
drop view myview ;
drop materialized view mv_myview ;
10、创建和管理序列
方法一:声明字段类型为序列整型(serial)来定义标识符字段。
例如:
CREATE TABLE T1
(id serial,
name text
);
方法二:创建序列,并通过nextval(‘sequence_name’)函数指定为某一字段的默认值。
步骤 1 创建序列。
CREATE SEQUENCE seq1 cache 100;
步骤 2 指定为某一字段的默认值,使该字段具有唯一标识属性。
CREATE TABLE T2
(
id int not null default nextval(seq1),
name text
);
步骤 3 指定序列与列的归属关系。
将序列和一个表的指定字段进行关联。删除此字段或其所在表的时候会自动删除已关联的序列。
ALTER SEQUENCE seq1 OWNED BY T2.id;
删除序列
DROP SEQUENCE seq1 CASCADE;
11、创建和管理存储过程
1、创建存储过程
步骤 1 创建表t_test。
create table t_test(c1 int, c2 int);
步骤 2 创建存储过程insert_data。
create or replace procedure insert_data
is
a int;
b int;
begin
a=1;
b=2;
insert into t_test values(a,b);
insert into t_test values(b,a);
end;
/
步骤 3 调用存储过程。
call insert_data();
步骤 4 查询表内容。
select * from t_test;
c1 | c2
----+----
1 | 2
2 | 1
(2 rows)
2、管理存储过程
管理存储过程,命令如下:
\\sf insert_data
结果如下:
CREATE OR REPLACE FUNCTION public.insert_data()
RETURNS void
LANGUAGE plpgsql
NOT FENCED NOT SHIPPABLE
AS $function$ DECLARE
a int;
b int;
begin
a=1;
b=2;
insert into t_test values(a,b);
insert into t_test values(b,a);
end$function$
3、删除存储过程,命令如下:
drop procedure insert_data;
12、创建和管理全局临时表
1、会话级全局临时表
数据会话级可见,其他会话看不到数据,但表结构可见。
步骤 1 创建临时表t_test2。
建表语句,使用ON COMMIT PRESERVE ROWS
CREATE GLOBAL TEMPORARY TABLE t_test2(
id integer,
lbl text
) ON COMMIT PRESERVE ROWS;
步骤 2 在当前会话插入数据并查询。
insert into t_test2 values(1,data1);
insert into t_test2 values(2,data2);
select * from t_test2;
id | lbl
----+-------
1 | data1
2 | data2
(2 rows)
步骤 3 退出会话再查看。
postgres=# \\q
[omm@ecs-32de ~]$ gsql -d postgres -p 26000 -r
gsql ((openGauss 1.0.1 build 13b34b53) compiled at 2020-10-12 02:01:33 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=# \\dt t_test2
List of relations
Schema | Name | Type | Owner | Storage
--------+---------+-------+-------+--------------------------------------------------------------
public | t_test2 | table | omm | orientation=row,compression=no,on_commit_delete_rows=false
(1 row)
步骤 4 查询表内容。
select * from t_test2;
id | lbl
----+-----
(0 rows)
此时可以发现,在其它会话中表结构可以看到,但是表数据看不到。
步骤 5 删除临时表。
drop table t_test2;
2、事务级全局临时表
数据事务级可见,事务提交后数据删除。
步骤 1 创建临时表t_test3。
建表语句,使用ON COMMIT DELETE ROWS
CREATE GLOBAL TEMPORARY TABLE t_test3(
id integer,
lbl text
) ON COMMIT DELETE ROWS;
步骤 2 插入数据并查询。
先用begin开始一个事务,接着给表插入数据,此时再对表进行查询,可以查出相应数据。
begin;
insert into t_test3 values(1,data1);
select * from t_test3;
id | lbl
----+-------
1 | data1
(1 row)
步骤 3 结束事务再查询。
先用commit提交来结束事务,此时再对表进行查询,可以发现已经查询不出数据了。
commit;
select * from t_test3;
id | lbl
----+-----
(0 rows) (1 row)
步骤 4 删除临时表。
drop table t_test3;
openGauss维护管理之日志收集gs_collector
一、概述
当openGauss发生故障时,使用此工具收集OS信息、日志信息以及配置文件等信息,来定位问题。可以使用-C参数,指定收集不同的信息内容,具体支持收集的内容信息如表所示。
1、gs_collector内容收集对照表
TypeName | Content | 描述 | 是否默认收集 |
System | HardWareInfo RunTimeInfo | 收集现在操作系统的状态信息:
| 是 |
Database | 具体列表见表1。 | 收集系统视图或者系统表的内容。 | 是,默认收集pg_locks、pg_stat_activity和 pg_thread_wait_status三个视图的信息。 |
Log | DataNode ClusterManager |
| 是 |
Config | DataNode |
| 是 |
Gstack | DataNode | 利用gstack命令得到DataNode的当前堆栈信息。 | 否 |
CoreDump | gs_ctl、gaussdb、GaussMaster、AioWorker、AlarmChecker、Archiver、Auditor、AutoVacLauncher、AutoVacWorker、AuxMain、BackendMode、BgWriter、BootStrap、Catchup、CBMWriter、Checkpointer、CommAuxStream、CommPoolCleane、CommRcvStream、CommRcvWorker、CommSendStream、CpMonitor、DataRcvWriter、DataReceiver、DataSender、ExtremeRTO、FencedUDFMaster、Heartbeater、JobExecutor、JobScheduler、LWLockMonitor、PageWriter、ParallelRecov、PercentileJob、Reaper、RemoteSrv、StartupProcess、StatCollector、Stream、SysLogger、ThdPoolListener、TwoPhaseCleaner、WalRcvWriter、WalReceiver、WalSender、WalWriter、WDRSnapshot、WlmArbiter、WlmCollector、WlmMonitor | 通过时间筛选gaussdb进程的core文件。 注意: 关于Core的配置和方式请按照如下要求:在/proc/sys/opengauss/core_pattern文件中添加core文件的格式:core-%e-%p-%t。 | 否 |
XLog | DataNode | 通过时间筛选收集xlog。 | 否 |
Plan | * | 收集计划复现信息:
| 否 |
日志收集工具依赖操作系统工具,例如gstack为其中一种,如果未安装该工具,则提示错误后,跳过该收集项。
2、语法
• 日志收集(非root用户)
gs_collector --begin-time="BEGINTIME" --end-time="ENDTIME" [-h HOSTNAME | -f HOSTFILE] [--keyword=KEYWORD] [--speed-limit=SPEED] [-o OUTPUT] [-l LOGFILE] [-C CONFIGFILE]
• 显示帮助信息
gs_collector -? | --help
• 显示版本号信息
gs_collector -V | --version
参数说明
-h
收集信息的主机名称。取值范围:主机名称,如果不指定则默认收集所有主机的信息。
-f
主机名称列表文件。该文件为纯文本格式。
说明: -f和-h参数不能同时使用。取值范围:主机名称列表。
-o
将收集日志以压缩包形式输出到指定的文件夹。
不指定则将检查结果以压缩包形式输出到配置文件中tmpMppdbPath选项所指定的目录中。
若配置文件中未配置tmpMppdbPath选项,则默认将检查结果以压缩包形式输出到“/tmp/用户名_mppdb/”目录中。
-l
指定的日志文件以及存放路径。
-C
指定待收集内容的配置文件,利用TypeName指定需要收集的信息类型,利用Content指定每一类信息的具体内容,利用Count指定此类信息收集的次数
,利用Interval指定收集间隔,单位为秒。
TypeName和Content不允许缺失或者内容为空。
Interval和Count可以不指定,如果没有指定Count,则默认收集一次。如果没有指定Interval则表示间隔为0秒,Interval和Count的值不能小于0。
如果不指定则使用默认的配置文件。
配置文件格式采用json格式,模板如下:
"Collect":
[
"TypeName": "name", "Content":"value","Interval":"seconds", "Count":"count"
]
说明:
TypeName和对应的Content取值范围见表1gs_collector内容收集对照表。 对于Log、CoreDump、Config和XLog四种类型,Interval和Count参
数不生效。
默认配置文件内容如下:
"Collect":
[
"TypeName": "System", "Content":"RunTimeInfo, HardWareInfo","Interval":"0", "Count":"1",
"TypeName": "Log", "Content" : "DataNode,ClusterManager", "Interval":"0", "Count":"1",
"TypeName": "Database", "Content": "pg_locks,pg_stat_activity,pg_thread_wait_status","Interval":"0", "Count":"1",
"TypeName": "Config", "Content": "DataNode", "Interval":"0", "Count":"1"
]
--keyword=KEYWORD
包含关键字KEYWORD的日志文件。
若关键字KEYWORD中含有空格,需要使用双引号包围。
说明:
性能日志为二进制日志,关键字搜集功能不支持该日志的搜集。
--begin-time
日志的开始时间。输入格式为“yyyymmdd hh:mm”。
--end-time
日志的结束时间。输入格式为“yyyymmdd hh:mm”。
--speed-limit
日志收集时的收集速率,输入格式为非负整数,单位为MB/s。
该参数主要是为了防止日志收集过程中产生过高的磁盘或网络IO,导致数据库节点故障(如果它们与GAUSSLOG/
PGHOST部署在同一个磁盘上)。该值应当不超过openGauss内上述磁盘IO与网络IO速率的最小值的1/3。
-?, --help
显示帮助信息。
-V, --version
显示版本号信息。
二、示例
1、直接收集
执行如下命令收集OS信息和日志信息。
gs_collector --begin-time="20180131 23:00" --end-time="20180201 20:00" -h plat1
查看收集到的统计信息。
tar -zxvf $PGHOST/collector_20200624_134541.tar.gz
collector_20200624_134541/
collector_20200624_134541/plat1.tar.gz
collector_20200624_134541/Detail.log
collector_20200624_134541/Summary.log
cd collector_20200624_134541
tar -zxvf plat1.tar.gz
plat1/
plat1/catalogfiles/
plat1/catalogfiles/gs_clean_20200624_134548283647.txt
plat1/catalogfiles/dn_6001_pg_locks_20200624_134547746215.csv
plat1/catalogfiles/dn_6001_pg_thread_wait_status_20200624_134548068716.csv
plat1/catalogfiles/dn_6001_pg_stat_activity_20200624_134547851117.csv
plat1/configfiles/
plat1/logfiles/
plat1/logfiles/log_20200624_134548540916.tar.gz
plat1/coreDumpfiles/
plat1/gstackfiles/
plat1/systemfiles/
plat1/systemfiles/OS_information_20200624_134542218134.txt
plat1/systemfiles/database_system_info_20200624_134546282006.txt
plat1/planSimulatorfiles/
plat1/xlogfiles/
cd plat1/logfiles/
tar -zxvf log_20200624_134548540916.tar.gz
2、指定配置文件
vi collector.json
"Collect":
[
"TypeName": "System", "Content":"RunTimeInfo, HardWareInfo","Interval":"0", "Count":"1",
"TypeName": "Log", "Content" : "Coordinator,DataNode,Gtm,ClusterManager", "Interval":"0", "Count":"1",
"TypeName": "Database", "Content": "pg_locks,pg_stat_activity,pg_thread_wait_status","Interval":"0", "Count":"1",
"TypeName": "Config", "Content": "Coordinator,DataNode,Gtm", "Interval":"0", "Count":"1"
]
配置文件中
利用TypeName指定需要收集的信息类型;
利用Content指定每一类信息的具体内容;
利用Count指定此类信息收集的次数;
利用Interval指定收集间隔,单位为秒;
TypeName和Content不允许缺失或者内容为空;
Interval和Count可以不指定,如果没有指定Count,则默认收集一次;
如果没有指定Interval则表示间隔为0秒,Interval和Count的值不能小于0;
如果不指定则使用默认的配置文件;
可以根据gs_collector内容收集对照表进行个性化定制配置;
配置文件格式采用json格式。
gs_collector --begin-time="20200720 23:00" --end-time="20200729 20:00" -C /home/omm/collector.json
Successfully parsed the configuration file.
create Dir.
Successfully create dir.
do system check interval 0 : count 1
Collecting OS information.
Failed to collect OS information.
do database check interval 0 : count 1
Collecting catalog statistics.
Successfully collected catalog statistics.
do log check interval 0 : count 1
Collecting Log files.
Successfully collected Log files.
do Config check 0:1
Collecting Config files.
Successfully collected Config files.
Collecting files.
Successfully collected files.
All results are stored in /opt/huawei/wisequery/omm_mppdb/collector_20200727_094932.tar.gz.
cd /opt/huawei/wisequery/omm_mppdb/
tar -zxvf collector_20200727_094932.tar.gz
cd collector_20200727_094932
tar -zxvf db1.tar.gz
cd db1
cd catalogfiles/
-rw------- 1 omm dbgrp 389 Jul 27 09:49 dn_6001_pg_locks_20200727_094934961507.csv
-rw------- 1 omm dbgrp 1.4K Jul 27 09:49 dn_6001_pg_stat_activity_20200727_094935134988.csv
-rw------- 1 omm dbgrp 878 Jul 27 09:49 dn_6001_pg_thread_wait_status_20200727_094935303146.csv
-rw------- 1 omm dbgrp 281 Jul 27 09:49 gs_clean_20200727_094935470508.txt
以上是关于openGauss维护管理之基本操作的主要内容,如果未能解决你的问题,请参考以下文章