GreenPlum的那些事《三》——常用操作

我們前面已經(jīng)說了,GPDB是一個列式數(shù)據(jù)庫,數(shù)據(jù)庫都有什么特性呢?都能做什么呢?熟悉MySQL,Oracle的同學(xué)可能就比較清楚關(guān)系型數(shù)據(jù)庫的管理,下面我們就來說下GPDB的一些管理和常用操作。

數(shù)據(jù)庫常用操作

數(shù)據(jù)庫常用操作分為:創(chuàng)建數(shù)據(jù)庫、創(chuàng)建schema、創(chuàng)建資源池、創(chuàng)建角色、創(chuàng)建用戶、創(chuàng)建表。下面我們一一來說下GPDB這些常用操作,和關(guān)系型數(shù)據(jù)庫MYSQL有什么不同呢?

  1. 創(chuàng)建數(shù)據(jù)庫

    gp_sydb=# CREATE DATABASE GPTEST;
    CREATE DATABASE

刪除數(shù)據(jù)庫

gp_sydb=# DROP DATABASE GPTEST;
DROP DATABASE

你也可以通過 createdb 創(chuàng)建數(shù)據(jù)庫

 [gpadmin@mpp01 ~]$ createdb -h mpp01 -p 5432 GPTEST 

查看創(chuàng)建的數(shù)據(jù)庫:

gp_sydb=# \l
                  List of databases
   Name    |  Owner  | Encoding |  Access privileges  
-----------+---------+----------+---------------------
 GPTEST    | gpadmin | UTF8     | 
 gp_sydb   | gpadmin | UTF8     | 
 postgres  | gpadmin | UTF8     | 
 template0 | gpadmin | UTF8     | =c/gpadmin          
                                : gpadmin=CTc/gpadmin
 template1 | gpadmin | UTF8     | =c/gpadmin          
                                : gpadmin=CTc/gpadmin
(5 rows)
  1. 創(chuàng)建schema

創(chuàng)建schema

GPTEST=# CREATE SCHEMA bdp;
CREATE SCHEMA

查看schema

GPTEST=# \dn
       List of schemas
        Name        |  Owner  
--------------------+---------
 bdp                | gpadmin
 gp_toolkit         | gpadmin
 information_schema | gpadmin
 pg_aoseg           | gpadmin
 pg_bitmapindex     | gpadmin
 pg_catalog         | gpadmin
 pg_toast           | gpadmin
 public             | gpadmin
(8 rows)

查看當(dāng)前的schema

GPTEST=# SELECT current_schema();
 current_schema 
----------------
 public
(1 row)

可以看到當(dāng)前schema是public,這是創(chuàng)建用戶的時候,我們沒有給它分配schema,那就是用默認(rèn)的schema public。
把新建的schema賦給數(shù)據(jù)庫gptest

gptest=# \dn
       List of schemas
        Name        |  Owner  
--------------------+---------
 bdp                | gpadmin
 gp_toolkit         | gpadmin
 information_schema | gpadmin
 pg_aoseg           | gpadmin
 pg_bitmapindex     | gpadmin
 pg_catalog         | gpadmin
 pg_toast           | gpadmin
 public             | gpadmin
(8 rows)

gptest=# ALTER DATABASE GPTEST SET search_path TO bdp,                                                                                                    public, pg_catalog;
ALTER DATABASE
gptest=# SELECT current_schema();
 current_schema 
----------------
 bdp
(1 row)

可以看到賦了新的schema。

  1. 創(chuàng)建角色

創(chuàng)建角色,如果有很多用戶對于一批表都有一樣的權(quán)限,這時候可以創(chuàng)建一個角色,把這些權(quán)限先賦給角色,然后把角色賦權(quán)給各個用戶。

gptest=# create role selectbdp;
CREATE ROLE
gptest=# \du
                                                                      List of roles
 Role name |                                                           Attributes                                                            | Member of 
-----------+---------------------------------------------------------------------------------------------------------------------------------+-----------
 bdp01     |                                                                                                                                 | {}
 gpadmin   | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Ext hdfs Table, Wri Ext hdfs Table | {}
 selectbdp | Cannot login                                                                                                                    | {}

gptest=# 

可以看到角色已經(jīng)創(chuàng)建成功。
賦權(quán)角色。

gptest=# grant selectbdp to gpadmin;     
GRANT ROLE

角色其實就是一個用戶組。

  1. 創(chuàng)建用戶:
gptest=# create user bdp01 WITH PASSWORD 'passwd123';
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
gptest=# 

使用用戶登錄:

 psql -Ubdp01 -d gptest -w 'passwd123'

發(fā)現(xiàn)報錯了:

