프로젝트가 운영단계로 접어들게 되면, 안정성과 신뢰성이 중요하게 작용한다. 장애, 재해 등 발생했을 때 데이터 복구 작업이 필요한데 준비되어 있지 않아, 데이터가 유실되거나, 초기화되는 경우 신뢰성은 추락하게 된다.


대비하려면 반드시 백업/복구에 대해 준비를 해야 한다. MariaDB 백업/복구는 mysqldump, xtrabackup 2가지 방법이 있다.


mysqldump는 설치 시 기본적으로 제공되는데, SQL 기반으로 백업되기 때문에 대응이 xtrabackup 보다는 편리하다.

운영 초기에는 별문제 없이 사용할 수 있는데, 데이터양이 많아졌을 때 한계점에 부딪치게 된다. 

모든 데이터를 메모리에 올려놓고 SQL로 변환하는 만큼 서버에 부담이 많이 가고, 백업도 많은 시간이 소요된다. 마찬가지로 복구도 모든 SQL이 실행되어야 하므로 같은 문제점을 가지고 있다.


xtrabackup은 Mysql, MariaDB 모든 버전을 지원하는 백업 솔루션이다. facebook은 엄청난 양의 데이터를 생성하는데 백업은 xtrabackup를 사용하고 있다.


“Facebook users create a vast amount of data every day. To make sure that data is stored reliably, we back up our databases daily. Facebook was an early adopter of incremental backup in Percona XtraBackup.”


대표적인 기능은 빠르고 안정적으로 백업/복구가 가능하고, 백업 중 중단없이 트랜젝션 처리가 가능하다. 모든 데이터를 가공하는 게 아닌, data 파일을 복제하는 것을 기반으로 하기 때문이다. 추가로 증분 백업을 지원하기 때문에 데이터양이 많아도 시점별로 관리가 가능하다.


사용하려면 별도로 설치해야 한다. linux에서만 지원하기 때문에, windows에서는 사용할 수 없다.

설치 가이드: https://www.percona.com/doc/percona-xtrabackup/LATEST/installation.html


설치가 완료되었다면 innobackupex 명령어를 통해서 전체 백업을 진행해보자.


백업 하기 전 주의사항이 있는데 엔진이 InnoDB인 경우 백업을 완료하는 시점에서 현재 스키마를 저장하기 위해 일시적으로 'Global Lock'을 걸게 되는데, 그 시간 동안 write 작업은 대기 상태가 되고, Lock이 해제되는 순간 진행된다. 데이터 파일이 크다면 길어질 수 있기 때문에 "--no-lock" 옵션을 사용하게 되면 이슈는 사라진다. 처리 시간은 DISK I/O의 영향을 많이 받으며, 가능하다면 별도의 디스크에 백업하는 것을 권장한다. 


전체 백업 시에는 MariaDB 서버의 설정 파일을 "--default-file"에 명시해야 한다. 서버 메모리가 여유가 된다면 "--use-memory"를 늘려서 처리하면 빠르게 진행할 수 있다. 백업이 완료된 후 "/backups"로 이동하여 파일을 확인해보면 data 파일이 이동된 것을 확인할 수 있다.


innobackupex \
        --default-file=my.cnf \
        --backup \
        --host=${backup_host} \
        --port=${backup_port} \
        --user=${backup_user} \
        --password=${backup_password} \
        --parallel=4 \
        --no-lock \
        --use-memory=4gb \
        /backups


데이터 복구를 진행하기 전 반드시 MariaDB 서버를 종료시키고, data 파일은 비워줘야 한다. 복구 시 파일 덮어쓰기는 불가능하다.

"/backups"를 data 파일 경로에 복사하여 복구 하므로 MariaDB 접속은 하지 않아도 된다.


복구 하기 전 "--apply-log" 옵션을 넣어서 준비상태로 만들어야 한다.


innobackupex \
        --use-memory=4gb \
        --apply-log \
/backups


완료되면 "--copy-back" 옵션을 넣고 복구를 진행한다.


innobackupex \
        --default-file=my.cnf \
        --parallel=4 \
        --copy-back \
        --use-memory=4gb \
        /backups


data 경로의 권한을 mysql로 변경해야 시작 시 권한 문제가 발생하지 않는다.


chown -R mysql. /mariadb/data


MariaDB를 시작하면 복구된 데이터를 확인할 수 있다.


만약 시간이 허락한다면, xtrabackup를 도입해서 장기적으로 장애 및 재해에 미리 대비하는 편이 안전하고 신뢰성을 높이는 길이라고 생각된다.


참고 사이트

  • https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
  • [리얼타임] MariaDB 실전 활용 노하우 (6.1. xtrabackup 참고)


database 에 접속하여 아래 명령어를 입력 하면 접속 정보가 나열 된다.


show processlist;


Application 개발 당시 DB 연동 문제로 골머리가 썩을 때에 사용하면 유용 하다.


Tibreo 공식 가이드를 참고 하면, 데이터 타입 중 LONG 은 접근 시 항상 순차적으로만 접근 할 수 있으며, 임의의 위치에 대해 연산은 할 수 없다고 한다.


