매일 22GB MySQL 데이터베이스 백업


28

지금은 mysqldump를 사용하여 백업을 수행 할 수 있습니다. 그러나 웹 서버를 중단해야하며 백업을 수행하는 데 약 5 분이 걸립니다. 웹 서버를 중단하지 않으면 영원히 걸리고 결코 끝나지 않으며 백업 중에 웹 사이트에 액세스 할 수 없게됩니다.

22GB 및 증가하는 데이터베이스를 백업하는 더 빠르고 더 나은 방법이 있습니까?

모든 테이블은 MyISAM입니다.


답변:


28

예.

두 번째 컴퓨터에 복제를 설정합니다. 백업이 필요한 경우 보조 시스템을 잠그고 mysqlhotcopy 또는 mysqldump를 수행 한 다음 잠금을 해제 할 수 있습니다. 마스터를 따라 잡기 때문에 마스터를 오프라인으로 전환 할 필요가 없습니다.

쓰기 I / O를 두 배로 늘리지 않아도되는 경우 동일한 머신에서이 작업을 수행 할 수도 있지만, 이상적으로는 실시간으로 두 번째 물리적 서버에 백업하고 필요할 때마다 스냅 샷 백업을 수행해야합니다. 프로덕션 서버를 방해하지 않습니다.

이론적으로 알려진 상태 및 binlog를 사용하여 데이터베이스를 복원 할 수도 있습니다. 한 번도 해본 적이 없으므로 먼저 조사해보십시오. 데이터베이스의 알려진 상태를 백업 한 다음 모든 새로운 binlog를 백업하고 복원해야 할 경우 다시 재생할 수 있습니다. binlog는 선형으로 작성되므로 새 binlog를 원격 컴퓨터로 재 동기화하는 것이 매우 빠릅니다.

편집 : 실제로 백업에 binlogs를 사용하는 것이 문서화 된 것처럼 보입니다.

이 질문은 매우 관련이 있습니다


예, 이것은 훌륭하게 작동하며 내 대답이 될 것입니다. 유일한 주요 단점은 복제가 매일 올바르게 작동하는지 확인해야 한다는 것입니다. 업무 시간 중에는 슬레이브 데이터베이스의 스냅 샷과 마스터의 야간 백업을 수행합니다.

5

OS가 Linux라고 가정 해 봅시다. LVM을 사용하지 않는 경우 사용해야합니다. 그렇다면 스냅 샷을 통해 백업하는 매우 간단한 방법입니다.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

이를 통해 슬레이브 서버를 추가하지 않고도 야간 백업을 수행 할 수 있습니다. 나는 고 가용성을 위해 슬레이브 서버를 사용하는 것을 매우 좋아하지만, 그 슬레이브를 만들 수있을 때까지 갇혀 있다고 생각하고 싶지 않습니다.


2

READ LOCK이있는 FLUSH 테이블은 생산 시스템에서 정기적으로 (또는 반 정기적으로) 수행하려는 것이 아닙니다. 마지막 수단이어야합니다.

복제 슬레이브를 두 개 이상 설정하십시오 (물론 읽기 잠금이있는 FLUSH 테이블이 필요합니다). 일단 설정되면 다른 하나는 예비 마스터로 동기화 된 상태에서 백업을 수행 할 수 있습니다.

또한 슬레이브 중 하나에 장애가 발생하면 스냅 샷을 사용하여 두 번째 (또는 세 번째) 슬레이브를 재 구축 할 수 있습니다. 모든 슬레이브가 고장 나면 읽기 잠금이있는 FLUSH TABLES로 돌아갑니다.

데이터가 동기화되어 있는지 정기적으로 확인하는 프로세스를 항상 기억하십시오. mk-table-checksum과 같은 것을 사용하십시오 (이 작업은 쉽지 않습니다. 자세한 내용은 Maatkit 설명서를 참조하십시오).

22GB가 상대적으로 작으므로이 작업을 수행하는 데 아무런 문제가 없습니다. 큰 데이터베이스를 사용하면 문제가 발생할 수 있습니다.


1

여기에 솔루션은 위에서 설명한 것처럼 두 가지입니다.

  1. 서버 복제를 오프라인으로 전환 할 수있는 슬레이브로 설정하십시오. 이를 수행하는 가장 좋은 방법은 mysqldump와 --master-data 매개 변수를 사용하여 데이터베이스를 덤프하는 것입니다.
  2. 슬레이브에 야간 백업을 설정하십시오. --master-data --flush-logs 및 --single-transaction 플래그를 사용하여 mysqldump를 사용하거나 mysql 서버를 중지하고 디스크에 데이터 파일을 복사 한 후 다시 시작할 수 있습니다 (복제 위치는 어디에서 선택됩니다) 중단되었습니다).
  3. 슬레이브에서 스크립트를 실행 (예 : 5, 10, 20 분)하여 mysql이 여전히 복제 중인지 확인하십시오. 나는 그것을 사용하기 위해 간단한 파이썬 스크립트작성 했다.

테이블에 InnoDB를 사용하는 경우 --single-transaction 플래그를 사용하여 테이블 잠금을 수행하지 않아도 마스터 에서조차 데이터베이스의 일관된 덤프를 얻을 수 있으므로 백업 없이도 백업을 수행 할 수 있습니다. 서버를 중단시킵니다. 그러나 위의 솔루션이 더 좋습니다.

또한 Linux에서 LVM을 사용하는 경우 파티션의 LVM 스냅 샷을 작성한 다음 백업 할 수 있습니다. LVM 스냅 샷은 원 자성이므로 '읽기 잠금이있는 테이블 플러시'를 수행 한 다음 스냅 샷을 만들고 잠금을 해제하면 일관된 스냅 샷이 생성됩니다.

덤프가 너무 오래 걸리는 I / O 경합이 우려되는 경우, 디스크 스 래싱을 피하기 위해 네트워크를 통해 세 번째 머신을 추가하고 mysqldump를 실행할 수 있습니다.


0

환경에 따라 스냅 샷은 일반적으로 훌륭한 방법입니다. 특히 어떤 이유로 마스터를 백업해야하는 경우. 마스터와 슬레이브 쌍을 실행하고 둘 다에서 스냅 샷 백업을 사용합니다.

  1. FLUSH TABLES WITH READ LOCK;
  2. 데이터베이스 및 로그 파일 시스템에서 스냅 샷을 가져옵니다.
  3. UNLOCK TABLES;
  4. 여유 시간에 데이터 파일을 스냅 샷에서 복사하십시오.

InnoDB 테이블을 사용 SET AUTOCOMMIT=0;하면 읽기 잠금 을 실행 하기 전에 실행 해야합니다.



-1

점진적 백업을 수행 할 수 있습니다. 매 시간마다 레코드의 1/24 번째 백업. 이 방법의 유일한 문제점은 하루 중 처음 몇 시간 동안 충돌이 발생하면 해당 시간에서 충돌 시간까지 손실되는 것입니다. 어느 쪽이든, 24 시간 미만의 기록을 잃어 버렸습니다 (나는 그것이 당신에게 얼마나 중요한지 모르겠습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.