Artikel ini terutama memperkenalkan cara menyelesaikan proses transplantasi sistem aplikasi PHP berbasis DB2 dari platform AIX ke platform Linux. Artikel ini berisi langkah-langkah rinci dalam mentransplantasikan database DB2 yang mendasarinya dan sistem aplikasi PHP lapisan atas, serta masalah dan solusi yang mungkin dihadapi selama proses transplantasi.
Ikhtisar Tugas
Pekerjaan migrasi sistem terutama dibagi menjadi beberapa aspek berikut:
1. Migrasi lintas platform sistem database DB2
2. Instalasi dan konfigurasi server Apache dan sistem aplikasi PHP.
Di bawah ini kami akan memperkenalkan langkah-langkah spesifik migrasi dan konfigurasi dalam dua aspek .
Migrasi lintas platform sistem basis data DB2
Lingkungan basis data
Lingkungan sumber: AIX+DB2 v8.1
Lingkungan target: Linux+DB2 v8.1
Basis data sumber berisi 2 Instans basis data: SRCDB1 dan SRCDB2. Basis data SRCDB1/SRCDB2 berisi ratusan tabel basis data, dan memiliki banyak indeks, batasan kunci asing, pemicu, prosedur tersimpan, dan beberapa tabel dengan bidang kenaikan otomatis (tabel dengan bidang yang ditentukan SELALU SEBAGAI IDENTITAS). Lebih rumit lagi, kami tidak memiliki skrip pembuatan yang akurat untuk objek database ini.
Pemilihan rencana migrasi
Jika sistem sumber dan sistem tujuan yang akan dimigrasi berasal dari jenis sistem operasi yang sama, seperti migrasi antara Linux atau migrasi antar sistem AIX, situasinya relatif sederhana. DB2 sendiri telah menyediakan alat praktis yang relevan untuk mencapai hal ini . Migrasi basis data antar platform dengan tipe yang sama, seperti perintah BACKUP dan RESTORE. Tentu saja, tergantung pada situasinya, Anda perlu memiliki pemahaman yang jelas tentang parameter yang disediakan oleh alat utilitas. Misalnya, jika sistem sumber dan sistem target menggunakan ruang tabel yang berbeda, masalah pengalihan ruang tabel akan terlibat. Karena fokus artikel ini adalah pada transplantasi lintas platform, solusi ini jelas tidak dapat memenuhi kebutuhan dan tidak akan dibahas di sini.
Jadi, bagaimana cara mengatasi masalah migrasi database lintas platform? Apakah mungkin menggunakan utilitas db2move? db2move hanya dapat memigrasikan data dalam tabel, tetapi tidak dapat memigrasikan objek database seperti indeks, batasan kunci asing, pemicu, dan prosedur tersimpan. Selain itu, db2move juga memiliki batasan tertentu untuk tabel yang berisi data bidang penambahan otomatis. Dan db2move hanya dapat mengimpor data ke tabel database yang ada dan tidak dapat menampilkan lokasi ruang tabel yang ditentukan. Karena selama proses migrasi sistem database, tidak hanya data dalam tabel yang perlu dimigrasi, tetapi juga objek database seperti indeks, batasan kunci asing, pemicu, dan prosedur tersimpan. Dibandingkan dengan solusi yang dipilih dalam artikel ini, yang terakhir memiliki lebih banyak keuntungan. Anda dapat menggunakan db2move hanya sebagai alternatif untuk memigrasikan data tabel.
Untuk ekspor dan impor, Anda hanya dapat mengekspor dan mengimpor satu tabel dalam satu waktu, dan Anda perlu memasukkan perintah ekspor dan impor secara manual serta nama tabel data yang akan diimpor dan diekspor ketika jumlah tabel database tidak banyak , ini Opsi ini mungkin masih dapat dipertimbangkan, tetapi ini bukan pilihan terbaik. Dalam kasus sejumlah besar tabel dalam database, pendekatan ini pada dasarnya tidak realistis, dan perintah import tidak menjamin bahwa data bidang yang bertambah secara otomatis akan konsisten dengan data tabel asli.
Berdasarkan mekanisme pemrosesan DB2 untuk objek database, artikel ini menggunakan metode yang menggabungkan db2look dengan skrip DDL dan DML, dan secara terpisah menangani pemicu, prosedur tersimpan, dan batasan kunci asing dalam database asli untuk menyediakan DB2 lintas platform. Solusi yang layak untuk migrasi sistem basis data.
Mari kita ambil SRCDB1 sebagai contoh untuk memperkenalkan proses migrasi database secara keseluruhan dalam kasus ini. Ada empat mode database: SRCDB1, ASN, DB2DBG dan SQLDBA dalam database SRCDB1. Asumsikan bahwa nama pengguna database SRCDB1 adalah user_srcdb1 dan kata sandinya adalah pw_srcdb1.
Operasi terkait pada sistem sumber (AIX)
1. Gunakan perintah db2look untuk mengekstrak daftar skrip DDL yang menghasilkan objek database
1. Perintah db2look dan parameter
# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
db2look: Hasilkan DDL untuk membuat ulang objek didefinisikan dalam database
Sintaks: 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 ID pengguna] [- w kata sandi]
[ -v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server ServerName] [-nofed]
-d: nama database, parameter yang diperlukan
-e: ekstrak file DDL yang diperlukan untuk mereplikasi database, opsi ini akan menghasilkan file DDL yang berisi Script untuk pernyataan
-o : Mengarahkan keluaran ke nama file yang diberikan, jika opsi -o tidak ditentukan, keluaran defaultnya adalah stdout
-a : Hasilkan statistik untuk semua program yang dibuat, jika opsi ini ditentukan, itu akan diabaikan opsi -u
-i : Tentukan user ID yang digunakan untuk login ke server tempat database berada
-w : Tentukan password yang digunakan untuk login ke server tempat database berada
2. Bedakan skrip DDL objek database menurut jenis objek yang berbeda.
Karena setiap data tabel dalam database sumber telah diproses oleh objek database seperti pemicu dan prosedur tersimpan, untuk memastikan konsistensi dan integritas data dalam database, database ini objek harus Dibuat setelah mengimpor data untuk mencegah eksekusi berulang objek database seperti pemicu dan prosedur tersimpan untuk menghasilkan data yang salah saat mengimpor data tabel. Gunakan editor teks untuk mengedit srcdb1.ddl yang dihasilkan oleh db2look, membagi pernyataan DDL yang membuat tabel dan indeks, membuat batasan kunci asing, dan membuat pemicu dan prosedur tersimpan menjadi empat grup, dan menyimpannya sebagai empat skrip DDL berikut:
srcdb1_tables.ddl srcdb1_foriegnkeys.ddl
srcdb1_triggers.ddl srcdb1_procedures.ddl
srcdb1_tables.ddl: Berisi pernyataan ddl untuk membuat SEQUENCE, UDF, TABLE, VIEW dan objek database lainnya.
Listing 2. pernyataan srcdb1_tables.ddl
BUAT URUTAN "SRCDB1"."SAMPLE_SEQ_1" SEBAGAI INTEGER
MINVALUE 1 MAXVALUE 9999999999
MULAI DENGAN 1 PENINGKATAN OLEH 1;
BUAT FUNGSI " SRCDB1"." SAMPEL _FUNC_1" (
VARCHAR(254),
VARCHAR(25 4) ,
VARCHAR(254)
) MENGEMBALIKAN VARCHAR(254)
SAMPEL
KHUSUS
_FUNC_1
…
;
TABEL " SRCDB1"." SAMPEL _TAB_2" (…);
…
BUAT TABEL " SRCDB1"." SAMPEL _TAB_N" (…);
BUAT LIHAT SRCDB1.SAMPLE_VIEW_1 (VIEW_COL1,VIEW_COL2) SEBAGAI PILIH
COL1 yang berbeda, COL2 DARI SAMPLE_TAB DI MANA … …;
CREATE VIEW SRCDB1.SAMPLE_VIEW_2 …;
…
CREATE VIEW SRCDB1.SAMPLE_VIEW_N …;
srcdb1_foriegnkeys.ddl: Berisi pernyataan ddl untuk membuat batasan kunci asing.
Listing 3. pernyataan srcdb1_foriegnkeys.ddl
ALTER TABLE " SRCDB1"."SAMPLE_FK_1"
TAMBAHKAN KONSTRAINT "SQL030903143850120" FOREIGN KEY
("FK_COL1")
REFERENSI " SRCDB1"."SAMPLE_TABLE"
("COL1");
ALTER TABLE " SRCDB1"."SAMP LE_FK_2 " ADD ......;
......
ALTER TABLE " SRCDB1"."SAMPLE_FK_N" ADD ......;
srcdb1_triggers.ddl: Berisi pernyataan ddl untuk membuat trigger.
Listing 4. Pernyataan srcdb1_triggers.ddl
BUAT PEMICU SRCDB1.SAMPLE_TRIG_1 SETELAH UPDATE col1 PADA SRCDB1.SAMPLE_TAB
REFERENSI BARU SEBAGAI n UNTUK SETIAP MODE BARIS DB2SQL KETIKA ( n.col1 > 3)
MULAI pembaruan ATOM
SAMPLE_TAB
set(col2) ='
anotherValue' di mana col1 = n.col1 ;--
CREATE
TRIGGER
SRCDB1
SRCDB1.SAMPLE_TRIG_N…;
srcdb1_procedures.ddl: Berisi pernyataan ddl untuk membuat prosedur tersimpan SQL dan prosedur tersimpan Java.
Listing 5. pernyataan srcdb1_procedures.ddl
BUAT PROSEDUR " SRCDB1"." JAVA_PROCEDURE_1" (
KELUAR KARAKTER SQLSTATE(5),
KELUAR ROWS_SUBMITED INTEGER,
DALAM BATCH_ID INTEGER,
DALAM LEVEL VARCHAR(4000)
)
SET HASIL DINAMIS 0
SUBMIT_BATCH
EXTERN AL NAME KHUSUS 'Sub mit_batch ! submit_batch'
BAHASAPARAMETER
JAVA
GAYA JAVABUKAN DETERMINISTIK
FENCED THREADSAFE
MEMODIFIKASI DATA SQL
TANPA
DBINFO
BUAT
" SRCDB1"."JAVA_PROCEDURE_2" ......;
SRCDB1
KHUSUS
.SQL_PROCEDURE_1
BAHASA SQL
--------------------------------------- ----------------------- ---
-- Prosedur Tersimpan SQL
----------------------------------- ----------- -------
P1: MULAI
......
AKHIR P1 ;
BUAT PROSEDUR SRCDB1.SQL_PROCEDURE_2 ......;
......
BUAT
PROSEDUR SRCDB1.SQL_PROCEDURE_N ......;
Versi db2 v6 dari db2look belum mengimplementasikan ekstraksi seperti pernyataan ddl UDF, TRIGGER, UserSpace, NodeGroup, BufferPool dan objek database lainnya. Mulai dari db2 v7, db2look dapat mengekstrak DDL dari objek di atas, namun masih tidak dapat mengekstrak pernyataan ddl yang membuat objek prosedur tersimpan. Mulai dari db2 v8.2, dukungan untuk fungsi db2look telah ditingkatkan, dan fungsi ekstraksi pernyataan ddl prosedur tersimpan telah diterapkan. Karena sistem basis data sumber yang terlibat dalam artikel ini adalah versi yang lebih rendah (DB2 v8.1), solusi di atas perlu diterapkan untuk mendapatkan informasi DDL dari semua objek basis data:
1). Dari sistem DB2 v8.2 ke SRCDB1 (Versi DB2 v8.1) melakukan operasi KATALOG:
katalog db2 db SRCDB1 sebagai SRCDB1;
2). Lakukan proses ekstraksi db2look pada SRCDB1 dari sistem DB2 v8.2:
db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
; informasi DDL Objek database.
3. Hasilkan skrip ekspor ekspor data
Gunakan skrip shell untuk membuat dan mengekspor skrip DML untuk semua data dan mengarahkannya ke file srcdb1_export.sql. Untuk pengguna yang familiar dengan DB2, Anda harus mengetahui bahwa setiap tabel, tampilan, dan alias yang dibuat dalam database berhubungan dengan baris record di SYSCAT.TABLES. Oleh karena itu, semua informasi tabel database yang diperlukan dapat diperoleh melalui pernyataan pemilihan database yang sesuai. Jika diperlukan, skrip shell berikut akan memilih nama tabel dari semua tabel tabschema di SRCDB1 yaitu SRCDB1, ASN, SQLDBA, dan DB2DBG berdasarkan bidang tabname dari tabel sistem SYSCAT.TABLES, dan menghasilkan pernyataan ekspor yang sesuai berdasarkan namanya . Mencapai tujuan ekspor batch. Fungsi rtrim digunakan untuk menghilangkan spasi pada sisi kanan data field tabname.
Listing 6. Hasilkan skrip ekspor
# db2 "pilih 'ekspor ke ' rtrim(nama tab) '.ixf dari ixf pilih * dari '
rtrim(nama tab) ';' dari syscat.tables
di mana tabschema in('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_export.sql;
Edit srcdb1_export.sql yang dihasilkan, hapus informasi statistik yang ditampilkan di header dan tail, dan simpan hanya pernyataan ekspor yang diperlukan. Dengan memodifikasi informasi tabschema yang terdapat pada skrip di atas, Anda dapat menentukan rentang tabel yang perlu diekspor, yaitu semua nama tabel yang diperlukan selama proses migrasi. Pernyataan ekspor ekspor yang dihasilkan memiliki bentuk perintah berikut:
db2 ekspor ke nama tabel.ixf dari ixf pilih * dari nama tabel
4. Hasilkan skrip pemuatan impor data
Gunakan skrip shell untuk menghasilkan skrip pemuatan untuk mengimpor data ke sistem target: srcdb1_load.sql
Listing 7. Hasilkan skrip pemuatan
# db2 "pilih 'muat dari ' rtrim(nama tab) '.ixf dari ixf masukkan ke '
rtrim( tabname) ';' dari syscat.tables
di mana tabschema in ('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_load.sql;
Edit srcdb1_load.sql yang dihasilkan dan hapus statistik kepala dan ekor. , hanya simpan pernyataan beban yang diperlukan. Mirip dengan pernyataan ekspor, skrip shell di atas memilih nama semua tabel di SRCDB1 dari tabel sistem dan menghasilkan pernyataan impor yang sesuai berdasarkan namanya untuk mencapai tujuan impor batch. Bentuk perintah import import statement yang dihasilkan adalah sebagai berikut:
db2 memuat dari tablename.ixf dari ixf insert ke tablename;