sql backup

yoon__0_0·2024년 5월 21일
0

이어드림 수업

목록 보기
40/103

backup 종류

1) Logical Backup

  • SQL 문으로 백업
  • sql file로 백업하는 것
  • 느린 속도의 백업과 복원
  • 디스크 용량을 적게 사용
  • 작업시 시스템 자원을 많이 사용
  • 문제 발생에 대한 파악이 쉬움
  • 서버 OS 호환이 잘됨
  • 데이터의 양이 적을 때 사용

2) Physical Backup

  • 파일 자체를 백업
  • 빠른 속도의 백업과 복원
  • 디스크 용량을 많이 사용함
  • 작업시 시스템 자원을 적게 사용
  • 문제 발생에 대한 파악과 검토가 어려움
  • 서버 OS 호환이 잘 안될 수 있음
  • 데이터 양이 많을 때 사용

3) Hot backup

  • 데이터 베이스를 중지하지 않은 상태로 데이터를 백업
  • 백업하는 동안 서비스를 실행
  • 이때 데이터가 변경되어 완전한 백업이 안될 수 있음

4) cold backup

  • 데이터 베이스를 중지한 상태로 데이터 백업
  • 안정적으로 백업이 가능
  • 백업하는 동안 서비스 중단 되어야 함.

crontab

  • crontab 명령어
crontab -e
  • crontba 시간 설정방법
    • 분 시 일 월 요일

      예시
      매시 10분에 실행 : 10 * * * date >> date.txt
      매 2분 간격으로 실행 :
      /2 * * * date >> date.txt
      매시 10분과 20분에 실행 : 10,20
      * * date >> date.txt
      매일 5시 10분과 20분에 실행 : 10,20 5
      * date >> date.txt
      일요일 5시 10분, 20분 실행 : 10,20 5
      * 7 date >> date.txt

실습

  1. 매분 마다 date찍어주기
crontab -e

* * * * * date >> date.txt
1-1. date 시간 변경 (seoul로) 
sudo timedatectl set-timezone Asia/Seoul
  1. python code 를 자동화로 실행
  • python file 만들기
# time.py
import datetime
today = datetime.datetime.now()
print(str(today))
  • python code를 자동화
crontab -e

# python 경로를 붙여주는 것이 꼭 필요함 
* * * * * ~/.pyenv/versions/3.8.5/bin/python3 time.py >> time.txt

에러메시지 확인

  • 로그 확인
grep CRON /var/log/syslog
  • 에러 메시지 확인
# 방법 1
$ sudo apt-get install -y postfix
$ cat /var/mail/ubuntu


# 방법 2
$ sudo apt install -y mailutils
$ mail

sql backup query , 자동화

  • 백업 명령어
mysqldump -u {계정} -p{비번} {db} > {backup파일이름}.sql

# 예시
mysqldump -u root -ppassword test > test.sql

실습

  • hot logical backup
# 날짜 출력
date +%Y%m%d_%H%M --date=today

  • backup.sh 생성
# bash shell 지정
#!bin/bash

# 실행결과가 BD라는 곳에 저장됨
BD=`date +%Y%m%d_%H%M --date=today`

# 파일이름설정(날짜, 시간으로 지정)
FILE=${BD}.sql

# 이동
cd data

# 백업
mysqldump -u root -ppassword test > $FILE
  • sh file 실행해보기
/bin/bash backup.sh 
  • corntab 안에서
* * * * * /bin/bash backup.sh
  • backup파일은 두번째 서버에 옮겨주는게 좋음 (scp 이용)

replication

  • 동기화를 위해 마스터, 슬래이브 생성

  • 마스터는 insert 담당
  • 슬래이브는 read 담당
  • 과부화를 막음

실습

  1. EC2 인스턴스 2개 만들어주기
  2. mysql 설정 (2개다 동일하게 설정)
$ sudo apt install mysql-server
$ sudo mysql
---
mysql >alter user 'root'@'localhost' identified with mysql_native_password by 'password';
---

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
---
bind-address = 0.0.0.0 으로 변경
---

$ sudo mysql -u root -ppassword
---
mysql> create user 'root'@'%' identified by 'password';
mysql> grant all privileges on *.* to 'root'@'%';
---

$ sudo systemctl restart mysql
  1. 마스터 서버 설정
  • 계정을 만들어서 권한을 설정해줌
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
--
#두개 주석 제거  (전체 db 동기화)
server-id = 1
log_bin = ~~
# 특정 db만 설정하고 싶으면 binlog_do_db 요기랑 그아래 부분 설정해주기
--

sudo systemctl restart mysql
sudo systemctl status mysql

$ sudo mysql -u root -ppassword
---
#master server 상태 출력
mysql> show master status\g;
#slave가 될 ip와 연결
mysql> create user '계정이름'@'slave_ip' identified by 'password';
# slave 권한 추가
mysql> grant replication slave on *.* to '계정이름'@'slave_ip';
# 상태보기 -> 전과는 position 변경
mysql> show master status\g;
---

  1. 슬레이브 설정
  • 마스터 계정을 가지고 접속하는 것
$sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
--
#두개 주석 제거 그리고 id 2번으로 변경
server-id = 2
log_bin = ~~
--

$sudo systemctl restart mysql
$sudo systemctl status mysql

$ sudo mysql -u root -ppassword
---
mysql> change replication source to 
source_host ='master_ip', 
source_log_file='master file', 
source_log_pos=master position, 
source_ssl=1;
# master file 과 postion은 master server에서 show master status\g; 했을때 나오는 것

# 실행시 Replica_IO_Running | Replica_SQL_Running 두 부분이 yes 가 되어있으면 완료! 
# 접속 시작 
start replica user='repl' password="password";
show replica status;
---
  1. 동기화 실행
  • master에서 실습
create database test;
create table user(
 	name varchar(20));
  • slave
use test;
desc user;

=> master에서 생성했는데 slave에서 보임
=> 단, slave는 보통 read만 가능
=> 만약 서로 동기화를 시켜주고 싶으면 반대로 또 연결을 시도해주면 됨.

profile
신윤재입니다

0개의 댓글