왠지 포스팅이 길어질 것 같아서 제목에 번호를 먼저 매겨버렸다.
이기종 DB간에 Migration이 쉽지 않다는 것은 숱하게 들었던 얘기이다. 그래서 되도록이면 안하고 싶었지만... 그러나 이번에 기존에 사용중이던 Cloud 서버를 정리하고 vm자체를 통채로 사내 Server로 옮겨오는 대공사를 마친 후 결과적으로 온프레미스 방식으로 운영방식을 전환하게 되면서, 내부사정으로 인해 데이터베이스 또한 File 기반으로 교체하는 것으로 결정이 내려졌다.
그래서 비교적 가벼운 SQLite로의 Migration을 시도하게 되었고, 그 과정을 여기에 정리해보려 한다.
그 전에 가장 먼저 고려해야할 사항이 있었다.
SQLite는 Stored Procedure를 지원하는가?
아무리 구글링 해봐도 답은 No였다. 정식으로 지원하지는 않는 것 같고, 플러그인처럼 여러 지식인들께서 머리를 맞대고 고민한 흔적이 보이는..뭔가 어려워보이는 글들이 좀 있었다. T-SQL로 작성된 stored procedure를 c코드로 변환해주는 프로그램도 있었는데, 여러가지 방법들 중에 눈에 띄는게 하나 있었다. "Fake table을 사용하세요!"
내용인 즉슨 After insert trigger를 활용해서 마치 하나의 procedure를 수행하는 것처럼 단위프로세스를 fire하라는 것. 일리는 있다. 그런데 내가 쓰는 그 많은 procedure들을 모두 trigger형식으로 옮길 수 있을까?
DB schema 자체를 SQLite로 이전하는 것은 그렇게 어렵지 않아보인다.(이것마저도 생각은 그러한데. 일단 부딪혀 봐야 안다. 100% 스무스하게 흘러갈것이라 확신할수는 없다. 그러다 뒷통수를 자주맞아서..) 관건은 procedure이다. 그 후 정상적으로 서비스가 도는지 한 Cycle은 돌아봐야 할 것이고, 하루이틀정도 시험 운영 기간이 필요할것이다.
그럼 먼저 DUMP를 활용해서 Tabe 이전 작업을 해보자.
작업에 있어서는 관련 Process를 매우 잘 정리해주신 Manuel van Rijn Blog 포스팅을 참고했다. 감사합니다!
pg_dump를 활용하면 dump.sql을 생성할 수 있다. 약간.. 포장이사 불러서 이삿짐 싸는 느낌이랄까...ㅎ 방법은 꽤 간단하다. pg_dump.exe는 Program Files > PostgreSQL > version > bin 폴더 내에 있다. command에서 순서대로 타이핑 해주면 된다.
pg_dump --data-only --inserts YOUR_DB_NAME > dump.sql
pg_dump에는 여러가지 옵션이 있다. 데이터 없이 스키마만 이전할 수도 있다. 그러나 이번 step에서는 schema는 포함하지 않고 데이터만 가지고 간다. schema 체계가 두 DB간에 차이가 있기 때문에 Data only 옵션으로 진행하는것이 작업 복잡도가 훨씬 덜하다.
그리고나면 export한 dump.sql을 소스코드편집기로 열어서 SQLite과 PostgreSQL 두 DB간에 SQL언어적 차이에 대한 요소를 조금씩만 손봐주면 된다. 그렇게 많지 않다. 그렇지만 꼼꼼히 작업해야한다. 방심했다가는 어디에서 잘못된지 모르고 한세월 보낼수도 있어... 여하튼 이정도만 수정해주면 된다.
1. SET으로 시작하는 라인을 제거합시다.
2. SELECT pg_catalog.setval 로 시작하는 라인을 제거합시다.
3. 전반적으로 true, false 단어를 각각 t, f로 변경해줍시다.
4. dump.sql을 BEGIN; END; 로 감싸줍시다.
왜냐면 이러한 이유들 때문이다.
1. SET으로 시작하는 구문들을 살펴보면 해당 setting은 SQLite에서는 사용하지 않는 구문이다. 그러므로 제거.
2. 해당 query를 보면 'id값 자동으로 증가시키기'와 같은 auto incrementing sequence를 설정하는 부분이다. 그러나 SQLite이 이 query를 만나면 이 낯선이는 뭐지?하면서 매우 낯을 가리니 여기도 제거.
3. SQLite에서는 true는 t, false는 f로 표기한다. 그들의 언어로 바꿔주자.
4. SQLite에서는 line하나하나를 transaction으로 수행한다고 하니, 쓸데없는 시간낭비를 예방하기 위해 하나의 Transaction으로 인식시켜주자.
..일단 참고하고 있던 블로그의 글이 좀 오래전 글이기도 하고, 지금은 PostgreSQL이나 SQLite의 정책이나 언어면에서 업데이트된 부분도 있을테니 차근차근 수행해보면서 발생하는 Issue나 불필요한 step은 재정리가 필요할 것 같다. 관련해서 경과 상황은 다음 포스팅에 기록하는걸로..
'기술공부 > DB' 카테고리의 다른 글
[PostgreSQL] Insert 쿼리에서 Serial 컬럼 값 삽입하기 (0) | 2023.08.22 |
---|---|
[PostgreSQL] serial column의 start number를 재설정하는 방법 (0) | 2023.02.27 |
[PostgreSQL] 1. DB 최적화 - Index에 대해 조금 더 알아보자.(1) (0) | 2022.03.21 |