【PostgreSQL】入門學習筆記
- 2022 年 4 月 19 日
- 筆記
- PostgreSQL
前言:
以下內容為前幾天在備考PostgreSQL入門考試時候做的筆記,經過了全職的兩天的奮戰與實驗,並最終順利通過了PCA初級認證考試。現在把我學習的筆記分享給大家,文中有對應的思維導圖圖片可供查看,內容與後面正文文本一致。另外,由於SQL語句部分比較基礎,基本上會一門數據庫就都會,所以此處部分省略掉不做過多記錄了。
以下,enjoy:
 
# PostgreSQL
## PostgreSQL的發展歷程
### 始於1986年的Postgres項目
### 1994年,新增了SQL語言解釋器,Postgres95誕生
### 1996年,更名 PostgreSQL,版本號從6.0開始
## PostgreSQL的安裝
### yum安裝
– //www.postgresql.org/download/linux/redhat/
    – yum install -y //download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    –  yum install -y postgresql14-server
    –  /usr/pgsql-14/bin/postgresql-14-setup initdb
    – systemctl enable postgresql-14
    – systemctl start postgresql-14
– 其他操作
    – 關閉selinux
        – setenforce 0
        – sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
    – 關閉防火牆
        – systemctl status firewalld.service
        – systemctl stop firewalld.service
        – systemctl disable firewalld.service
    – 修改環境變量  /etc/profile
        – export PATH=/usr/pgsql-14/bin/:$PATH
        – source /etc/profile
### rpm安裝
– //yum.postgresql.org/rpmchart/
    – postgresql14
    – postgresql14-contrib
    – postgresql14-libs
    – postgresql14-server
– rpm -ivh postgresql14*
### 源碼的安裝
– wget //ftp.postgresql.org/pub/source/v13.3/postgresql-13.3.tar.gz
tar xf postgresql-13.3.tar.gz
– 重要的依賴:readline,flex,bison
    – yum install -y bison flex readline-devel zlib-deve1 zlib zlib-devel gcc openssl-devel
– ./configure && make && make install | install-world
– 編譯
    – cd postgresql-xx/
    – ./configure –prefix=/XXX/postgresql –with-openssl
    – gmake world && gmake install-world
– 授權
    – chown -R postgres. /XXX/postgresql
– 環境變量  /etc/profile
    – export PATH=/XXX/postgresql/bin:$PATH
export PGDATA=/XXX/postgresql/data
    – source /etc/profile
– 初始化
    – su – postgres
initdb -D $PGDATA
– 啟動
    – pg_ctl -D $PGDATA start
