가끔 실제 환경에서 Database가 다운되거나 혹은 서버가 다운되거나 등의 이유로
DB의 무결성이 깨지게 되는 케이스가 존재한다.
임시방편적으로 무결성이 깨진 부분을 복구하는 건 서버 개발자 혹은 DBA의 몫인데,
그 과정에서 Record를 삽입하게 되고, 삽입한 레코드의 순서가 맞지 않는 상황이 발생하게 된다.
이런 상황을 맞닥뜨렸을 때 어떻게 대응할 것인가?
나는 처음 생각한 방법으로, PK를 swap하는 방법을 생각했다.
참고로 필자는 MySQL 5+, 엔진으로는 InnoDB를 사용했다.
그리고 이 방법은 아주 처참하게 실패했다. 적어도 MySQL에서는.
시도한 방법 1)
UPDATE 쿼리를 두 번 작성한다.
결론 1)
그러나 이렇게 하면 Duplicate Key이기 때문에 PK의 unique성 때문에 실행되지 않는다.
시도한 방법 2)
같은 테이블을 조인한 다음 각각 별칭을 주고, 각 PK를 동시에 UPDATE할 수 있게 한다.
결론 2)
동시에 한 테이블에 접근할 수 없다고 뜨며 에러를 뱉는다.
시도한 방법 3)
SET unique_checks = 0으로 만들고 업데이트를 시도한다.
결론 3)
1번과 같은 에러를 뱉는다...흑흑
시도한 방법 4)
transaction으로 묶고 실행시켜 본다.
결론 4)
쿼리문에 따라 1번 혹은 2번과 같은 에러를 뱉는다!!
한 마디로 얘기하자면, stackoverflow에서 열심히 검색한 방법들은 다 작동하지 않았고(내 검색 능력의 부족일 수 있다.)
도저히 PK를 스왑할 수 없었다.
(심지어 transaction으로 하다가, end transaction을 안 해서 디비가 lock wait을 하는 대참사가 발생했다.
오류를 복구하려다가 오류를 더 만든 셈이 되어버렸다...)
그리고 이 방법은 아주 처참하게 실패했다. 적어도 MySQL InnoDB에서는, 또한 내가 시도한 방법들에서는..
간단히 말하자면, swap을 PK할 수는 없었다.
결론적으로, PK를 제외한 다른 값들을 스왑하자!
+ 추가적으로, 최근 관계형 데이터베이스와 관련한 책을 읽고 있는데
이런 시도 자체가 관계형 DB스럽지 않은 방법이며, 릴레이션을 해칠 수 있는 방법인 것으로 보인다.
[H2] Database (디렉토리 경로) not found, either pre-create it or allow remote database creation (9) | 2020.04.23 |
---|---|
[MySQL][JDBC] SQLException : server time zone value 'KST' is unrecognized (0) | 2020.04.15 |
댓글 영역