最上層是執行個體,執行個體中允許建立多個資料庫,每個資料庫中可以建立多個schema,每個schema下面可以建立多個對象。
對象包括表、物化視圖、操作符、索引、視圖、序列、函數、... 等等。
在資料庫中所有的權限都和角色(使用者)挂鈎,public是一個特殊角色,代表所有人。
超級使用者是有允許任意操作對象的,普通使用者隻能操作自己建立的對象。
另外有一些對象是有賦予給public角色預設權限的,是以建好之後,是以人都有這些預設權限。
執行個體級别的權限由pg_hba.conf來控制,例如 :
配置解釋
資料庫級别的權限,包括允許連接配接資料庫,允許在資料庫中建立schema。
預設情況下,資料庫在建立後,允許public角色連接配接,即允許任何人連接配接。
預設情況下,資料庫在建立後,不允許除了超級使用者和owner之外的任何人在資料庫中建立schema。
預設情況下,資料庫在建立後,會自動建立名為public 的schema,這個schema的all權限已經賦予給public角色,即允許任何人在裡面建立對象。
schema級别的權限,包括允許檢視schema中的對象,允許在schema中建立對象。
預設情況下建立的schema的權限不會賦予給public角色,是以除了超級使用者和owner,任何人都沒有權限檢視schema中的對象或者在schema中建立對象。
對象級别的權限,每種類型的對象權限屬性都不一樣,具體請參考
<a href="http://www.postgresql.org/docs/9.5/static/sql-grant.html">http://www.postgresql.org/docs/9.5/static/sql-grant.html</a>
以表為例,可以有select | insert | update | delete | truncate | references | trigger這些權限。
簡單介紹一下grant的一些通用選項
with admin option表示被賦予權限的使用者,拿到對應的權限後,還能将對應的權限賦予給其他人,否則隻能自己有這個權限,但是不能再賦予給其他人。
使用者,角色在postgresql是一個概念。
public角色,代表所有人的意思。
以表為例 :
或者執行
得到權限說明如下
解釋一下 access privileges
rolename=xxx 其中rolename就是被賦予權限的使用者名,即權限被賦予給誰了?
=xxx 表示這個權限賦予給了public角色,即所有人
/yyyy 表示是誰賦予的這個權限?
權限的含義如下
例子
賦予權限的人是postgres使用者, sbtest2表的select權限被賦予給了digoal使用者。
回收權限一定要針對已有的權限來,如果你發現這裡的權限還在,那照着權限回收即可。
例如
b-tree:支援排序、範圍查詢、精确查詢;适合所有資料類型,單個索引條目不能超過索引頁的1/3。
hash:支援等值查詢;适合超長字段。
gin:反向索引,支援等值、包含、相交、等查詢;适合多值類型(數組、全文檢索等),任意字段組合查詢。
gist:r-tree索引,支援包含,相交,距離,點面判斷等查詢;适合幾何類型、範圍類型、全文檢索、異構類型等。
sp-gist:空間分區(平衡)r-tree,支援包含,相交,距離,點面判斷等查詢;适合幾何類型、範圍類型、全文檢索、異構類型等。
brin:塊級索引,适合實體存儲與列值存在較好相關性的字段。比如時序資料、物聯網傳感資料、feed資料等。支援範圍查詢、等值查詢。
rum:擴充索引接口,支援全文檢索,支援附加标量類型的全文檢索,支援帶位置關系的全文檢索。
多個索引,postgresql會使用bitmapand或bitmapor合并掃描。
1、建立索引
2、删除舊索引
3、pk\uk的維護,與之類似,增加一步驟。
索引盤:對應索引表空間。
空間評估、iops評估、帶寬評估。建議采用ssd,檔案系統采用ext4或xfs。
資料盤:對應資料檔案表空間。
重做日志盤:對應wal目錄。
歸檔盤:對應wal歸檔目錄。
空間評估、iops評估、帶寬評估。可以采用機械盤,檔案系統采用ext4或xfs或zfs,可以開啟檔案系統壓縮功能。
備份盤:對應資料庫備份目錄。
日志盤(pg_log):對應資料庫審計、錯誤日志目錄。
帶寬評估,網段規劃,防火牆規劃。
不建議使用公網。
根據業務需求,評估cpu主頻,核數。建議實測性能名額。
/etc/sysctl.conf
sysctl -p
/etc/security/limits.conf
/home/digoal/.bash_profile
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_01.md">《postgresql 最佳實踐 - 線上邏輯備份與恢複介紹》</a>
備份digoal庫, ddl中不包含表空間. 是以恢複時不需要提前建立對應的表空間.
如果備份為-f p格式,備份輸出為文本,直接運作即可。
要支援實體備份,務必打開歸檔,同時建議打開流複制。
配置歸檔目錄
配置流複制和歸檔
vi postgresql.conf
重新開機資料庫
vi $pgdata/pg_hba.conf
pg_ctl reload -d $pgdata
建立備份目錄,備份可以通過流複制協定,備份到遠端。
例子 1,通過流複制使用者,以及流複制備份
例子 2,使用cp備份
步驟如下
實體增量備份分為兩種,
一種是資料檔案的增量備份,需要等10.0或者使用pg_rman, pg_probackup
<a href="https://github.com/postgrespro/pg_probackup">https://github.com/postgrespro/pg_probackup</a>
<a href="https://github.com/ossc-db/pg_rman">https://github.com/ossc-db/pg_rman</a>
另一種是歸檔增量備份。
将歸檔檔案拷貝到備份存儲即可。
1. 如果是異機備份,首先要部署postgresql軟體環境,建議部署的postgresql軟體版本與備份的資料檔案一緻。編譯參數一緻。
如何檢視編譯參數?在源庫執行如下指令
部署軟體時,還需要部署源庫所有的postgresql插件,并且需要確定插件版本一緻。
2. 建構恢複目錄,需要有足夠的空間。
3. 解壓資料檔案,歸檔到各自的目錄。
如果有表空間,将表空間使用軟鍊連接配接到$pgdata/pg_tblspc,或者将表空間解壓到$pgdata/pg_tblspc。
4. 修改postgresql.conf
主要修改參數,包括監聽端口,shared buffer, preload library 等,防止端口沖突導緻啟動失敗。
5. 配置$pgdata/recovery.conf,同時設定恢複目标
主要配置,restore_command。(如果是搭建流複制備庫,則需要配置的是#primary_conninfo = '' # e.g. 'host=localhost port=5432'。)
設定恢複到哪個時間點、xid或者target name。(如果是搭建流複制備庫,則需要配置recovery_target_timeline = 'latest')
6. 啟動恢複庫
資料變更操作(主庫)
首先要建立一個記錄還原點xid的表。記錄xid,時間,以及描述資訊。(來代替pg_create_restore_point 系統函數的功能)
建立一個函數,代替pg_create_restore_point的功能,插入還原點。
插入一個還原點
查詢這個表的資訊:
接下來要模拟一下還原:
記錄目前哈希值。用于恢複後的比對。
接下來我要做一筆删除操作,在删除前,我先建立一條還原點資訊。
我隻需要恢複到561574 即可。接下來就是模拟恢複了。
主動産生一些xlog,觸發歸檔。
下載下傳阿裡雲rds的備份和歸檔到本地。
在本地需要安裝一個postgresql, 與阿裡雲rds的編譯配置參數一緻(例如資料塊的大小),最好使用的子產品也一緻,這裡沒有用到其他子產品,是以無所謂。
通過pg_settings來看一下rds的配置資訊,版本資訊,友善我們在本地進行恢複。
本地編譯安裝postgresql 9.4.1,編譯參數與rds一緻。阿裡雲rds這幾個參數都是預設的。
下載下傳備份和歸檔檔案,解壓:
基礎備份選擇需要恢複的時間點之前的一個備份,歸檔則選擇在此之後的所有歸檔檔案。
修改配置檔案,注釋掉阿裡雲rds pg的一些定制參數。
配置recovery.conf
打開hot_standby,恢複到目标點後暫停,如果确認已經到達,使用resume激活。
啟動資料庫
檢查是否恢複到指定xid
檢查,已經恢複到delete test表的資料之前了。
假設 512gb 記憶體, ssd.
pg_stat_statements插件,統計sql調用的資源消耗。
top 5 cpu_time sql
<a href="https://github.com/digoal/blog/blob/master/201611/20161123_01.md">《postgresql awr報告(for 阿裡雲apsaradb pgsql)》</a>
列印逾時sql當時的執行計劃。
explain 文法
explain 例子
explain 節點
初始化資料, 1000萬記錄。
測試
建立測試表
建立腳本
壓測
1、awr健康報告
2、垃圾回收
3、膨脹索引重建
4、top sql性能優化
5、錯誤日志分析
6、安全風險評估(sql注入、暴力破解、密碼周期修改)
7、備份可用性校驗
8、曆史備份和歸檔清理
9、曆史資料清理
10、實時監控系統建設
11、ha建設、監控、演練
12、容災建設、監控、演練
13、審計系統建設
14、業務邏輯優化
15、核心優化
16、版本更新、bug fix
17、社群交流