我們前面已經說了,GPDB是一個列式資料庫,資料庫都有什麼特性呢?都能做什麼呢?熟悉MySQL,Oracle的同學可能就比較清楚關系型資料庫的管理,下面我們就來說下GPDB的一些管理和常用操作。
資料庫常用操作分為:建立資料庫、建立schema、建立資源池、建立角色、建立使用者、建立表。下面我們一一來說下GPDB這些常用操作,和關系型資料庫MYSQL有什麼不同呢?
-
建立資料庫
gp_sydb=# CREATE DATABASE GPTEST;
CREATE DATABASE
删除資料庫
gp_sydb=# DROP DATABASE GPTEST;
DROP DATABASE
你也可以通過 createdb 建立資料庫
[gpadmin@mpp01 ~]$ createdb -h mpp01 -p 5432 GPTEST
檢視建立的資料庫:
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)
- 建立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)
檢視目前的schema
GPTEST=# SELECT current_schema();
current_schema
----------------
public
(1 row)
可以看到目前schema是public,這是建立使用者的時候,我們沒有給它配置設定schema,那就是用預設的schema public。
把建立的schema賦給資料庫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。
- 建立角色
建立角色,如果有很多使用者對于一批表都有一樣的權限,這時候可以建立一個角色,把這些權限先賦給角色,然後把角色賦權給各個使用者。
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=#
可以看到角色已經建立成功。
賦權角色。
gptest=# grant selectbdp to gpadmin;
GRANT ROLE
角色其實就是一個使用者組。
- 建立使用者:
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'
發現報錯了:
[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=>
登入成功!
- 建立資源隊列
為什麼要建立資源隊列呢?我們知道一個資料庫肯定不是給一個使用者使用的,通常是有ETL使用者,進行資料加載,資料清洗。還有WEB端使用者進行查詢,還有個人使用者進行開發查詢使用等等。這麼多使用者,如果不進行資源隊列管控,那麼就會出現資源争搶現象,影響線上應用功能。比如一個新手開發人員寫了一個比較菜的查詢語句,占用了大量資源,此時資料庫的其他查詢使用者都需要排隊等待了。再比如加載資料是需要使用大量資源,那麼也會影響查詢性能,以上你會發現,你需要把不同類型的操作進行資源隔離,這就是為什麼要有資源隊列了。
檢視已有的資源隊列:
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)
建立一個新的資源隊列:
gptest=# create resource queue load_queue with (active_statements=3,MEMORY_LIMIT='1024MB',PRIORITY=LOW); CREATE QUEUE
把建立的資源隊列賦權給剛才建立的使用者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已經使用了新的資源池了。
- 建立表
簡單的建表語句,此處不在講解了,來說兩個地方,一個是分區,一個是分布鍵。
- 分區:
來看下分區的資料結構
分區是把一張大表按照适合的次元進行分割,通過表的繼承,規則,限制實作。
并不是每個表都适合分區,隻有很大的表才适合分區,應為分區多了會增加表的中繼資料資訊,特别是多級分區。如果一個表被按照日和城市劃分并且有1000個日以及1000個城市,那麼分區的總數就是一百萬。列存表會把每一列存在一個實體表中,是以如果這個表有100個列,系統就需要為該表管理一億個檔案。一方面Linux的iNode可能不會有這麼大,就會出現檔案查詢報錯等,分區過多了,對于資料庫停止和恢複也會造成很大影響的。是以建立分區表的時候,對分區進行自動的建立和删除,以保障合适的資料周期很重要。
- 分布鍵 在MPP架構中,一個查詢是需要從所有segment擷取資料然後在master彙總得到結果的。那麼這樣,影響查詢性能的就有兩個問題,查詢最慢的segment和網絡帶寬。分布鍵就是為了解決第一個問題,讓資料盡可能均勻的分布在每個segment上,進而避免資料傾斜導緻的查詢效率問題。第二個網絡問題,MPP資料叢集搭建要求叢集内部為萬兆網連接配接,并且機器配置一樣,進而避免影響。
分布鍵一般選擇主鍵,比如手機号等。
盡量選擇經常需要 JOIN 的列,當關聯鍵和分布鍵均一緻時,可以在 Segment 中完成 JOIN,不需要重分布或者廣播小表。
以上就是GPDB簡單的管理流程,後面我們會再介紹更深入的查詢優化和管理知識。