이 기사에서는 주로 AIX 플랫폼에서 Linux 플랫폼으로 DB2 기반 PHP 애플리케이션 시스템의 이식 프로세스를 완료하는 방법을 소개합니다. 이 기사에는 기본 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를 위한 실행 가능한 솔루션을 제공합니다. 데이터베이스 시스템 마이그레이션.
이 경우 전체 데이터베이스 마이그레이션 프로세스를 소개하기 위해 SRCDB1을 예로 들어 보겠습니다. SRCDB1 데이터베이스에는 SRCDB1, ASN, DB2DBG 및 SQLDBA의 네 가지 데이터베이스 모드가 있습니다. 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 사용자 ID] [- w 비밀번호]
[ -v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server ServerName] [-nofed]
-d: 데이터베이스 이름, 필수 매개변수
-e: 데이터베이스 복제에 필요한 DDL 파일 추출, 이 옵션 명령문에 대한 스크립트가 포함된 DDL 파일을 생성합니다
. -o: 출력을 지정된 파일 이름으로 리디렉션합니다. -o 옵션이 지정되지 않은
경우 출력은 기본적으로 stdout으로 설정됩니다.-a: 생성된 모든 프로그램에 대한 통계를 생성합니다. 이 옵션이 지정된 경우 무시됩니다. -u 옵션
-i: 데이터베이스가 위치한 서버에 로그인하는 데 사용되는 사용자 ID를 지정합니다.
-w: 데이터베이스가 있는 서버에 로그인하는 데 사용되는 비밀번호를 지정합니다
. 다양한 객체 유형에 따라 데이터베이스 객체 DDL 스크립트를 차별화합니다.
원본 데이터베이스의 각 테이블 데이터는 데이터베이스 내 데이터의 일관성과 무결성을 보장하기 위해 트리거 및 저장 프로시저와 같은 데이터베이스 객체에 의해 처리되므로 이러한 데이터베이스는 테이블 데이터를 가져올 때 잘못된 데이터를 생성하는 트리거 및 저장 프로시저와 같은 데이터베이스 개체의 반복 실행을 방지하려면 데이터를 가져온 후 개체를 생성해야 합니다. 텍스트 편집기를 사용하여 db2look에서 생성된 srcdb1.ddl을 편집하고 테이블 및 인덱스 생성, 외래 키 제약 조건 생성, 트리거 및 저장 프로시저 생성을 수행하는 DDL 문을 4개의 그룹으로 나누어 다음 4개의 DDL 스크립트로 저장합니다.
srcdb1_tables.ddl srcdb1_foriegnkeys.ddl
srcdb1_triggers.ddl srcdb1_procedures.ddl
srcdb1_tables.ddl: SEQUENCE, UDF, TABLE, VIEW 및 기타 데이터베이스 개체를 생성하는 ddl 문이 포함되어 있습니다.
목록 2. srcdb1_tables.ddl 문
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)
) VARCHAR(254)
특정 샘플 _FUNC_1 ……;
CREATE TABLE " SRCDB1"." SAMPLE _TAB_1" (
"TAB_COL1" CHAR(20) NOT NULL ,
"TAB_COL2" VARCHAR(70) NOT NULL )
CREATE TABLE " SRCDB1"." SAMPLE _TAB_2" (…);
…
CREATE TABLE " SRCDB1"." SAMPLE _TAB_N" (…);
CREATE VIEW SRCDB1.SAMPLE_VIEW_1 (VIEW_COL1,VIEW_COL2) AS SELECT 개별
COL1, COL2 WHERE …
CREATE VIEW SRCDB1.SAMPLE_VIEW_2 …;
…
CREATE VIEW 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")
REFERENCES " SRCDB1"."SAMPLE_TABLE"
("COL1");
ALTER TABLE " SRCDB1"."SAMP LE_FK_2 " ADD ……;
……
ALTER TABLE " SRCDB1"."SAMPLE_FK_N" ADD ……;
srcdb1_triggers.ddl: 트리거를 생성하는 ddl 문이 포함되어 있습니다.
목록 4. srcdb1_triggers.ddl 문
SRCDB1.SAMPLE_TAB에서 col1 업데이트 후 CREATE TRIGGER SRCDB1.SAMPLE_TRIG_1
각 행 모드에 대한 n 참조 DB2SQL WHEN ( n.col1 > 3)
ATOMIC 업데이트 시작
SAMPLE_TAB
set(col2) = 'anotherValue' 여기서 col1 = n.col1 ;--
END;
CREATE
TRIGGER SRCDB1
…
SRCDB1.SAMPLE_TRIG_N…
srcdb1_procedures.ddl: SQL 저장 프로시저 및 Java 저장 프로시저를 생성하는 ddl 문이 포함되어 있습니다.
목록 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)
)
동적 결과 세트 0
SPECIFIC SUBMIT_BATCH
EXTERN AL 이름 '제출_배치 ! submit_batch'
언어 JAVA
매개변수 스타일 JAVA
비결정적
FENCED 스레드세이프
수정 SQL 데이터
NO
DBINFO;
생성
절차 " SRCDB1"."JAVA_PROCEDURE_2" …
특정
SRCDB1
.SQL_PROCEDURE_1
언어 SQL
-------------------------- -------- ---
-- SQL 저장 프로시저
--------------------- ----------- -------
P1: BEGIN
……
END P1 ……
CREATEPROCEDURE
SRCDB1.SQL_PROCEDURE_N
……
;
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) DB2 v8.2 시스템에서 SRCDB1에 대해 db2look 추출 프로세스를 수행합니다.
db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1;
데이터베이스 개체 DDL 정보입니다.
3. 데이터 내보내기 내보내기 스크립트
생성 쉘 스크립트를 사용하여 모든 데이터에 대한 DML 스크립트를 생성하고 내보내고 이를 srcdb1_export.sql 파일로 리디렉션합니다. DB2에 익숙한 사용자는 데이터베이스에 생성된 각 테이블, 뷰 및 별칭이 SYSCAT.TABLES의 레코드 행에 해당한다는 것을 알아야 합니다. 따라서 해당 데이터베이스 선택 문을 통해 필요한 모든 데이터베이스 테이블 정보를 얻을 수 있습니다. 필요에 따라 다음 쉘 스크립트는 시스템 테이블 SYSCAT.TABLES의 tabname 필드를 기반으로 SRCDB1, ASN, SQLDBA 및 DB2DBG인 SRCDB1의 모든 tabschema 테이블 이름을 선택하고 해당 이름을 기반으로 해당 내보내기 문을 생성합니다. . 일괄 내보내기 목적을 달성합니다. rtrim 함수는 탭 이름 필드 데이터의 오른쪽 공백을 제거하는 데 사용됩니다.
목록 6. 내보내기 스크립트 생성
# 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;
생성된 srcdb1_export.sql을 편집하고 헤더와 테일에 표시된 통계 정보를 삭제하고 필요한 내보내기 문만 유지합니다. 위 스크립트에 포함된 탭 스키마 정보를 수정하면 내보내야 하는 테이블의 범위, 즉 마이그레이션 프로세스 중에 필요한 모든 테이블 이름을 지정할 수 있습니다. 생성된 내보내기 내보내기 명령문의 명령 형식은 다음과 같습니다.
db2 import to tablename.ixf of ixf select * from tablename
4; 데이터 가져오기 로드 스크립트 생성
쉘 스크립트를 사용하여 데이터를 대상 시스템으로 가져오기 위한 로드 스크립트를 생성합니다. srcdb1_load.sql
목록 7. 로드 스크립트 생성
# db2 "select 'load from ' rtrim(tabname) '.ixf of ixf insert into '
rtrim( tabname) ';' syscat.tables에서
tabschema in ('SRCDB1', 'ASN', 'SQLDBA', 'DB2DBG')" > srcdb1_load.sql;
생성된 srcdb1_load.sql을 편집하고 헤드 및 테일 통계를 삭제합니다. , 필요한 로드 문만 유지하세요. 내보내기 문과 유사하게 위의 쉘 스크립트는 시스템 테이블에서 SRCDB1의 모든 테이블 이름을 선택하고 해당 이름을 기반으로 해당 가져오기 문을 생성하여 일괄 가져오기 목적을 달성합니다. 생성된 import import 문 명령 형식은 다음과 같습니다.
ixf insert into tablename의 tablename.ixf에서 db2 로드;