تقدم هذه المقالة بشكل أساسي كيفية إكمال عملية نقل نظام تطبيق PHP المعتمد على DB2 من منصة AIX إلى منصة Linux. تحتوي المقالة على الخطوات التفصيلية لزرع قاعدة بيانات DB2 الأساسية ونظام تطبيق PHP للطبقة العليا، بالإضافة إلى المشكلات والحلول التي قد تتم مواجهتها أثناء عملية الزرع.
نظرة عامة على المهام
ينقسم عمل ترحيل النظام بشكل أساسي إلى الجوانب التالية:
1. الترحيل عبر الأنظمة الأساسية لنظام قاعدة بيانات DB2
2. تثبيت وتكوين خادم Apache ونظام تطبيق PHP
أدناه سنقدم الخطوات المحددة للترحيل والتكوين في جانبين .
الترحيل عبر الأنظمة الأساسية لنظام قاعدة بيانات DB2
بيئة قاعدة البيانات
البيئة المصدر: AIX+DB2 v8.1
البيئة المستهدفة: Linux+DB2 v8.1
تحتوي قاعدة البيانات المصدر على مثيلين لقاعدة البيانات: SRCDB1 وSRCDB2. تحتوي قاعدة بيانات SRCDB1/SRCDB2 على مئات من جداول قاعدة البيانات، وتحتوي على العديد من الفهارس، وقيود المفاتيح الخارجية، والمشغلات، والإجراءات المخزنة، وبعض الجداول ذات حقول الزيادة التلقائية (الجداول ذات الحقول التي تم إنشاؤها دائمًا كهوية محددة). ولجعل الأمور أكثر صعوبة، ليس لدينا نصوص برمجية دقيقة لإنشاء كائنات قاعدة البيانات هذه.
اختيار خطة الترحيل
إذا كان النظام المصدر ونظام الوجهة المراد ترحيلهما ينتميان إلى نفس نوع نظام التشغيل، مثل الترحيل بين Linux أو الترحيل بين أنظمة AIX، فإن الوضع بسيط نسبيًا وقد وفرت DB2 نفسها الأدوات العملية ذات الصلة لتحقيق ذلك ترحيل قاعدة البيانات بين الأنظمة الأساسية من نفس النوع، مثل أوامر النسخ الاحتياطي والاستعادة. بالطبع، اعتمادًا على الموقف، يجب أن يكون لديك فهم واضح للمعلمات التي توفرها الأداة المساعدة. على سبيل المثال، إذا كان النظام المصدر والنظام الهدف يستخدمان مساحات جدول مختلفة، فستكون هناك مشكلة في إعادة توجيه مساحة الجدول. نظرًا لأن تركيز هذه المقالة ينصب على عملية الزرع عبر الأنظمة الأساسية، فمن الواضح أن هذا الحل لا يمكن أن يلبي الاحتياجات ولن يتم مناقشته هنا.
إذًا، كيف يمكن التعامل مع مشكلات ترحيل قاعدة البيانات عبر الأنظمة الأساسية؟ هل من الممكن استخدام الأداة المساعدة db2move؟ يمكن لـ db2move ترحيل البيانات الموجودة في الجداول فقط، ولكن لا يمكنه ترحيل كائنات قاعدة البيانات مثل الفهارس وقيود المفاتيح الخارجية والمشغلات والإجراءات المخزنة علاوة على ذلك، يحتوي db2move أيضًا على قيود معينة للجداول التي تحتوي على بيانات حقلية ذات زيادة تلقائية. ويمكن لـ db2move فقط استيراد البيانات إلى جداول قاعدة البيانات الموجودة ولا يمكنه عرض موقع مساحة الجدول المحددة. نظرًا لأنه أثناء عملية ترحيل نظام قاعدة البيانات، لا يلزم ترحيل البيانات الموجودة في الجداول فحسب، بل يلزم أيضًا ترحيل كائنات قاعدة البيانات مثل الفهارس وقيود المفاتيح الخارجية والمشغلات والإجراءات المخزنة المزيد من المزايا. يمكنك استخدام db2move فقط كبديل لترحيل بيانات الجدول.
بالنسبة للتصدير والاستيراد، يمكنك تصدير واستيراد جدول واحد فقط في كل مرة، وتحتاج إلى إدخال أوامر التصدير والاستيراد يدويًا واسم جدول البيانات المراد استيراده وتصديره عندما لا يكون عدد جداول قاعدة البيانات كبيرًا ، قد لا يزال هذا الخيار قيد النظر، لكنه ليس الخيار الأفضل. في حالة وجود عدد كبير من الجداول في قاعدة البيانات، يكون هذا الأسلوب غير واقعي في الأساس، ولا يضمن أمر الاستيراد أن تكون بيانات الحقول المتزايدة تلقائيًا متوافقة مع بيانات الجدول الأصلي.
استنادا إلى آلية معالجة DB2 لكائنات قاعدة البيانات، تستخدم هذه المقالة طريقة تجمع بين db2look مع البرامج النصية DDL وDML، وتتعامل بشكل منفصل مع المشغلات والإجراءات المخزنة وقيود المفاتيح الخارجية في قاعدة البيانات الأصلية لتوفير حل عملي DB2 عبر الأنظمة الأساسية لـ ترحيل نظام قاعدة البيانات.
لنأخذ SRCDB1 كمثال لتقديم عملية ترحيل قاعدة البيانات الشاملة في هذه الحالة. هناك أربعة أوضاع لقاعدة البيانات: SRCDB1، وASN، وDB2DBG، وSQLDBA في قاعدة بيانات SRCDB1. افترض أن اسم المستخدم لقاعدة بيانات SRCDB1 هو user_srcdb1 وكلمة المرور هي pw_srcdb1.
العمليات ذات الصلة على النظام المصدر (AIX)
1. استخدم الأمر db2look لاستخراج قائمة البرامج النصية DDL التي تنشئ كائنات قاعدة البيانات
1. أمر db2look ومعلماته
# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
db2look: قم بإنشاء DDL لإعادة إنشاء الكائنات المعرفة في بناء جملة قاعدة البيانات
: db2look -d DBname [-e] [-u Creator] [-z Schema]
[-t Tname1 Tname2...TnameN] [-tw Tname] [-h] [-o Fname] [- a]
[- m] [-c] [-r] [-l] [-x] [-xd] [-f] [-fd] [-td x]
[-noview] [-i معرف المستخدم] [- w كلمة المرور]
[ -v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server ServerName] [-nofed]
-d: اسم قاعدة البيانات، المعلمة المطلوبة
-e: استخراج ملف DDL المطلوب لنسخ قاعدة البيانات، هذا الخيار سيتم إنشاء ملف DDL يحتوي على برنامج نصي للبيانات
-o : إعادة توجيه الإخراج إلى اسم الملف المحدد، إذا لم يتم تحديد الخيار -o، فإن إعدادات الإخراج الافتراضية هي stdout
-a : إنشاء إحصائيات لجميع البرامج التي تم إنشاؤها، إذا تم تحديد هذا الخيار، فسيتم سيتم تجاهل -u الخيار
-i: حدد معرف المستخدم المستخدم لتسجيل الدخول إلى الخادم حيث توجد قاعدة البيانات
-w: حدد كلمة المرور المستخدمة لتسجيل الدخول إلى الخادم حيث توجد قاعدة البيانات
2. التمييز بين نصوص DDL لكائن قاعدة البيانات وفقًا لأنواع مختلفة من الكائنات
نظرًا لأن كل بيانات جدول في قاعدة البيانات المصدر تمت معالجتها بواسطة كائنات قاعدة البيانات مثل المشغلات والإجراءات المخزنة، وذلك لضمان اتساق وسلامة البيانات في قاعدة البيانات، يجب إنشاء الكائنات بعد استيراد البيانات لمنع التنفيذ المتكرر لكائنات قاعدة البيانات مثل المشغلات والإجراءات المخزنة لإنشاء بيانات خاطئة عند استيراد بيانات الجدول. استخدم محرر نصوص لتحرير srcdb1.ddl الذي تم إنشاؤه بواسطة db2look، وتقسيم عبارات DDL التي تنشئ الجداول والفهارس، وإنشاء قيود المفاتيح الخارجية، وإنشاء المشغلات والإجراءات المخزنة إلى أربع مجموعات، وحفظها كبرنامج نصي DDL الأربعة التالي:
srcdb1_tables.ddl srcdb1_foriegnkeys.ddl
srcdb1_triggers.ddl srcdb1_procedures.ddl
srcdb1_tables.ddl: يحتوي على عبارات ddl لإنشاء SEQUENCE وUDF وTABLE وVIEW وكائنات قاعدة البيانات الأخرى.
القائمة 2. بيان srcdb1_tables.ddl
إنشاء التسلسل "SRCDB1"."SAMPLE_SEQ_1" AS INTEGER
MINVALUE
1 MAXVALUE 9999999999
START
with 1 Increment BY 1; 4
) ,
VARCHAR(254)
) إرجاع VARCHAR(254)
SPECIFIC SAMPLE _FUNC_1 ……;
إنشاء
جدول " SRCDB1"." SAMPLE _TAB_1" (
"TAB_COL1" CHAR(20) NOT NULL ,
"TAB_COL2" VARCHAR(70) NOT CREATE ) ;
TABLE " SRCDB1"." SAMPLE _TAB_2" (...);
...
إنشاء جدول " SRCDB1"." SAMPLE _TAB_N" (...);
إنشاء عرض SRCDB1.SAMPLE_VIEW_1 (VIEW_COL1,VIEW_COL2) كما حدد
COL1 و COL2 من SAMPLE_TAB حيث … …;
إنشاء عرض SRCDB1.SAMPLE_VIEW_2 …;
…
إنشاء عرض SRCDB1.SAMPLE_VIEW_N …;
srcdb1_foriegnkeys.ddl: يحتوي على عبارة ddl لإنشاء قيود المفتاح الخارجي.
القائمة 3. بيان srcdb1_foriegnkeys.ddl
ALTER TABLE " SRCDB1"."SAMPLE_FK_1"
ADD CONSTRAINT "SQL030903143850120" FOREIGN KEY
("FK_COL1")
مراجع " SRCDB1"."SAMPLE_TABLE"
("COL1")
؛ LE_FK_2 " ADD ……;
……
ALTER TABLE " SRCDB1"."SAMPLE_FK_N" ADD ……;
srcdb1_triggers.ddl: يحتوي على عبارات ddl لإنشاء المشغلات.
القائمة 4. بيان srcdb1_triggers.ddl
قم بإنشاء TRIGGER SRCDB1.SAMPLE_TRIG_1 بعد تحديث col1 على SRCDB1.SAMPLE_TAB
الرجوع إلى جديد كـ n لكل وضع صف DB2SQL عند ( n.col1 > 3)
بدء
التحديث الذري
SAMPLE_TAB
set(col2)=
'anotherValue'
حيث col1 = n.col1 ;--
END;
SRCDB1.SAMPLE_TRIG_N...؛
srcdb1_procedures.ddl: يحتوي على عبارات ddl لإنشاء إجراءات SQL المخزنة وإجراءات جافا المخزنة.
القائمة 5. بيان srcdb1_procedures.ddl
إنشاء الإجراء "SRCDB1"." JAVA_PROCEDURE_1" (
OUT SQLSTATE CHARACTER(5)،
OUT ROWS_SUBMITED INTEGER،
IN BATCH_ID INTEGER،
IN LEVEL VARCHAR(4000))
)
مجموعات النتائج الديناميكية 0
SPECIFIC SUBMIT_BATCH
EX TERN AL NAME 'Submit_batch Submit_batch'
LANGUAGE JAVA
PARAMETER STYLE JAVA
غير محدد
بسياج THREADSAFE
يعدل بيانات SQL
بدون
معلومات
إنشاء
"SRCDB1"."JAVA_PROCEDURE_2" ……;
SRCDB1
محدد
.SQL_PROCEDURE_1
لغة SQL
--------------------------------------- -------- ---
-- إجراء SQL المخزن
---------------------------------- ----------- -------
P1: البدء
……
نهاية P1 ;
إنشاء الإجراء SRCDB1.SQL_PROCEDURE_2 ………
إنشاء
الإجراء
SRCDB1.SQL_PROCEDURE_N ……;
لم ينفذ الإصدار db2 v6 من db2look بعد استخراجًا مثل UDF وTRIGGER وUserSpace وNodeGroup وBufferPool وبيانات ddl لكائنات قاعدة البيانات الأخرى. بدءًا من db2 v7، يمكن لـ db2look استخراج DDL للكائنات المذكورة أعلاه، لكنه لا يزال غير قادر على استخراج عبارة ddl التي تقوم بإنشاء كائن الإجراء المخزن. بدءًا من الإصدار db2 v8.2، تم تحسين دعم وظيفة db2look، وتم تنفيذ وظيفة استخراج بيانات ddl الخاصة بالإجراء المخزن. نظرًا لأن نظام قاعدة البيانات المصدر المتضمن في هذه المقالة هو إصدار أقل (DB2 v8.1)، فيجب اعتماد الحل أعلاه للحصول على معلومات DDL لجميع كائنات قاعدة البيانات:
1). من نظام DB2 v8.2 إلى SRCDB1 (الإصدار DB2 v8.1) قم بإجراء عملية الكتالوج:
كتالوج db2 db SRCDB1 كـ SRCDB1
2). تنفيذ عملية استخراج db2look على SRCDB1 من نظام DB2 v8.2:
db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
؛ معلومات كائن قاعدة البيانات DDL.
3. إنشاء برنامج نصي لتصدير البيانات
استخدم برنامج نصي Shell لإنشاء برنامج نصي DML لجميع البيانات وتصديره وإعادة توجيهه إلى ملف srcdb1_export.sql. بالنسبة للمستخدمين المطلعين على DB2، يجب أن تعلم أن كل جدول وطريقة عرض واسم مستعار تم إنشاؤه في قاعدة البيانات يتوافق مع صف من السجلات في SYSCAT.TABLES. لذلك، يمكن الحصول على جميع معلومات جدول قاعدة البيانات المطلوبة من خلال بيان تحديد قاعدة البيانات المقابل. حسب الحاجة، سيحدد البرنامج النصي shell التالي أسماء الجداول لجميع جداول مخطط علامات التبويب في SRCDB1 وهي SRCDB1 وASN وSQLDBA وDB2DBG بناءً على حقل اسم علامة التبويب من جدول النظام SYSCAT.TABLES، وإنشاء بيانات التصدير المقابلة بناءً على أسمائها. تحقيق الغرض من تصدير دفعة. يتم استخدام الدالة rtrim لإزالة المسافات الموجودة على الجانب الأيمن من بيانات حقل اسم علامة التبويب.
القائمة 6. إنشاء برنامج نصي للتصدير
# db2 "حدد "تصدير إلى" rtrim(tabname) '.ixf of ixf حدد * من '
rtrim(tabname)';' من syscat.tables
حيث يوجد مخطط علامات التبويب في('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_export.sql؛
قم بتحرير srcdb1_export.sql الذي تم إنشاؤه، وحذف المعلومات الإحصائية المعروضة في الرأس والذيل، واحتفظ فقط ببيانات التصدير الضرورية. من خلال تعديل معلومات مخطط علامات التبويب الموجودة في البرنامج النصي أعلاه، يمكنك تحديد نطاق الجداول التي يجب تصديرها، أي جميع أسماء الجداول المطلوبة أثناء عملية الترحيل. يحتوي بيان التصدير الذي تم إنشاؤه على نموذج الأمر التالي:
تصدير db2 إلى tablename.ixf الخاص بـ ixf حدد * من اسم الجدول
4؛ إنشاء برنامج نصي لتحميل استيراد البيانات
استخدم برنامج Shell النصي لإنشاء برنامج نصي للتحميل لاستيراد البيانات إلى النظام الهدف:
قائمة srcdb1_load.sql 7. إنشاء برنامج نصي للتحميل
# db2 "حدد "تحميل من" rtrim(tabname) ".ixf من ixf أدخل في"
rtrim( tabname) ';' من syscat.tables
حيث يوجد مخطط علامات التبويب ('SRCDB1'، 'ASN'، 'SQLDBA'، 'DB2DBG')" > srcdb1_load.sql؛
قم بتحرير srcdb1_load.sql الذي تم إنشاؤه وحذف إحصائيات الرأس والذيل. احتفظ فقط ببيانات التحميل الضرورية. على غرار بيان التصدير، يحدد البرنامج النصي shell أعلاه أسماء جميع الجداول في SRCDB1 من جدول النظام وينشئ بيانات الاستيراد المقابلة بناءً على أسمائها لتحقيق غرض الاستيراد المجمع. نموذج أمر عبارة الاستيراد الذي تم إنشاؤه هو كما يلي:
تحميل db2 من tablename.ixf الخاص بـ ixf Insert into tablename؛