PostgreSQL: إنشاء وإدارة قواعد البيانات في PostgreSQL

آخر تحديث: 2026-08-26

ق��عدة البيانات هي الوحدة▶�لتنظيمية العليا في PostgreSQL — مثل خزانة ملفات يمكنها استيعاب العديد من الأدراج (الجداول).

1. ما ستتعلمه


2. قصة حقيقية لمهندس DevOps

(1) المشكلة: ثلاث بيئات، ثلاث مجموعات أحرف

يحتاج Charlie إلى إنشاء 3 قواعد بيانات لمشروع تجارة إلكترونية، تتوافق مع بيئات dev / staging / prod:

Charlie غير متأكد من كيفية تحديد مجموعة الأحرف والترتيب عند إنشاء قاعدة بيانات، ولا يعرف ما هي قاعدة البيانات النموذجية.

(2) CREATE DATABASE للإنقاذ

يتيح لك CREATE DATABASE في PostgreSQL تحديد مجموعة الأحرف والترتيب والنموذج عند الإنشاء:

SQL
-- إنشاء قواعد بيانات بإعدادات محلية مختلفة لكل بيئة
CREATE DATABASE shop_dev
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    TEMPLATE = template1;

CREATE DATABASE shop_staging
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8';

CREATE DATABASE shop_prod
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8';

(3) النتيجة


3. أساسيات قواعد البيانات

(1) التسلسل الهرمي التنظمي لـ PostgreSQL

100%
graph TB
    PG[مثيل PostgreSQL<br/>خادم واحد قيد التشغيل] --> DB1[قاعدة بيانات: shop_dev]
    PG --> DB2[قاعدة بيانات: shop_staging]
    PG --> DB3[قاعدة بيانات: shop_prod]
    DB1 --> SC1[مخطط: public]
    SC1 --> T1[جدول: users]
    SC1 --> T2[جدول: orders]
    DB2 --> SC2[مخطط: public]
    DB3 --> SC3[مخطط: public]
المستوى الوصف العلاقة العددية
المثيل عملية خادم PostgreSQL واحدة قيد التشغيل مثيل واحد يحتوي العديد من قواعد البيانات
قاعدة البيانات مساحة الأسماء المستقلة العليا قاعدة بيانات واحدة تحتوي العديد من المخططات
المخطط مساحة أسماء داخل قاعدة البيانات (الافتراضي public) مخطط واحد يحتوي العديد من الجداول
الجدول جدول ثنائي الأبعاد يخزن البيانات الجداول تنتمي إلى مخطط
💡 نصيحة: على عكس MySQL، "قاعدة البيانات" في PostgreSQL أشبه بـ "Schema" في MySQL. في PG يجب عليك تحديد قاعدة بيانات عند الاتصال، ولا يمكنك JOIN مباشرة عبر قواعد البيانات (يحتاج ذلك إلى FDW للاستعلامات عبر قواعد البيانات، سيتم تغطيتها في درس لاحق).


4. CREATE DATABASE

(1) الصيغة الأساسية

SQL
CREATE DATABASE name
    [WITH]
    [OWNER = user_name]
    [TEMPLATE = template]
    [ENCODING = encoding_name]
    [LC_COLLATE = lc_collate]
    [LC_CTYPE = lc_ctype]
    [TABLESPACE = tablespace_name]
    [CONNECTION LIMIT = conn_limit]
    [IS_TEMPLATE = true | false];
المعامل الافتراضي الوصف
OWNER المستخدم المنفذ مالك قاعدة البيانات
TEMPLATE template1 النموذج المنسوخ عند إنشاء قاعدة بيانات جديدة
ENCODING ترميز النموذ�� ترميز الأحرف (UTF8 موصى به)
LC_COLLATE ترتيب النموذج ترتيب فرز السلاسل
LC_CTYPE تصنيف أ��رف النموذج تصنيف الأحرف (حالة/أرقام/إلخ)
TABLESPACE مساحة الجداول الافتراضية موقع تخزين ملفات البيانات
CONNECTION LIMIT -1 (غير محدود) الحد الأقصى للاتصالات المتزامنة
IS_TEMPLATE false وضع علامة كقاعدة بيانات نموذجية

(1) ▶ مثال

SQL
-- إنشاء قاعدة بيانات بسيطة بالإعدادات الافتراضية
CREATE DATABASE my_app;

-- التحقق من الإنشاء
\l

Output:

TEXT 📖 للعرض فقط
CREATE TABLE

(2) ▶ مثال

