當前位置:首頁 » 數據倉庫 » fdwpg資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

fdwpg資料庫

發布時間: 2022-08-19 08:12:37

❶ 請問ora2pg如何使用,如何將oracle資料庫中的函數,表,存儲過程,數據,觸發器等移植到postgresql里呢

高版本PG可以用oracle_fdw來做,類似DBLINK,很方便。也可以用oracle的spool導出,然後用Postgres的COPY導入,速度也較快。

❷ 什麼資料庫比較熱門

總體來說,主流資料庫並不存在明確的好壞之分,每一種資料庫都有各自的優缺點,最主要還是看它是否能夠滿足您的需求。

總的來說,選擇資料庫可以從以下角度考慮:

從個人角度出發的話,如果是以學習和小型業務需求為主,推薦使用MySQL,它的優勢在於:

成本(免費)
自由(完全開源,適用多個場景)
性能(體積小但速度快)
這三點決定了MySQL資料庫的超高性價比。並且目前有不少主流公司仍然青睞MySQL,大名鼎鼎的Fackbook就依然在延續MySQL的使用。

2. 如果是企業角度出發,主流的大型資料庫如Oracle、Sql Server...以及近些年來大數據領域十分火熱的非關系型資料庫,例如Redis、HBse等等,都可以作為考慮的對象。

接下來具體列舉一些常用資料庫的優缺點,希望能為大家提供參考:
MySQL:
優勢:

MySQL是開放源代碼的資料庫,任何人都可以獲得該資料庫的源代碼。
MySQL能夠實現跨平台操作,可以在Windows、UNIX、Linux和Mac OS等操作系統上運行。
MySQL資料庫是一款自由軟體,大部分應用場景下都是免費使用。
MySQL功能強大且使用方便,社區生態繁榮,有諸多學習資料。
缺點:規模小,功能有限。

SQL Server
高度可擴展:可以從單一的筆記本電腦上運行任何東西或以高倍雲伺服器網路運行,或在兩者之間任何東西。
「雖然說是「任何東西」,但是仍然要滿足相關的軟體和硬體的要求「
生態鏈廣:具有內置的商務智能工具,以及一系列的分析和報告工具,可以創建資料庫、備份、復制,帶來了更好的安全性。
Oracle
Oracle資料庫系統是目前世界上流行的關系資料庫管理系統,具有以下特點:

可移植性好(在各類大、中、小、微機環境中都適用)
使用方便、
功能強
因此,Oracle是一種高效率、可靠性好的、適應高吞吐量的資料庫解決方案。

DB2
DB2是IBM開發的一種大型關系型資料庫平台。它支持多用戶或應用程序在同一條SQL 語句中查詢不同database甚至不同DBMS中的數據。它的應用特點如下:

支持面向對象的編程:db2支持復雜的數據結構,如無結構文本對象,可以對無結構文本對象進行布爾匹配、最接近匹配和任意匹配等搜索。可以建立用戶數據類型和用戶自定義函數。
支持多媒體應用程序:db2支持大二分對象(blob),允許在資料庫中存取二進制大對象和文本大對象。其中,二進制大對象可以用來存儲多媒體對象。
具有良好的備份和恢復能力
支持存儲過程和觸發器,用戶可以在建表時顯示的定義復雜的完整性規則
支持異構分布式資料庫訪問,支持數據復制
PostgreSQL
PostgreSQL 是一個免費的對象-關系資料庫伺服器(ORDBMS),它的 Slogan 是 「世界上最先進的開源關系型資料庫」。

