마스터 데이터베이스 교체(수동)

마스터 데이터베이스에 장애가 생겨 복구가 불가능한 경우 슬레이브 데이터베이스를 마스터 데이터베이스로 교체할 수 있다. 마스터 데이터베이스로 교체하기 위해서는 다음과 같은 조건을 만족해야 한다.

슬레이브 데이터베이스를 사용하여 마스터 데이터베이스를 교체하는 과정은 다음과 같다.

사전 단계: 마스터 데이터베이스 스키마 백업

마스터 데이터베이스의 사용자 계정, 클래스, 인덱스, 트리거 등 스키마가 변경될 때마다 cubrid unloaddb 유틸리티를 이용하여 항상 스키마 정보를 백업해야 한다.

cubrid unloaddb -s –C master_db_name

cubrid unloaddb 유틸리티 수행 결과로 master_db_name_schema와 master_db_name_trigger라는 파일이 생성되고 이 파일을 보관했다가 슬레이브 데이터베이스를 마스터 데이터베이스로 교체할 때 사용한다.

단계 1: 슬레이브 데이터베이스 백업 및 복사

cubrid backupdb 유틸리티를 이용한 전체 백업을 수행한 후 마스터 데이터베이스가 위치할 호스트로 백업 볼륨, 활성 로그 파일, 그리고 보관 로그 파일을 모두 복사한다.

cubrid backupdb slave_db_name

마스터 데이터베이스로 교체하기 위해서는 반드시 슬레이브 데이터베이스 전체를 백업해야 한다. 백업 볼륨은 물론 활성 로그 파일 및 보관 로그 파일도 모두 복사해야 전체를 복구할 수 있다.

단계 2:  슬레이브 데이터베이스 복구 후 이름 변경

마스터 호스트에서 백업 볼륨을 복구한 후 이름을 변경한다.

cubrid restoredb slave_db_name

cubrid renamedb slave_db_name master_db_name

만약, 슬레이브 호스트에서의 데이터베이스 볼륨 경로와 마스터 호스트에서의 데이터베이스 볼륨 경로가 다른 경우에는 cubrid restoredb-n 옵션을 이용하여 볼륨 경로를 이전 마스터 데이터베이스와 동일하게 지정한다. cubrid restoredb 유틸리티에 대한 상세 설명은 데이터베이스 복구를 참조한다.

단계 3: 사용자 계정 및 스키마 변경 사항 적용

"사전 단계: 마스터 데이터베이스 스키마 백업"에서 보관했던 스키마 정보 파일을 이용하여 장애 이전 마스터 데이터베이스와 동일한 사용자 계정 및 인덱스를 생성한다.

master_db_name_schema 파일 첫 부분에는 DBA 계정의 암호를 다시 생성하는 구문과 사용자 계정을 새로 생성하는 구문이 있다. 이미 슬레이브 데이터베이스에는 이 계정이 존재하므로 사용자 계정을 생성하는 구문을 사용자 계정을 찾는 구문으로 변경한다.

call add_user('REPL', '') on class db_root to auser;

위 구문을 모두 찾아 아래 구문으로 변경한다.

call find_user('REPL') on class db_user to auser;

master_db_name_schema 파일에는 마스터 데이터베이스의 스키마 생성 DDL이 저장되어 있으므로 이미 슬레이브 데이터베이스에 해당 스키마가 존재하는 경우 오류가 발생하는데 이 오류는 무시한다.

csql -S -u dba -p dba_passwd master_db_name -e -i master_db_name_schema

단계 4: 트리거 정의

다음 단계는 동일한 방식으로 마스터에 정의된 트리거 정보를 다시 반영하는 작업이다.

csql -S -u dba -p dba_passwd master_db_name -e -i master_db_name_trigger

사후 단계 1: 시리얼 조정

시리얼 값이 복구되지 않으므로 시리얼의 현재 값을 수작업으로 조정한다.

csql -S -u dba -p dba_passwd master_db_name
drop serial a;
call find_user('REPL') on class db_user to auser;
create serial a
     start with 1743715
     increment by 1
     minvalue 1
     maxvalue 10000000000000000000000000000000000000
     nocycle;
update db_serial set owner = :auser, started=1 where name= 'a';

사후 단계 2: 복제 계정 삭제

복제 계정을 삭제한다.

csql -S -u dba -p dba_passwd master_db_name –c "drop user repl_user"