SQL
-- إنشاء قاعدة بيانات مع تحديد جميع الخيارات الشائعة
CREATE DATABASE shop_prod
    WITH OWNER = devuser
    ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    CONNECTION LIMIT = 100;

Output:

TEXT 📖 للعرض فقط
CREATE TABLE
⚠️ ملاحظة: لا يمكن تشغيل CREATE DATABASE داخل معاملة (تشغيله داخل BEGIN...COMMIT يسبب خطأ). هذا بتصمي�� PG — إنشاء قاعدة بيانات هو عملية DDL ولا يمكن التراجع عنها.


5. قواعد البيانات النموذجية

(1) template0 مقابل template1

يأتي PostgreSQL مع قاعدتي بيانات نموذجيتين مدمجتين:

الخاصية template0 template1
الغرض نموذج أصلي، غير قابل للتعديل نموذج قابل للتخصيص، قابل للتعديل
قابل للتعديل؟ ❌ لا ✅ نعم
المحتويات الافتراضية كائنات نظام minimal مثل template0 + كائنات معرفة من قبل المستخدم
متى تستخدم عندما تحتاج لاستعادة الترميز/الترتيب الأصلي إنشاء قواعد البيانات اليومي (الافتراضي)
الإنشاء TEMPLATE = template0 TEMPLATE = template1 (الافتراضي)
📌 نقطة رئيسية: بمجرد إنشاء جداول أو دوال أو إضافات في template1، ترث جميع قواعد البيانات الجديدة تلك الكائنات. هذه طريقة مريحة لتكوين قواعد البيانات الجديدة مسبقًا.

(3) ▶ مثال

SQL
-- الخطوة 1: الاتصال بـ template1 وإضافة إضافات شائعة
\c template1

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";

-- الخطوة 2: الآن جميع قواعد البيانات الجديدة ستحتوي على هذه الإضافات
\c postgres

CREATE DATABASE new_project;
-- new_project يحتوي تلقائيًا على uuid-ossp و pg_trgm

-- الخطوة 3: التحقق
\c new_project
\dx

Output:

TEXT 📖 للعرض فقط
CREATE TABLE

(4) ▶ مثال

SQL
-- إذا كان template1 له ترميز مختلف عما تحتاج،
-- استخدم template0 لإنشاء قاعدة بيانات بترميز محدد
CREATE DATABASE db_with_latin
    TEMPLATE = template0
    ENCODING = 'LATIN1'
    LC_COLLATE = 'C'
    LC_CTYPE = 'C';

Output:

TEXT 📖 للعرض فقط
CREATE TABLE

6. ALTER DATABASE

(1) التعديلات الشائعة

العملية الصيغة الوصف
إعادة تسمية ALTER DATABASE old_name RENAME TO new_name تغيير اسم قاعدة البيانات
تعيين معامل ALTER DATABASE name SET parameter = value تعيين معامل وقت التشغيل لقاعدة البيانات
إعادة تعيين معامل ALTER DATABASE name RESET parameter استعادة القيمة الافتراضية للمعامل
تغيير المالك ALTER DATABASE name OWNER TO new_owner تغيير مالك قاعدة البيانات
تعيين حد الاتصال ALTER DATABASE name CONNECTION LIMIT = n تغيير الحد الأقصى للاتصالات
وضع علامة كنموذج ALTER DATABASE name IS_TEMPLATE = true وضع/إزالة علامة كنموذج

(5) ▶ مثال

SQL
-- إعادة تسمية قاعدة بيانات (يجب فصل جميع المستخدمين أولاً)
ALTER DATABASE shop_dev RENAME TO shop_development;

-- تعيين search_path الافتراضي لقاعدة بيانات
ALTER DATABASE shop_prod SET search_path TO public, admin;

-- تعيين work_mem لقاعدة بيانات محددة
ALTER DATABASE shop_prod SET work_mem = '64MB';

-- تغيير ح�� الاتصال
ALTER DATABASE shop_prod CONNECTION LIMIT = 200;

-- وضع علامة كنموذج
ALTER DATABASE shop_base IS_TEMPLATE = true;

Output:

TEXT 📖 للعرض فقط
-- تم تنفيذ عبارة SQL بنجاح
⚠️ ملاحظة: قبل إعادة تسمية قاعدة بيانات، يجب فصل جميع المستخدمين المتصلين بها. استخدم الاستعلام التالي لرؤية الاتصالات النشطة:

SQL
-- العثور على الاتصالات النشطة بقاعدة بيانات
SELECT pid, usename, application_name, client_addr, state
FROM pg_stat_activity
WHERE datname = 'shop_dev';