PostgreSQL具有如下特徵:
函數:通過函數,可以在資料庫伺服器端執行指令程序。
索引:用戶可以自定義索引方法,或使用內置的 B 樹,哈希表與 GiST 索引。
觸發器:觸發器是由SQL語句查詢所觸發的事件。如:一個INSERT語句可能觸發一個檢查數據完整性的觸發器。觸發器通常由INSERT或UPDATE語句觸發。 多版本並發控制:PostgreSQL使用多版本並發控制(MVCC,Multiversion concurrency control)系統進行並發控制,該系統向每個用戶提供了一個資料庫的」快照」,用戶在事務內所作的每個修改,對於其他的用戶都不可見,直到該事務成功提交。
規則:規則(RULE)允許一個查詢能被重寫,通常用來實現對視圖(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、刪除(DELETE)。
數據類型:包括文本、任意精度的數值數組、JSON 數據、枚舉類型、XML 數據等。
全文檢索:通過 Tsearch2 或 OpenFTS,8.3版本中內嵌 Tsearch2。
NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 資料庫的外部數據包裝器。
數據倉庫:能平滑遷移至同屬 PostgreSQL 生態的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 進行 ETL

❸ MySQL與PostgreSQL相比哪個更好

MySQL
MySQL聲稱自己是最流行的開源資料庫。LAMP中的M指的就是MySQL。構建在LAMP上的應用都會使用MySQL,如WordPress、Drupal等大多數php開源程序。MySQL最初是由MySQL AB開發的,然後在2008年以10億美金的價格賣給了Sun公司,Sun公司又在2010年被Oracle收購。Oracle支持MySQL的多個版本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費下載的,另外一些則是收費的。其核心代碼基於GPL許可,由於MySQL被控制在Oracle,社區擔心會對MySQL的開源會有影響,所以開發了一些分支,比如: MariaDB和Percona。
PostgreSQL
PostgreSQL標榜自己是世界上最先進的開源資料庫。PostgreSQL的一些粉絲說它能與Oracle相媲美,而且沒有那麼昂貴的價格和傲慢的客服。最初是1985年在加利福尼亞大學伯克利分校開發的,作為Ingres資料庫的後繼。PostgreSQL是完全由社區驅動的開源項目。它提供了單個完整功能的版本,而不像MySQL那樣提供了多個不同的社區版、商業版與企業版。PostgreSQL基於自由的BSD/MIT許可,組織可以使用、復制、修改和重新分發代碼,只需要提供一個版權聲明即可。
MySQL與PostgreSQL的對比
MySQL的背後是一個成熟的商業公司,而PostgreSQL的背後是一個龐大的志願開發組。這使得MySQL的開發過程更為慎重,而PostgreSQL的反應更為迅速。這樣的兩種背景直接導致了各自固有的優點和缺點。
PostgreSQL相對於MySQL的優勢
1)不僅僅是關系型資料庫
除了存儲正常的數據類型外,還支持存儲:
array,不管是一位數組還是多為數組均支持
json(hStore)和jsonb,相比使用text存儲接送要高效很多
json和jsonb之間的區別
jsonb和json在更高的層面上看起來幾乎是一樣的,但在存儲實現上是不同的。
json存儲完的文本,json列會每次都解析存儲的值,它不支持索引,但你可以為查詢創建表達式索引。
jsonb存儲的二進制格式,避免了重新解析數據結構。它支持索引,這意味著你可以不使用指定的索引就能查詢任何路徑。
當我們比較寫入數據速度時,由於數據存儲的方式的原因,jsonb會比json稍微的慢一點。json列會每次都解析存儲的值,這意味著鍵的順序要和輸入的時候一樣。但jsonb不同,以二進制格式存儲且不保證鍵的順序。因此,如果你有軟體需要依賴鍵的順序,jsonb可能不是你的應用的最佳選擇。使用jsonb的優勢還在於你可以輕易的整合關系型數據和非關系型數據, PostgreSQL對於mongodb這類的基於文檔的資料庫是個不小的威脅,畢竟如果一個表中只有一列數據的類型是半結構化的,沒有必要為了遷就它而整個表的設計採用schemaless的結構。
2)支持地理信息處理擴展
PostGIS 為PostgreSQL提供了存儲空間地理數據的支持,使PostgreSQL成為了一個空間資料庫,能夠進行空間數據管理、數量測量與幾何拓撲分析。在功能上,和MYSQL對比,PostGIS具有下列優勢:

