文章目錄
- 1 PostgreSQL 簡介
- 2 PostgreSQL 與 MySQL 的區別
- 3 PostgreSQL 的安裝
- 1_Linux部署
- 2_容器化部署
- 4 PostgreSQL的配置
- 1_遠程連接配置
- 2_配置數據庫的日志
- 3_設置數據庫密碼
- 5 PostgreSQL 基本操作
- 1_用戶操作
- 2_權限操作
- 3_創建一個自己的用戶
- 4_差異補充
- 6 安裝圖形化界面
- 1_使用 pgAdmin(官方推薦)
- 2_DBeaver(多數據庫通用)
- 3_DataGrip(JetBrains 出品)
- 4_Navicat for PostgreSQL(商業)
- 7 總結
- 1_安全卸載
- 2_結語
1 PostgreSQL 簡介
PostgreSQL 是一個功能強大、開源的對象-關系型數據庫系統,以其可靠性、數據完整性、可擴展性而著稱,底層使用 C 語言實現。
它采用與 Linux 內核相同的開源協議 —— BSD 協議。
這一協議非常寬松,與 MIT 協議類似,允許你在遵守基礎條款的前提下進行二次開發,甚至將其商業化并收費。
自 1986 年起由加州大學伯克利分校開始開發,PostgreSQL 目前在全球范圍擁有活躍的社區和商業支持。
PostgreSQL 最初的前身是名為 Ingres 的數據庫系統。
后來為了改進 Ingres 的架構并解決其存在的問題,開發者將新系統命名為 Postgres,意指 “Ingres 的后繼者(Post-Ingres)”。
隨后,為了強調其對 SQL 的支持,最終定名為 PostgreSQL。
PostgreSQL 擁有一個非常活躍的開源社區,通常每三個月會發布一個小版本,頻繁的更新使得常見的 bug 能夠被及時修復。
雖然 PostgreSQL 在國外應用廣泛,但在國內目前仍以 MySQL 為主流。
不過,許多國產數據庫產品都是基于 PostgreSQL 二次開發的,例如:
- 華為的 GaussDB
- 騰訊的 TBase
此外,許多企業從 Oracle 遷移數據庫時,也選擇 PostgreSQL 作為替代方案,各大云廠商(如阿里云、騰訊云、華為云)均已支持 PostgreSQL。
得益于開源生態,PostgreSQL 社區提供了大量的數據遷移工具,方便用戶從其他數據庫系統平滑遷移(pgloader)。
主要特性:
- 完整的 ACID 支持
- 支持復雜查詢、并發控制、多版本并發控制(MVCC)
- 支持存儲過程、觸發器、自定義類型、擴展模塊
- 原生 JSON/JSONB 支持,適合構建混合結構的數據系統
PostgreSQL 官方網站:https://www.postgresql.org/
PostgreSQL 中文社區:http://www.postgres.cn/index.php/v2/home
2 PostgreSQL 與 MySQL 的區別
技術沒有好壞之分,主要看能否解決你的業務需求,其次查看社區的活躍度以及更新的頻次。
對比項 | PostgreSQL 15 | MySQL 8.0 |
---|---|---|
數據類型 | 豐富(布爾、網絡地址、XML、數組…) | 支持類型較基礎 |
序列(Sequence)機制 | 支持 | 不支持 |
擴展性 | 高,支持擴展、插件、自定義操作符 | 較低 |
并發控制 | MVCC(40 億事務版本號) | MVCC(不同的實現) |
高并發讀寫 | 性能指標強(極限負載) | 出現波峰后下滑 |
JSON 支持 | 原生 JSON/JSONB,強大查詢功能 | 支持 JSON,但功能弱 |
同步復制機制 | 異步、同步 | 只支持異步 |
存儲過程 | 支持多種語言(PL/pgSQL、Python、JavaScript 等) | 主要是 SQL 和最近支持的其他語言 |
適用場景 | 企業級復雜系統、GIS、大數據處理 | 輕量應用、Web 項目、CMS 系統 |
開源協議 | BSD 協議 | GPL 協議(嚴格) |
總結:MySQL 輕便易用,適合中小項目;PostgreSQL 功能強大,更適合對復雜業務和數據一致性有高要求的系統。
3 PostgreSQL 的安裝
僅在Linux中嘗試安裝,不推薦大家在Windows下安裝。
1_Linux部署
進入官網選擇Linux和對應的發型商,比如我的是紅帽系的系統:
點擊后跳轉到如下地址:https://www.postgresql.org/download/linux/redhat/
選擇好對應的PostgreSQL版本、服務器型號和架構后將出現安裝命令,直接復制即可。
命令如下(如果網絡不好直接粘貼下面命令即可):
# 下載PostgreSQL的rpm包
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安裝PostgreSQL15的軟件程序,需要下載,需要等一會,一般不會失敗,即便失敗,他也會重新幫你找鏡像
sudo yum install -y postgresql15-server
# 數據庫初始化
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
# 設置開啟啟動項,并設置為開啟自行啟動
sudo systemctl enable postgresql-15
# 啟動PostgreSQL
sudo systemctl start postgresql-15
可能出現的問題:鏡像不存在或鏡像倉庫問題(可以使用國內鏡像源比如阿里鏡像站)、插件等相關依賴不存在(配置 Epel 鏡像即可解決)、端口占用、Linux網絡問題等等。。。。
2_容器化部署
如果有docker直接運行如下命令即可:
# 指定好容器名、用戶、密碼、默認數據庫、容器內數據存放路徑、端口號、卷掛載路徑
docker run -d \--name postgres \-e POSTGRES_PASSWORD=postgres \-e POSTGRES_USER=postgres \-e POSTGRES_DB=postgres \-e PGDATA=/var/lib/postgresql/data/pg_data \-p 5432:5432 \-v pg_data:/var/lib/postgresql/data/pg_data \postgres:15
# 可以使用 docker volume inspect pg_data 查看掛載路徑
# 默認在/var/lib/docker/volumes/pg_data/_data目錄下
4 PostgreSQL的配置
要搞兩個配置信息,關于PostgreSQL的遠程連接配置以及PostgreSQL的日志配置。
配置文件通常位于:
/var/lib/pgsql/<version>/data # version = 15
主要文件:
postgresql.conf
:設置端口、日志、連接數等pg_hba.conf
:配置客戶端認證方式(local/host/md5/trust 等)
查看 data 目錄下的所有配置文件
ll /var/lib/pgsql/15/data
上圖可以看到,postgreSQL的核心文件,都屬于postgres用戶,操作的時候,盡可能的別用root用戶,容易玩出坑,盡可能先切換到postgres用戶。
1_遠程連接配置
PostgreSQL默認情況下不支持遠程連接的,這個跟MySQL幾乎一樣。
也就是說PostgreSQL也要基于配置文件修改,才能制定用戶是否可以遠程連接。
直接去修改pg_hba.conf
配置文件,用戶以及對應數據庫和連接方式的編寫模板
# local:代表本地連接,host代表可以指定連接的ADDRESS
# database編寫數據庫名,如果寫all,代表所有庫都可以連接
# user編寫連接的用戶,可以寫all,代表所有用戶
# address代表那些IP地址可以連接
# method加密方式,這塊不用過多關注,直接md5
# 直接來個痛快的配置嗎,允許任意地址的全部用戶連接所有數據庫
host all all 0.0.0.0/0 md5
為了實現遠程連接,除了用戶級別的這種配置,還要針對服務級別修改一個配置,服務級別的配置在postgresql.conf
:
發現默認情況下,PostgreSQL只允許localhost
連接,直接配置為*
即可解決問題,為了生效,一定要記得重啟PostgreSQL服務
# postgres密碼不管,直接root用戶
sudo systemctl restart postgresql-15
2_配置數據庫的日志
查看postgresql.conf
文件
PostgreSQL默認情況下,只保存7天的日志,循環覆蓋。
# 日志輸出到標準錯誤中
log_destination = 'stderr'
# 代表日志是開啟的。
logging_collector = on
# 日志存放的路徑,默認放到當前目錄下的log里
log_directory = 'log'
# 日志的文件名,默認是postgresql為前綴,星期作為后綴
log_filename = 'postgresql-%a.log'
# 一天一個日志文件
log_rotation_age = 1d
# 一個日志文件,沒有大小限制
log_rotation_size = 0
# 默認一周過后,日志文件會被覆蓋
log_truncate_on_rotation = on
3_設置數據庫密碼
默認的用戶和密碼配置
sudo -u postgres psql
\password postgres
5 PostgreSQL 基本操作
由于當前PostgreSQL服務就在本機,所以直接執行以下命令
# 切換到postgres用戶
su postgres
# 進入 PostgreSQL 命令行
psql
使用 psql --help
,查看psql命令的完整參數如下:
PostgreSQL中類似于MySQL中的 DQL、DDL、DML 這些數據庫級別的命令基本相同。
我們主要看一些PostgreSQL特有的服務級別的命令,常用命令如下:
\dt -- 查看所有表
\l -- 查看所有數據庫
\du -- 查看所有用戶
\q -- 退出 psql
\? [commands] -- 顯示反斜線命令的幫助
\? options -- 顯示 psql 命令行選項的幫助
\? variables -- 顯示特殊變量的幫助
\h [NAME] -- SQL命令語法上的說明,用*顯示全部命令的語法說明
PostgreSQL默認會為我們生成三個庫,如下
1_用戶操作
構建用戶命令巨簡單
-- 區別就是create user默認有連接權限,create role沒有,不過可以基于選項去設置
CREATE USER 名稱 [ [ WITH ] 選項 [ ... ] ]
create role 名稱 [ [ WITH ] 選項 [ ... ] ]
構建一個超級管理員用戶
create user root with SUPERUSER PASSWORD 'root';
退出psql命令行
嘗試使用root用戶登錄PostgreSQL命令行
psql -h 192.168.200.129 -p 5432 -U root -W
# psql: 錯誤: 連接到"192.168.200.129"上的服務器,端口5432失敗:FATAL: database "root" does not exist
發現,只有用戶不讓登錄,用戶需要有一個數據庫,直接構建一個root庫
create database root; -- 使用postgre創建
可以在不退出psql的前提下,直接切換數據庫\c database_name
:
也可以退出psql,重新基于psql命令去切換用戶以及數據庫。
如果要修改用戶信息,或者刪除用戶,可以查看
# 修改用戶,直接基于ALTER命令操作
# 刪除用戶,直接基于DROP命令操作
如果要查看現在的全部用戶信息
2_權限操作
權限操作前,要先掌握一下PostgreSQL的邏輯結構
邏輯結構圖 |
---|
![]() |
可以看到PostgreSQL一個數據庫中有多個schema,在每個schema下都有自己的相應的庫表信息,權限粒度會比MySQL更細一些。
在PostgreSQL中,權限的管理分為很多多層
server、cluster、tablespace級別:這個級別一般是基于pg_hba.conf
去配置
database級別:通過命令級別操作,grant
namespace、schema級別:不用過多了解這個~~
對象級別:通過grant命令去設置
后面如果需要對database或者是對象級別做權限控制,直接基于grant命令去操作即可
-- 查看grant命令
\help grant
3_創建一個自己的用戶
整體流程如下:
-- 準備用戶
create user shenyang with password 'shenyang';
-- 準備數據庫
create database shenyang;
-- 切換數據庫
\c shenyang;
-- 構建schema
create schema shenyang;
-- 將schema的擁有者修改為 shenyang 用戶
alter schema shenyang owner to shenyang;
-- 將shenyang庫下的shenyang的schema中的表的增,改,查權限賦予給shenyang用戶
grant select,insert,update on all tables in schema shenyang to shenyang;
-- 用postgres用戶先構建一張表
create table shenyang.test(id int);
-- 切換到shenyang用戶的shenyang庫。
\c shenyang -shenyang
-- 報錯:
-- 致命錯誤: 對用戶"-shenyang"的對等認證失敗
-- Previous connection kept
-- 上述方式直接涼涼,原因是匹配連接方式時,基于pg_hba.conf文件去從上往下找
-- 找到的第一個是local,匹配上的。發現連接方式是peer。
-- peer代表用當前系統用戶去連接PostgreSQL
-- 當前系統用戶只有postgres,沒有shenyang,無法使用peer連接
-- 想構建shenyang用戶時,發現postgreSQL的所有文件擁有者和所屬組都是postgres,并且能操作的只有擁有者-- 基于上述問題,不采用本地連接即可。
-- 采用遠程連接。
psql -h 192.168.200.129 -p 5432 -U shenyang -W
-- 這樣依賴,跳過了local鏈接方式的匹配,直接鎖定到后面的host,host的連接方式是md5,md5其實就是密碼加密了。
-- 登錄后,直接輸入
\dn
查看到當前database下有兩個schema
這種權限的賦予方式,可以用管理員用戶去構建整體表結構,如此一來,分配指定用戶,賦予不同的權限,就不怕用戶誤操了。
4_差異補充
還有很重要的一點需要補充:
PostgreSQL填充關鍵字時并不像MySQL使用``
反引號標記,而是使用雙引號""
。
6 安裝圖形化界面
1_使用 pgAdmin(官方推薦)
- 下載地址:https://www.pgadmin.org/download/
- 跨平臺支持,功能全面(表管理、SQL 查詢、權限配置等)
2_DBeaver(多數據庫通用)
- 官網:https://dbeaver.io/
- 開源、UI 美觀,支持 PostgreSQL、MySQL、Oracle 等
3_DataGrip(JetBrains 出品)
- 強大的 SQL 編輯器和數據庫管理工具,適合高級用戶
4_Navicat for PostgreSQL(商業)
- 功能完整,適合商業場景,但非免費
7 總結
1_安全卸載
使用如下命令完全卸載PostgreSQL,容器化安裝則無需考慮數據殘留問題
# 卸載PostgreSQL,清空全部數據
version=15 # 定義你自己的版本號
sudo systemctl stop postgresql-${version} # 停止服務
sudo yum remove -y postgresql${version}\* # 卸載軟件和軟件包
# 刪除所有相關目錄
sudo rm -rf /var/lib/pgsql/${version}/
sudo rm -rf /usr/pgsql-${version}/
sudo rm -rf /var/log/pgsql/
# 刪除用戶和用戶組
sudo userdel postgres
# sudo groupdel postgres
# 刪除倉庫配置
sudo yum remove -y pgdg-redhat-repo
# 完整清理檢查
sudo find / -name "*pgsql*" -o -name "*postgres*" 2>/dev/null
2_結語
PostgreSQL 是一個值得深入掌握的數據庫系統,它不僅穩定高效,而且功能強大,支持豐富的擴展能力。
無論是從性能、SQL 規范支持,還是企業級部署能力來看,它都具備成為核心數據庫的實力。