DataBase/Maria DB

[DB] MariaDB 백업 스케줄 설정과 백업파일 AWS S3 저장소 업로드

Trillion Binary 2023. 2. 8. 08:38
SMALL
기업이나 개발자들은 정기적인 DB 백업의 중요성을 잘 알 것입니다.
디스크가 고장나거나 DB 서버에 오류가 발생할 경우 백업을 미리 해 두었는지 여부에 따라
몇 년 치의 업무 데이터가 손실되느냐 아니면 빠른 시간 내에 정상적으로 복구하느냐를 결정하게 됩니다.
본 글에서는 MariaDB의 정기적인 백업을 실행하고 결과 파일을 AWS S3 저장소로 자동 업로드하는 방법을 알아볼 것입니다.

Windows 환경에서의 MariaDB 백업


1. 정기적 백업을 실행할 batch 파일을 작성합니다.

set CUR_DATE=%date:~0,4%-%date:~5,2%-%date:~8,2%
echo %CUR_DATE% "D:\mariadb\bin\mysqldump" --single-transaction --routines --databases -u아이디 -p비밀번호 백업할DB명 > D:\dbbackup\backup-%CUR_DATE%.sql
 
 
메모장을 실행하여 해당 코드를 자신의 환경설정에 맞게 작성한 후 저장합니다.
(주의 : 메모장 저장시 문자열 인코딩을 반드시 'ANSI'로 설정 후 저장해야 합니다.)
그 후 확장자를 .txt 에서 .bat으로 변경합니다.

2. batch 파일을 실행하여 결과가 잘 나오나 확인합니다.

batch 파일을 더블클릭 하거나, 관리자 권한 cmd에서 bat을 실행하여 결과가 잘 출력되는지 확인합니다.
 

3. batch 파일을 실행하는 C# 코드를 실행합니다.

using System.Diagnostics;
ProcessStartInfo batchFile = new ProcessStartInfo();
batchFile.FileName = "cmd.exe";
batchFile.Arguments = $"/C {Environment.CurrentDirectory}/temp.bat";
batchFile.RedirectStandardOutput = true;
batchFile.UseShellExecute = false;
Process proc = Process.Start(batchFile);
while (true)
{
     string txt = proc.StandardOutput.ReadLine(); // blocking 함수
     if (txt == null) // 프로세스가 종료한 경우 null 반환
     {
          break;
     }
}
ProcessStartInfo batchFile 변수 선언을 통해 cmd 콘솔을 실행한 후 프로젝트 경로 내에 셋팅한 batch 파일을 실행합니다.

4. batch 파일로 생성된 SQL 백업 파일을 업로드하는 C# 함수를 선언하고 실행합니다.

using System.IO;
using Amazon.S3;
 
public static void UploadBackupFile()
{
     try
     {
          //디렉토리 검사
          if (!Directory.Exists($"{Environment.CurrentDirectory}\\backup"))
          {
               Directory.CreateDirectory($"{Environment.CurrentDirectory}\\backup");
          }
          string fileName = $"backup-{DateTime.Now.ToString("yyyy-MM-dd")}.sql";
          string filePath = $"{Environment.CurrentDirectory}\\backup/{fileName}";
          string endPoint = "AWS 저장소 주소";
​          AmazonS3Config config = new AmazonS3Config { ServiceURL = endPoint };
          using AmazonS3Client s3Client = new AmazonS3Client("AWS액세스 키", "AWS액세스 시크릿 키", config);
          using TransferUtility fileTransferUtility = new TransferUtility(s3Client);
          using FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read);
          using MemoryStream ms = new MemoryStream();
          fs.CopyTo(ms);
          TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
          {
               BucketName = $"버킷 저장소 경로",
               Key = fileName,
               InputStream = ms
           };
          fileTransferUtility.Upload(request);
     }
    catch
    {
         throw;
     }
}