O2O業務場景中的LBS業務使用PostgreSQL + PostGIS有無法比擬的優勢。
3)可以快速構建REST API
PostgREST 可以方便的為任何 PostgreSQL 資料庫提供完全的 RESTful API 服務。
4)支持樹狀結構
支持R-trees這樣可擴展的索引類型,可以更方便地處理一些特殊數據。MySQL 處理樹狀的設計會很復雜, 而且需要寫很多代碼, 而 PostgreSQL 可以高效處理樹結構。
5)有極其強悍的 SQL 編程能力
支持遞歸,有非常豐富的統計函數和統計語法支持。
MySQL:支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數可以用 SQL、C 和 C++ 編寫。
PostgreSQL:沒有單獨的存儲過程,都是通過函數實現的。用戶定義函數可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。
6)外部數據源支持
可以把 70 種外部數據源 (包括 Mysql, Oracle, CSV, hadoop …) 當成自己資料庫中的表來查詢。Postgres有一個針對這一難題的解決方案:一個名為「外部數據封裝器(Foreign Data Wrapper,FDW)」的特性。該特性最初由PostgreSQL社區領袖Dave Page四年前根據SQL標准SQL/MED(SQL Management of External Data)開發。FDW提供了一個SQL介面,用於訪問遠程數據存儲中的遠程大數據對象,使DBA可以整合來自不相關數據源的數據,將它們存入Postgres資料庫中的一個公共模型。這樣,DBA就可以訪問和操作其它系統管理的數據,就像在本地Postgres表中一樣。例如,使用FDW for MongoDB,資料庫管理員可以查詢來自文檔資料庫的數據,並使用SQL將它與來自本地Postgres表的數據相關聯。藉助這種方法,用戶可以將數據作為行、列或JSON文檔進行查看、排序和分組。他們甚至可以直接從Postgres向源文檔資料庫寫入(插入、更細或刪除)數據,就像一個一體的無縫部署。也可以對Hadoop集群或MySQL部署做同樣的事。FDW使Postgres可以充當企業的中央聯合資料庫或「Hub」。
7)沒有字元串長度限制
一般關系型資料庫的字元串有限定長度8k左右,無限長 TEXT 類型的功能受限,只能作為外部大數據訪問。而PostgreSQL的 TEXT 類型可以直接訪問,SQL語法內置正則表達式,可以索引,還可以全文檢索,或使用xml xpath。MySQL 的各種text欄位有不同的限制,要手動區分 small text, middle text, large text… PostgreSQL 沒有這個限制,text 能支持各種大小。
8)支持圖結構數據存儲
沒有具體使用過,具體可以自己搜索下。參考鏈接:https://mp.weixin.qq.com/s/cjor82wgDu5gzDvTYpLDWw
9)支持窗口函數
窗口函數提供跨行相關的當前查詢行集執行計算的能力。僅當調用跟著OVER子句的聚集函數,作為窗口函數;否則它們作為常規的聚合函數。窗口也是一種分組,但和 group by 的分組不同。窗口,可以提供分組之外,還可以執行對每個窗口進行計算。可以相像成是group by 後,然後對每個分組進行計算,而不像Group by ,只是單純地分組。MySQL 不支持 OVER 子句, 而PostgreSQL支持。OVER 子句能簡單的解決 「每組取 top 5」 的這類問題。MySQL支持的SQL語法(ANSI SQL標准)的很小一部分。不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(分析函數)。
10)對索引的支持更強
PostgreSQL 的可以使用函數和條件索引,這使得PostgreSQL資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。對於索引類型:
MySQL:取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。
PostgreSQL:支持 B-樹、哈希、R-樹和 Gist 索引。
InnoDB的表和索引都是按相同的方式存儲。也就是說表都是索引組織表。這一般要求主鍵不能太長而且插入時的主鍵最好是按順序遞增,否則對性能有很大影響。PostgreSQL不存在這個問題。
索引類型方面,MySQL取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。PostgreSQL支持 B-樹、哈希、R-樹和 Gist 索引。
11)集群支持更好
Mysql Cluster可能與你的想像有較大差異。開源的cluster軟體較少。復制(Replication)功能是非同步的並且有很大的局限性。例如,它是單線程的(single-threaded),因此一個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master。
PostgreSQL有豐富的開源cluster軟體支持。plproxy 可以支持語句級的鏡像或分片,slony 可以進行欄位級的同步設置,standby 可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單。
另外,PostgreSQL的主備復制屬於物理復制,相對於MySQL基於binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。對於WEB應用來說,復制的特性很重要,mysql到現在也是非同步復制,pgsql可以做到同步,非同步,半同步復制。還有mysql的同步是基於binlog復制,類似oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合異地復制,pgsql的復制基於wal,可以做到同步復制。同時,pgsql還提供stream復制。
12)事務隔離做的更好
MySQL 的事務隔離級別 repeatable read 並不能阻止常見的並發更新, 得加鎖才可以, 但悲觀鎖會影響性能, 手動實現樂觀鎖又復雜. 而 PostgreSQL 的列里有隱藏的樂觀鎖 version 欄位, 默認的 repeatable read 級別就能保證並發更新的正確性, 並且又有樂觀鎖的性能。
13)對於字元支持更好一些
MySQL 里需要 utf8mb4 才能顯示 emoji 的坑, PostgreSQL 沒這個坑。
14)對表連接支持較完整
對表連接支持較完整,MySQL只有一種表連接類型:嵌套循環連接(nested-loop),不支持排序-合並連接(sort-merge join)與散列連接(hash join)。PostgreSQL都支持。
15)存儲方式支持更大的數據量
PostgreSQL主表採用堆表存放,MySQL採用索引組織表,能夠支持比MySQL更大的數據量。
16)時間精度更高
MySQL對於時間、日期、間隔等時間類型沒有秒以下級別的存儲類型,而PostgreSQL可以精確到秒以下。
17)優化器的功能較完整
MySQL對復雜查詢的處理較弱,查詢優化器不夠成熟,explain看執行計劃的結果簡單。性能優化工具與度量信息不足。
PostgreSQL很強大的查詢優化器,支持很復雜的查詢處理。explain返回豐富的信息。提供了一些性能視圖,可以方便的看到發生在一個表和索引上的select、delete、update、insert統計信息,也可以看到cache命中率。網上有一個開源的pgstatspack工具。
18)序列支持更好
MySQL 不支持多個表從同一個序列中取 id, 而 PostgreSQL 可以。
19)對子查詢支持更好
對子查詢的支持。雖然在很多情況下在SQL語句中使用子查詢效率低下,而且絕大多數情況下可以使用帶條件的多表連接來替代子查詢,但是子查詢的存在在很多時候仍然不可避免。而且使用子查詢的SQL語句與使用帶條件的多表連接相比具有更高的程序可讀性。幾乎任何資料庫的子查詢 (subquery) 性能都比 MySQL 好。
20)增加列更加簡單
MySQL表增加列,基本上是重建表和索引,會花很長時間。PostgreSQL表增加列,只是在數據字典中增加表定義,不會重建表.
MySQL相對於PostgreSQL的優勢
1)MySQL比PostgreSQL更流行
流行對於一個商業軟體來說,也是一個很重要的指標,流行意味著更多的用戶,意味著經受了更多的考驗,意味著更好的商業支持、意味著更多、更完善的文檔資料。易用,很容易安裝。第三方工具,包括可視化工具,讓用戶能夠很容易入門。
2)回滾實現更優
innodb的基於回滾段實現的MVCC機制,相對PG新老數據一起存放的基於XID的MVCC機制,是占優的。新老數據一起存放,需要定時觸發VACUUM,會帶來多餘的IO和資料庫對象加鎖開銷,引起資料庫整體的並發能力下降。而且VACUUM清理不及時,還可能會引發數據膨脹。
3)在Windows上運行更可靠
與PostgreSQL相比,MySQL更適宜在Windows環境下運行。MySQL作為一個本地的Windows應用程序運行(在 NT/Win2000/WinXP下,是一個服務),而PostgreSQL是運行在Cygwin模擬環境下。PostgreSQL在Windows下運行沒有MySQL穩定,應該是可以想像的。
4)線程模式相比進程模式的優勢
MySQL使用了線程,而PostgreSQL使用的是進程。在不同線程之間的環境轉換和訪問公用的存儲區域顯然要比在不同的進程之間要快得多。
進程模式對多CPU利用率比較高。進程模式共享數據需要用到共享內存,而線程模式數據本身就是在進程空間內都是共享的,不同線程訪問只需要控制好線程之間的同步。
線程模式對資源消耗比較少。所以MySQL能支持遠比PostgreSQL多的更多的連接。但PostgreSQL中有優秀的連接池軟體軟體,如pgbouncer和pgpool,所以通過連接池也可以支持很多的連接。
5)許可權設置上更加完善
MySQL在許可權系統上比PostgreSQL某些方面更為完善。PostgreSQL只支持對於每一個用戶在一個資料庫上或一個數據表上的 INSERT、SELECT和UPDATE/DELETE的授權,而MySQL允許你定義一整套的不同的數據級、表級和列級的許可權。對於列級的許可權, PostgreSQL可以通過建立視圖,並確定視圖的許可權來彌補。MySQL還允許你指定基於主機的許可權,這對於目前的PostgreSQL是無法實現的,但是在很多時候,這是有用的。
6)存儲引擎插件化機制
MySQL的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態數據的查詢場景。
7)適應24/7運行
MySQL可以適應24/7運行。在絕大多數情況下,你不需要為MySQL運行任何清除程序。PostgreSQL目前仍不完全適應24/7運行,這是因為你必須每隔一段時間運行一次VACUUM。
8)更加試用於簡單的場景
PostgreSQL只支持堆表,不支持索引組織表,Innodb只支持索引組織表。
索引組織表的優勢:表內的數據就是按索引的方式組織,數據是有序的,如果數據都是按主鍵來訪問,那麼訪問數據比較快。而堆表,按主鍵訪問數據時,是需要先按主鍵索引找到數據的物理位置。
索引組織表的劣勢:索引組織表中上再加其它的索引時,其它的索引記錄的數據位置不再是物理位置,而是主鍵值,所以對於索引組織表來說,主鍵的值不能太大,否則佔用的空間比較大。
對於索引組織表來說,如果每次在中間插入數據,可能會導致索引分裂,索引分裂會大大降低插入的性能。所以對於使用innodb來說,我們一般最好讓主鍵是一個無意義的序列,這樣插入每次都發生在最後,以避免這個問題。
由於索引組織表是按一個索引樹,一般它訪問數據塊必須按數據塊之間的關系進行訪問,而不是按物理塊的訪問數據的,所以當做全表掃描時要比堆錶慢很多,這可能在OLTP中不明顯,但在數據倉庫的應用中可能是一個問題。
總結
MySQL從一開始就沒有打算做所有事情,因而它在功能方面有一定的局限性,並不能滿足一些先進應用程序的要求。MySQL對某些功能(例如引用、事務、審計等)的實現方式使得它與其他的關系型資料庫相比缺少了一些可靠性。對於簡單繁重的讀取操作,使用PostgreSQL可能有點小題大做,同時性能也比MySQL這樣的同類產品要差。除非你需要絕對的數據完整性,ACID遵從性或者設計復雜,否則PostgreSQL對於簡單的場景而言有點多餘。
如何你確定只在MySQL和PostgreSQL中進行選擇,以下規則總是有效的:
如果你的操作系統是Windows,你應該使用MySQL。
當絕對需要可靠性和數據完整性的時候,PostgreSQL是更好的選擇。
如果需要資料庫執行定製程序,那麼可擴展的PostgreSQL是更好的選擇。
你的應用處理的是地理數據,由於R-TREES的存在,你應該使用PostgreSQL。
如果你對資料庫並不了十分了解,甚至不知道事務、存儲過程等究竟是什麼,你應該使用MySQL。