7. DROP DATABASE

(1) صيغة الحذف

SQL
DROP DATABASE [IF EXISTS] name [WITH (FORCE)];
الخيار الوصف
IF EXISTS لا خطأ إذا لم تكن قاعدة▶�لبيانات موجودة (إشعار فقط)
WITH (FORCE) فصل جميع▶�لاتصالات قسرًا، ثم الحذف (PG 13+)

(6) ▶ مثال

SQL
-- حذف آمن (لا خطأ إذا لم تكن قاعدة البيانات موجودة)
DROP DATABASE IF EXISTS old_project;

-- حذف قسري (فصل جميع المستخدمين أولا��، PG 13+)
DROP DATABASE IF EXISTS shop_dev WITH (FORCE);

Output:

TEXT 📖 للعرض فقط
-- تم تنفيذ عبارة SQL بنجاح
🔥 فخ: حذف قاعدة بيانات لا رجعة فيه! يتم فقدان جميع الجداول والبيانات وطرق العرض في قاعدة البيانات بشكل دائم. في الإنتاج، قم دائمًا بالنسخ الاحتياطي قبل الحذف.


8. مجموعة الأحرف والترتيب

(1) الترميزات الشائعة

الترميز الوصف السيناريو الموصى به
UTF8 Unicode، يدعم جميع اللغات جميع المشاريع (موصى به)
LATIN1 لغات أوروبا الغربية توافق الأنظمة القديمة
EUC_JP اليابانية الأنظمة اليابانية القديمة
SQL_ASCII بدون تحويل ترميز بيانات ASCII نقية

(2) مقارنة الترتب

الترتيب السلوك مثال
en_US.utf8 ترتيب إنجليزي، حساس لحالة الأحرف a, A, b, B
C ترتيب البايت، الأسرع A, B, a, b
en_US.utf8 (مع ICU) ترتيب أكثر مرونة يمكن تجاهل الحالة/العلامات

(7) ▶ مثال

SQL
-- سرد الترميزات المتاحة
SELECT name, description FROM pg_encodings LIMIT 10;

-- سرد الترتيبات المتاحة
SELECT name, locale FROM pg_collation LIMIT 10;

Output:

TEXT 📖 للعرض فقط
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)

(8) ▶ مثال

SQL
-- إنشاء جدول اختبار ببيانات نصية
CREATE TABLE sort_test (name TEXT);
INSERT INTO sort_test VALUES ('apple'), ('Banana'), ('cherry'), ('Apple');

-- ترتيب مع محدد C locale (ترتيب البايت: الأحرف الكبيرة أولاً)
SELECT name FROM sort_test ORDER BY name COLLATE "C";

-- ترتيب مع en_US.utf8 (ترتيب قاموسي: غير حساس للحالة داخل نفس الحرف)
SELECT name FROM sort_test ORDER BY name COLLATE "en_US.utf8";

-- تنظيف
DROP TABLE sort_test;

Output:

TEXT 📖 للعرض فقط
-- C locale:
  Apple
  Banana
  apple
  cherry

-- en_US.utf8:
  apple
  Apple
  Banana
  cherry

9. أوامر psql الوصفية لإدارة قواعد البيانات

الأمر SQL المكافئ الوصف
\l SELECT * FROM pg_database سرد جميع قواعد البيانات
\l+ نفس الشيء، مع مساحة الجداول/الحجم سرد قواعد البيانات بالتفصيل
\c dbname - التبديل إلى قاعدة البيانات المحددة
\conninfo - عرض معلومات الاتصال الحالي

(9) ▶ مثال

BASH
# سرد جميع قواعد البيانات
\l

# التبديل إلى قاعدة بيانات shop_dev
\c shop_dev

# التحقق من الاتصال الحالي
\conninfo

# العودة إلى قاعدة بيانات postgres
\c postgres

Output:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

10. مثال كامل: إعداد قواعد بيانات لثلاث بيئات

SQL
-- ============================================
-- مثال كامل: إعداد▶�واعد بيانات dev/staging/prod
-- لمشروع تجارة إلكترونية
-- ============================================

-- الخطوة 1: الاتصال بـ postgres (قاعدة بيانات الصيانة)
\c postgres

-- الخطوة 2: إنشاء قاعدة بيانات dev بالإعدادات الإنجليزية
CREATE DATABASE shop_dev
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    OWNER = devuser
    CONNECTION LIMIT = 50;

