PostgreSQL
一種超越MYSQL的開源關係型數據庫
告知:作者在初學PostgreSQL的過程中將學習思路和操作流程記錄下來,希望對初學者有一定幫助
環境告知:
1 操作系統:Centos7.7
2 必須的依賴工具庫
① make版本3.80或以上
②GCC編譯器
③GNU Readline庫:它允許psql記住你輸入的每個命令,這樣就可以通過上下方向鍵快速輸入之前的命令,默認開啓,也可以通過編譯參數–without-readline來禁止它,建議保留默認。
④Zlib庫
yum install -y readline \
readline-devel \
openssl \
openssl-devel \
zlib \
zlib-devel
3 環境變量
#默認安裝路徑/usr/local/pgsql/
export PG_HOME=/usr/local/pgsql/
export PATH="$PG_HOME/bin:$PATH"
##########################################################
1 安裝
作者提供三種安裝方式,並親測有效
1.1 yum安裝
流程:
①下載官方yum源
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
#路徑可能根據官方的更新而失效,進入連接,選擇你想要的版本
https://yum.postgresql.org/repopackages.php#pg10
②yum安裝
yum clean all \
&& yum repolist \
&& yum -y install postgresql10-server
③初始化
yum安裝默認路徑
/usr/pgsql-10/bin/postgresql-10-setup initdb
④啓動
systemctl restart postgresql-10.service \
&& systemctl enable postgresql-10.service
⑤驗證
#使用postgres用戶進入
[root@db1 ~]# su postgres
#進入PostpreSQL數據庫
bash-4.2$ psql
#退出
postgres=# \q
#返回終端
bash-4.2$ exit
#已退出
[root@db1 ~]#
⑥安裝成功,到此,yum安裝PostgreSQL完成!!!
###########################################################
1.2 源碼安裝
流程:
①獲取官方源碼包
我準備裝11.7版本(12版本還不穩定),選擇其他版本進入下面的第一個地址後退選擇目的版本即可
安裝官方教學:
https://www.postgresql.org/docs/11/install-getsource.html
源碼包:
https://www.postgresql.org/ftp/source/
11.7:連接可能隨着官方的更新而失效
https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz
②源碼安裝
指定安裝路徑,便於管理:/usr/local/postgresql
--prefix=/usr/local/postgresql
依賴gcc等,自行安裝(根據報錯提示安裝)
mkdir -p /usr/local/postgresql
wget https://ftp.postgresql.org/pub/source/v11.7/postgresql-11.7.tar.gz \
-O /usr/local/postgresql/postgresql-11.7.tar.gz
cd /usr/local/postgresql/
tar -xvf postgresql-11.7.tar.gz
cd postgresql-11.7
#按照默認安裝
./configure --prefix=/?
#如果出現報錯:configure: error: readline library not found
yum -y install readline readline-devel
#再運行
./configure --prefix=/?
make && make install
#成功
#生成/usr/local/pgsql目錄,默認路徑/usr/local/pgsql
詳細的configure配置:
https://blog.csdn.net/pg_hgdb/article/details/81946121
③初始化數據庫
cd /usr/local/pgsql/
mkdir /usr/local/pgsql/data/
chown postgres: /usr/local/pgsql/data/
sudo su postgres
#-D定義數據的存放路徑
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
④啓動與開機自啓
在解壓路徑下有一個
/usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux
cp -a /usr/local/postgresql/postgresql-11.7/contrib/start-scripts/linux \
/etc/init.d/postgresql
vi /etc/init.d/postgresql
#根據實際情況修改下列兩行內容
prefix=/usr/local/pgsql #安裝路徑
PGDATA="/usr/local/pgsql/data" #數據庫路徑
#centos6版本的啓動方式,centos7版本的啓動方式還未研究
service postgresql start
service postgresql status
#關閉
service postgresql stpo
#啓動成功,能看見PID
#使用postgres用戶連接
sudo su postgres
/usr/local/pgsql/bin/psql
#進入
#安裝成功
#查看版本
postgres=# select version();
version
----------------------------------------------------------------
PostgreSQL 11.7 on x86_64-pc-linux-gnu, compiled
by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)
#製作軟連接
rm -rf /usr/bin/psql
ln -s /usr/local/pgsql/bin/psql /usr/bin/psql
sudo su postgres
psql
#成功進入
⑤!!!缺少源碼啓動方式,後面補充
補充:
#源碼啓動
#初始化數據庫時,提示了啓動方式,注意有一個logfile
#這裏在安裝目錄增加一個文件夾log,用來記錄日誌
mkdir -p /usr/local/pgsql/logs/server.log
#啓動,並指定數據庫與日誌
pg_ctl -D /usr/local/pgsql/data/ \
-l /usr/local/pgsql/logs/server.log \
(start/stop)
⑥安裝成功,到此,源碼安裝PostgreSQL完成!!!
postgresql詳細配置,端口,開放網段
https://blog.csdn.net/Linjingke32/article/details/80393576
###########################################################
1.3 二進制安裝
①下載二進制包
pgsql有很多類型的包,對於不同linux發行版都有對應的編譯好的包,安裝很方便,另外如果對於通用的linux平臺可以編譯源碼安裝或者安裝官方編譯好的二進制包,源碼包的安裝僅僅比二進制安裝多出一個編譯步驟,其餘的都一樣,所以這裏使用安裝方式是安裝編譯好的二進制包
pgsql官網地址:https://www.postgresql.org/,進入後點擊download就來到下載頁,這裏點擊Linux下面的Other Linux選項,然後點擊下方的tar.gz archive下載二進制歸檔
然後就來到最終的pgsql下載頁了,地址爲:https://www.enterprisedb.com/download-postgresql-binaries,如下圖下載最新版本的10.1https://sbp.enterprisedb.com/getfile.jsp?fileid=12574&_ga=2.120855624.1731532218.1589505053-724926244.1589505053
如上圖根據機器的位數下載對應的包,我這裏下載的是x86-64的包,爲:postgresql-10.1-1-linux-x64-binaries.tar.gz,下載之後準備安裝
②安裝二進制包
將下載好的二進制包上傳到你的目標路徑,我放到/root/postgresql###驗證結果表面,不能放在root下,後來我轉移到/pgsql
useradd postgres
mkdir /pgsql
cd /pgsql
tar -xvf postgresql-10.12-1-linux-x64-binaries.tar.gz
#得到pgsql文件夾
cd pgsql
#創建數據庫文件和日誌文件data logs
mkdir data logs
chown postgres: /root/postgresql/pgsql -R
#初始化數據庫data
sudo su postgres
./bin/initdb -D data
#初始化成功,提示啓動命令
#啓動,定義啓動日誌名稱server.log
./bin/pg_ctl -D data -l logs/server.log start
#查看幫助
./bin/pg_ctl --help
#啓動成功
#連接postgresql
./bin/psql
#建議設置軟連接或者別名
#軟連接設置了很多次都沒有成功,幾個bin sbin都試了
alias psql='/pgsql/pgsql/bin/psql'
echo 'alias psql="/pgsql/pgsql/bin/psql"' >> /etc/bashrc
*③安裝成功,到此,二進制安裝PostgreSQL完成!!!
安裝部分結束。
###########################################################
2 PostgreSQL基本操作
2.1 添加用戶和新數據庫
初次安裝後,默認生成一個名爲postgres的數據庫和一個名爲postgres的數據庫用戶。這裏需要注意的是,同時還生成了一個名爲postgres的Linux系統用戶。
下面,我們使用postgres用戶,來生成其他用戶和新數據庫。好幾種方法可以達到這個目的,這裏介紹兩種。
2.1.1 使用PostgreSQL控制檯
#首先,新建一個Linux新用戶,可以取你想要的名字,這裏爲dbuser。
sudo adduser dbuser
#然後,切換到postgres用戶。
sudo su - postgres
#下一步,使用psql命令登錄PostgreSQL控制檯。
psql
#這時相當於系統用戶postgres以同名數據庫用戶的身份,登錄數據庫,這是不用輸入密碼的。
#如果一切正常,系統提示符會變爲"postgres=#",表示這時已經進入了數據庫控制檯。以下的命令都在控制檯內完成。
#第一件事是使用\password命令,爲postgres用戶設置一個密碼。
\password postgres
#第二件事是創建數據庫用戶dbuser(剛纔創建的是Linux系統用戶),並設置密碼。
CREATE USER dbuser WITH PASSWORD 'password';
#第三件事是創建用戶數據庫,這裏爲exampledb,並指定所有者爲dbuser。
CREATE DATABASE exampledb OWNER dbuser;
#第四件事是將exampledb數據庫的所有權限都賦予dbuser,否則dbuser只能登錄控制檯,沒有任何數據庫操作權限。
GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;
#最後,使用\q命令退出控制檯(也可以直接按ctrl+D)。
\q
2.1.2 使用shell命令行
#添加新用戶和新數據庫,除了在PostgreSQL控制檯內,還可以在shell命令行下完成。
#這是因爲PostgreSQL提供了命令行程序createuser和createdb。還是以新建用戶dbuser和數據庫exampledb爲例。
#源碼和二進制安裝方式則需要指定./bin/createuser ./bin/createdb 命令
#也可以製作軟連接和設置別名Alias實現
#首先,創建數據庫用戶dbuser,並指定其爲超級用戶。
sudo -u postgres createuser --superuser dbuser
sudo -u postgres createuser -s dbuser -P #交互式設置新用戶密碼
#接着,在shell命令行下,創建數據庫exampledb,並指定所有者爲dbuser。
sudo -u postgres createdb -O dbuser exampledb
##########################################################
2.2 登錄數據庫
#修改配置文件,開放所有IP
vi postgresql.conf
vi pg_hba.conf
#添加新用戶和新數據庫以後,就要以新用戶的名義登錄數據庫,這時使用的是psql命令。
psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432 -W
#上面命令的參數含義如下:
#-U指定用戶,-d指定數據庫,-h指定服務器,-p指定端口,-W指定密碼。
#輸入上面命令以後,系統會提示輸入dbuser用戶的密碼。
#輸入正確,就可以登錄控制檯了。
#psql命令存在簡寫形式。
#如果當前Linux系統用戶,同時也是PostgreSQL用戶,則可以省略用戶名(-U參數的部分)。
#舉例來說,我的Linux系統用戶名爲ruanyf,且PostgreSQL數據庫存在同名用戶
#則我以ruanyf身份登錄Linux系統後,可以直接使用下面的命令登錄數據庫,且不需要密碼。
psql exampledb
#此時,如果PostgreSQL內部還存在與當前系統用戶同名的數據庫,則連數據庫名都可以省略。
#比如,假定存在一個叫做ruanyf的數據庫,則直接鍵入psql就可以登錄該數據庫。
psql
#另外,如果要恢復外部數據,可以使用下面的命令。
psql exampledb < exampledb.sql
###########################################################
2.3 控制檯命令集
#除了前面已經用到的\password命令(設置密碼)和\q命令(退出)以外,控制檯還提供一系列其他命令。
\h:查看SQL命令的解釋,比如\h select。
\?:查看psql命令列表。
\l:列出所有數據庫。
\c [database_name]:連接其他數據庫。
\d:列出當前數據庫的所有表格。
\d [table_name]:列出某一張表格的結構。
\du:列出所有用戶。
\e:打開文本編輯器。
\conninfo:列出當前數據庫和連接的信息。
##########################################################
2.4 數據庫SQL
#基本的數據庫操作,就是使用一般的SQL語言。
# 創建新表
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入數據
INSERT INTO user_tbl(name, signup_date) VALUES('張三', '2013-12-22');
# 選擇記錄
SELECT * FROM user_tbl;
# 更新數據
UPDATE user_tbl set name = '李四' WHERE name = '張三';
# 刪除記錄
DELETE FROM user_tbl WHERE name = '李四' ;
# 添加欄位
ALTER TABLE user_tbl ADD email VARCHAR(40);
# 更新結構
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名欄位
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 刪除欄位
ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名
ALTER TABLE user_tbl RENAME TO backup_tbl;
# 刪除表格
DROP TABLE IF EXISTS backup_tbl;
到此,PostgreSQL的安裝和基本操作部分已完成,下面對架構進行優化。
##########################################################
3 PostgreSQL主從結構
數據庫版本必須一致
https://www.jianshu.com/p/2d07339774c0
主服務器:
#先創建一個新目錄用來存放歸檔文件
mkdir /opt/pgsql/pg_archive
#創建一個數據庫用戶進行主從同步。創建用戶replica,並賦予登錄和複製的權限
postgres# CREATE ROLE replica login replication encrypted password 'replica'
#修改pg_hba.conf,允許replica用戶來同步
#允許94連接到主服務器
host all all 192.168.200.90/32 trust
#允許94使用replica用戶來複制
host replication replica 192.168.200.90/32 md5
#這樣,就設置了replica這個用戶可以從主服務器進行流複製請求
#注:
#第二個字段必須要填replication
#修改postgresql.conf
listen_addresses = '*' # 監聽所有IP
archive_mode = on # 允許歸檔
archive_command = 'cp %p /opt/pgsql/pg_archive/%f' # 用該命令來歸檔logfile segment
wal_level = hot_standby
max_wal_senders = 32 #這個設置了可以最多有幾個流複製連接,差不多有幾個從,就設置幾個wal_keep_segments = 256 # 設置流複製保留的最多的xlog數目
wal_sender_timeout = 60s #設置流複製主機發送數據的超時時間
max_connections = 100 #這個設置要注意下,從庫的max_connections必須要大於主庫的
#配置完兩個文件後重啓服務器
#測試從服務器能否連接主服務器數據庫
#在從服務器上運行如下命令:
psql -h 192.168.200.113 -U postgres
#看看是否能進入數據庫。若可以,則正常
從服務器:
#從主節點拷貝數據到從節點
su - postgres
rm -rf /opt/pgsql/data/* #先將data目錄下的數據都清空
pg_basebackup -h 192.168.200.113 -U replica -D /opt/pgsql/data -X stream -P # 從93拷貝數據到94(基礎備份)
#./bin/pg_basebackup -h 192.168.200.91 -U replication -D data/ -F p -P -W
mkdir /opt/pgsql/pg_archive
#配置recovery.conf
#複製/usr/pgsql-9.4/share/recovery.conf.sample 到 /opt/pgsql/data/recovery.conf
#recovery.conf
standby_mode = on # 說明該節點是從服務器
primary_conninfo = 'host=192.168.20.93 port=5432 user=replica password=replica' # 主服務器的信息以及連接的用戶
recovery_target_timeline = 'latest'
#配置postgresql.conf
wal_level = hot_standby
max_connections = 1000 # 一般查多於寫的應用從庫的最大連接數要比較大
hot_standby = on # 說明這臺機器不僅僅是用於數據歸檔,也用於數據查詢
max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間
wal_receiver_status_interval = 10s # 多久向主報告一次從的狀態,當然從每次數據複製都會向主報告狀態,這裏只是設置最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的數據複製,是否向主進行反饋
#配置完後重啓從服務器
驗證部署:
#在主節點上執行:
select client_addr,sync_state from pg_stat_replication;
#結果如下:
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
-----------------+------------
192.168.200.90 | async
(1 行記錄)
#說明90是從服務器,在接收流,而且是異步流複製。
#進程查看
ps aux | grep postgres
親測有效:
主服務器
從服務器
注意:這裏有坑,官方二進制包的動態庫不夠,會失敗
建議使用yum安裝,源碼安裝未測試
拓展:
#備註:歸檔標識文件archive_active 需要手工創建。
archive_command = '/bin/date' # (change requires restart)
#archive_command='cp %p /archive/pg93/%f'
archive_command = 'test ! -f /pgsql/pgsql/archive/10/archive_active || cp %p /pgsql/pgsql/archive/10/%f'
archive_command = 'if [ -f "/archive/pg93/archive_active" ]; then cp %p /archive/pg93/%f; fi'
archive_command = 'DIR=/pgarch/arch/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/%f && sudo cp %p $DIR/%f'