MySQL 備份和恢復(fù)策略詳細(xì)教程

字號(hào):


    在數(shù)據(jù)庫(kù)表丟失或損壞的情況下,備份你的數(shù)據(jù)庫(kù)是很重要的。如果發(fā)生系統(tǒng)崩潰,你肯定想能夠?qū)⒛愕谋肀M可能丟失最少的數(shù)據(jù)恢復(fù)到崩潰發(fā)生時(shí)的狀態(tài)。本文主要對(duì)MyISAM表做備份恢復(fù)。
    備份策略一:直接拷貝數(shù)據(jù)庫(kù)文件(不推薦)
    備份策略二:使用mysqlhotcopy備份數(shù)據(jù)庫(kù)(完全備份,適合小型數(shù)據(jù)庫(kù)備份)
    備份策略三:使用mysqldump備份數(shù)據(jù)庫(kù)(完全+增量備份,適合中型數(shù)據(jù)庫(kù)備份)
    備份策略四:使用主從復(fù)制機(jī)制(replication)(實(shí)現(xiàn)數(shù)據(jù)庫(kù)實(shí)時(shí)備份)
    備份策略一、直接拷貝數(shù)據(jù)庫(kù)文件
    直接拷貝數(shù)據(jù)文件最為直接、快速、方便,但缺點(diǎn)是基本上不能實(shí)現(xiàn)增量備份。為了保證數(shù)據(jù)的一致性,需要在備份文件前,執(zhí)行以下 SQL 語(yǔ)句:
    FLUSH TABLES WITH READ LOCK;
    也就是把內(nèi)存中的數(shù)據(jù)都刷新到磁盤中,同時(shí)鎖定數(shù)據(jù)表,以保證拷貝過(guò)程中不會(huì)有新的數(shù)據(jù)寫入。這種方法備份出來(lái)的數(shù)據(jù)恢復(fù)也很簡(jiǎn)單,直接拷貝回原來(lái)的數(shù)據(jù)庫(kù)目錄下即可。
    備份策略二、使用mysqlhotcopy備份數(shù)據(jù)庫(kù)
    mysqlhotcopy 是一個(gè) PERL 程序,最初由Tim Bunce編寫。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來(lái)快速備份數(shù)據(jù)庫(kù)。它是備份數(shù)據(jù)庫(kù)或單個(gè)表的最快的途徑,但它只能運(yùn)行在數(shù)據(jù)庫(kù)文件(包括數(shù)據(jù)表定義文件、數(shù)據(jù)文件、索引文件)所在的機(jī)器上,并且mysqlhotcopy 只能用于備份 MyISAM表。
    本備份策略適合于小型數(shù)據(jù)庫(kù)的備份,數(shù)據(jù)量不大,可以采用mysqlhotcopy程序每天進(jìn)行一次完全備份。
    備份策略布置:
    (1)、安裝DBD-mysql perl模塊,支持mysqlhotcopy腳本連接到MySQL數(shù)據(jù)庫(kù)。
    shell> tar -xzvf DBD-mysql-4.005.tar.gz
    shell> cd DBD-mysql-4.005
    shell> unset LANG
    shell> perl Makefile.PL -mysql_config=/usr/local/mysql/bin/mysql_config -testuser=root -testpassword=UserPWD
    shell> make
    shell> make test
    shell> make install
    (2)、設(shè)置crontab任務(wù),每天執(zhí)行備份腳本
    shell> crontab -e
    0 3 * * * /root/MySQLBackup/mysqlbackup.sh >/dev/null 2>&1
    每天凌晨3:00執(zhí)行備份腳本。
    mysqlbackup.sh注釋:
    #!/bin/sh
    # Name:mysqlbackup.sh
    # PS:MySQL DataBase Backup,Use mysqlhotcopy script.
    # Write by:i.Stone
    # Last Modify:2007-11-15
    #
    # 定義變量,請(qǐng)根據(jù)具體情況修改
    # 定義腳本所在目錄
    scriptsDir=`pwd`
    # 數(shù)據(jù)庫(kù)的數(shù)據(jù)目錄
    dataDir=/usr/local/mysql/data/
    # 數(shù)據(jù)備份目錄
    tmpBackupDir=/tmp/tmpbackup/
    backupDir=/tmp/mysqlbackup/
    # 用來(lái)備份數(shù)據(jù)庫(kù)的用戶名和密碼
    mysqlUser=root
    mysqlPWD=111111
    # 定義eMail地址
    # 如果臨時(shí)備份目錄存在,清空它,如果不存在則創(chuàng)建它
    if [[ -e $tmpBackupDir ]]; then
    rm -rf $tmpBackupDir/*
    else
    mkdir $tmpBackupDir
    fi
    # 如果備份目錄不存在則創(chuàng)建它
    if [[ ! -e $backupDir ]];then
    mkdir $backupDir
    fi
    # 清空MySQLBackup.log
    if [[ -s MySQLBackup.log ]]; then