-- الخطوة 3: إنشاء قاعدة بيانات staging (نفس تكوين prod)
CREATE DATABASE shop_staging
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    OWNER = devuser
    CONNECTION LIMIT = 50;

-- الخطوة 4: إنشاء قاعدة بيانات prod مع حد اتصال
CREATE DATABASE shop_prod
    WITH ENCODING = 'UTF8'
    LC_COLLATE = 'en_US.utf8'
    LC_CTYPE = 'en_US.utf8'
    OWNER = devuser
    CONNECTION LIMIT = 200;

-- الخطوة 5: تعيين search_path الافتراضي لـ prod
ALTER DATABASE shop_prod SET search_path TO public, admin;

-- الخطوة 6: التحقق من إنشاء جميع قواعد البيانات
SELECT datname, pg_encoding_to_char(encoding) AS encoding,
       datcollate, datctype, datconnlimit
FROM pg_database
WHERE datname LIKE 'shop_%'
ORDER BY datname;

Output:

TEXT 📖 للعرض فقط
   datname    | encoding |  datcollate  |   datctype   | datconnlimit
--------------+----------+--------------+--------------+-------------
 shop_dev     | UTF8     | en_US.utf8   | en_US.utf8   |           50
 shop_prod    | UTF8     | en_US.utf8   | en_US.utf8   |          200
 shop_staging | UTF8     | en_US.utf8   | en_US.utf8   |           50

❓ أسئلة شائعة

س ما هو الحد الأقصى لعدد قواعد البيانات التي يمكن لمثيل PostgreSQL إنشاؤها؟
ج لا يوجد حد صارم نظريًا، لكن كل قاعدة بيانات تستهلك بعض مساحة فهرس النظام. عمليًا، حافظ على مثيل واحد تحت 100 قاعدة بيانات. إذا كنت بح��جة إلى عزل أكثر، فكر في استخدام المخططات بدلاً من ذلك.
س ماذا لو أظهر CREATE DATABASE خطأ "source قاعدة بيانات is being accessed by other users"؟
ج هذا يعني أن template1 قيد الاستخدام من قبل اتصال آخر. أصلحه عن طريق: 1) إنهاء جميع الجلسات المتصلة بـ template1؛ أو 2) استخدام TEMPLATE = template0 بدلاً من ذلك.
س ما الفرق بين LC_COLLATE و LC_CTYPE؟
ج LC_COLLATE يتحكم في ترتيب فرز السلاسل (نتيجة ORDER BY)؛ LC_CTYPE يتحكم في تصنيف الأحرف (تحويل الحالة، ما يعتبر حرفًا، إلخ). في معظم الحالات، تعيينهما بنفس القيمة جيد.
س هل يمكن تغيير ترميز الأحرف بعد إنشاء قاعدة البيانات؟
ج ليس مباشرة. يجب عليك pg_dump البيانات، إنشاء قاعدة بيانات جديدة بالترميز الجديد، ثم pg_restore. لهذا يوصى بـ UTF8 من البداية — يدعم كل اللغات.
س كيف أتحقق من حجم قاعدة البيانات الحالية؟
ج استخدم SELECT pg_size_pretty(pg_database_size('shop_dev')) لقاعدة بيانات واحدة، أو \l+ لرؤية جميع أحجام قواعد البيانات.
س هل يمكن لـ dev و prod مشاركة قاعدة بيانات واحدة؟
ج لا يوصى بشدة. العمليات أثناء التطوير (DROP TABLE، DELETE جماعي) قد تدمر بيانات الإنتاج عن طريق الخطأ. الحد الأدنى: dev و prod يستخدمان قواعد بيانات مختلفة، ويفضل مثيلات PG مختلفة.

📖 ملخص


📝 تمارين

  1. أساسي (★): أنشئ قاعدة بيانات باسم my_bookstore باستخدام ترميز UTF8، ثم تحقق باستخدام \l من إنشائها، وأخيرًا احذفها.

  2. متوسط (★★): أولاً قم بتثبيت إضافة uuid-ossp في template1، ثم أنشئ قاعدة بيانات جديدة test_template وتحقق من أن قاعدة البيانات الجديدة ورثت إضافة uuid-ossp تلقائيًا.

  3. تحدي (★★★): أنشئ قاعدتي بيانات باستخدام ترتيبي C و en_US.utf8 على التوالي. في كل منهما، أنشئ نفس الجدول وأدرج البيانات 'apple'، 'Banana'، 'cherry'، 'Apple'، ثم استخدم ORDER BY لمقارنة نتائج الترتيب واشرح لماذا تختلف.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%