마스터 데이터베이스에 장애가 생겨 복구가 불가능한 경우 슬레이브 데이터베이스를 마스터 데이터베이스로 교체할 수 있다. 마스터 데이터베이스로 교체하기 위해서는 다음과 같은 조건을 만족해야 한다.
슬레이브 데이터베이스를 사용하여 마스터 데이터베이스를 교체하는 과정은 다음과 같다.
마스터 데이터베이스의 사용자 계정, 클래스, 인덱스, 트리거 등 스키마가 변경될 때마다 cubrid unloaddb 유틸리티를 이용하여 항상 스키마 정보를 백업해야 한다.
cubrid unloaddb -s -C master_db_name
cubrid unloaddb 유틸리티 수행 결과로 master_db_name_schema와 master_db_name_trigger라는 파일이 생성되고 이 파일을 보관했다가 슬레이브 데이터베이스를 마스터 데이터베이스로 교체할 때 사용한다.
cubrid backupdb 유틸리티를 이용한 전체 백업을 수행한 후 마스터 데이터베이스가 위치할 호스트로 백업 볼륨, 활성 로그 파일, 그리고 보관 로그 파일을 모두 복사한다.
cubrid backupdb slave_db_name
마스터 데이터베이스로 교체하기 위해서는 반드시 슬레이브 데이터베이스 전체를 백업해야 한다. 백업 볼륨은 물론 활성 로그 파일 및 보관 로그 파일도 모두 복사해야 전체를 복구할 수 있다.
마스터 호스트에서 백업 볼륨을 복구한 후 이름을 변경한다.
cubrid restoredb slave_db_name
cubrid renamedb slave_db_name master_db_name
만약, 슬레이브 호스트에서의 데이터베이스 볼륨 경로와 마스터 호스트에서의 데이터베이스 볼륨 경로가 다른 경우에는 cubrid restoredb의 -n 옵션을 이용하여 볼륨 경로를 이전 마스터 데이터베이스와 동일하게 지정한다. cubrid restoredb 유틸리티에 대한 상세 설명은 데이터베이스 복구를 참조한다.
"사전 단계: 마스터 데이터베이스 스키마 백업"에서 보관했던 스키마 정보 파일을 이용하여 장애 이전 마스터 데이터베이스와 동일한 사용자 계정 및 인덱스를 생성한다.
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
다음 단계는 동일한 방식으로 마스터에 정의된 트리거 정보를 다시 반영하는 작업이다.
csql -S -u dba -p dba_passwd master_db_name -e -i master_db_name_trigger
시리얼 값이 복구되지 않으므로 시리얼의 현재 값을 수작업으로 조정한다.
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';
복제 계정을 삭제한다.
csql -S -u dba -p dba_passwd master_db_name -c "drop user repl_user"