[gpadmin@mpp01 gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123'
Password for user bdp01: 
psql: FATAL:  no pg_hba.conf entry for host "[local]", user "bdp01", database "gptest", SSL off

GPDB登錄需要在pg_hba.conf文件中添加信任的用戶:

local    all         bdp01      trust

添加后,使配置文件生效,再次登錄:

[gpadmin@mpp01 gpseg-1]$ psql -Ubdp01 -d gptest -w 'passwd123'
psql: warning: extra command-line argument "passwd123" ignored
psql (8.3.23)
Type "help" for help.

gptest=> 

登錄成功!

  1. 創(chuàng)建資源隊列

為什么要創(chuàng)建資源隊列呢?我們知道一個數(shù)據(jù)庫肯定不是給一個用戶使用的,通常是有ETL用戶,進(jìn)行數(shù)據(jù)加載,數(shù)據(jù)清洗。還有WEB端用戶進(jìn)行查詢,還有個人用戶進(jìn)行開發(fā)查詢使用等等。這么多用戶,如果不進(jìn)行資源隊列管控,那么就會出現(xiàn)資源爭搶現(xiàn)象,影響線上應(yīng)用功能。比如一個新手開發(fā)人員寫了一個比較菜的查詢語句,占用了大量資源,此時數(shù)據(jù)庫的其他查詢用戶都需要排隊等待了。再比如加載數(shù)據(jù)是需要使用大量資源,那么也會影響查詢性能,以上你會發(fā)現(xiàn),你需要把不同類型的操作進(jìn)行資源隔離,這就是為什么要有資源隊列了。
查看已有的資源隊列:

gptest=> SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status
gptest-> WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;
  rolname  |  rsqname   
-----------+------------
 bdp01     | pg_default
 selectbdp | pg_default
 gpadmin   | pg_default
(3 rows)

創(chuàng)建一個新的資源隊列:

gptest=#  create resource queue load_queue with (active_statements=3,MEMORY_LIMIT='1024MB',PRIORITY=LOW);                                                 CREATE QUEUE

把創(chuàng)建的資源隊列賦權(quán)給剛才創(chuàng)建的用戶bdp01:

gptest=# ALTER USER bdp01  resource queue load_queue;                                              
ALTER ROLE

再次查詢資源池分配情況:

gptest=# SELECT rolname, rsqname FROM pg_roles, gp_toolkit.gp_resqueue_status                                                                             WHERE pg_roles.rolresqueue=gp_toolkit.gp_resqueue_status.queueid;
  rolname  |  rsqname   
-----------+------------
 bdp01     | load_queue
 selectbdp | pg_default
 gpadmin   | pg_default
(3 rows)

可以看到bpd01已經(jīng)使用了新的資源池了。

  • 創(chuàng)建表
    簡單的建表語句,此處不在講解了,來說兩個地方,一個是分區(qū),一個是分布鍵。
  • 分區(qū):
    來看下分區(qū)的數(shù)據(jù)結(jié)構(gòu)

分區(qū)是把一張大表按照適合的維度進(jìn)行分割,通過表的繼承,規(guī)則,約束實現(xiàn)。
并不是每個表都適合分區(qū),只有很大的表才適合分區(qū),應(yīng)為分區(qū)多了會增加表的元數(shù)據(jù)信息,特別是多級分區(qū)。如果一個表被按照日和城市劃分并且有1000個日以及1000個城市,那么分區(qū)的總數(shù)就是一百萬。列存表會把每一列存在一個物理表中,因此如果這個表有100個列,系統(tǒng)就需要為該表管理一億個文件。一方面Linux的iNode可能不會有這么大,就會出現(xiàn)文件查詢報錯等,分區(qū)過多了,對于數(shù)據(jù)庫停止和恢復(fù)也會造成很大影響的。所以建立分區(qū)表的時候,對分區(qū)進(jìn)行自動的創(chuàng)建和刪除,以保障合適的數(shù)據(jù)周期很重要。

  • 分布鍵 在MPP架構(gòu)中,一個查詢是需要從所有segment獲取數(shù)據(jù)然后在master匯總得到結(jié)果的。那么這樣,影響查詢性能的就有兩個問題,查詢最慢的segment和網(wǎng)絡(luò)帶寬。分布鍵就是為了解決第一個問題,讓數(shù)據(jù)盡可能均勻的分布在每個segment上,從而避免數(shù)據(jù)傾斜導(dǎo)致的查詢效率問題。第二個網(wǎng)絡(luò)問題,MPP數(shù)據(jù)集群搭建要求集群內(nèi)部為萬兆網(wǎng)連接,并且機(jī)器配置一樣,從而避免影響。
    分布鍵一般選擇主鍵,比如手機(jī)號等。
    盡量選擇經(jīng)常需要 JOIN 的列,當(dāng)關(guān)聯(lián)鍵和分布鍵均一致時,可以在 Segment 中完成 JOIN,不需要重分布或者廣播小表。

以上就是GPDB簡單的管理流程,后面我們會再介紹更深入的查詢優(yōu)化和管理知識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容