❹ postgreSQL的簡單介紹

postgreSQL是一款先進的開源資料庫,擁有非常齊全的自由軟體的對象-關系型資料庫管理系統(ORDBMS),可面向企業復雜SQL的OLTP業務場景,支持多項企業級功能,能解決使用資料庫的各種難題。

PostgreSQL的優勢有很多。它是一個免費的對象-關系資料庫伺服器(ORDBMS),在靈活的BSD許可證下發行。

postgreSQL的特徵
函數:通過函數,可以在資料庫伺服器端執行指令程序。

索引:用戶可以自定義索引方法,或使用內置的 B 樹,哈希表與 GiST 索引。

觸發器:觸發器是由SQL語句查詢所觸發的事件。如:一個INSERT語句可能觸發一個檢查數據完整性的觸發器。觸發器通常由INSERT或UPDATE語句觸發。 多版本並發控制:PostgreSQL使用多版本並發控制(MVCC,Multiversion concurrency control)系統進行並發控制,該系統向每個用戶提供了一個資料庫的"快照",用戶在事務內所作的每個修改,對於其他的用戶都不可見,直到該事務成功提交。

規則:規則(RULE)允許一個查詢能被重寫,通常用來實現對視圖(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、刪除(DELETE)。

數據類型:包括文本、任意精度的數值數組、JSON 數據、枚舉類型、XML 數據等。全文檢索:通過 Tsearch2 或 OpenFTS,8.3版本中內嵌 Tsearch2。

NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 資料庫的外部數據包裝器。

數據倉庫:能平滑遷移至同屬postgreSQL生態的GreenPlum,DeepGreen,HAWK 等,使用 FDW 進行 ETL。

❺ vb 能不能寫個語句把SQL里的數據輸出到對應的text.text

建立一個模塊
將工程的啟動設置為 SUB MAIN
在模塊里寫下面代碼
Public db As Database
Public rs As Recordset
Sub main()
set db=db.opendatabase("資料庫路徑"<建議用相對路徑--就是把資料庫文件和工程文件放在同一目錄下--相對路徑就是APP.PATH+"資料庫名帶後綴">)
第一啟動窗體<比如:form1>.show
end sub
以後在其他窗體中如果要調用資料庫只用在窗體中寫代碼
set rs=openrecordset(<可以是資料庫的表--如"student",也可以是查詢語句--如"select* form student">)
這時資料庫的內容都存在FILE集合里
比方說set rs=openrecordset("select* form student")
rs.file(0)就是SQL語句查詢結果的第一列
rs.files就是整個結果
使用text1.text=rs.file(0)就可以把文本框於查詢結果幫定起來
如果要對資料庫進行修這時用以下代碼:
db.Execute (<SQL語句--如"insert into student(sno,sname) value("","")">)

❻ postgresql怎麼給一個用戶賦予許可權

grant db_role1 to db_user1,db_user2; 意為:給用戶1,2賦予角色1,兩個用戶就擁有了角色1對應的許可權。

1、角色

PostgreSQL使用角色的概念管理資料庫訪問許可權。 根據角色自身的設置不同,一個角色可以看作是一個資料庫用戶,或者一組資料庫用戶。 角色可以擁有資料庫對象(比如表)以及可以把這些對象上的許可權賦予其它角色, 以控制誰擁有訪問哪些對象的許可權。

2、角色的許可權

一個資料庫角色可以有很多許可權,這些許可權定義了角色和擁有角色的用戶可以做的事情。

3、用戶

其實用戶和角色都是角色,只是用戶是具有登錄許可權的角色。

4、賦予角色控制許可權

可以使用GRANT 和REVOKE命令賦予用戶角色,來控制許可權。

如:

create role db_role1 createdb createrole; --創建角色1

grant db_role1 to db_user1,db_user2; --給用戶1,2賦予角色1,兩個用戶就擁有了創建資料庫和創建角色的許可權

revoke db_role1 from db_user1; --從用戶1移除角色1,用戶不再擁有角色1的許可權。

(6)fdwpg資料庫擴展閱讀

1、角色許可權相關腳本

create role db_role1 LOGIN; --創建具有登錄許可權的角色db_role1

create role db_role2 SUPERUSER; --創建具有超級用戶許可權的角色

create role db_role3 CREATEDB; --創建具有創建資料庫許可權的角色

create role db_role4 CREATEROLE --創建具有創建角色許可權的角色

alter role db_role1 nologin nocreatedb; --修改角色取消登錄和創建資料庫許可權

2、用戶相關腳本

create user db_user1 password '123'; --創建用戶

create role db_user1 password '123' LOGIN; --同上一句等價

drop user db_user1; --刪除用戶

alter user db_user1 password '123456'; --修改密碼

alter user db_user1 createdb createrole; --對用戶授權

參考資料

網路-postgresql

❼ 討論PostgreSQL 和其他資料庫的差異在哪裡

PostgreSQL 近幾年在全球的人氣不斷攀升,每年發布的版本都體現了社區的活力,9.6作為里程碑式的作品,更加有非常多的新特性加入。

例如
1. 多核並行計算

2. FDW 下推join, sort, where clause.
3. snapshot too old
4. 檢查點平滑fsync
5. vacuum freeze加速
6. sharding base on fdw

7. 分詞增強,支持相鄰phrases搜索,據說比ES用起來還爽。
8. scale-up 多核增強, 72HT的機器tpc-b select only達到了180萬的tps.
9. 推出等待事件統計信息
10. 支持多副本同步復制,滿足金融級可靠性要求

11. 聚合復用SFUNC,多個聚合如果INIT和SFUNC一致的話,可以節約非常多的運算開銷。
12. 事務idle超時機制
還有很多,可以在 release notes頁面查找
https://www.postgresql.org/docs/9.6/static/release-9-6.html

除此之外,社區開發的一些特性也很吸引人,例如
1. rum插件,支持文本相似度查詢,效率嘛10億級別TOKEN,毫秒級響應,比搜索引擎還好用,具體見雲棲社區的測試文章。
2. LLVM版本的PostgreSQL,對大數據量的表達式處理性能提升非常明顯。也是大數據處理慣用的手法,例如Impala。雖然PostgreSQL的定位是OLTP,但不代表它不能處理OLAP的請求,而且Gartner去年就提出了HTAP的資料庫概念,指即能處理TP有能處理AP的資料庫產品,PostgreSQL的特性可見一斑。
3. 10.0版本已經加入的聚合運算元下推,你是不是開始浮想聯翩了呢?
更多的插件可以到github , pgxn.org , pgfoundry ,

❽ 如何擴大postgresql存儲空間

1. 概述
cstore_fdw實現了 PostgreSQL 資料庫的列式存儲。列存儲非常適合用於數據分析的場景,數據分析的場景下數據是批量載入的。
這個擴展使用了Optimized Row Columnar (ORC)數據存儲格式,ORC改進了Facebook的RCFile格式,帶來如下好處:

壓縮:將內存和磁碟中數據大小削減到2到4倍。可以擴展以支持不同壓縮演算法。
列投影:只提取和查詢相關的列數據。提升IO敏感查詢的性能。
跳過索引:為行組存儲最大最小統計值,並利用它們跳過無關的行。
2. 使用
cstore_fdw的安裝和使用都非常簡單,可以參考官方資料。
thub.com/citusdata/cstore_fdw

注)注意cstore_fdw只支持PostgreSQL9.3和9.4 。

