الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول
افهم صيغ ALTER TABLE التي تحصل على قفل ACCESS EXCLUSIVE وتعيد كتابة الجدول، وتلك التي تقتصر على البيانات الوصفية
الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
مشكلة الترحيل في بيئة الإنتاج
في قاعدة بيانات صغيرة، يكون ALTER TABLE فوريًا. أما في جدول حيّ حجمه 500GB، فقد يمنع الأمر نفسه عمليات الكتابة لمدة 20 دقيقة. لذلك من الضروري معرفة أوامر ALTER الآمنة وتلك غير الآمنة.
مستويات الأقفال
تأتي أقفال PostgreSQL في مستويات:
- ACCESS SHARE — لعمليات SELECT
- ROW EXCLUSIVE — لعمليات الكتابة
- SHARE / SHARE ROW EXCLUSIVE — لأوامر DDL التي تتعايش مع عمليات القراءة
- EXCLUSIVE — يمنع عمليات SELECT
- ACCESS EXCLUSIVE — يمنع كل شيء
ما الذي يتطلبه ALTER TABLE
تتطلب معظم صيغ ALTER قفل ACCESS EXCLUSIVE، ما يمنع القرّاء والكتّاب حتى اكتمال العملية.
أوامر ALTER السريعة (التي تقتصر على البيانات الوصفية)
تغيّر بعض أوامر ALTER الكتالوج فقط، وتكتمل خلال أجزاء من الألف من الثانية حتى في الجداول الضخمة:
ALTER TABLE t RENAME COLUMN a TO b;
ALTER TABLE t ALTER COLUMN a SET DEFAULT ...;
ALTER TABLE t ADD COLUMN x INT; -- nullable, no default: metadata only (PG 11+)
ALTER TABLE t ADD COLUMN x INT NOT NULL DEFAULT 0; -- metadata only PG 11+ if default is constantأوامر ALTER البطيئة (التي تعيد كتابة الجدول)
تعيد هذه الأوامر كتابة الجدول بأكمله:
ALTER TABLE t ALTER COLUMN x TYPE BIGINT; -- when types not binary-compatible
ALTER TABLE t SET LOGGED;
CLUSTER t USING idx; -- physically reorders rows
VACUUM FULL t; -- rewrites whole tableإضافة NOT NULL بأمان
في جدول كبير:
-- BAD: full table scan + ACCESS EXCLUSIVE lock
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
-- BETTER:
ALTER TABLE t ADD CONSTRAINT x_not_null CHECK (x IS NOT NULL) NOT VALID;
ALTER TABLE t VALIDATE CONSTRAINT x_not_null; -- scans without exclusive lock
-- then drop the CHECK and add NOT NULL (still cheap because already validated):
ALTER TABLE t ALTER COLUMN x SET NOT NULL;
ALTER TABLE t DROP CONSTRAINT x_not_null;إضافة المفاتيح الخارجية عبر الإنترنت
استخدموا حيلة NOT VALID نفسها:
ALTER TABLE orders
ADD CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_fk;مشكلات انتظار الأقفال
سيصطف أمر ALTER الذي ينتظر قفل ACCESS EXCLUSIVE خلف كل معاملة طويلة التشغيل. كما ستصطف المعاملات الأحدث خلف أمر ALTER، فتتشكل سلسلة من الاستعلامات المحجوبة.
lock_timeout
لا تسمحوا للترحيلات بالانتظار إلى ما لا نهاية:
SET lock_timeout = '5s';
ALTER TABLE t ...;
-- ERROR if it can't get the lock in 5s — retry.حلقات إعادة المحاولة
ينبغي أن تعيد الترحيلات المحاولة عند حدوث lock_timeout:
for (let i = 0; i < 20; i++) {
try {
await client.query('SET lock_timeout = 5000');
await client.query('ALTER TABLE ...');
break;
} catch (e) {
if (e.code === '55P03') continue; // lock_not_available
throw e;
}
}استخدام statement_timeout للسلامة
حدّدوا المدة القصوى التي يمكن أن يستغرقها أي أمر منفرد داخل الترحيل:
SET statement_timeout = '30s';أدوات مفيدة
- strong_migrations (Rails)
- django-migrate-zero-downtime
- pg-osc (Postgres Online Schema Change)
- pgRoll
مراجعة
تتطلب الترحيلات عبر الإنترنت الانتباه إلى ما يلي:
- أي أوامر ALTER تقتصر على البيانات الوصفية وأيها يعيد الكتابة
- استخدام NOT VALID مع VALIDATE للقيود
- ضبط lock_timeout وإعادة المحاولة
- تجنب المعاملات طويلة التشغيل التي تحجب الترحيلات
تحقق سريع
أضفتم قيد NOT NULL إلى جدول حجمه 500GB باستخدام أمر ALTER TABLE واحد، ماذا يحدث لعمليات الكتابة؟
الأسئلة الشائعة
هل درس «الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول» مجاني؟
نعم — نص درس «الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول»؟
افهم صيغ ALTER TABLE التي تحصل على قفل ACCESS EXCLUSIVE وتعيد كتابة الجدول، وتلك التي تقتصر على البيانات الوصفية تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الترحيلات الفورية: لماذا تقفل ALTER TABLE الجداول
- الفهارس المتزامنة (CREATE INDEX CONCURRENTLY)
- إعادة تسمية الأعمدة دون توقف
- الأدوات: Flyway وLiquibase وSqitch