دليل مفصل خطوة بخطوة - مماثلة كاملة (Full Replication)
IP: 192.168.1.100
IP: 192.168.1.101
C:\Program Files\PostgreSQL\18\
مجلد البيانات: C:\Program Files\PostgreSQL\18\data\
اسم الخدمة في Windows:
postgresql-x64-18
الخطوة 1: التجهيز على السيرفر الرئيسي (Master)
1.1 إنشاء مستخدم النسخ (Replication User)افتح SQL Shell (psql) كمسؤول وسجل دخولك:
-- إنشاء دور خاص بالنسخ CREATE ROLE replicator WITH LOGIN PASSWORD 'StrongPassword123' REPLICATION; \q1.2 تعديل ملف postgresql.conf
المسار: C:\Program Files\PostgreSQL\18\data\postgresql.conf
افتح الملف باستخدام Notepad بصلاحية المسؤول (Run as Administrator) وعدّل الإعدادات التالية:
# مستوى سجل الكتابة المسبقة (يجب أن يكون replica) wal_level = replica # الحد الأقصى لعدد عمليات الإرسال المتزامنة max_wal_senders = 10 # الحد الأقصى لفتحات النسخ (Slots) max_replication_slots = 10 # المساحة المحتفظ بها من WAL (10 جيجابايت) wal_keep_size = 10240 # السماح بالاتصالات من جميع العناوين listen_addresses = '*' # اختياري: ضغط البيانات المرسلة # wal_compression = on1.3 تعديل ملف الصلاحيات pg_hba.conf
المسار: C:\Program Files\PostgreSQL\18\data\pg_hba.conf
أضف السطر التالي في نهاية الملف:
# TYPE DATABASE USER ADDRESS METHOD host replication replicator 192.168.1.101/32 scram-sha-2561.4 إعادة تشغيل خدمة PostgreSQL
افتح PowerShell كمسؤول ونفذ:
# إيقاف الخدمة Stop-Service -Name postgresql-x64-18 # تشغيل الخدمة Start-Service -Name postgresql-x64-18 # التحقق من الحالة Get-Service postgresql-x64-18
أو عبر موجه الأوامر (CMD):
net stop postgresql-x64-18 net start postgresql-x64-18
الخطوة 2: إعداد السيرفر التابع (Standby)
2.1 إيقاف خدمة PostgreSQL على التابعStop-Service -Name postgresql-x64-182.2 حذف محتويات مجلد البيانات الحالي
# الانتقال لمجلد PostgreSQL cd "C:\Program Files\PostgreSQL\18\" # حذف محتويات مجلد data (تأكد أن الخدمة متوقفة) Remove-Item -Path ".\data\*" -Recurse -Force2.3 سحب النسخة الأساسية من الرئيسي باستخدام pg_basebackup
نفذ الأمر التالي في PowerShell كمسؤول. يجب تنفيذه كمستخدم postgres:
runas /user:postgres "C:\Program Files\PostgreSQL\18\bin\pg_basebackup.exe -h 192.168.1.100 -p 5432 -U replicator -D \"C:\Program Files\PostgreSQL\18\data\" -Fp -Xs -P -R -C"
سيُطلب منك:
- كلمة سر مستخدم
postgresفي Windows. - كلمة سر مستخدم
replicatorفي PostgreSQL (StrongPassword123).
| الخيار | الوصف |
|---|---|
-h 192.168.1.100 | عنوان السيرفر الرئيسي |
-U replicator | اسم مستخدم النسخ |
-D "..." | مجلد الوجهة في التابع |
-Xs | سحب WAL مباشرة (Stream) |
-P | إظهار شريط التقدم |
-R | ينشئ ملف standby.signal تلقائياً |
-C | ينشئ Replication Slot لمنع فقدان البيانات |
الخطوة 3: تكوين التابع للعمل في وضع Standby
3.1 التأكد من وجود ملف standby.signalإذا لم ينشئ الملف تلقائياً، أنشئه يدوياً:
New-Item -Path "C:\Program Files\PostgreSQL\18\data\standby.signal" -ItemType File3.2 تفعيل وضع Hot Standby (اختياري لكن مفيد)
يسمح بتنفيذ استعلامات القراءة فقط على التابع. أضف في ملف postgresql.conf للتابع:
hot_standby = on3.3 تشغيل خدمة التابع
Start-Service -Name postgresql-x64-18
الخطوة 4: اختبار المماثلة (Replication)
4.1 التحقق من حالة التابعافتح SQL Shell على التابع ونفذ:
SELECT pg_is_in_recovery();
يجب أن تكون النتيجة t (true) - أي أن التابع في وضع الاسترداد.
على السيرفر الرئيسي (Master):
CREATE DATABASE test_repl;
\c test_repl
CREATE TABLE orders (id SERIAL PRIMARY KEY, product TEXT);
INSERT INTO orders (product) VALUES ('Laptop from Windows Master');
على السيرفر التابع (Standby):
\c test_repl SELECT * FROM orders;
يجب أن ترى الصف الجديد يظهر فوراً.
أوامر مراقبة حالة النسخ
على الرئيسي - لمعرفة حالة التابع:
SELECT
application_name,
state,
sync_state,
pg_wal_lsn_diff(sent_lsn, write_lsn) AS write_lag_bytes,
pg_wal_lsn_diff(write_lsn, flush_lsn) AS flush_lag_bytes
FROM pg_stat_replication;
على التابع - لمعرفة آخر تغيير مستلم:
SELECT
pg_last_wal_receive_lsn() AS last_received,
pg_last_wal_replay_lsn() AS last_replayed;
ملاحظات هامة لنظام Windows
🔧 جدار الحماية (Windows Firewall)
يجب فتح منفذ 5432 TCP على كلا الجهازين. نفذ في PowerShell كمسؤول:
New-NetFirewallRule -DisplayName "PostgreSQL 18" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow
أو عبر موجه الأوامر:
netsh advfirewall firewall add rule name="PostgreSQL 18" dir=in action=allow protocol=TCP localport=5432
📁 صلاحيات المجلدات
تأكد أن مستخدم postgres (المستخدم المحلي في Windows) لديه صلاحيات Full Control على المجلد:
C:\Program Files\PostgreSQL\18\data
🛡️ مضاد الفيروسات وجدار الحماية
قد تتدخل بعض برامج الحماية وتمنع الاتصال. إذا فشل pg_basebackup أو بقيت المماثلة متوقفة، جرب تعطيل جدار الحماية مؤقتاً للاختبار.
✅ الخلاصة
بهذا الإعداد، أصبح لديك Replication كامل بين السيرفرين على Windows مع PostgreSQL 18. التابع سيبقى متزامناً طالما الاتصال قائم. إذا انقطع الاتصال، سيعيد المزامنة تلقائياً عند عودته طالما wal_keep_size كافٍ.