下面做幾個簡單的性能對比,看看cstore_fdw究竟能帶來多大的性能提升。

2.1 數據載入
2.1.1 普通表
CREATE TABLE tb1
(
id int,
c1 TEXT,
c2 TEXT,
c3 TEXT,
c4 TEXT,
c5 TEXT,
c6 TEXT,
c7 TEXT,
c8 TEXT,
c9 TEXT,
c10 TEXT
);

注:要和普通表的全表掃描作對比,所以不建主鍵和索引。

[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c " tb1 from STDIN with CSV"
COPY 10000000
1.56user 1.00system 6:42.39elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k
776inputs+0outputs (17major+918minor)pagefaults 0swaps

real 6m42.402s
user 0m15.174s
sys 0m14.904s

postgres=# select pg_total_relation_size('tb1'::regclass);
pg_total_relation_size
------------------------
1161093120
(1 row)

postgres=# \timing
Timing is on.
postgres=# analyze tb1;
ANALYZE
Time: 11985.070 ms

插入1千萬條記錄,數據佔用存儲大小1.16G,插入耗時6分42秒,分析耗時12秒。

2.1.2 cstore表
$ mkdir -p /home/chenhj/data94/cstore

CREATE EXTENSION cstore_fdw;
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;
CREATE FOREIGN TABLE cstb1
(
id int,
c1 TEXT,
c2 TEXT,
c3 TEXT,
c4 TEXT,
c5 TEXT,
c6 TEXT,
c7 TEXT,
c8 TEXT,
c9 TEXT,
c10 TEXT
)
SERVER cstore_server
OPTIONS(filename '/home/chenhj/data94/cstore/cstb1.cstore',
compression 'pglz');

[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text, www.hnne.com id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c " cstb1 from STDIN with CSV"
COPY 10000000
1.53user 0.78system 7:35.15elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k
968inputs+0outputs (20major+920minor)pagefaults 0swaps

real 7m35.520s
user 0m14.809s
sys 0m14.170s

[postgres@node2 chenhj]$ ls -l /home/chenhj/data94/cstore/cstb1.cstore
-rw------- 1 postgres postgres 389583021 Jun 23 17:32 /home/chenhj/data94/cstore/cstb1.cstore

postgres=# \timing
Timing is on.
postgres=# analyze cstb1;
ANALYZE
Time: 5946.476 ms

插入1千萬條記錄,數據佔用存儲大小390M,插入耗時7分35秒,分析耗時6秒。
使用cstore列存儲後,數據佔用存儲大小降到普通表的3分之1。需要說明的是,由於所有TEXT列填充了隨機數據,壓縮率不算高,某些實際的應用場景下壓縮效果會比這更好。

2.2 Text列的like查詢性能對比
2.2.1 普通表
清除文件系統緩存,並重啟PostgreSQL
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart

[root@node2 ~]# free
total used free shared buffers cached
Mem: 2055508 771356 1284152 0 9900 452256
-/+ buffers/cache: 309200 1746308
Swap: 4128760 387624 3741136
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@node2 ~]# free
total used free shared buffers cached
Mem: 2055508 326788 1728720 0 228 17636
-/+ buffers/cache: 308924 1746584
Swap: 4128760 381912 3746848

對Text列執行like查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.42 0.00 95.40

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.55 330.68 212.08 7351441 4714848

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"
count
--------
100000
(1 row)

real 0m7.051s
user 0m0.001s
sys 0m0.004s

[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.39

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.90 381.53 211.90 8489597 4714956

耗時7.1秒,產生IO讀1.14G,IO寫108K。

不清文件系統緩存,不重啟PostgreSQL,再執行一次。消耗時間降到1.6秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.39

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.81 332.20 213.06 7350301 4714364

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"
count
--------
100000
(1 row)

real 0m1.601s
user 0m0.002s
sys 0m0.001s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.38

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.80 332.12 213.01 7350337 4714364

2.2.2 cstore表
清除文件系統緩存,並重啟PostgreSQL
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches

對Text列執行like查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.38 0.00 95.45

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.12 376.42 209.04 8492017 4716048

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"
count
--------
100000
(1 row)

real 0m2.786s
user 0m0.002s
sys 0m0.003s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.38 0.00 95.44

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.12 378.75 208.89 8550761 4716048

耗時2.8秒,產生IO讀59M,IO寫0K。執行時間優化的雖然不是太多,但IO大大減少,可見列投影起到了作用。

不清文件系統緩存,不重啟PostgreSQL,再執行一次。消耗時間降到1.4秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.36 0.00 95.47

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.75 376.33 207.58 8550809 4716524

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"
count
--------
100000
(1 row)

real 0m1.424s
user 0m0.002s
sys 0m0.001s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.36 0.00 95.47

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.70 375.96 207.38 8550809 4716588

2.3 對Int列執行=查詢
2.3.1 普通表
清除文件系統緩存,並重啟PostgreSQL後
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches

對Int列執行=查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.33 0.00 95.50

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.25 373.21 205.67 8560897 4717624

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"
count
-------
1
(1 row)

real 0m6.844s
user 0m0.002s
sys 0m0.006s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.34 0.00 95.49

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.60 422.57 205.54 9699161 4717708

耗時6.8秒,產生IO讀1.14G,IO寫84K
不清緩存,再執行一次。消耗時間降到1.1秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.33 0.00 95.50

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.44 421.37 204.97 9699177 4718032

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"
count
-------

❾ postgreSQL資料庫public許可權拿shell

Pg許可權分為兩部分,一部分是「系統許可權」或者資料庫用戶的屬性,可以授予role或user(兩者區別在於login許可權);一部分為資料庫對象上的操作許可權。對超級用戶不做許可權檢查,其它走acl。對於資料庫對象,開始只有所有者和超級用戶可以做任何操作,其它走acl。在pg里,對acl模型做了簡化,組和角色都是role,用戶和角色的區別是角色沒有login許可權。

可以用下面的命令創建和刪除角色,
CREATE ROLE name;
DROP ROLE name;
為了方便,也可以在 shell 命令上直接調用程序 createuser 和 dropuser,這些工具對相應命令提供了封裝:
createuser name
dropuser name

資料庫對象上的許可權有:SELECT,INSERT, UPDATE,DELETE,RULE, REFERENCES,TRIGGER,CREATE, TEMPORARY,EXECUTE,和 USAGE等,具體見下面定義

typedefuint32AclMode; /* a bitmask of privilege bits */

#define ACL_INSERT (1<<0) /* forrelations */
#defineACL_SELECT (1<<1)
#defineACL_UPDATE (1<<2)
#defineACL_DELETE (1<<3)
#defineACL_TRUNCATE (1<<4)
#defineACL_REFERENCES (1<<5)
#defineACL_TRIGGER (1<<6)
#defineACL_EXECUTE (1<<7) /* for functions */
#defineACL_USAGE (1<<8) /* for languages, namespaces, FDWs, and
* servers */
#defineACL_CREATE (1<<9) /* for namespaces and databases */
#defineACL_CREATE_TEMP (1<<10) /* for databases */
#defineACL_CONNECT (1<<11) /* for databases */
#defineN_ACL_RIGHTS 12 /* 1plus the last 1<<x */
#defineACL_NO_RIGHTS 0
/*Currently, SELECT ... FOR UPDATE/FOR SHARE requires UPDATE privileges */
#defineACL_SELECT_FOR_UPDATE ACL_UPDATE

我們可以用特殊的名字 PUBLIC 把對象的許可權賦予系統中的所有角色。 在許可權聲明的位置上寫 ALL,表示把適用於該對象的所有許可權都賦予目標角色。
beigang=# grantall on schema csm_ca to public;
GRANT
beigang=# revoke all on schema csm_ca frompublic;
REVOKE
beigang=#

每種對象的all許可權定義如下:
/*
* Bitmasks defining "allrights" for each supported object type
*/
#defineACL_ALL_RIGHTS_COLUMN (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_REFERENCES)
#defineACL_ALL_RIGHTS_RELATION (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_DELETE|ACL_TRUNCATE|ACL_REFERENCES|ACL_TRIGGER)
#defineACL_ALL_RIGHTS_SEQUENCE (ACL_USAGE|ACL_SELECT|ACL_UPDATE)
#defineACL_ALL_RIGHTS_DATABASE (ACL_CREATE|ACL_CREATE_TEMP|ACL_CONNECT)
#define ACL_ALL_RIGHTS_FDW (ACL_USAGE)
#defineACL_ALL_RIGHTS_FOREIGN_SERVER (ACL_USAGE)
#defineACL_ALL_RIGHTS_FUNCTION (ACL_EXECUTE)
#defineACL_ALL_RIGHTS_LANGUAGE (ACL_USAGE)
#defineACL_ALL_RIGHTS_LARGEOBJECT (ACL_SELECT|ACL_UPDATE)
#defineACL_ALL_RIGHTS_NAMESPACE (ACL_USAGE|ACL_CREATE)
#defineACL_ALL_RIGHTS_TABLESPACE (ACL_CREATE)