즉 검색을 할 수 없다. 필요하다면 다른 데이터 타입을 사용해야 하는대 대용량 객체를 저장하기 위한 CLOB 를 사용하면 된다.


CLOB 타입은 LONG 타입을 확장한 데이터 타입이다.


  • 데이터를 최대 4GB까지 저장할 수 있다.
  • 테이블 내에서 하나 이상의 컬럼에 선언할 수 있다.
  • 데이터에 접근할 때, LONG 타입과 달리 임의의 위치에서 접근할 수 있다.
  • CLOB 타입의 컬럼 값은 같은 테이블의 다른 타입으로 선언된 컬럼 값과 동일한 디스크 블록에 저장되 지 않는다.


디스크 블록 내의 로우는 별도의 디스크 블록에 저장된 CLOB 타입의 포인터만 저장하고 있다.


Table 을 Drop 하고 CLOB 타입을 사용하여 새로 생성 하자.


요즘 IT 소프트웨어 개발의 화두는 오픈 소스이다. 개발 시 어지간한 기능은 오픈 소스 라이브러리로 구현되어 있고, 개인이 수정해서 배포하는 경우도 있다. Java Web Application 개발 시 많이 사용하는 SpringFramework 도 대표적인 오픈소스 프로젝트 중에 하나 이다.


오픈 소스는 주로 GitHub 를 사용하여 많이 공유 하고 있다.


“Database 에서 사용하는 Schema 는 공유 할수 없을 까?” Schema 도 마찬가지로 개발마다 다르게 설계 해야 하고, 작은 규모의 회사 에서는 개발자들이 통상 테이블 설계를 하고 있는 실정 이다. 설계에는 정답이 없는 만큼 대신 편리한 점도 있겠지만, 취약점도 있을 것이다.


가까운 지인에게 추천을 받은 사이트는 Schema 를 공유 하는 사이트 이다.


설계 할 때 다른 사람들의 생각도 참고 하면서 Schema 를 만든다면 훨씬 좋은 결과물이 나오지 않을까 하는 생각 이다.



가입(register) 시 Connect via Github 메뉴의 Connect 버튼을 이용하면, 연동도 가능 하다.



dbpatterns 의 장점은 Schema 생성 스크립트를 자동으로 만들어 준다. 지원 하는 DB 는 Mysql, Postgres, Oracle, SQLite 이다. 이정도만 해도 참고 가능한 Schema가 있다면 스크립트로 Schema를 생성하여 테스트 하는 정도는 간편하게 할 수 있다고 생각 한다.



종종 들리면서 참고하면 설계에 많은 도움이 되는 좋은 공간이다.


보통, 공지 글 이 존재하는 게시판 작성 시 실수 할 수 있다. 게시 글 중 Top 1~3 개를 가져올 것이다.


select * from board where rownum = 1 order by board_id desc


위와 같은 Query 는 rownum = 1 조건이 먼저 실행 되고 그 후 order by board_id desc 이 실행 되기 때문에, Top 1 게시 글을 받아 올 수 없다.


select * from (select * from board order by board_id desc) where rownum = 1


이렇게 하면 order by board_id desc 먼저 실행 한 후, rownum = 1 조건을 적용 하기 때문에 원하는 게시 글을 볼 수 있다.


Table 수정 이나, 데이터 이전이 필요 한 경우, 백업 을 사전에 해야 한다. 데이터가 잘못 됬을 경우 복구를 위해서 이다.


  • 전체 데이터 백업
select * into backupTable from targetTable

  • 부분 데이터 백업
select * into backupTable from (select * from targetTable where ...)


원하는 부분을 where 로 조건을 주면 해당 데이터만 백업이 된다.


투입된 프로젝트가 MS SQL 을 사용하여 범용적으로 사용하던 DBeaver(http://dbeaver.jkiss.org/) 에 추가하여 사용해 보았으나, 

기본적인 SQL 작성 이외에는 기능이 지원되지 않아, Microsoft SQL Server Management Studio 2012 를 설치 하였다.


다운로드: http://www.microsoft.com/ko-kr/download/details.aspx?id=29062


설치가 안되어 있다면 위 링크를 참조하여 KOR\x64\SQLManagementStudio_x64_KOR.exe(64bit 기준) 선택하여 설치 한다.


설치 완료 후 서버에 연결 하는 화면 이다.



서버 이름: Ip,Host,Port (ex: 000.000.000.000,1433 test.test.co.kr,1433)

인증: SQL Server 인증

로그인: ID

암호: Password


연결 속성 Tab 클릭, 연결할 데이터베이스: OOOO 


5가지 항목을 등록 했다면, 연결 하자 성공 한다면 개체 탐색기에 추가가 될 것이다.


서버이름 설정 할때 , 로 연결되는 부분을 몰라서 상당히 시간이 날아갔다.



Query 사용 시 Rownum 이 필요 할 때가 있다.


사용 방법.


select

  @row_number:=@row_number+1, data.*

from

  (select @row_number:=0) as rownum, data


임시 변수를 만들어 놓고, 매 회 추가 되는 방법을 사용 한다.


+ Recent posts