บทความนี้จะแนะนำวิธีดำเนินการกระบวนการย้ายของระบบแอปพลิเคชัน PHP ที่ใช้ DB2 จากแพลตฟอร์ม AIX ไปเป็นแพลตฟอร์ม Linux เป็นหลัก บทความนี้ประกอบด้วยขั้นตอนโดยละเอียดของการย้ายฐานข้อมูล DB2 พื้นฐานและระบบแอปพลิเคชัน PHP ชั้นบน ตลอดจนปัญหาและแนวทางแก้ไขที่อาจพบในระหว่างกระบวนการย้าย
ภาพรวมงาน
งานการย้ายระบบแบ่งออกเป็นส่วนต่างๆ ดังต่อไปนี้:
1. การโยกย้ายข้ามแพลตฟอร์มของระบบฐานข้อมูล DB2
2. การติดตั้งและการกำหนดค่าเซิร์ฟเวอร์ Apache และระบบแอปพลิเคชัน PHP
ด้านล่างนี้เราจะแนะนำขั้นตอนเฉพาะของการโยกย้ายและการกำหนดค่าในสองด้าน .
การโอนย้ายข้ามแพลตฟอร์มของระบบฐานข้อมูล DB2
สภาพแวดล้อม
ฐานข้อมูล สภาพแวดล้อมต้นทาง: AIX+DB2 v8.1
สภาพแวดล้อมเป้าหมาย: Linux+DB2 v8.1
ฐานข้อมูลต้นทางมี 2 อินสแตนซ์ฐานข้อมูล: SRCDB1 และ SRCDB2 ฐานข้อมูล SRCDB1/SRCDB2 มีตารางฐานข้อมูลหลายร้อยตาราง และมีดัชนี ข้อจำกัดของคีย์นอก ทริกเกอร์ ขั้นตอนการจัดเก็บ และบางตารางที่มีฟิลด์เพิ่มอัตโนมัติ (ตารางที่มีฟิลด์ที่กำหนด GENERATED ALWAYS AS IDENTITY กำหนดไว้) เพื่อให้เรื่องยากยิ่งขึ้น เราไม่มีสคริปต์การสร้างที่ถูกต้องสำหรับออบเจ็กต์ฐานข้อมูลเหล่านี้
การเลือกแผนการโอนย้าย
หากระบบต้นทางและระบบปลายทางที่จะโอนย้ายอยู่ในระบบปฏิบัติการชนิดเดียวกัน เช่น การโอนย้ายระหว่าง Linux หรือการโอนย้ายระหว่างระบบ AIX สถานการณ์นั้นค่อนข้างง่าย DB2 เองได้จัดเตรียมเครื่องมือเชิงปฏิบัติที่เกี่ยวข้องเพื่อให้บรรลุเป้าหมายนี้ . การโยกย้ายฐานข้อมูลระหว่างแพลตฟอร์มประเภทเดียวกัน เช่น คำสั่ง BACKUP และ RESTORE แน่นอน ขึ้นอยู่กับสถานการณ์ คุณต้องมีความเข้าใจที่ชัดเจนเกี่ยวกับพารามิเตอร์ที่เครื่องมือยูทิลิตี้จัดเตรียมไว้ให้ ตัวอย่างเช่น หากระบบต้นทางและระบบเป้าหมายใช้พื้นที่ตารางต่างกัน ปัญหาการเปลี่ยนเส้นทางพื้นที่ตารางจะเกี่ยวข้อง เนื่องจากบทความนี้เน้นไปที่การปลูกถ่ายข้ามแพลตฟอร์ม วิธีแก้ปัญหานี้ไม่สามารถตอบสนองความต้องการได้อย่างชัดเจน และจะไม่กล่าวถึงในที่นี้
ดังนั้นจะจัดการกับปัญหาการย้ายฐานข้อมูลข้ามแพลตฟอร์มได้อย่างไร? เป็นไปได้ไหมที่จะใช้ยูทิลิตี้ db2move? db2move สามารถย้ายข้อมูลในตารางเท่านั้น แต่ไม่สามารถย้ายออบเจ็กต์ฐานข้อมูล เช่น ดัชนี ข้อจำกัดของคีย์นอก ทริกเกอร์ และขั้นตอนการจัดเก็บ นอกจากนี้ db2move ยังมีข้อจำกัดบางประการสำหรับตารางที่มีข้อมูลฟิลด์ที่เพิ่มขึ้นโดยอัตโนมัติ และ db2move สามารถนำเข้าข้อมูลลงในตารางฐานข้อมูลที่มีอยู่เท่านั้น และไม่สามารถแสดงตำแหน่งของพื้นที่ตารางที่ระบุได้ เนื่องจากในระหว่างกระบวนการย้ายระบบฐานข้อมูล ไม่เพียงแต่ต้องย้ายข้อมูลในตารางเท่านั้น แต่ยังต้องย้ายออบเจ็กต์ฐานข้อมูล เช่น ดัชนี ข้อจำกัดของคีย์นอก ทริกเกอร์ และขั้นตอนการจัดเก็บ เมื่อเปรียบเทียบกับโซลูชันที่เลือกในบทความนี้ ข้อดีเพิ่มเติม คุณสามารถใช้ db2move เป็นทางเลือกแทนการย้ายข้อมูลตารางเท่านั้น
สำหรับการส่งออกและนำเข้า คุณสามารถส่งออกและนำเข้าได้ครั้งละหนึ่งตารางเท่านั้น และคุณต้องป้อนคำสั่งส่งออกและนำเข้าและชื่อของตารางข้อมูลที่จะนำเข้าและส่งออกด้วยตนเองเมื่อจำนวนตารางฐานข้อมูลไม่มาก , นี่ ตัวเลือกนี้อาจยังได้รับการพิจารณา แต่ก็ไม่ใช่ตัวเลือกที่ดีที่สุด ในกรณีที่มีตารางจำนวนมากในฐานข้อมูล วิธีการนี้ไม่สมจริงโดยพื้นฐาน และคำสั่งนำเข้าไม่รับประกันว่าข้อมูลของเขตข้อมูลที่เพิ่มขึ้นอัตโนมัติจะสอดคล้องกับข้อมูลตารางต้นฉบับ
ตามกลไกการประมวลผลของ DB2 สำหรับอ็อบเจ็กต์ฐานข้อมูล บทความนี้ใช้วิธีการที่รวม db2look เข้ากับสคริปต์ DDL และ DML และแยกจัดการทริกเกอร์ กระบวนงานที่เก็บไว้ และข้อจำกัดของคีย์ภายนอกในฐานข้อมูลดั้งเดิม เพื่อจัดเตรียมโซลูชัน DB2 A ข้ามแพลตฟอร์มที่เป็นไปได้สำหรับ การโยกย้ายระบบฐานข้อมูล
ลองใช้ SRCDB1 เป็นตัวอย่างเพื่อแนะนำกระบวนการย้ายฐานข้อมูลโดยรวมในกรณีนี้ มีโหมดฐานข้อมูลสี่โหมด: SRCDB1, ASN, DB2DBG และ SQLDBA ในฐานข้อมูล SRCDB1 สมมติว่าชื่อผู้ใช้ของฐานข้อมูล SRCDB1 คือ user_srcdb1 และรหัสผ่านคือ pw_srcdb1
การดำเนินการที่เกี่ยวข้องบนระบบต้นทาง (AIX
) ใช้คำสั่ง 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 userID] [- รหัสผ่าน w]
[ -v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server ServerName] [-nofed]
-d: ชื่อฐานข้อมูล, พารามิเตอร์ที่จำเป็น
-e: แยกไฟล์ DDL ที่จำเป็นสำหรับการจำลองฐานข้อมูล ตัวเลือกนี้ จะสร้างไฟล์ DDL ที่มีสคริปต์สำหรับคำสั่ง
-o : เปลี่ยนเส้นทางเอาต์พุตไปยังชื่อไฟล์ที่กำหนด หากไม่ได้ระบุตัวเลือก -o เอาต์พุตจะมีค่าเริ่มต้นเป็น stdout
-a : สร้างสถิติสำหรับโปรแกรมที่สร้างขึ้นทั้งหมด หากระบุตัวเลือกนี้ จะถูกละเว้น -u ตัวเลือก
-i: ระบุ ID ผู้ใช้ที่ใช้ในการเข้าสู่ระบบเซิร์ฟเวอร์ที่ฐานข้อมูลตั้งอยู่
-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" เป็นจำนวนเต็ม
minvalue 1 maxvalue 999999999
เริ่ม
ต้น
ด้วยการเพิ่ม 1 เพิ่มขึ้น 1;
,
VARCHAR(254)
) ส่งกลับ VARCHAR(254)
ตัวอย่างเฉพาะ _FUNC_1 ……;
CREATE
TABLE " SRCDB1"." SAMPLE _TAB_1" (
"TAB_COL1" CHAR(20) NOT NULL,
"TAB_COL2" VARCHAR(70) NOT NULL );
TABLE " SRCDB1"." SAMPLE _TAB_2" (…);
…
CREATE TABLE " SRCDB1"." SAMPLE _TAB_N" (…);
CREATE VIEW SRCDB1.SAMPLE_VIEW_1 (VIEW_COL1,VIEW_COL2) เป็น SELECT ที่แตกต่างกัน
COL1 , COL2 จาก SAMPLE_TAB WHERE … …;
CREATE VIEW SRCDB1.SAMPLE_VIEW_2 …;
CREATE
VIEW SRCDB1.SAMPLE_VIEW_N …
;
รายการ 3. คำสั่ง srcdb1_foriegnkeys.ddl
แก้ไขตาราง " SRCDB1"."SAMPLE_FK_1"
เพิ่มข้อ จำกัด "SQL030903143850120" คีย์ต่างประเทศ
("FK_COL1")
อ้างอิง " SRCDB1"."SAMPLE_TABLE"
("COL1");
แก้ไขตาราง " SRCDB1" 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)
การ
อัปเดตATOMIC
ชุดSAMPLE_TAB
= 'anotherValue' โดยที่ col1 = n.col1 ;--
END;
CREATE
TRIGGER SRCDB1
SRCDB1. SAMPLE_TRIG_N…;
srcdb1_procedures.ddl: มีคำสั่ง ddl เพื่อสร้างขั้นตอนการจัดเก็บ SQL และขั้นตอนการจัดเก็บ java
รายการ 5. srcdb1_procedures.ddl คำสั่ง
CREATE PROCEDURE " SRCDB1"." JAVA_PROCEDURE_1" (
OUT SQLSTATE CHARACTER(5),
OUT ROWS_SUBMITED INTEGER,
IN BATCH_ID INTEGER,
IN LEVEL VARCHAR(4000)
)
DYNAMIC RESULT SETS 0
SPECIFIC SUBMIT_BATCH
EXTERN AL NAME 'Sub mit_batch ! send_batch'
รูปแบบพารามิเตอร์
ภาษา JAVA
JAVAไม่ใช่
เธรด
ที่มีรั้วกำหนดปรับเปลี่ยนข้อมูล SQL
NO
DBINFO;
CREATE
PROCEDURE " SRCDB1"."JAVA_PROCEDURE_2" ……;
เฉพาะ
SRCDB1
.SQL_PROCEDURE_1
ภาษา SQL
--------------------------------------- -------- ---
-- ขั้นตอนการจัดเก็บ SQL
---------------------------------- ----------- -------
P1: BEGIN
……
END P1 ;
CREATE
PROCEDURE
SRCDB1.SQL_PROCEDURE_2
……;
db2look เวอร์ชัน db2 v6 ยังไม่ได้ใช้การแยกเช่น 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) ดำเนินการการดำเนินการ CATALOG:
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. สร้างสคริปต์ส่งออกข้อมูลส่งออก
ใช้เชลล์สคริปต์เพื่อสร้างและส่งออกสคริปต์ DML สำหรับข้อมูลทั้งหมด และเปลี่ยนเส้นทางไปยังไฟล์ srcdb1_export.sql สำหรับผู้ใช้ที่คุ้นเคยกับ DB2 คุณควรทราบว่าแต่ละตาราง มุมมอง และนามแฝงที่สร้างขึ้นในฐานข้อมูลสอดคล้องกับแถวของเรกคอร์ดใน SYSCAT.TABLES ดังนั้นข้อมูลตารางฐานข้อมูลที่จำเป็นทั้งหมดสามารถรับได้ผ่านคำสั่งเลือกฐานข้อมูลที่เกี่ยวข้อง หากจำเป็น เชลล์สคริปต์ต่อไปนี้จะเลือกชื่อตารางของตาราง tabschema ทั้งหมดใน SRCDB1 ที่เป็น SRCDB1, ASN, SQLDBA และ DB2DBG ตามฟิลด์ชื่อแท็บจากตารางระบบ SYSCAT.TABLES และสร้างคำสั่งการส่งออกที่สอดคล้องกันตามชื่อ บรรลุวัตถุประสงค์ของการส่งออกเป็นชุด ฟังก์ชัน rtrim ใช้เพื่อลบช่องว่างทางด้านขวาของข้อมูลฟิลด์ชื่อแท็บ
รายการ 6. สร้างสคริปต์ส่งออก
# db2 "select 'export to ' rtrim(tabname) '.ixf of ixf select * from '
rtrim(tabname) '; from syscat.tables
โดยที่ tabschema in('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')"> srcdb1_export.sql;
แก้ไข srcdb1_export.sql ที่สร้างขึ้น ลบข้อมูลทางสถิติที่แสดงในส่วนหัวและส่วนท้าย และเก็บเฉพาะคำสั่งการส่งออกที่จำเป็นเท่านั้น ด้วยการแก้ไขข้อมูล tabschema ที่มีอยู่ในสคริปต์ข้างต้น คุณสามารถระบุช่วงของตารางที่ต้องส่งออก ซึ่งก็คือชื่อตารางทั้งหมดที่จำเป็นในระหว่างกระบวนการย้ายข้อมูล คำสั่งการส่งออกที่สร้างขึ้นมีรูปแบบคำสั่งต่อไปนี้:
db2 ส่งออกไปยัง tablename.ixf ของ ixf เลือก * จาก tablename
; สร้างสคริปต์โหลดการนำเข้าข้อมูล
ใช้เชลล์สคริปต์เพื่อสร้างสคริปต์โหลดสำหรับการนำเข้าข้อมูลไปยังระบบเป้าหมาย: srcdb1_load.sql
รายการ 7. สร้างสคริปต์โหลด
# db2 "select 'load from ' rtrim(tabname) '.ixf of ixf insert into '
rtrim( tabname) ';' จาก syscat.tables
โดยที่ tabschema ใน ('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')"> srcdb1_load.sql;
แก้ไข srcdb1_load.sql ที่สร้างขึ้นและลบสถิติส่วนหัวและส่วนท้าย , เก็บเฉพาะคำสั่งโหลดที่จำเป็นเท่านั้น เช่นเดียวกับคำสั่งการส่งออก เชลล์สคริปต์ด้านบนจะเลือกชื่อของตารางทั้งหมดใน SRCDB1 จากตารางระบบ และสร้างคำสั่งการนำเข้าที่เกี่ยวข้องตามชื่อเพื่อให้บรรลุวัตถุประสงค์ของการนำเข้าแบบแบตช์ แบบฟอร์มคำสั่งคำสั่งนำเข้านำเข้าที่สร้างขึ้นมีดังนี้
โหลด db2 จาก tablename.ixf ของ ixf แทรกลงใน tablename;