​5.  해당 코드를 토대로 구성한 스케줄러 서비스를 윈도우 작업 스케줄러 프로그램에 등록합니다.

리눅스 환경에서의 MariaDB 백업


 
 

1. 우선 리눅스 서버나 DB 서버에 root로 접속합니다.

DB 서버가 설치된 로컬 서버에도 백업이 가능하지만 원격 서버에서도 백업이 가능하니
백업 데이터를 저장할 서버에 접속합니다.

2. bash 스크립트 파일을 생성합니다.

vi /usr/local/bin/dbbackup.sh 
명령어로 vi 에디터를 실행합니다.

3. 다음 DB 백업하는 스크립트 코드를 입력합니다.

#!/bin/sh
now-$(date +"%Y%m%d")
find /home/dbbackup/ -mtime +60 -name '*.sql' -exec rm {} \;
mysqldump -uUSER_ID -pPASSWORD -h SERVER_ADDRESS DB_NAME > /home/dbbackup/db_$now.sql
 
find 줄은 저장된 데이터베이스 백업 파일 중 60일이 지난 것들은 삭제하는 옵션입니다.

4. 저장 후 해당 파일의 권한을 실행 가능하도록 명령어를 입력합니다.

chmod 755 /usr/local/bin/dbbackup.sh

5. crontab을 이용하여 스크립트 파일을 주기적으로 실행하는 명령어를 입력합니다.

crontab -e
00 01 * * * /usr/bin/rdate -s time.bora.net && hwclock -w
30 8 * * 5 su -root -'/usr/local/bin/backup.sh'
 
첫번째 00 01 라인은 서버의 시간은 항상 표준시에 맞추어 주는 기능을 합니다.
매일 새벽 1시에 시간을 맞추어 주게끔 처리합니다.
두번째 30 8 라인은 매주 금요일 오전 8시 30분에 /usr/local/bin/backup.sh 스크립트를 실행시켜 DB 백업을 진행해줍니다.

6. AWS CLI 설치 및 버전확인을 합니다.

​AWS CLI 리눅스 설치 가이드

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

aws --version
 

7. AWS CLI 환경설정을 해줍니다.

aws configure 
AWS Access Key ID [None] : 자신의 Accecss Key AWS 
Secret Access Key [None] : 자신의 Secret Key 
Default region name [None] : 자신의 region 
Default output format [None] : json (text도 가능)

 

해당 설정 완료 후 파일 형태로 아래 경로에 생성이 됩니다.
~/.aws/config
~/.aws/credentials

 

8. CLI 명령어로 파일을 업로드 해주는 스크립트를 작성합니다.

vi /usr/local/bin/dbupload.sh
#!/bin/sh
 
aws s3 sync ./home/dbbackup s3://S3_DOMAIN.com/backups
echo "DB Backup is processing."
 

9. 백업파일 업로드 스크립트를 실행하는 crontab 설정을 해줍니다.

crontab -e
 
30 0 * * * '/usr/local/bin/dbupload.sh' >> '/usr/local/bin/log/crontablogs.log'
 

10. crontab 상태 확인

crontab -l
 
  • 본 실습의 특징 및 장단점

 

  • ​mysqldump 백업은 간편하고 가장 기본적인 방법이지만 백업과 복원에 오랜 시간이 소요됩니다.
    ex) 만약 mysqldump로 500GB 가량의 데이터를 테이블 단위로 백업하는데는
    약 2시간 30분 소요되었으며 백업 용량은 약 377GB 정도로 저장됩니다.
     
     
  • 본 실습은 임시 DB와 작은 테이블로 백업하여 용량이 약 10KB밖에 되지 않아 유의미한 트래픽이 있지는 않았지만 만약 실제의 고용량 클라이언트 환경이라면 백업 서비스와 업로드 서비스를 따로 나누어서 시간적 차이를 두고 스케쥴러 서비스를 등록하는 것이 나아보였습니다.
BIG