슬레이브에서 mysqldump를 할 때 마스터의 mysql 바이너리 로그 위치를 작성하는 방법?

StackOverflow https://stackoverflow.com/questions/1522976

문제

나는 현재 데이터베이스를 백업하기 위해 MySQL 슬레이브에서 mysqldump를 실행하고 있습니다. 이것은 데이터 자체를 백업하는 데 잘 작동했지만 보충하려는 것은 mysqldump에서 생성 된 데이터에 해당하는 마스터의 이진 로그 위치입니다.

이렇게하면 마스터의 이진 로그 위치를 잡는 메인 데이터베이스에서 별도의 mysqldump를 수행하지 않고도 노예 (또는 새 노예를 설정)를 복원 할 수 있습니다. 우리는 MySQLDump에서 생성 한 데이터를 가져 와서 우리가 생성 한 이진 로그 정보와 결합하고 Voila를 재 동기화합니다.

지금까지 내 연구는이 목표를 달성 할 수 있다는 점에 매우 가까워졌지만 자동화 된 방법을 파악할 수는 없었습니다. 다음은 내가 밝혀진 "거의"입니다.

  • 기본 데이터베이스에서 MySQLDump를 실행중인 경우 MySQLDUMP와 함께 "-마스터 데이터"매개 변수를 사용하여 마스터의 이진 위치를 덤프 데이터와 함께 로그인 할 수 있습니다 (이진 로그를 생성하기 시작한 경우에도 작동한다고 가정합니다. 우리 노예이지만 우리가 성취하고자하는 것에 대한 과잉처럼 보입니다)
  • 우리 가이 작업을 수행하지 않은 방식으로이 작업을 수행하고 싶다면 슬레이브의 데이터베이스에 로그인하여 "STOP SLAVE SQL_THREAD;"를 실행할 수 있습니다. 그 뒤에 "노예 상태 표시"; (http://dev.mysql.com/doc/refman/55.0/en/mysqldump.html). 그러나 우리가 미리 우리가 Salve에서 무언가를 뒷받침하고 싶다는 것을 알지 않는 한 이것은 우리에게 좋은 일을하지 않을 것입니다.
  • 날려서 $ 500/연간이 있었다면 InnoDB 핫 백업 플러그인을 사용하고 Main DB에서 MySQLDump를 실행할 수 있습니다. 그러나 우리는 그 돈이없고, 어쨌든 우리의 메인 DB에 추가 I/O를 추가하고 싶지 않습니다.

이것은 누군가가 전에 알아 냈을 정도로 일반적인 것 같습니다. 누군가가 스택 오버플로를 사용하고 있기를 바랍니다.

도움이 되었습니까?

해결책

다음 쉘 스크립트는 CRON 또는 주기형으로 실행되며 필요에 따라 변수를 대체합니다 (기본값은 freeBSD로 작성) :

# MySQL executable location
mysql=/usr/local/bin/mysql

# MySQLDump location
mysqldump=/usr/local/bin/mysqldump

# MySQL Username and password
userpassword=" --user=<username> --password=<password>"

# MySQL dump options
dumpoptions=" --quick --add-drop-table --add-locks --extended-insert"

# Databases
databases="db1 db2 db3"

# Backup Directory
backupdir=/usr/backups

# Flush and Lock
mysql $userpassword -e 'STOP SLAVE SQL_THREAD;'

set `date +'%Y %m %d'`

# Binary Log Positions
masterlogfile=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep '[^_]Master_Log_File'`
masterlogpos=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep 'Read_Master_Log_Pos'`

# Write Binlog Info
echo $masterlogfile >> ${backupdir}/info-$1-$2-$3.txt
echo $masterlogpos >> ${backupdir}/info-$1-$2-$3.txt

# Dump all of our databases
echo "Dumping MySQL Databases"
for database in $databases
do
$mysqldump $userpassword $dumpoptions $database | gzip - > ${backupdir}/${database}-$1-$2-$3.sql.gz
done

# Unlock
$mysql $userpassword -e 'START SLAVE'

echo "Dump Complete!"

exit 0

다른 팁

Ross의 대본은 올바른 길에 있지만 @joatis는 마스터 로그 위치를 확인하기 전에 노예를 멈추라고 말할 때 옳습니다. 그 이유는 읽기 잠금 장치가 Read_Master_Log_Pos 그것은 다시 검색됩니다 SHOW SLAVE STATUS.

이것이 사실이라는 것을 알기 위해, 당신의 슬레이브에서 mysql에 로그인하고 실행하십시오.

FLUSH TABLES WITH READ LOCK

SHOW SLAVE STATUS \G

참고 Read_Master_Log_Pos

몇 초 동안 기다렸다가 다시 한 번 실행하십시오.

SHOW SLAVE STATUS \G

당신은 그것을 알아야합니다 Read_Master_Log_Pos 변경되었습니다.

상태를 확인한 후 백업이 빠르게 시작되므로 스크립트로 기록 된 로그 위치가 정확할 수 있습니다. 그러나 여기에서 절차를 따르는 대신 선호합니다.http://dev.mysql.com/doc/refman/en/replication-solutions-backups-mysqldump.html

그리고 달리기 STOP SLAVE SQL_THREAD; 대신에 FLUSH TABLES WITH READ LOCK 백업 기간 동안.

완료되면 다시 복제를 시작하십시오 START SLAVE

또한 증분 백업을 위해 Bin-Logs를 백업하거나 추가 안전 조치로 백업하려면 위의 $ dumpoptions 변수에 플러시 로그를 추가하는 것이 유용합니다.

당신은 두 번째 옵션이 올바른 트랙처럼 보입니다.

MySQLDump를 사용하여 차등 백업을 수행하는 방법을 알아 내야했습니다. 나는 백업 할 데이터베이스를 선택한 다음 mysqldump를 실행하는 스크립트를 작성하게되었습니다. 언급 된 단계를 따르는 스크립트를 만들 수 없습니까? http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_master-data 그리고 Cron 직업에서 그것을 부르나요?

  1. MySQL에 연결하고 "노예 중지"
  2. 쇼 노예 상태를 실행하십시오
  3. 변수의 File_name, file_pos를 저장하십시오
  4. 슬레이브를 덤프하고 다시 시작하십시오.

단지 생각이지만 "change mas

마스터에서 계속할 위치로 read_master_log_pos를 사용하면 누락 된 데이터로 끝날 수 있습니다.

read_mas

여기서 문제는 슬레이브 SQL 스레드를 중지하고 read_mas

이로 인해 read_mas

슬레이브에서 사용하기에 올바른 값은 exec_mas

올바른 사용법 위의 Ross의 스크립트를 사용하는 것은 다음과 같습니다.

# MySQL executable location
mysql=/usr/bin/mysql

# MySQLDump executable location
mysqldump=/usr/bin/mysqldump

# MySQL Username and password
userpassword=" --user=<username> --password=<password>"

# MySQL dump options
dumpoptions=" --quick --add-drop-table --add-locks --extended-insert"

# Databases to dump
databases="db1 db2 db3"

# Backup Directory
# You need to create this dir
backupdir=~/mysqldump


# Stop slave sql thread

echo -n "Stopping slave SQL_THREAD... "
mysql $userpassword -e 'STOP SLAVE SQL_THREAD;'
echo "Done."

set `date +'%Y %m %d'`

# Get Binary Log Positions

echo "Logging master status..."
masterlogfile=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep '[^_]Master_Log_File'`
masterlogpos=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep 'Exec_Master_Log_Pos'`

# Write log Info

echo $masterlogfile
echo $masterlogpos
echo $masterlogfile >> ${backupdir}/$1-$2-$3_info.txt
echo $masterlogpos >> ${backupdir}/$1-$2-$3_info.txt

# Dump the databases

echo "Dumping MySQL Databases..."
for database in $databases
do
echo -n "$database... "
$mysqldump $userpassword $dumpoptions $database | gzip - > ${backupdir}/$1-$2-$3_${database}.sql.gz
echo "Done."
done

# Start slave again

echo -n "Starting slave... "
$mysql $userpassword -e 'START SLAVE'
echo "Done."

echo "All complete!"

exit 0

MysqlDump (5.6)에는 노드에서 실행될 때 노드가 슬레이브라는 마스터의 이진 로그 코드를 기록하는 옵션-덤프 슬레이브가있는 것 같습니다. 그러한 덤프의 의도는 정확히 당신이 묘사하는 것입니다.

(늦었 어, 알아)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top