– 使用系統管理
    –  修改: /usr/lib/systemd/system/postgresql-xx.service
        – [Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGPORT=5432
Environment=PGDATA=/XXX/postgresql/data/
OOMScoreAdjust=-1000
ExecStart=/XXX/postgresql/bin/pg_ctl start -D ${PGDATA} -s -o “-p ${PGPORT}” -w -t 300
ExecStop=/XXX/postgresql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/XXX/postgresql/bin/pg_ctl reload -D ${PGDATA} -s
TimeoutSec=300
[Install]
WantedBy=multi-user.target
    – 重新加載:systemctl daemon-reload
    – 使用systemctl啟動
        – systemctl start postgresql-xx.service
systemctl enable postgresql-xx.service
### 二進制的安裝
– EDB
## PostgreSQL的安裝(其他)
### 初始化命令
– 運行initdb創建數據庫實例:
    – $ su – postgres
    – $ initdb -D
        – 指定數據目錄。沒有指定,將使用環境變量PGDATA
    – $ initdb -U
        – 指定數據庫超級用戶名字
    – -E
        – 指定數據庫字符編碼
    – -n
        – 錯誤後不清理文件
    – -W
        – 初始化時給數據庫設置密碼
    – -x
        – 預寫日誌目錄位置
    – –wal-segsize=XXX
        – 指定 WAL 段大小(單位 M),默認是 16M,最大 1G
### 啟動和關閉
– system管理方式
    – systemctl start postgresql-xx
systemctl enable postgresql-xx
systemctl status postgresql-xx
systemctl stop postgresql-xx
– postgresql自帶的命令
    – pg_ctl start
pg_ctl stop
pg_ctl status
    – pg_ctl -D $PGDATA stop -m smart
pg_ctl -D $PGDATA stop -m fast
pg_ctl -D $PGDATA stop -m immediate
        – smart 等待客戶端斷開連接(執行之後會特別慢)
        – fast 回滾未完成的事務,斷開客戶端連接(推薦用法)
        – immediate 強行終止進程,數據庫沒有乾淨的關閉
– 啟動\停止有關日誌
    – vim /var/lib/pgsql/xx/data/log/postgresql-Mon.log
### 注意事項
– 關閉防火牆
    – systemctl status firewalld.service
    – systemctl stop firewalld.service
    – systemctl disable firewalld.service
– ntp時間同步
    – 服務端配置
        – yum -y install ntp
        – 修改配置文件 /etc/ntp.conf
            – 給本機權限:
restrict 127.0.0.1
restrict ::1
            – 例如授權10.0.0.0網段上所有的機器允許從ntp服務器上查詢和同步時間:
restrict 10.0.0.0 mask 255.255.255.0 nomodify notrap
            – 增加時間服務器列表:
0.asia.pool.ntp.org
0.cn.pool.ntp.org
time.nist.gov
server 0.asia.pool.ntp.org iburst
server 1.asia.pool.ntp.org iburst
server 2.asia.pool.ntp.org iburst
server 3.asia.pool.ntp.org iburst
            – 當外部時間不可用時,使用本地時間:
server 127.127.1.0 iburst
fudge 127.127.1.0 stratum 10
        – 設置開機自啟動
            – systemctl enable ntpd
systemctl start ntpd
systemctl enable ntpdate
systemctl start ntpdate
        – 查看ntp情況
            – ntpq -p
                – remote: NTP主機的IP或主機名稱;
最左邊是 + 表示目前正在起作用的上層NTP;如果是 * 表示這個也連接上了,不過是作為次要聯機的NTP主機
                – refid: 參考上一層NTP主機的地址
                – st: stratum階層
                – t: 連接類型
                    – u:單播(unicast)
                    – l:本地(local)
                    – m: 多播(multicast)
                    – b: 廣播(broadcast)
                – when: 這個時間之前剛剛做過時間同步
                – poll: 在幾秒之後進行下次更新
                – reach: 已經向上層NTP服務器要求更新的次數
                – delay: 網絡傳輸過程中的延遲時間
                – offset: 時間補償的結果
                – jitter: Linux系統時間和Bios硬件時間的差異時間
        – 與硬件時間進行同步
            – hwclock -w
        – 測試
            – ntpstat
    – 客戶端配置
        – yum -y install ntp ntpdate
        – 方法一
            – 重啟服務以使配置生效,之後大概要等10分鐘左右,才會同步成功
                – echo “server ip” >/etc/ntp.conf
systemctl enable ntpd
systemctl restart ntpd
hwclock -w
        – 方法二
            – systemctl enable ntpdate
/usr/sbin/ntpdate -u ip
hwclock -w
crontab -e
10 23 * * * (/usr/sbin/ntpdate -u ip && /sbin/hwclock -w)&>/var/log/ntpdate.log
– 如果配置主從,盡量保持uid和gid一致
    – 檢查uid和gid
        – id postgres
    – 通過usermod,groupmod修改OS用戶uid和gid
        – groupmod -g 1000 postgres
usermod -u 1000 -g 1000 postgres
– 關閉selinux
    – setenforce 0
    – sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
– psql參數的使用
    – 參數說明
        – -U
            – 以哪個用戶登錄
        – -W
            – 強制輸入密碼
        – -h
            – 主機名/IP地址
        – -p
            – 端口號
        – -d
            – 登錄哪個數據庫
    – 查看版本信息
        – psql –version
select version();
## PostgreSQL的配置
### 參數的修改
– 文件位置:$ PGDATA/postgresql.conf
    – include_if_exists = ‘xxx.conf’
        – 開啟參數,並存在可使用的 $PGDATA/xxx.conf 文件才會進行加載
    – include_dir = ‘conf.d’
        – 加載目錄下的參數文件,$PGDATA/.conf.d/xxx.conf
    – include = ‘xxx.conf’
        – 無論參數文件是否存在都會加載  $PGDATA/xxx.conf
    – 數據庫啟動時,會讀取該文件,可手動修改
– postgresql.auto.conf
    – alter system修改後的參數配置,會覆蓋postgresql.conf的值
– recovery.conf
    – pg12已經不存在這個文件,已經將此文件的參數合併到了postgresql.conf
– pg_hba.conf  客戶端認證配置文件(PG防火牆)
    – 第一列 TYPE(連接方式)
        – local
            – 使用Unix域套接字的連接,如果沒有TYPE為local的條目則不允許通過Unix域套接字連接
        – host
            – 匹配使用TCP/IP建立的連接,同時匹配SSL和非SSL連接
        – hostssl
            – 匹配必須是使用SSL的TCP/IP進行連接。
                – 配置hostssl的3個條件
                    –  戶端和服務端都安裝openssl
                    –  編譯時要指定 –with-openssl 打開ssl支持
                    – 在postgresql.conf中配置ssl = on
        – hostnossl
            – 只匹配使用非SSL的TCP/IP連接
    – 第二列 DATABASE(目標數據庫)
        – 標識該行設置對哪個數據庫生效
    – 第三列 USER (目標用戶)
        – 標識該行設置對哪個數據庫用戶生效
    – 第四列 ADDRESS (訪問來源)
        – 標識該行設置對哪個IP地址或IP地址段生效
    – 第五列 METHOD (認證方式)
        – reject
            – 無條件拒絕連接
        – md5 或 password
            – 雙重md5加密和明文加密
        – scram-sha-256
            – postgresql10中新增最安全的加密方式
            – 查看沒有用SCRAM加密口令的用戶
                – create user foo password ‘foopassword’;
                – select usename,passwd from pg_shadow where passwd not like ‘SCRAM%’ or passwd is null;
                – select usename,passwd from pg_shadow ;
        – trust
            – 無條件的允許連接
        – cert
            – 使用SSL客戶端證書認證
        – peer
            – 本地操作系統的當前用戶名和數據庫的用戶名一致時,可以直接使用此用戶名登錄而不需要密碼
        – ident
            – 用戶映射文件
    – 查看當前的加密方法
        – postgres=# show password_encryption;
    – 修改加密方法
        – postgres=# alter system set password_encryption = ‘scram-sha-256’;
postgres=# show password_encryption;
postgres=# select pg_reload_conf();
    – 修改密碼
        – postgres=# alter user foo password ”Xzzp2008 ‘;
    – 遠程登錄
        – psql -h 192.168.1.221 -p 5433 -d postgres -U foo -W
    – 加強口令複雜度管理插件
        – passwordcheck
            – //www.postgresql.org/docs/current/static/passwordcheck.html
– pg_ident.conf 客戶端認證映射文件
### 數據庫相關命令
– 查看參數
    – 查詢pg_settings系統表
        – SELECT name,setting FROM pg_settings where name ~ 『xxx』;
    – select name,setting,unit,short_desc from pg_settings where name like ‘work_mem%’;
    – SELECT current_setting(name);
    – SELECT current_setting(‘work_mem’);
    – 通過show 命令查看
        – show all
– 參數生效幾種方式
    – SELECT pg_reload_conf();
    – pg_ctl -D $PGDATA reload;
    – /etc/init.d/postgresql-11.x reload; (el6)
    – systemctl reload service.postgresql-11.x (el7)
– 子主題 3
### 數據庫管理
– 客戶端工具
    – pgAdmin
        – //www.pgadmin.org
        – yum / apt install pgadmin
    – psql
        – 連接數據庫
            – psql -h localhost -p 5432 database_name
        – 獲得psql的幫助
            – \?
        – 獲得語法的幫助
            – \h STATEMENT
        – 在shell中執行命令
            – psql -c “STATEMENT”
        – 通過psql執行sql文件
            – psql < f.sql
        – 其他
            – \l 查看有哪些數據庫
            – \c 用於切換數據庫
            – \d 顯示每個匹配關係(表,視圖,索引,序列)的信息
            – \d 後面跟一個表名,表示顯示錶結構定義
            – \d 後跟一個索引名,顯示索引的信息
            – \d 後面跟一個視圖名,顯示視圖信息
            – \timing on 顯示SQL執行的時間
            – \timing off 關閉計時功能
            – \dn 列出所有的schema
            – \db 顯示所有的表空間
            – \du\dg 列出所有的角色或者用戶
            – \dp 顯示權限分配情況
            – \x 行列互換顯示
            – \set AUTOCOMMIT off 將自動提交功能關閉
## 體系結構
### 內存結構
– shared_buffers
    – 共享內存
– work_mem
    – 當使用order by或distinct操作對元組僅從排序時會使用這部分內存
– wal_buffer
    – wal緩存
### 進程結構
– 查看進程
    – –ps –ef |grep post
– background writer
    – 進程將shared buffer pool中的臟數據寫到磁盤,檢查點總能觸發這個進程
– checkpointer
    – 檢查點會觸發產生這個進程
– autovacuum launcher
    – autovacuum的守護進程,為vacuum process周期性的調用autovacuum work processes
    – autovacuum的作用
        – 刪除或重用無效元組的磁盤空間
        – 更新數據統計信息,保證執行計劃更優
        – 更新visibility map,加速index-only scans
        – 避免XID回卷造成的數據丟失
– WAL writer
    – 周期性的從wal buffer刷新數據到磁盤
– statistics collector
    – 收集統計信息進程,比如pg_stat_activity 和pg_stat_database的數據。(表和索引進行了多少次插入,更新,刪除操作,磁盤塊讀寫次數及行的讀寫次數)
– logging collector (logger)
    – 將錯誤信息寫入到日誌
– archiver
    – 將日誌歸檔的進程
– postgremaster
    – 監聽
### 數據庫集群概念
– 一個數據庫集簇(database cluster)=一個數據庫實例(簡稱「實例」)
– 每個數據庫實例由數據庫目錄組成,目錄中包含了所有的數據文件和配置文件
– 不同的實例可以通過兩種方式引用
    – 數據目錄的位置
    – 端口號
– 一個服務器可以管理多個數據庫實例
### 物理結構
– 數據目錄
    – base
        – 表和索引文件存放目錄
    – global
        – 影響全局的系統表存放目錄
    – pg_commit_ts
        – 事務提交時間戳數據存放目錄
    – pg_stat
        – 統計子系統信息永久文件
    – pg_wal
        – 事務日誌(預寫日誌)
– 相關文件
    – PG_VERSION
        – 版本號文件
    – pg_hba.conf
        – 客戶端認證控制文件
    – postgresql.conf
        – 參數文件
    – postgresql.auto.conf
        – 參數文件,只保存ALTER SYSTEM命令修改的參數
    – postmaster.opts
        – 記錄服務器最後一次啟動時使用的命令行參數
    – pg_ident.conf
        – 控制postgresql用戶名映射文件
    – postmaster.pid
        – 記錄數據庫進程編號、PGDATA、端口等
## 數據庫故障排查
### 查看操作系統錯誤日誌
– /var/log/message 系統啟動後的信息和錯誤日誌,是Red Hat Linux中最常用的日誌之一
### 查看數據庫錯誤日誌
– 查看文件$PGDATA/log
默認情況下,一天產生一個日誌
## SQL入門
### DDL
– 數據定義語言,用來定義庫和表
### DML
– 數據操作語言
### DCL
– 數據控制語言
### DQL
– 數據查詢語言
### 數據類型
– 字符類型
– 數字類型
– 日期/時間類型
– 範圍類型
– 布爾類型
– 相關約束
### 其他
## 數據庫備份相關
### 物理備份
– 熱備
    – 全量 pg_basebackup
        –  備份命令:
pg_basebackup -h ip -D /XXX/backup -P -p 5432 -U postgres
        – 恢復命令: 
cd /xxx/backup/
tar xf base.tar.gz -C ../data
    – 結合時間點進行恢復
        – 創建歸檔目錄
            – mkdir -p /XXX/archive
            – chown -R postgres. /XXX/
        – 開啟歸檔,並重啟數據庫
            – wal_level = ‘replica’
                – wal_level參數說明
                    – minimal
                        – 記錄wal最少,記錄數據庫異常關閉需要恢復的wal外,其它操作都不記錄
                    – replica
                        – 在minimal的基礎上還支持wal歸檔、複製和備庫中啟用只讀查詢等操作所需的wal信息
                    – logical
                        – 記錄wal日誌信息最多,包含了支持邏輯解析(10版本的新特性,邏輯複製使用這種模式)所需的wal,此參數包含了minimal和replica所有的記錄
            – archive_mode = ‘on’
            – archive_command = ‘cp %p /XXX/archive/%f’
            – 重啟數據庫
                – pg_ctl restart
        – 執行全量備份
            – pg_basebackup -D /xxx/backup -P -p 5432 -U postgres
            – 如果此時的數據有變化,也可以執行增量備份:
pg_receivewal -D /xxx/backup/ -p 5432
        – 啟動備份實例,進行數據恢復
            – vim postgresql.conf
recovery_target_time = ‘2022-04-17 16:00:00.00000+08’
restore_command=’cp /xxx/archive/%f %p’
recovery_target_action = ‘promote’
        – 創建備庫標籤
            – touch recovery.signal
        – 啟動數據庫
            – pg_ctl -D /xxx/backup start
        – 關閉讀模式
            – select pg_wal_replay_resume();
    – 結合還原點進行恢復
        – 創建歸檔目錄
            – mkdir -p /xxx/archive
chown -R postgres. /xxx/
        – 開啟歸檔,並重啟數據庫
            – wal_level = ‘replica’
archive_mode = ‘on’
archive_command = ‘cp %p /xxx/archive/%f’
        – 重啟數據庫
            – pg_ctl restarat
        – 執行全量備份
            – pg_basebackup -h ip -D /xxx/backup -P -p 5432 -U postgres
        – 如果有變化的數據,可以執行增量備份
            – pg_receivewal -D /xxx/backup/ -p 5432
        – 啟動備份實例,進行數據恢復
            – vim postgresql.conf
recovery_target_name = ‘huanyuan’
restore_command=’cp /xxx/archive/%f %p’
recovery_target_action = ‘promote’
            – touch recovery.signal
        – 啟動數據庫
            – pg_ctl -D /xxx/backup start
        – 關閉讀模式
            – select pg_wal_replay_resume();
    – 結合事務進行恢復
        – 創建歸檔目錄
            – mkdir -p /xxx/archive
chown -R postgres. /xxx/
        – 開啟歸檔,並重啟數據庫
            – wal_level = ‘replica’
archive_mode = ‘on’
archive_command = ‘cp %p /xxx/archive/%f’
        – 重啟數據庫
            – pg_ctl restarat
        – 執行全量備份
            – pg_basebackup -h ip -D /xxx/backup -P -p 5432 -U postgres
        – 如果有變化的數據,可以執行增量備份
            – pg_receivewal -D /xxx/backup/ -p 5432
        – 啟動備份實例,進行數據恢復
            – vim postgresql.conf
recovery_target_xid = ‘487’
restore_command=’cp /xxx/archive/%f %p’
recovery_target_action = ‘promote’
touch recovery.signal
        – 啟動數據庫
            – pg_ctl -D /xxx/backup start
        – 關閉讀模式
            – select pg_wal_replay_resume();
    – 結合LSN號碼進行恢復
        – 創建歸檔目錄
            – mkdir -p /xxx/archive
chown -R postgres. /xxx/
        – 開啟歸檔,並重啟數據庫
            – wal_level = ‘replica’
archive_mode = ‘on’
archive_command = ‘cp %p /xxx/archive/%f’
        – 重啟數據庫
            – pg_ctl restarat
        – 執行全量備份
            – pg_basebackup -h ip -D /xxx/backup -P -p 5432 -U postgres
        – 如果有變化的數據,可以執行增量備份
            – pg_receivewal -D /xxx/backup/ -p 5432
        – 啟動備份實例,進行數據恢復
            – vim postgresql.conf
recovery_target_lsn = ‘0/4011BF8’
restore_command=’cp /xxx/archive/%f %p’
recovery_target_action = ‘promote’
touch recovery.signal
        – 啟動數據庫
            – pg_ctl -D /xxx/backup start
        – 關閉讀模式
            – select pg_wal_replay_resume(); 
– 冷備
### 邏輯備份
– 全庫備份
– pg_dump
    – 庫級別備份
        – 備份
            – pg_dump -U postgres test >test.sql
        – 恢復
            – psql
create database test;
psql -U postgres test < test.sql
        – 指定格式進行備份
            – 備份
                – pg_dump -Fc -U postgres test >test.dmp
            – 恢復
                – psql
create database test;
pg_restore -d test test.dmp
    – 表級別備份
        – 備份庫下某個模式所有的表
            – 備份
                – pg_dump -U postgres -t ‘schema1.t*’ test >test.sql
            – 恢復
                – psql -U postgres test < test.sql
        – 備份單個表
            – 備份
                – pg_dump -t 表名 數據庫名 >dump.sql
            – 恢復
                – create database 數據庫名;
psql -U postgres 數據庫名< dump.sql
    – schema級別備份
– pg_dumpall
    – 全庫級別備份
        – 備份
            – pg_dumpall -U postgres > dumpall.sql
        – 恢復
            – psql -U postgres < dumpall.sql
– pg_dump VS pg_dumpall
    – pg_dumpall 是一個用於寫出(”轉儲”)一個數據庫集群里的所有PostgreSQL 數據庫到一個腳本文件的工具。
    – pg_dumpall 調用pg_dump
    – pg_dumpall 還轉儲出所有數據庫公用的全局對象。這些信息目前包括數據庫用戶和組,以及適用於整個數據庫的訪問權限
    – pg_dumpall 無法轉儲”大對象”,因為pg_dump無法把這樣的對象轉儲到純文本文件中。如果你的數據庫里有大對象,那麼你應該使用pg_dump 的非文本輸出格式之一轉儲它們。
		  				
		  				

