it-swarm.asia

أفضل الممارسات لتغييرات المخطط وترحيل البيانات إلى قاعدة بيانات مباشرة دون توقف؟

كيف تجري تغييرات المخطط على قاعدة بيانات مباشرة دون توقف؟

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

أعتقد أن هذه المشكلة تظهر بشكل متكرر ولكن لا يمكنني العثور على أي حل قياسي للتعامل معها.

هذه المقالة تتعامل مع المشكلة ولكني لم أفهم حقًا الخطوة 3. يقول أن الكتابة إلى كلا الجدولين ، ثم ترحيل البيانات القديمة من الجدول الأول إلى الجدول الجديد. كيف تتأكد من أنك تقوم بترحيل البيانات القديمة فقط؟

(أستخدم PostgreSQL على Herok .)

44
Dan Leary

لقد حصلت على إجابتك تقريبًا بالفعل:

  1. إنشاء هيكل جديد بالتوازي
  2. ابدأ الكتابة لكلا البنائين
  3. ترحيل البيانات القديمة إلى الهيكل الجديد
  4. فقط اكتب واقرأ الهيكل الجديد
  5. حذف الأعمدة القديمة

أما بالنسبة الخطوة ، استخدم شيئًا مثل هذا (في معاملة واحدة):

أدخل ما هو غير موجود بعد:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

تحديث ما تغير في هذه الأثناء:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

لن يتم لمس البيانات الجديدة لأنها متطابقة في المكانين.

27
Erwin Brandstetter