Alter Table DDL 모범 사례
다음은 Oracle ALTER TABLE 작업 복제에 대한 모범 사례입니다.
VARRAY 또는 ABSTRACT 유형이 있는 테이블
ALTER TABLE을 실행하여 컬럼을 삭제하거나 그 후 곧 사용되지 않는 컬럼을 설정하려는 경우 VARRAY 컬럼 또는 추상 데이터 유형 컬럼을 추가하지 마십시오. 이 데이터 유형에 대한 정보를 얻으려면 SharePlex가 데이터베이스를 쿼리해야 합니다. SharePlex가 첫 번째 DDL을 처리할 수 있기 전에 두 번째 DDL이 수행되었다면 메타데이터가 이미 변경되었기 때문에 쿼리가 실패합니다.
시스템별 메타데이터가 포함된 테이블
일부 메타데이터가 데이터베이스 객체의 스토리지 매개변수와 같이 시스템에 특정한 경우, 해당 메타데이터에 대한 DDL이 복제될 때 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 SharePlex는 ALTER TABLE 명령으로 일부만 변경되었던 경우에도 소스 Oracle 객체에 대한 모든 스토리지 매개변수를 복제합니다. 소스 및 타겟 객체가 동일한 스토리지 매개변수로 생성되지 않았던 경우 둘 중 하나가 발생할 수 있습니다. 타겟 테이블이 소스 테이블의 스토리지를 가정하거나 타겟이 DDL을 지원하지 않는 경우에 오류가 발생합니다.
예: MAXEXTENTS 525 및 MINEXTENTS 20이 있는 소스 테이블과 MAXEXTENTS 505 및 MINEXTENTS 4가 있는 타겟 테이블을 생각해 보겠습니다. 소스 객체의 MAXEXTENTS가 무제한으로 변경되면 SharePlex에서는 MAXEXTENTS 변경 사항과 변경되지 않은 MINEXTENTS 20개를 모두 복제합니다. MINEXTENTS는 현재 할당된 범위보다 클 수 없기 때문에 Oracle 오류 01570이 발생합니다. 또는 소스에서 MINEXTENTS가 1로 변경되었지만 MAXEXTENTS가 변경되지 않은 경우 SharePlex는 둘 다 복제하여 타겟 매개변수가 MAXEXTENTS 525 및 MINEXTENTS 1이 됩니다.
이름이 변경된 테이블
현재 복제 중인 소스 테이블에서 ALTER TABLE RENAME이 실행되면 SharePlex는 이전 구성 줄을 주석 처리하고 구성 파일 끝에 새 줄을 추가하여 활성 구성 파일의 테이블 이름을 변경합니다. 소스 테이블 이름과 타겟 테이블 이름이 동일한 경우 둘 다 새 이름으로 변경합니다. 둘 다 변경하지 않으면 소스 이름만 변경됩니다. 다음은 예입니다. 현재 복제 중인 소스 테이블에서 ALTER TABLE RENAME이 실행되면 SharePlex는 이전 구성 줄을 주석 처리하고 구성 파일 끝에 새 줄을 추가하여 활성 구성 파일의 테이블 이름을 변경합니다. 소스 테이블 이름과 타겟 테이블 이름이 동일한 경우 둘 다 새 이름으로 변경합니다. 둘 다 변경하지 않으면 소스 이름만 변경됩니다.
다음은 예입니다.
# Table scott.table1 renamed to scott.table2 August 5, 2003 10:14
scott.table2 scott.table2 sysA@o.ora555
RENAME 작업 시 Post 프로세스가 중지되는지 여부는 SP_OPO_STOP_ON_DDL_ERR 매개변수의 설정에 따라 달라집니다.
시스템 생성 간격 파티션/하위 파티션이 있는 테이블
데이터베이스가 시스템 생성 간격 파티션/하위 파티션의 이름을 생성하므로 소스의 해당 파티션 이름은 타겟의 해당 파티션 이름과 일치하지 않습니다. P_OCT_TRUNC_PARTITION_BY_ID 매개변수를 1로 설정하여 SharePlex가 ALTER TABLE을 복제하여 시스템 생성 간격 파티션을 TRUNCATE할 때 올바른 파티션을 자르도록 합니다. 이 설정은 SharePlex가 기존의 ALTER TABLE 명령에 지정된 파티션 이름을 사용하지 않고 파티션 ID를 사용하여 파티션을 식별하도록 지시합니다. Post는 파티션 ID를 타겟 테이블의 올바른 파티션 이름에 매핑합니다. 자세한 내용은 SP_OCT_TRUNC_PARTITION_BY_ID 를 참조하십시오.
시스템-명명된 간격 파티션/하위 파티션의 복제를 지원하려면 소스와 타겟 모두 SharePlex 버전 8.6.4 이상이어야 합니다.
SharePlex는 하위 파티션이 비어 있는 경우 시스템 생성 하위 파티션의 TRUNCATE를 지원하지 않습니다.
ALTER TABLE...MOVE
복제 중인 테이블의 기본 키 또는 유니크 키가 기록되지 않는 경우 테이블의 rowid를 변경하는 ALTER TABLE DDL 명령은 후속 DML 작업에 영향을 미칠 수 있습니다. 키가 기록되지 않으면 SharePlex는 rowid를 기반으로 해당 값을 가져옵니다. ALTER TABLE...MOVE와 같이 rowid를 변경하는 작업으로 인해 후속 DML 작업에 잘못된 키 값이 사용될 수 있습니다.
Capture와 Post는 모두 처리하는 DDL을 기록합니다. SharePlex는 복제된 DDL을 SharePlex이벤트 로그에도 인쇄하지만 이는 잘릴 수 있습니다. Post DDL 로그에만 완전한 DDL 문이 포함됩니다. SharePlex는 소스 및 타겟 시스템에 있는 variable-data 디렉토리의 log 하위 디렉토리에 DDL 로그를 저장합니다.
기본적으로 Post는 DDL 오류가 발생하면 중지됩니다. 오류는 일반적으로 소스 시스템에서 DDL이 실행된 데이터베이스 구성 요소가 타겟 데이터베이스에 존재하지 않음을 나타냅니다. SP_OPO_STOP_ON_DDL_ERR 매개변수의 기본 설정은 Post on DDL 오류를 중지하므로 해당 객체에 대한 후속 DML이 실패하지 않습니다. 이를 통해 문제를 해결하고 데이터베이스를 동기화된 상태로 유지할 수 있습니다. 이 매개변수에 대한 자세한 내용은 SharePlex 참조 안내서를 참조하십시오.
표5: SharePlex DDL 로그 명명 규칙
Capture |
o.ORACLE_SID_ocap_ddl_log_number.log |
o.ora12_ocap_ddl_01.log |
Oracle 타겟 |
o.ORACLE_SID_machine_name_opo_ddl_log_number.log |
o.ora12_server2_opo_ddl_01.log |
Open Target 타겟 |
r.database_name_machine_name_xpst_ddl_log_number.log |
r.mssdb1_server3_xpst_ddl_01.log |
이 장에는 Post 프로세스에서 반환된 오류를 처리하기 위해 SharePlex가 제공하는 도구에 대한 개요가 포함되어 있습니다.
내용
DML 오류 발생 시 계속 게시
SharePlex는 DML 오류가 발생한 후 Post가 중지되지 않고 처리를 계속할 수 있는 방법을 제공합니다.
Oracle 및 SharePlex 오류에 대한 계속 게시
Oracle 타겟에 유효
SharePlex가 Oracle 타겟에 게시되면 특정 Oracle DML 오류와 특정 SharePlex 오류 메시지를 무시하고 처리를 계속하도록 Post를 구성할 수 있습니다. Post는 oramsglist 파일의 목록을 기반으로 무시할 메시지를 결정합니다. 파일은 기본적으로 작은 오류 목록과 함께 설치되지만 원하는 대로 제거할 수 있습니다.
Post가 오류를 무시하면 해당 오류를 SharePlex 이벤트 로그에 기록합니다. 또한 Post는 오류와 오류를 발생시킨 SQL 문을 오류 로그에 기록합니다. 이 로그의 이름은 SID_errlog.sql 로그 파일이며 SharePlex variable-data 디렉토리의 데이터 디렉토리에 저장됩니다. 자세한 내용은 이벤트 및 오류 보기를 참조하십시오.
참고: Post가 무시하지 않는 특정 오류가 있으며 해당 메시지가 oramsglist 파일에 나열되어 있어도 해당 메시지에 대해 중지됩니다.
중요: 이 기능을 사용할 때는 주의하십시오. 숨겨진 동기화 중단 상태가 발생할 수 있습니다. 타겟 사용자가 복제 지연을 허용할 수 없고 일부 동기화 중단 데이터가 허용되는 경우에만 이 매개변수를 활성화합니다. SID_errlog.sql 로그를 자주 확인하여 복제 문제를 초래할 수 있는 오류가 있는지 확인하십시오.
오류가 발생해도 Post를 계속하도록 구성하려면 다음을 수행합니다.
-
타겟 시스템에서 디렉토리를 SharePlex variable-data 디렉토리의 data 하위 디렉토리로 변경합니다.
- oramsglist 파일을 찾습니다.
-
복제가 활성화되지 않은 경우 텍스트 편집기에서 파일을 엽니다. 복제가 활성화된 경우 파일 복사본을 만든 후 편집기에서 복사본을 엽니다.
-
추가하는 오류 수만큼 첫 번째 줄의 숫자를 늘립니다. 이 숫자는 파일에 있는 총 오류 수와 같아야 합니다. 예를 들어 다음 파일에는 10개의 오류가 나열되어 있습니다.
ora@sys1dad > vi oramsglist
10
604
900
902
908
909
910
911
932
960
1026
-
파일의 끝에서 시작하여 앞의 예에서 표시된 대로 각 Oracle 또는 SharePlex 오류의 숫자를 한 줄에 하나씩 추가합니다. 메시지는 숫자 순서로 표시될 필요가 없습니다.
- 파일을 저장한 후 닫습니다.
-
Post를 중지합니다(실행 중인 경우).
- oramsglist 파일의 복사본을 편집한 경우 복사본을 oramsglist의 원래 이름으로 저장합니다.
-
SP_OPO_CONT_ON_ERR 매개변수의 값을 1로 변경합니다. 또는 oramsglist 파일에 나열된 테이블 오류에 대한 게시를 계속하려면 값을 2로 변경합니다. SP_OPO_CONT_ON_ERR 매개변수에 대한 설명은 SharePlex 참조 안내서를 참조하십시오.
sp_ctrl> set param SP_OPO_CONT_ON_ERR 1
-
Post를 시작합니다.
sp_ctrl> start post
ODBC 오류에 대해 계속 게시
Open Target에 유효
SharePlex가 Open Target 타겟에 게시되면 ODBC 오류를 무시하고 처리를 계속하도록 Post를 구성할 수 있습니다. Post는 SharePlex 이벤트 로그에 오류를 기록합니다. 또한 Post는 오류와 오류를 발생시킨 SQL 문을 오류 로그에 기록합니다. 이 로그의 이름은 ID_errlog.sql 로그 파일이며 여기서, ID는 데이터베이스 식별자입니다. 파일은 SharePlex variable-data 디렉토리의 데이터 디렉토리에 저장됩니다. 자세한 내용은 이벤트 및 오류 보기를 참조하십시오.
중요: 이 기능을 사용할 때는 주의하십시오. 숨겨진 동기화 중단 상태가 발생할 수 있습니다. 타겟 사용자가 복제 지연을 허용할 수 없고 일부 동기화 중단 데이터가 허용되는 경우에만 이 매개변수를 활성화합니다. SID_errlog.sql 로그를 자주 확인하여 복제 문제를 초래할 수 있는 오류가 있는지 확인하십시오.
오류가 발생해도 Post를 계속하도록 구성하려면 다음을 수행합니다.
-
타겟 시스템에서 디렉토리를 SharePlex variable-data 디렉토리의 data 하위 디렉토리로 변경합니다.
-
데이터베이스에 따라 다음 파일 중 하나를 찾습니다. 이러한 파일은 빈 상태로 설치됩니다.
postgresmsglist |
Postgres |
sqlservermsglist |
Microsoft SQL Server |
mysqlmsglist |
Oracle MySQL |
참고: 메시지 파일에 해당 오류를 나열하더라도 Post가 중지되는 특정 오류가 있습니다.
-
복제가 활성화되지 않은 경우 텍스트 편집기에서 파일을 엽니다. 복제가 활성화된 경우 파일 복사본을 만든 후 편집기에서 복사본을 엽니다.
-
파일의 끝에서 시작하여 예에서 표시된 대로 각 오류의 숫자를 한 줄에 하나씩 추가합니다. 메시지는 숫자 순서로 표시될 필요가 없습니다.
예:
sqlservermsglist:
8102
8180
544
2627
3621
- 파일을 저장한 후 닫습니다.
-
Post를 중지합니다(실행 중인 경우).
- 기존 파일을 복사한 경우 원래 이름으로 다시 저장합니다.
-
SP_OPX_CONT_ON_ERR 매개변수의 값을 1로 변경합니다.
sp_ctrl> set param SP_OPX_CONT_ON_ERR 1
-
Post를 시작합니다.
sp_ctrl> start post