2014-03-13 53 views
2

我們設置了MySQL(5.1版本)與主從設置。 我們需要提出備份策略,我們將使用mysqldumpMySQL:備份策略 - 主或從?

我們打算使用flushlogs,master-date=2single-transaction選項。

我只想知道從哪個節點更好地運行Master或Slave備份?

回答

0

以下是我如何很久以前解決這個問題:

#!/usr/bin/ksh 
date=`date +%y%m%d` 
mysql -u root db_name -e "flush tables with read lock;" 
mysqldump -u root -pYrPass --add-drop-table --add-locks natl_inv > /path/to/backup/db_name$date 
mysql -u root -e "reset master;" 
mysql -u root db_name -e "unlock tables;" 
mysql -u root –pYrPass db_name < /path/to/backup/db_name$date 
mysql -u root -e "flush logs;" 

在從屬服務器(S):使用show從狀態命令來驗證您是在與主機同步。如果你想重新同步到主運行:

slave stop; 
reset slave; 
slave start; 

您可能需要停止MySQL中,刪除從斌的日誌文件,然後重新啓動並運行以上(這是對我們很重要,因爲我們有一個流氓應用程序鐓從站上的mysql配置)。

這個策略對我們的目的非常有益。確保並測試以確保它符合您的需求。

+2

這是如何回答大師與奴隸的問題? – greg0ire

+0

它在主設備上運行。我認爲「重置主」命令使其隱含。 – DTecMeister

+0

我知道你建議從備份中進行備份。問題是:爲什麼? – greg0ire

3

您應該在從設備上運行備份,以便主設備不會以任何方式中斷,並且主設備可以保持生產模式。

下面是一個腳本來備份mysql數據的奴隸,只保留最近7個備份

MYSQL_USER=root 
MYSQL_PASS=rootpass 
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" 
BACKUP_HOME=/some/path/to/your/backups 
BACKUP_TIME=`date +"%Y%m%d_%H%M%S"` 
BACKUP_FILE=${BACKUP_HOME}/MySQLData_${BACKUP_TIME}.sql 
BACKUP_GZIP=${BACKUP_FILE}.gz 

MYSQLDUMP_OPTIONS="--single--transaction --routines --triggers" 
# 
# Stop Replication 
# Dump the Data 
# Resume Replication 
# 
mysql ${MYSQL_CONN} -ANe"STOP SLAVE" 
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -A | gzip > ${BACKUP_GZIP} 
mysql ${MYSQL_CONN} -ANe"START SLAVE" 

# 
# Rotate Out Old Backups based on BACKUPS_TO_KEEP 
# 
cd ${BACKUP_HOME} 
FILES_TO_DELETE=/tmp/BackupFilesToDelete.txt 
BACKUPS_TO_KEEP=7 
BACKUPS_ON_HAND=`ls MySQLData_*.gz | wc -l` 
if [ ${BACKUPS_ON_HAND} -gt ${BACKUPS_TO_KEEP} ] 
then 
    ((DIFF = BACKUPS_ON_HAND - BACKUPS_TO_KEEP)) 
    ls -l MySQLData_*.gz | head -${DIFF} > ${FILES_TO_DELETE} 
    for FIL in `cat ${FILES_TO_DELETE}` ; do rm -f ${FIL} ; done 
fi 

不能使用--master-data=2因爲備份是從奴隸,而不是法師。如果您升級MySQL 5.5,則可以使用MYSQLDUMP_OPTIONS中的--dump-slave來捕獲主設備的二進制日誌和SHOW SLAVE STATUS\G的位置。您將在轉儲的第23行找到--dump-slave的輸出。

如果您希望繼續使用MySQL 5.1和你想記錄從主座標,使用此

MYSQL_USER=root 
MYSQL_PASS=rootpass 
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" 
BACKUP_HOME=/some/path/to/your/backups 
BACKUP_TIME=`date +"%Y%m%d_%H%M%S"` 
BACKUP_COOR=${BACKUP_HOME}/MySQLCoor_${BACKUP_TIME}.txt 
BACKUP_FILE=${BACKUP_HOME}/MySQLData_${BACKUP_TIME}.sql 
BACKUP_GZIP=${BACKUP_FILE}.gz 

MYSQLDUMP_OPTIONS="--single--transaction --routines --triggers" 
# 
# Stop Replication 
# Dump the Data 
# Capture Master Coordinates 
# Resume Replication 
# 
mysql ${MYSQL_CONN} -ANe"STOP SLAVE" 
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -A | gzip > ${BACKUP_GZIP} 
mysql ${MYSQL_CONN} -Ae"SHOW SLAVE STATUS\G" > /tmp/SSS.txt 
grep "Relay_Master_Log_File:" /tmp/SSS.txt > ${BACKUP_COOR} 
grep "Exec_Master_Log_Pos:" /tmp/SSS.txt >> ${BACKUP_COOR} 
mysql ${MYSQL_CONN} -ANe"START SLAVE" 
# 
# Rotate Out Old Backups based on BACKUPS_TO_KEEP 
# 
cd ${BACKUP_HOME} 
FILES_TO_DELETE=/tmp/BackupFilesToDelete.txt 
BACKUPS_TO_KEEP=7 
BACKUPS_ON_HAND=`ls MySQLData_*.gz | wc -l` 
if [ ${BACKUPS_ON_HAND} -gt ${BACKUPS_TO_KEEP} ] 
then 
    ((DIFF = BACKUPS_ON_HAND - BACKUPS_TO_KEEP)) 
    ls -l MySQLData_*.gz | head -${DIFF} > ${FILES_TO_DELETE} 
    for FIL in `cat ${FILES_TO_DELETE}` ; do rm -f ${FIL} ; done 
fi 

如果你想在主自轉二進制日誌,只是在主

配置此
[mysqld] 
expire-logs-days=7 

試試看!

+0

+1實際回答問題,並感謝您的備份腳本。 – greg0ire

+0

好的,但你應該在前面添加一些代碼,在你備份之前驗證slave是否實際同步。 有些人將從服務器設置爲您所選擇的服務器,並只將更新發送給主服務器。如果這是您的情況,除非您需要全天候更新功能,否則無需擔心主設備。 我只是從不同的角度回答了你的問題。 – DTecMeister

+0

也許,上面5.1的腳本的「SHOW SLAVE」部分應該是'mysql $ {MYSQL_CONN} -AE -e「SHOW SLAVE STATUS \ G」> /tmp/SSS.txt',對不對? –