PostgreSQL: إنشاء وإدارة قواعد البيانات في PostgreSQL
آخر تحديث: 2026-08-26
ق��عدة البيانات هي الوحدة▶�لتنظيمية العليا في PostgreSQL — مثل خزانة ملفات يمكنها استيعاب العديد من الأدراج (الجداول).
1. ما ستتعلمه
- CREATE DATABASE لإنشاء قاعدة بيانات
- DROP DATABASE لحذف قاعدة بيانات
- ALTER DATABASE لتعديل خصائص قاعدة البيانات
- قواعد البيانات النموذجية (template0 / template1)
- مجموعة الأحرف والترتيب
- أوامر psql الوصفية: \l / \c
2. قصة حقيقية لمهندس DevOps
(1) المشكلة: ثلاث بيئات، ثلاث مجموعات أحرف
يحتاج Charlie إلى إنشاء 3 قواعد بيانات لمشروع تجارة إلكترونية، تتوافق مع بيئات dev / staging / prod:
- dev: ترتيب إنجليزي (مناسب للتطوير)
- staging: UTF8 + ترتيب إنجليزي (متسق مع الإنتاج)
- prod: UTF8 + ترتيب محدد (سوق الشرق الأوسط، يحتاج دعم العربية)
Charlie غير متأكد من كيفية تحديد مجموعة الأحرف والترتيب عند إنشاء قاعدة بيانات، ولا يعرف ما هي قاعدة البيانات النموذجية.
(2) CREATE DATABASE للإنقاذ
يتيح لك CREATE DATABASE في PostgreSQL تحديد مجموعة الأحرف والترتيب والنموذج عند الإنشاء:
-- إنشاء قواعد بيانات بإعدادات محلية مختلفة لكل بيئة
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) النتيجة
- كل بيئة لديها قاعدة بيانات مستقلة؛ البيانات لا تتداخل
- مجموعة الأحرف موحدة إلى UTF8، تدعم البيانات متعددة اللغات
- الترتيب يتوافق مع احتياجات العمل، لذا ترتيب نتائج الاستعلام صحيح
3. أساسيات قواعد البيانات
(1) التسلسل الهرمي التنظمي لـ PostgreSQL
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) | مخطط واحد يحتوي العديد من الجداول |
| الجدول | جدول ثنائي الأبعاد يخزن البيانات | الجداول تنتمي إلى مخطط |
4. CREATE DATABASE
(1) الصيغة الأساسية
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) ▶ مثال
-- إنشاء قاعدة بيانات بسيطة بالإعدادات الافتراضية
CREATE DATABASE my_app;
-- التحقق من الإنشاء
\l
Output:
CREATE TABLE
(2) ▶ مثال
-- إنشاء قاعدة بيانات مع تحديد جميع الخيارات الشائعة
CREATE DATABASE shop_prod
WITH OWNER = devuser
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.utf8'
LC_CTYPE = 'en_US.utf8'
CONNECTION LIMIT = 100;
Output:
CREATE TABLE
5. قواعد البيانات النموذجية
(1) template0 مقابل template1
يأتي PostgreSQL مع قاعدتي بيانات نموذجيتين مدمجتين:
| الخاصية | template0 | template1 |
|---|---|---|
| الغرض | نموذج أصلي، غير قابل للتعديل | نموذج قابل للتخصيص، قابل للتعديل |
| قابل للتعديل؟ | ❌ لا | ✅ نعم |
| المحتويات الافتراضية | كائنات نظام minimal | مثل template0 + كائنات معرفة من قبل المستخدم |
| متى تستخدم | عندما تحتاج لاستعادة الترميز/الترتيب الأصلي | إنشاء قواعد البيانات اليومي (الافتراضي) |
| الإنشاء | TEMPLATE = template0 |
TEMPLATE = template1 (الافتراضي) |
(3) ▶ مثال
-- الخطوة 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:
CREATE TABLE
(4) ▶ مثال
-- إذا كان template1 له ترميز مختلف عما تحتاج،
-- استخدم template0 لإنشاء قاعدة بيانات بترميز محدد
CREATE DATABASE db_with_latin
TEMPLATE = template0
ENCODING = 'LATIN1'
LC_COLLATE = 'C'
LC_CTYPE = 'C';
Output:
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) ▶ مثال
-- إعادة تسمية قاعدة بيانات (يجب فصل جميع المستخدمين أولاً)
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:
-- تم تنفيذ عبارة SQL بنجاح
-- العثور على الاتصالات النشطة بقاعدة بيانات
SELECT pid, usename, application_name, client_addr, state
FROM pg_stat_activity
WHERE datname = 'shop_dev';
7. DROP DATABASE
(1) صيغة الحذف
DROP DATABASE [IF EXISTS] name [WITH (FORCE)];
| الخيار | الوصف |
|---|---|
IF EXISTS |
لا خطأ إذا لم تكن قاعدة▶�لبيانات موجودة (إشعار فقط) |
WITH (FORCE) |
فصل جميع▶�لاتصالات قسرًا، ثم الحذف (PG 13+) |
(6) ▶ مثال
-- حذف آمن (لا خطأ إذا لم تكن قاعدة البيانات موجودة)
DROP DATABASE IF EXISTS old_project;
-- حذف قسري (فصل جميع المستخدمين أولا��، PG 13+)
DROP DATABASE IF EXISTS shop_dev WITH (FORCE);
Output:
-- تم تنفيذ عبارة 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) ▶ مثال
-- سرد الترميزات المتاحة
SELECT name, description FROM pg_encodings LIMIT 10;
-- سرد الترتيبات المتاحة
SELECT name, locale FROM pg_collation LIMIT 10;
Output:
id | name | value
----+----------+-------
1 | example | 42
(1 row)
(8) ▶ مثال
-- إنشاء جدول اختبار ببيانات نصية
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:
-- 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) ▶ مثال
# سرد جميع قواعد البيانات
\l
# التبديل إلى قاعدة بيانات shop_dev
\c shop_dev
# التحقق من الاتصال الحالي
\conninfo
# العودة إلى قاعدة بيانات postgres
\c postgres
Output:
# تم تنفيذ الأمر بنجاح
10. مثال كامل: إعداد قواعد بيانات لثلاث بيئات
-- ============================================
-- مثال كامل: إعداد▶�واعد بيانات 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:
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
❓ أسئلة شائعة
TEMPLATE = template0 بدلاً من ذلك.SELECT pg_size_pretty(pg_database_size('shop_dev')) لقاعدة بيانات واحدة، أو \l+ لرؤية جميع أحجام قواعد البيانات.📖 ملخص
- CREATE DATABASE ينشئ قاعدة بيانات، يدعم الترميز/الترتيب/النموذج/المالك/حد-الاتصال
- template0 هو نموذ�� أصلي (غير قابل للتعديل)؛ template1 هو نموذج قابل للتخصيص (الافتراضي)
- تثبيت الإضافات في template1 وترثها قواعد البيانات الجديدة تلقائيًا
- ALTER DATABASE يمكنه إعادة التسمية وتعيين المعاملات وتغيير المالك
- DROP DATABASE لا رجعة فيه؛ IF EXISTS يمنع الأخطاء، WITH (FORCE) يفصل قسرًا
- استخدم دائمًا ترميز UTF8؛ اختر الترتيب بناءً على احتياجات العمل
- أوامر psql الوصفية:
\lيسرد قواعد البيانات،\cيبدل قاعدة البيانات،\conninfoيعرض معلومات الاتصال
📝 تمارين
-
أساسي (★): أنشئ قاعدة بيانات باسم
my_bookstoreباستخدام ترميز UTF8، ثم تحقق باستخدام\lمن إنشائها، وأخيرًا احذفها. -
متوسط (★★): أولاً قم بتثبيت إضافة
uuid-osspفي template1، ثم أنشئ قاعدة بيانات جديدةtest_templateوتحقق من أن قاعدة البيانات الجديدة ورثت إضافة uuid-ossp تلقائيًا. -
تحدي (★★★): أنشئ قاعدتي بيانات باستخدام ترتيبي
Cوen_US.utf8على التوالي. في كل منهما، أنشئ نفس الجدول وأدرج البيانات'apple'،'Banana'،'cherry'،'Apple'، ثم استخدم ORDER BY لمقارنة نتائج الترتيب واشرح لماذا تختلف.