【PostgreSQL】入門學習筆記
阿新 • • 發佈:2022-04-20
前言:
以下內容為前幾天在備考PostgreSQL入門考試時候做的筆記,經過了全職的兩天的奮戰與實驗,並最終順利通過了PCA初級認證考試。現在把我學習的筆記分享給大家,文中有對應的思維導圖圖片可供檢視,內容與後面正文文字一致。另外,由於SQL語句部分比較基礎,基本上會一門資料庫就都會,所以此處部分省略掉不做過多記錄了。
以下,enjoy:
## PostgreSQL的發展歷程
### 始於1986年的Postgres專案
### 1994年,新增了SQL語言直譯器,Postgres95誕生
### 1996年,更名 PostgreSQL,版本號從6.0開始
## PostgreSQL的安裝
### yum安裝
- https://www.postgresql.org/download/linux/redhat/
- yum install -y https://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安裝
- https://yum.postgresql.org/rpmchart/
- postgresql14 - postgresql14-contrib - postgresql14-libs - postgresql14-server
- rpm -ivh postgresql14*
### 原始碼的安裝
- wget https://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
- http://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
- https://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 的非文字輸出格式之一轉儲它們。
# PostgreSQL
## PostgreSQL的發展歷程
### 始於1986年的Postgres專案
### 1994年,新增了SQL語言直譯器,Postgres95誕生
### 1996年,更名 PostgreSQL,版本號從6.0開始
## PostgreSQL的安裝
### yum安裝
- https://www.postgresql.org/download/linux/redhat/
- yum install -y https://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安裝
- https://yum.postgresql.org/rpmchart/
- postgresql14 - postgresql14-contrib - postgresql14-libs - postgresql14-server
- rpm -ivh postgresql14*
### 原始碼的安裝
- wget https://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
- http://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
- https://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 的非文字輸出格式之一轉儲它們。