In diesem Artikel wird hauptsächlich erläutert, wie der Transplantationsprozess eines auf DB2 basierenden PHP-Anwendungssystems von der AIX-Plattform auf die Linux-Plattform abgeschlossen wird. Der Artikel enthält die detaillierten Schritte zum Transplantieren der zugrunde liegenden DB2-Datenbank und des PHP-Anwendungssystems der oberen Schicht sowie die Probleme und Lösungen, die während des Transplantationsprozesses auftreten können.
Aufgabenübersicht
Die Systemmigrationsarbeit gliedert sich hauptsächlich in die folgenden Aspekte:
1. Plattformübergreifende Migration des DB2-Datenbanksystems
2. Installation und Konfiguration des Apache-Servers und des PHP-Anwendungssystems
Im Folgenden werden die spezifischen Schritte der Migration und Konfiguration in zwei Aspekten vorgestellt . .
Plattformübergreifende Migration des DB2-Datenbanksystems
Datenbankumgebung
Quellumgebung: AIX+DB2 v8.1
Zielumgebung: Linux+DB2 v8.1
Die Quelldatenbank enthält zwei Datenbankinstanzen: SRCDB1 und SRCDB2. Die SRCDB1/SRCDB2-Datenbank enthält Hunderte von Datenbanktabellen und verfügt über viele Indizes, Fremdschlüsseleinschränkungen, Trigger, gespeicherte Prozeduren und einige Tabellen mit automatisch inkrementierenden Feldern (Tabellen mit definierten GENERATED ALWAYS AS IDENTITY-Feldern). Um die Sache noch schwieriger zu machen, verfügen wir nicht über genaue Erstellungsskripts für diese Datenbankobjekte.
Auswahl des Migrationsplans
Wenn das zu migrierende Quellsystem und das zu migrierende Zielsystem zum gleichen Betriebssystemtyp gehören, z. B. bei der Migration zwischen Linux oder zwischen AIX-Systemen, ist die Situation relativ einfach. DB2 selbst stellt entsprechende praktische Tools bereit, um dies zu erreichen . Datenbankmigration zwischen Plattformen desselben Typs, z. B. BACKUP- und RESTORE-Befehle. Natürlich müssen Sie je nach Situation ein klares Verständnis der vom Dienstprogramm bereitgestellten Parameter haben. Wenn beispielsweise das Quellsystem und das Zielsystem unterschiedliche Tabellenbereiche verwenden, tritt das Problem der Tabellenbereichsumleitung auf. Da der Schwerpunkt dieses Artikels auf der plattformübergreifenden Transplantation liegt, kann diese Lösung die Anforderungen offensichtlich nicht erfüllen und wird hier nicht besprochen.
Wie geht man also mit Problemen bei der plattformübergreifenden Datenbankmigration um? Ist es möglich, das Dienstprogramm db2move zu verwenden? db2move kann nur Daten in Tabellen migrieren, aber keine Datenbankobjekte wie Indizes, Fremdschlüsseleinschränkungen, Trigger und gespeicherte Prozeduren. Darüber hinaus unterliegt db2move auch bestimmten Einschränkungen für Tabellen, die automatisch inkrementierte Felddaten enthalten. Und db2move kann nur Daten in vorhandene Datenbanktabellen importieren und den Speicherort des angegebenen Tabellenbereichs nicht anzeigen. Da während des Migrationsprozesses des Datenbanksystems nicht nur die Daten in den Tabellen migriert werden müssen, sondern auch Datenbankobjekte wie Indizes, Fremdschlüsseleinschränkungen, Trigger und gespeicherte Prozeduren weitere Vorteile. Sie können db2move nur als Alternative zur Migration von Tabellendaten verwenden.
Beim Export und Import können Sie jeweils nur eine Tabelle exportieren und importieren. Wenn die Anzahl der Datenbanktabellen nicht groß ist, müssen Sie die Export- und Importbefehle sowie den Namen der zu importierenden und zu exportierenden Datentabelle manuell eingeben , diese Option kann immer noch in Betracht gezogen werden, ist aber nicht die beste Option. Bei einer großen Anzahl von Tabellen in der Datenbank ist dieser Ansatz grundsätzlich unrealistisch und der Importbefehl garantiert nicht, dass die Daten der automatisch inkrementierten Felder mit den ursprünglichen Tabellendaten übereinstimmen.
Basierend auf dem Verarbeitungsmechanismus von DB2 für Datenbankobjekte verwendet dieser Artikel eine Methode, die db2look mit DDL- und DML-Skripten kombiniert und Trigger, gespeicherte Prozeduren und Fremdschlüsseleinschränkungen in der Originaldatenbank separat verarbeitet, um eine plattformübergreifende DB2-Lösung bereitzustellen Datenbanksystemmigration.
Nehmen wir SRCDB1 als Beispiel, um den gesamten Datenbankmigrationsprozess in diesem Fall vorzustellen. In der SRCDB1-Datenbank gibt es vier Datenbankmodi: SRCDB1, ASN, DB2DBG und SQLDBA. Gehen Sie davon aus, dass der Benutzername der SRCDB1-Datenbank user_srcdb1 und das Kennwort pw_srcdb1 lautet.
Zugehörige Vorgänge auf dem Quellsystem (AIX)
1. Verwenden Sie den Befehl db2look, um die DDL-Skriptliste zu extrahieren, die Datenbankobjekte generiert
. 1. Befehl und Parameter db2look
# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
db2look: DDL generieren, um die Objekte neu zu erstellen in der Datenbank definiert
Syntax: db2look -d DBname [-e] [-u Ersteller] [-z Schema]
[-t Tname1 Tname2...TnameN] [-tw Tname] [-h] [-o Fname] [- a]
[- m] [-c] [-r] [-l] [-x] [-xd] [-f] [-fd] [-td x]
[-noview] [-i Benutzer-ID] [- w Passwort]
[ -v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server Servername] [-nofed]
-d: Datenbankname, erforderlicher Parameter
-e: Extrahieren Sie die DDL-Datei, die zum Replizieren der Datenbank erforderlich ist, diese Option generiert eine DDL-Datei mit Skript für Anweisungen.
-o: Leitet die Ausgabe auf den angegebenen Dateinamen um. Wenn die Option -o nicht angegeben ist, ist die Ausgabe standardmäßig auf stdout eingestellt.
-a: Statistiken für alle erstellten Programme generieren. Wenn diese Option angegeben ist, wird sie angezeigt wird ignoriert -u Option
-i: Geben Sie die Benutzer-ID an, die für die Anmeldung bei dem Server verwendet wird, auf dem sich die Datenbank befindet
.-w: Geben Sie das Kennwort an, das für die Anmeldung bei dem Server verwendet wird, auf dem sich die Datenbank befindet
. 2. Unterscheiden Sie Datenbankobjekt-DDL-Skripte nach verschiedenen Objekttypen,
da jede Tabellendaten in der Quelldatenbank von Datenbankobjekten wie Triggern und gespeicherten Prozeduren verarbeitet wurde, um die Konsistenz und Integrität der Daten in der Datenbank sicherzustellen Objekte sollten nach dem Importieren von Daten erstellt werden, um zu verhindern, dass Datenbankobjekte wie Trigger und gespeicherte Prozeduren wiederholt ausgeführt werden, um beim Importieren von Tabellendaten fehlerhafte Daten zu generieren. Verwenden Sie einen Texteditor, um die von db2look generierte Datei srcdb1.ddl zu bearbeiten, die DDL-Anweisungen zum Erstellen von Tabellen und Indizes, zum Erstellen von Fremdschlüsseleinschränkungen sowie zum Erstellen von Triggern und gespeicherten Prozeduren in vier Gruppen aufzuteilen und sie als das folgende vier DDL-Skript zu speichern:
srcdb1_tables.ddl srcdb1_foriegnkeys.ddl
srcdb1_triggers.ddl srcdb1_procedures.ddl
srcdb1_tables.ddl: Enthält DDL-Anweisungen zum Erstellen von SEQUENCE, UDF, TABLE, VIEW und anderen Datenbankobjekten.
Listing 2. srcdb1_tables.ddl-Anweisung
CREATE SEQUENCE „SRCDB1“. „SAMPLE_SEQ_1“ AS INTEGER
MINVALUE 1 MAXVALUE 9999999999
START WITH 1 INCREMENT BY 1;
CREATE FUNCTION „ SRCDB1“. „SAMPLE _FUNC_1“ (
VARCHAR(254),
VARCHAR(25 4) ,
VARCHAR(
254)
) RETURNS VARCHAR(254)
SPECIFIC SAMPLE _FUNC_1 ……;
CREATE
TABLE „ SRCDB1“
.
TABLE „ SRCDB1“. „SAMPLE _TAB_2“ (…);
…
CREATE
TABLE „ SRCDB1“. „SAMPLE _TAB_N“ (…)
;
CREATE VIEW SRCDB1.SAMPLE_VIEW_2 …;
…
CREATE VIEW SRCDB1.SAMPLE_VIEW_N …;
Enthält die ddl-Anweisung zum Erstellen von Fremdschlüsseleinschränkungen.
Listing 3. srcdb1_foriegnkeys.ddl-Anweisung
ALTER TABLE " SRCDB1"."SAMPLE_FK_1"
ADD CONSTRAINT "SQL030903143850120" FOREIGN KEY
("FK_COL1")
REFERENCES " SRCDB1"."SAMPLE_TABLE"
("COL1");
ALTER TABLE " SRCDB1"."SAMP LE_FK_2 " ADD ……;
……
ALTER TABLE " SRCDB1"."SAMPLE_FK_N" ADD ……;
srcdb1_triggers.ddl: Enthält DDL-Anweisungen zum Erstellen von Triggern.
Listing 4. srcdb1_triggers.ddl-Anweisung
CREATE TRIGGER SRCDB1.SAMPLE_TRIG_1 AFTER UPDATE OF col1 ON SRCDB1.SAMPLE_TAB
REFERENZIEREN NEU ALS n FÜR JEDEN ZEILENMODUS DB2SQL WHEN ( n.col1 > 3)
BEGIN ATOMIC
update SAMPLE_TAB
set(col2) = 'anotherValue' where col1 = n.col1 ;--
END;
CREATE TRIGGER SRCDB1 …;
…
CREATE TRIGGER SRCDB1. SAMPLE_TRIG_N…;
srcdb1_procedures.ddl: Enthält DDL-Anweisungen zum Erstellen gespeicherter SQL-Prozeduren und Java-Prozeduren.
Listing 5. srcdb1_procedures.ddl-Anweisung
CREATE PROCEDURE „SRCDB1“. JAVA_PROCEDURE_1 (
OUT SQLSTATE CHARACTER(5
),
OUT
ROWS_SUBMITED INTEGER,
IN BATCH_ID INTEGER,
IN LEVEL VARCHAR(4000
)
)
!submit_batch'
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC
FENCED
THREADSAFE
MODIFIES SQL DATA
NO
DBINFO
;
SPEZIFISCH
SRCDB1
.SQL_PROCEDURE_1
SPRACHE SQL
--------------------------------------- -------- ---
-- Gespeicherte SQL-Prozedur
--------------------- ----------- -------
P1: BEGIN
……
END P1 ;
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_2 ……;
……
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_N ……
; Die db2 v6-Version von db2look hat noch keine Extraktion wie UDF, TRIGGER, UserSpace, NodeGroup, BufferPool und andere DDL-Anweisungen für Datenbankobjekte implementiert. Ab db2 v7 kann db2look die DDL der oben genannten Objekte extrahieren, aber es kann immer noch nicht die ddl-Anweisung extrahieren, die das gespeicherte Prozedurobjekt erstellt. Ab db2 v8.2 wurde die Unterstützung für die db2look-Funktion verbessert und die Extraktionsfunktion für DDL-Anweisungen gespeicherter Prozeduren implementiert. Da es sich bei dem in diesem Artikel betroffenen Quelldatenbanksystem um eine niedrigere Version (DB2 v8.1) handelt, muss die obige Lösung übernommen werden, um die DDL-Informationen aller Datenbankobjekte zu erhalten:
1). (DB2 v8.1-Version) führen Sie die CATALOG-Operation aus:
-
Katalog db SRCDB1 als SRCDB1;
2
).
DDL-Informationen zum Datenbankobjekt.
3. Generieren Sie ein Exportskript für den Datenexport.
Verwenden Sie ein Shell-Skript, um ein DML-Skript für alle Daten zu generieren, zu exportieren und es in die Datei srcdb1_export.sql umzuleiten. Benutzer, die mit DB2 vertraut sind, sollten wissen, dass jede in der Datenbank erstellte Tabelle, Ansicht und jeder Alias einer Datensatzzeile in SYSCAT.TABLES entspricht. Daher können alle erforderlichen Datenbanktabelleninformationen über die entsprechende Datenbankauswahlanweisung abgerufen werden. Bei Bedarf wählt das folgende Shell-Skript die Tabellennamen aller Tabschema-Tabellen in SRCDB1 (SRCDB1, ASN, SQLDBA und DB2DBG) basierend auf dem Tabname-Feld aus der Systemtabelle SYSCAT.TABLES aus und generiert entsprechende Exportanweisungen basierend auf ihren Namen . Erreichen Sie den Zweck des Batch-Exports. Die Funktion rtrim wird verwendet, um die Leerzeichen auf der rechten Seite der Tabname-Felddaten zu entfernen.
Listing 6. Exportskript generieren
# db2 „select ‚export to ‚ rtrim(tabname)‘.ixf of ixf select * from ‚
rtrim(tabname) ‚;‘ from syscat.tables
where tabschema in(‘SRCDB1‘, ‚ASN‘, 'SQLDBA', 'DB2DBG')" > srcdb1_export.sql;
Bearbeiten Sie die generierte srcdb1_export.sql, löschen Sie die im Header und Tail angezeigten statistischen Informationen und behalten Sie nur die erforderlichen Exportanweisungen bei. Durch Ändern der im obigen Skript enthaltenen Tabschema-Informationen können Sie den Bereich der zu exportierenden Tabellen angeben, d. h. alle Tabellennamen, die während des Migrationsprozesses erforderlich sind. Die generierte Export-Export-Anweisung hat die folgende Befehlsform:
db2 export to tablename.ixf of ixf select * from tablename
4. Generieren Sie ein Ladeskript für den Datenimport.
Verwenden Sie ein Shell-Skript, um ein Ladeskript zum Importieren von Daten in das Zielsystem zu generieren: srcdb1_load.sql.
Listing 7. Generieren Sie ein Ladeskript
# db2 "select 'load from ' rtrim(tabname) '.ixf of ixf insert into '
rtrim( tabname) ';' from syscat.tables
where tabschema in ('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_load.sql;
Bearbeiten Sie die generierte srcdb1_load.sql und löschen Sie die Head- und Tail-Statistiken. , Behalten Sie nur die erforderlichen Lastanweisungen bei. Ähnlich wie die Exportanweisung wählt das obige Shell-Skript die Namen aller Tabellen in SRCDB1 aus der Systemtabelle aus und generiert entsprechende Importanweisungen basierend auf ihren Namen, um den Zweck des Stapelimports zu erreichen. Die generierte Befehlsform der Import-Import-Anweisung lautet wie folgt:
db2 Load from Tablename.ixf of ixf insert into tablename;