1.操作主服務器
1.1修改pg_hba.conf
// 這邊就設置所有用戶,所有ip都可以交互
host replication all 0.0.0.0/0 md5
2.2 創建流復制用戶
// 創建流復制用戶replicator
CREATE USER replica REPLICATION LOGIN PASSWORD 'replica';
2.3 修改postgresql.conf配置文件
// 覆蓋postgresql.conf
# basic
listen_addresses = '*' # 監聽所有ip
port = 5432 # 端口
max_connections = 1000 # 最大連接數
superuser_reserved_connections = 10 # 給超級用戶預留的連接數
shared_buffers = 1GB # 共享內存,一般設置為內存的1/4
wal_buffers = 16MB # 用于還未寫入磁盤的 WAL 數據的共享內存,一般設置為內存的1/128
work_mem = 16MB # 設置在寫入臨時磁盤文件之前查詢操作(例如排序或哈希表)可使用的最大內存容量
maintenance_work_mem = 256MB # 在維護性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的 最大的內存量
timezone = 'Asia/Shanghai' # 系統時區
hot_standby = on # 打開熱備# optimizer
default_statistics_target = 500 # 默認100,ANALYZE在pg_statistic中存儲的信息量,增大該值,會增加ANALYZE的時間,但會讓解釋計劃更精準# wal
max_wal_size = 1GB # 建議與shared_buffers保持一致
min_wal_size = 80MB # 建議max_wal_size/12.5
wal_keep_size = 10240 # 用于指定pg_wal目錄中保存的過去的wal文件(wal 段)的最小數量,以防備用服務器在進行流復制時需要
wal_log_hints = on # 控制WAL日志記錄的方式,建議打開
wal_level = replica # wal日志寫入級別,要使用流復制,必須使用replica或更高級別
wal_sender_timeout = 60s # 設置WAL發送者在發送WAL數據時等待主服務器響應的超時時間# archive
archive_mode = on #
archive_command = 'copy "%p" D:\\PostgreSQL\\"%f"' # 歸檔存儲位置,自行修改# log 近7天輪詢
log_destination = 'csvlog' # 日志格式
logging_collector = on # 日志收集器
log_directory = 'pg_log' # 日志目錄 $PGDATA/pg_log
log_filename = 'postgresql.%a' # 7天日志輪詢
log_file_mode = 0600 # 日志文件的權限
log_rotation_size = 0 # 日志的最大尺寸,設置為零時將禁用基于大小創建新的日志文件
log_truncate_on_rotation = on # 這個參數將導致PostgreSQL截斷(覆蓋而不是追加)任何已有的同名日志文件
log_min_duration_statement = 0 # 如果語句運行至少指定的時間量,將導致記錄每一個這種完成的語句的持續時間
log_duration = on # 每一個完成的語句的持續時間被記錄
log_lock_waits = on # 控制當一個會話為獲得一個鎖等到超過deadlock_timeout時,是否要產生一個日志消息
log_statement = 'mod' # 控制哪些 SQL 語句被記錄。有效值是 none (off)、ddl、mod和 all(所有語句)。ddl記錄所有數據定義語句,例如CREATE、ALTER和 DROP語句。mod記錄所有ddl語句,外加數據修改語句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM
log_timezone = 'Asia/Shanghai' # 設置在服務器日志中寫入的時間戳的時區# sql
statement_timeout = 300000 # 語句執行超時時間 5分鐘
idle_in_transaction_session_timeout = 300000 # 事務空閑超時時間 5分鐘
idle_session_timeout = 1800000 # 會話空閑超時時間 30分鐘
lock_timeout = 60000 # 等鎖超時時間 1分鐘# 參考
dynamic_shared_memory_type = windows # 服務器使用的內存管理方式。可能的值是posix(用于使用 shm_open分配的 POSIX 共享內存)、sysv (用于通過shmget分配的 System V 共享內存)、 windows(用于 Windows 共享內存)、和mmap (使用存儲在數據目錄中的內存映射文件模擬共享內存)。
max_worker_processes = 32 # 系統能夠支持的后臺進程的最大數量,默認值為 8。在更改這個值時,考慮也對 max_parallel_workers、max_parallel_maintenance_workers、max_parallel_workers_per_gather 進行調整。
max_parallel_workers_per_gather = 16 # 設置允許的最大并行查詢數,并行查詢可能消耗比非并行查詢更多的資源,把這個值設置為0將會禁用并行查詢執行,默認值是2。
max_parallel_maintenance_workers = 4 # 單一工具性命令能夠啟動的最大并行數。當前支持使用并行工作者的工具性命令是 CREATE INDEX,并且只有在構建B-樹索引時才能并行,并且 VACUUM 沒有 FULL選項。并行工作者從由 max_worker_processes 創建的進程池中取出,數量由max_parallel_workers控制,默認值為2。
max_parallel_workers = 32 # 設置系統支持的最大并行數量,默認值為8,要注意將這個值設置得大于 max_worker_processes 將不會產生效果,因為并行工作者進程都是從 max_worker_processes 所建立的工作者進程池中取出來的。
max_wal_senders = 6 # 啟動復制進程數量限制,必須大于0
effective_cache_size = 32GB # 推薦操作系統物理內存的1/2
default_text_search_config = 'pg_catalog.simple' # 選擇被那些沒有顯式參數指定配置的文本搜索函數變體使用的文本搜索配置,內建默認值是pg_catalog.simple,但是如果能夠標識一個匹配區域的配置,initdb將用對應于選中的lc_ctype區域的設置初始化配置文件
datestyle = 'iso, ymd' # 設置日期和時間值的顯示格式,以及解釋有歧義的日期輸入值的規則。由于歷史原因, 這個變量包含兩個獨立的部分:輸出格式聲明(ISO、Postgres、SQL或German)、 輸入/輸出的年/月/日順序(DMY、MDY或YMD)。這些可以被獨立設置或者一起設置。關鍵字Euro和European是DMY的同義詞;關鍵字US、NonEuro和NonEuropean是MDY的同義詞。內建默認值是ISO, MDY,但是initdb將用對應于選中的lc_time區域行為的設置初始化配置文件
random_page_cost = 1.1 # 隨機掃描磁盤的代價,默認是4;SSD等高性能磁盤可以設置小點。
lc_messages = 'Chinese (Simplified)_China.936' # 設置消息顯示的語言。可接受的值是系統相關的,如果這個變量被設置為空字符串(默認),那么該值將以一種系統相關的方式從服務器的執行環境中繼承。
lc_monetary = 'Chinese (Simplified)_China.936' # 設置用于格式化貨幣量的區域,例如用to_char函數族。可接受的值是系統相關的,如果這個變量被設置為空字符串(默認),那么該值將以一種系統相關的方式從服務器的執行環境中繼承。
lc_numeric = 'Chinese (Simplified)_China.936' # 設置用于格式化數字的區域,例如用to_char函數族。可接受的值是系統相關的,如果這個變量被設置為空字符串(默認),那么該值將以一種系統相關的方式從服務器的執行環境中繼承。
lc_time = 'Chinese (Simplified)_China.936' # 設置用于格式化日期和時間的區域,例如用to_char函數族。可接受的值是系統相關的,如果這個變量被設置為空字符串(默認),那么該值將以一種系統相關的方式從服務器的執行環境中繼承。
2.4 創建歸檔存儲位置
根據上方archive_command參數,創建歸檔存儲文件夾
2.5 重啟Pg15服務
3 操作從服務器
3.1 復制data文件夾,備份
3.2 刪除data文件夾
3.2 運行命令獲取主庫的data
// 運行命令 ip為主庫ip -D 復制的位置, 運行命令,輸入之前創建用戶的密碼
pg_basebackup -h 192.168.1.1 -p 5432 -U replica -D "D:\PostgreSQL\data" -p 5432 --wal-method=stream
3.3 修改postgresql.conf
由于之前從主服務器復制過來了配置文件,所以不需要修改很多
// 添加命令 主庫的連接用戶
primary_conninfo = 'host=192.168.1.1 port=5432 user=replica password=replica' #主庫信息
3.4 data文件夾創建文件standby.signal
// 添加命令 主庫的連接用戶
standby_mode = on #on為從庫
primary_conninfo = 'host=192.168.1.1 port=5432 user=replica password=replica' #主庫信息
recovery_target_timeline = 'latest' #流復制同步最新數據
3.5 重啟從庫
4 測試是否成功
主從庫查詢:主庫是f代表false ;備庫是t,代表trueselect pg_is_in_recovery();
主庫查詢復制狀態:select * from pg_stat_replication;
從庫查詢wal日志接收狀態:select * from pg_stat_wal_receiver;
從庫是否同步select client_addr,sync_state from pg_stat_replication;
5 主備切換
原主庫操作
1 停止主庫
2 添加standby.signal文件,并根據3.3,3.4配置參數
3 重啟
原備庫操作
1 停止備庫
2 刪除standby.signal,刪除postgresql.conf文件中的3.3操作
3 重啟
PS: 如果啟動失敗則用 pg_ctl 啟動從庫(cmd 切到 pgsql/bin 目錄下) 然后去看log報錯原因
-D pg_basebackup 執行的復制位置pg_ctl -D "D:\PostgreSQL\data" start