mysqldump를 이용한 백업에 대한 통찰력
IMHO 백업을 수행하는 방법을 알고 있다면 백업을하는 것이 예술적인 형태가되었습니다.
당신은 옵션이 있습니다
옵션 1 : mysqldump 전체 mysql 인스턴스
이것은 가장 쉬운 방법입니다.
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
하나의 파일로 작성된 모든 것 : 테이블 구조, 인덱스, 트리거, 저장 프로 시저, 사용자, 암호화 된 비밀번호. 다른 mysqldump 옵션은 다른 스타일의 INSERT 명령, 로그 파일 및 이진 로그에서 로그 위치 및 좌표, 데이터베이스 생성 옵션, 부분 데이터 (--where 옵션) 등을 내보낼 수 있습니다.
옵션 2 : mysqldump 별도의 데이터베이스를 별도의 데이터 파일로 분리
데이터베이스 목록을 작성하여 시작하십시오 (이를 수행하는 두 가지 기술).
기술 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
기술 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
기술 1이 가장 빠른 방법입니다. 기술 2가 가장 안전하고 안전합니다. 때로는 사용자가 데이터베이스와 관련이없는 / var / lib / mysql (datadir)에 일반 용도로 폴더를 작성하기 때문에 기술 2가 더 좋습니다. information_schema는 폴더를 information_schema.schemata 테이블에 데이터베이스로 등록합니다. 기술 2는 mysql 데이터가없는 폴더를 우회합니다.
일단 데이터베이스 목록을 컴파일하면 원하는 경우 병렬로 목록을 반복하여 mysqldump 할 수 있습니다.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
한 번에 시작할 데이터베이스가 너무 많은 경우 한 번에 10 개씩 병렬 덤프하십시오.
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
옵션 3 : mysqldump를 별도의 데이터 파일로 분리
테이블 목록을 작성하여 시작
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
그런 다음 10 개의 그룹으로 모든 테이블을 덤프하십시오.
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
옵션 4 : 이미지 사용
위에서 언급 한 옵션과 깔끔한 스냅 샷 기술의 변형을 시도하십시오
예
- 각 테이블의 크기를 오름차순 또는 내림차순으로 테이블 목록을 정렬하십시오.
- 별도의 프로세스를 사용하여 mysqldump를 시작하기 전에 "읽기 잠금이있는 FLUSH 테이블; SELECT SLEEP (86400)"을 실행하십시오. mysqldumps가 완료된 후이 프로세스를 종료하십시오. 데이터베이스에 InnoDB와 MyISAM이 모두 포함 된 경우에 유용합니다
- mysqldump를 날짜가 지정된 폴더에 저장하고 이전 백업 폴더를 회전시킵니다.
- 전체 인스턴스 mysqldump를 독립형 서버에로드하십시오.
경고
옵션 1 만 모든 것을 제공합니다. 단점은 이런 방식으로 생성 된 mysqldump가 mysqldump가 생성 된 것과 동일한 majot release 버전의 mysql로만 다시로드 될 수 있다는 것입니다. 즉, MySQL 5.0 데이터베이스의 mysqldump는 5.1 또는 5.5로로드 할 수 없습니다. 이유 ? mysql 스키마는 주요 릴리스마다 완전히 다릅니다.
옵션 2와 3에는 사용자 이름과 비밀번호 저장이 포함되지 않습니다.
읽기 쉽고 이식 가능한 사용자를 위해 SQL Grants를 덤프하는 일반적인 방법은 다음과 같습니다.
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
옵션 3은 저장 프로 시저를 저장하지 않으므로 다음을 수행 할 수 있습니다.
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
주목해야 할 또 다른 사항은 InnoDB에 관한 것입니다. 큰 InnoDB 버퍼 풀이있는 경우 백업을 수행하기 전에 최대한 플러시하는 것이 좋습니다. 그렇지 않으면 MySQL은 남아있는 더티 페이지가 버퍼 풀에서 테이블을 플러시하는 데 시간을 보냅니다. 여기 내가 제안하는 것이 있습니다.
백업을 수행하기 약 1 시간 전에이 SQL 명령을 실행하십시오.
SET GLOBAL innodb_max_dirty_pages_pct = 0;
MySQL 5.5에서 기본 innodb_max_dirty_pages_pct는 75입니다. MySQL 5.1 이상에서 기본 innodb_max_dirty_pages_pct는 90입니다. innodb_max_dirty_pages_pct를 0으로 설정하면 더티 페이지를 디스크로 플러시하는 것이 빨라집니다. 이렇게하면 InnoDB 테이블에 대해 mysqldump를 수행하기 전에 InnoDB 데이터의 불완전한 2 단계 커밋을 정리하는 영향을 방지하거나 최소한 줄일 수 있습니다.
mysqldump의 최종 단어
대부분의 사람들은 다른 도구를 선호하기 때문에 mysqldump를 피하고 그 도구는 실제로 좋습니다.
이러한 도구에는 다음이 포함됩니다
- MAATKIT ( Percona의 병렬 덤프 / 복원 스크립트 [사용되지 않지만 훌륭함 ])
- XtraBackup (Percona의 TopNotch 스냅 샷 백업)
- CDP R1Soft ( 특정 스냅 샷을 작성하는 MySQL 모듈 옵션 )
- MySQL Enterprise Backup (이전의 InnoDB Hot Backups [상업용])
진정한 MySQL DBA의 정신이 있다면, mysqldump를 수용하고이를 달성 할 수있는 완전한 숙달을 가질 수 있습니다. 모든 백업이 MySQL DBA로서의 기술을 반영하기를 바랍니다 .