DB를 다루다 보면 누구나 한번쯤은 고민하겠지만, 어떠한 환경을 구축할 때에 (특히 테스트 환경 구축시에) 백업과 복원(Backup and Restore)에 대한 고민을 하게 된다. DB를 공부하다가 자주 나오는 cold 백업과 warm 백업(응?) 이란 개념이 있어서 mysql이든 ms sql이든 오라클이든 비슷한 개념으로 진행하면 되는 것이긴 하다.
그러나 이게 말처럼 쉽게 되는 것은 아니다. 나는 저번주에 처음으로 오라클 DB를 백업/복원 해 보았는데 뭐 말로는 import하고 export하면 된다고 해서 실제 서버에 있는 데이터를 .dmp파일로 백업받고 그것을 어떻게 해야 할지 엄청나게 고민했던 것 같다.
실 서버의 오라클은 10g Enterprise Edition 정품, 테스트 서버는 무료로 제공되는 Express Edition 이다. 사실 기존에 테스트 서버를 개발자들이 만들어 놓고 가서 나는 별로 건드릴 것이 없었다. 다만 DBMS툴(토드 10을 사용중이다.)을 가지고 테이블이나 만들고 필드나 수정하는 등의 작업을 했었을 뿐이다.
그런데 이번에 테스트 서버가 다 죽어버린 것이다. 하긴 6개월동안 단순 쿼드코어 데스크탑을 돌렸으니 아무리 나 혼자 사용한다 한들 죽는것은 당연하지. 윈도우 시스템이 날아가버려서 황급히 데이터를 내 PC로 백업하고 회사에 요청해서 새롭게 인텔 i5 등 조금 괜찮은 사양으로 맞췄다. 테스트 서버가 2대 있었는데(1. WAS 2. DB와CMS) 두대 다 랜탈한 것인지라 그냥 반납하는 조건으로 말이다. 기존에 사용하던 PC는 WAS서버(Resin)로, 그리고 내 작업 PC는 DB와 CMS를 구동하기로 했다.
그리고 나서 레진까진 복구 성공했는데 문제는 역시 오라클이었다. 나는 오라클을 작년 5월에 처음 다루어봤다. 위에서 언급한 것처럼 단순 쿼리 작업 정도만 진행했지 시스템에 관해서는 거의 아는게 없었다. 그러다 보니 엄청나게 삽질을 한 것이다. my-sql이나 ms sql까지는 내가 백업복원을 해봤었는데 오라클은 또 처음이더라.
실서버 | 테스트 서버 |
Oracle Database 10g Enterprise Edition | Oracle Database 10g Express Edition |
그래서 일단 토드를 사용해서 실서버 import / 테스트 서버 export를 해봤다. 이상한 에러가 나면서 안된다.. 아, 오라클의 에디션(Enterprise / Express) 차이인가? 아 메뉴얼을 읽어보니 Express버전(흔히 말하는 OracleXE이다.)에는 DB가 하나밖에 생성 안된다고 한다. 흠..? 기본이 XE라는 DB로 되어있는데 내가 우너하는 DB는 따로 또 만들어야 하는가? 그래서 Enterprise는 제약이 없길래 설치하기로 했다.
그래서 회사에서 오라클 10g Enterprise Edition CD를 받아서 Enterprise로 설치했다. 설치할때는 별로 안걸렸는데 한번 구동하니깐 컴퓨터 거의 맛갈 지경.. 아 사양이 나쁜 것도 아닌데 왜이러지?
어쨌든 같은 버전인데도 또 안된다.. 에러를 잘 살펴보니 버전이 다르다고 한다. Oracle Universal Installer을 실행해서 “설치된 제품” 을 비교해 보니 실서버는 언제 또 업데이트를 해서 Oracle Database 10g Release 2 Patch Set 3 10.2.0.4.0 이더라.(아 무슨 버전은 또 이리 긴 것인가.) 그래서 또 엄청나게 써칭을 해서 찾았다. (구글에서 p6810189_10204_Win32.zip 를 검색하자. 아니면 http://support.oracle.com 에서 찾을 수 있다. 단 여긴 정품 유저만 가능하다. 🙂
그렇게 버전을 맞췄는데도 안된다. 무엇이 문제일까? 기존 테스트 서버에서 받아 놓은 DBF파일을 그대로, 아니 아에 c:\oraclexe폴더(오라클 XE 기본 폴더)를 통째로 집어 넣어도 안된다.
결국 .dmp 파일 이것만이 정답일 것 같다.. 그리고 인터넷을 뒤져서 해결 방법을 알아냈다.
1. 우선 토드를 통하거나 도스에서 exp80 system/1234 file=myexp.dmp 이런 식으로 dmp파일을 생성.
2. dmp파일을 테스트 서버에 두고 imp userid=system/1231 fromuser=백업받은계정(실서버의) touser=백업받을 계정(테스트 서버의) file=backup.dmp
이런 식으로 하면 복원이 완료된다.
다만 테스트 서버에 유저 하나가 필요한데, 이는 보통 실서버와 똑같은 ID/PW로 생성해 주는 것이 좋다.
– SQL PLUS로 접속하거나 XE의 경우 “SQL 명령줄 실행” 을 통해 SQL에 접속한다.
SQL> create user newuser identified by mypassword
2 default tablespace users
3 temporary tablespace temp
4 quota 1000m on users;
이런식으로 복원받을 계정을 만든 다음
SQL> grant connect, resource to newuser;
이런식으로 계정에 권한을 부여한다.
SQL> conn newuser/mypassword
이렇게 해서 있으면 완료된 것이다.
그런데 복원 중간에 “ORA-01950 : 테이블스페이스 ‘USERS’에 대한 권한이 없습니다” 이런 메시지가 나오면
일단 sqlplus로 system 계정으로 로그인후
alter user [계정명] default tablespace users quota unlimited on users;
를 입력하면 해결된다.
다만 복원 중간에 에러가 난 것이라면 무언가 찜찜하므로 ORACLE XE를 지웠다 다시 깔고 복원하는 것을 추천한다.
이렇게 지금은 정리해서 내가 블로그에 적고 있지만 나는 이 과정때문에 무려 6일간을 끙끙댄 것 같다. 이래서 개념이 중요한 것 같다. 일전까지는 table space라는 것조차 몰랐고 오라클 버전별로 차이도 몰랐다. 단순히 ms-sql정도 수준이겠지라고 생각한 내가 잘못. 틈날 때마다 오라클 구조에 대해 연구해 봐야 할 필요성을 느꼈다. 무엇보다 자신이 사용하는 환경에서 백업 방법을 충분히 숙지하고 자동 백업 시스템을 구축, 그리고 빠른 복원이 가능하도록 하는 것이 최선인 것 같다..!!