一.创建目录
root用户登录四台服务器,每台都执行下面操作
[root@mdw tmp]# mkdir -p /datax/tbs_tmp
[root@mdw tmp]# mkdir -p /datax/tbs_tmp2
# 赋权限
[root@mdw tmp]# chown gpadmin:gpadmin /datax/*
二.创建库
gpadmin用户登录master机器
[gpadmin@mdw ~]$ psql -d postgres
psql (9.4.24)
Type "help" for help.
postgres=# create database gpdb encoding='UTF8';
CREATE DATABA
gpdb=# SELECT datname from pg_database;
datname
-----------
template1
template0
postgres
gpperfmon
gpdb
(5 rows)
postgres=# \q
三. 表空间
gpadmin用户登录master机器
每个 Greenplum 数据库系统都有以下默认表空间。
pg_global用于共享系统目录。
pg_default,默认表空间。由template1和template0数据库使用。
这些表空间使用默认系统位置,即系统初始化时创建的数据目录位置。
要查看表空间信息,请使用pg_tablespace目录表获取表空间的对象 ID(OID),然后使用gp_tablespace_location()函数显示表空间目录。这是一个列出一个用户定义表空间的示例myspace:
[root@mdw tmp]# su - gpadmin
# 进入gpdb库
[gpadmin@mdw ~]$ psql -d gpdb
psql (9.4.24)
Type "help" for help.
# 创建表空间
gpdb=# create tablespace tbs_tmp location '/datax/tbs_tmp';
CREATE TABLESPACE
gpdb=# create tablespace tbs_tmp2 location '/datax/tbs_tmp2';
CREATE TABLESPACE
gpdb=#
########################## 查看表空间 #####################
gpdb=# SELECT oid, * FROM pg_tablespace ;
oid | spcname | spcowner | spcacl | spcoptions
-------+------------+----------+-------------------------------------+------------
1663 | pg_default | 10 | |
1664 | pg_global | 10 | |
16658 | tbs_tmp2 | 10 | |
16657 | tbs_tmp | 10 | {gpadmin=C/gpadmin,guser=C/gpadmin} |
(4 rows)
#表空间的 OID myspace是16657 . 运行gp_tablespace_location()以显示由两个段实例和主实例组成的系统的表空间位置
gpdb=# SELECT * FROM gp_tablespace_location(16657);
gp_segment_id | tblspc_loc
---------------+----------------
0 | /datax/tbs_tmp
7 | /datax/tbs_tmp
2 | /datax/tbs_tmp
4 | /datax/tbs_tmp
1 | /datax/tbs_tmp
6 | /datax/tbs_tmp
5 | /datax/tbs_tmp
3 | /datax/tbs_tmp
-1 | /datax/tbs_tmp
(9 rows)
gpdb=#
#此查询使用gp_tablespace_location()目录gp_segment_configuration表来显示段实例信息以及myspace表空间的文件系统位置。
gpdb=# WITH spc AS (SELECT * FROM gp_tablespace_location(16657)) SELECT seg.role, spc.gp_segment_id as seg_id, seg.hostname, seg.datadir, tblspc_loc FROM spc, gp_segment_configuration AS seg WHERE spc.gp_segment_id = seg.content ORDER BY seg_id;
role | seg_id | hostname | datadir | tblspc_loc
------+--------+----------+-----------------------+----------------
p | -1 | mdw | /datax/master/gpseg-1 | /datax/tbs_tmp
m | -1 | smdw | /datax/master/gpseg-1 | /datax/tbs_tmp
p | 0 | sdw1 | /datax/primary/gpseg0 | /datax/tbs_tmp
m | 0 | sdw2 | /datax/mirror/gpseg0 | /datax/tbs_tmp
m | 1 | sdw2 | /datax/mirror/gpseg1 | /datax/tbs_tmp
p | 1 | sdw1 | /datax/primary/gpseg1 | /datax/tbs_tmp
m | 2 | sdw2 | /datax/mirror/gpseg2 | /datax/tbs_tmp
p | 2 | sdw1 | /datax/primary/gpseg2 | /datax/tbs_tmp
p | 3 | sdw1 | /datax/primary/gpseg3 | /datax/tbs_tmp
m | 3 | sdw2 | /datax/mirror/gpseg3 | /datax/tbs_tmp
m | 4 | sdw1 | /datax/mirror/gpseg4 | /datax/tbs_tmp
p | 4 | sdw2 | /datax/primary/gpseg4 | /datax/tbs_tmp
p | 5 | sdw2 | /datax/primary/gpseg5 | /datax/tbs_tmp
m | 5 | sdw1 | /datax/mirror/gpseg5 | /datax/tbs_tmp
m | 6 | sdw1 | /datax/mirror/gpseg6 | /datax/tbs_tmp
p | 6 | sdw2 | /datax/primary/gpseg6 | /datax/tbs_tmp
m | 7 | sdw1 | /datax/mirror/gpseg7 | /datax/tbs_tmp
p | 7 | sdw2 | /datax/primary/gpseg7 | /datax/tbs_tmp
(18 rows)
gpdb=#
指定表空间
SET default_tablespace = tbs_tmp;
CREATE TABLE foo(i int);
gpdb=# SET default_tablespace = tbs_tmp;
SET
gpdb=# CREATE TABLE foo(i int);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
gpdb=#
删除表空间
注意:如果表空间不为空或者存储临时文件或事务文件,则不能删除表空间。
表空间所有者或超级用户有权限删除表空间。在删除所有使用该表空间的数据库中的所有对象之前,您不能删除该表空间。
DROP TABLESPACE xxx
四. 创建和管理模式schema
创建schema
gpdb=# create schema tmp_schema;
CREATE SCHEMA
要在模式中创建或访问对象,请编写由模式名称和表名组成的限定名称,并用句点分隔。例如
myschema.table
例如,您可以创建其他人拥有的模式,以将用户的活动限制在明确定义的名称空间中
CREATE SCHEMA
schemaname
AUTHORIZATIONusername
;
五. 用户角色
用户级角色被认为是可以登录数据库并发起数据库会话的数据库角色。因此,当您使用该命令创建新的用户级角色时CREATE ROLE,您必须指定LOGIN权限。例如:
CREATE ROLE jsmith WITH LOGIN;
创建角色
# guser无登录权限
gpdb=# create ROLE guser password 'guser';
NOTICE: resource queue required -- using default resource queue "pg_default"
CREATE ROLE
gpdb=# grant all on database gpdb to guser;
GRANT
# 有登录权限
gpdb=# create ROLE guser2 WITH LOGIN password 'guser2';
NOTICE: resource queue required -- using default resource queue "pg_default"
CREATE ROLE
gpdb=#
修改权限
ALTER ROLE
username
WITH PASSWORD ‘passwd123’;
ALTER userusername
WITH PASSWORD ‘passwd123’;
ALTER ROLE admin VALID UNTIL ‘infinity’;
ALTER ROLEusername
LOGIN;
ALTER ROLEusername
RESOURCE QUEUE que1;
ALTER ROLEusername
DENY DAY ‘Sunday’;
角色成员
将用户分组在一起以简化对象权限的管理通常很方便:这样,可以将权限授予或撤消整个组。
CREATE ROLE admin CREATEROLE CREATEDB;
GRANT组角色存在后,您可以使用andREVOKE命令添加和删除成员(用户角色)
GRANT admin TO user1, user2;
REVOKE admin FROM user3;
为了管理对象权限,您将只向组级角色授予适当的权限,然后成员用户角色继承组角色的对象权限。
GRANT ALL ON TABLE mytable TO admin;
GRANT ALL ON SCHEMA myschema TO admin;
GRANT ALL ON DATABASE mydb TO admin;
注意:
角色属性LOGIN, SUPERUSER, CREATEDB, CREATEROLE,CREATEEXTTABLE和RESOURCE QUEUE永远不会像数据库对象的普通权限那样被继承。
用户成员实际上必须SET ROLE具有这些属性之一的特定角色才能使用该属性
SET ROLE admin;
例如
gpdb=# ALTER ROLE guser2 SUPERUSER LOGIN CREATEDB;
ALTER ROLE
gpdb=#
六. 赋权限
# 赋表空间权限给guser
gpdb=# GRANT CREATE ON TABLESPACE tbs_tmp TO guser;
GRANT
七. 创建表
CREATE TABLE foo(i int) TABLESPACE tbs_tmp;
八. 远程登录
修改文件
[gpadmin@mdw ~]$ vi /datax/master/gpseg-1/pg_hba.conf
# 增加内容
host all guser2 0.0.0.0/0 trust
使得配置生效
[gpadmin@mdw ~]$ gpstop -u
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Starting gpstop with args: -u
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Gathering information and validating the environment...
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Obtaining Greenplum Master catalog information
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Greenplum Version: 'postgres (Greenplum Database) 6.18.2 build commit:1242aadf0137d3b26ee42c80e579e78bd7a805c7'
20220703:22:21:58:123477 gpstop:mdw:gpadmin-[INFO]:-Signalling all postmaster processes to reload
.
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:---------------------------------------------
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:-Some segment postmasters were not reloaded
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:---------------------------------------------
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:- Host Datadir Port Status
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:- smdw /datax/master/gpseg-1 5432 u
20220703:22:21:59:123477 gpstop:mdw:gpadmin-[INFO]:---------------------------------------------
[gpadmin@mdw ~]$
登录无效
重新执行如下无效
[gpadmin@mdw ~]$ pg_ctl reload -D /datax/master/gpseg-1/
server signaled
[gpadmin@mdw ~]$
usage:使用表空间存储数据库对象
#具有表空间权限的用户CREATE可以在该表空间中创建数据库对象,例如表、索引和数据库
# 格式:CREATE TABLE tablename(options) TABLESPACE spacename;
#在表空间space1中创建一个表
CREATE TABLE foo(i int) TABLESPACE tbs_tmp;
#您还可以使用该参数为不指定表空间的命令default_tablespace指定默认表空间:CREATE TABLECREATE INDEX
SET default_tablespace = space1;
CREATE TABLE foo(i int);
测试数据
gpadmin用户
[gpadmin@mdw ~]$ psql -d gpdb
psql (9.4.24)
Type "help" for help.
gpdb=# SET default_tablespace = tbs_tmp;
SET
gpdb=# CREATE TABLE foo(i int);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Greenplum Database data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
gpdb=#
# 插入16条数据
gpdb=# insert into foo values(100000);
INSERT 0
增加数据
gpdb=# select count(*) from foo;
count
---------
4854608
(1 row)
初始数据foo表16条, foo2为0条。
insert数据量如下
大小变化
master节点有tbs_tmp目录
sdw2的gpseg0
最终的大小比较
状态
数据去重
row_number()over(partition by ...
其他常见处理
1. ERROR: permission denied: “gp_segment_configuration” is a system catalog
权限问题
postgres=# set allow_system_table_mods='dml';
SET
postgres=# delete from gp_segment_configuration where role='m';