MySQL備份和還原

1.備份類型

根據備份時服務器是否能夠向外繼續提供服務分爲:熱備份、溫備份、冷備份。

    熱備份:在線,讀、寫不受影響;

    溫備份:在線,但僅可以執行讀操作;

    冷備份:離線,讀、寫操作均不能進行;

根據備份時是直接複製數據文件還是將數據導出進行備份分爲:物理備份、邏輯備份。

    物理備份:直接複製數據文件;

    邏輯備份:將數據導出至文本文件當中;

根據備份內容不同分爲:完全備份、增量備份、差異備份。

    完全備份:備份全部數據;

    增量備份:僅備份上次完全備份或增量備份以後變化的數據;

    差異備份:僅備份上次完全備份以來變化的數據;

2.使用mysqldump工具備份還原數據

    mysqldump是一個邏輯備份工具,對MyISAM引擎可以實現溫備,對InnoDB引擎可以實現熱備。速度比較慢,不適合對大數據庫進行完全備份。數據還原時應該將二進制日誌功能臨時性關掉(sql_log_bin=OFF),還原後在啓用。

    mysqldump命令的用法及其常見選項:

mysqldump -uroot -p [db_name] [tb1] [tb2] > backfile    #備份單個數據庫,或庫中特定表
    --master-data={0|1|2}
        0: 不記錄二進制日誌文件及其位置;
        1:以CHNAGE MASTER TO的方式記錄位置,可用於恢復後直接啓動從服務器;
        2:以CHANGE MASTER TO的方式記錄位置,但默認爲被註釋;
    --lock-all-tables:鎖定所有表
    --flush-logs:執行日誌滾動
    --all-databases:備份所有庫
    --databases DB_NAME,DB_NAME,...:備份指定庫
    --events:備份事件
    --routines:備份存儲過程和存儲函數
    --triggers:備份觸發器
    --no-data:只備份表結構
    如果指定庫中的表類型均爲InnoDB,可使用--single-transaction啓動熱備;

    mysqldump完全備份加二進制日誌增量備份及還原實例:

備份:

mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /root/all.sql
    #完全備份
mysqlbinlog mysql-bin.000011 > /root/first-incremental.sql
    #第一次增量備份

刪除數據文件模擬故障還原(假設故障時使用的二進制日誌文件爲mysql-bin.000012且二進制日誌文件和數據文件分開存儲):

killall mysqld
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data
    #初始化數據庫
service mysqld start
mysql -uroot -p < /root/all.sql
    #還原完全備份
mysql -uroot -p < /root/first-incremental.sql
    #還原增量備份
mysqlbinlog mysql-bin.000012 > /tmp/tmp.sql
mysql -uroot -p < /tmp/tmp.sql
    #即時點恢復

3.通過select命令備份數據並還原

    select通常用來備份單個表,還原時表結構需要預先創建好。

備份:

mysql> SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];

還原:

mysql> LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;

4.使用LVM快照進行數據庫備份

    LVM快照能夠實現幾乎熱備,使用LVM快照備份需要注意以下幾點:

        1、數據文件要在邏輯捲上;
        2、此邏輯卷所在卷組必須有足夠空間使用快照卷;
        3、數據文件和事務日誌要在同一個邏輯捲上;

備份:

    刷新表並施加讀鎖:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;

    通過另一個終端保存二進制日誌文件及相關位置信息:

mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master.info

    創建快照卷:

lvcreate -L 1G -s -p r -n mydata-snap /dev/myvg/mydata

    釋放鎖:

mysql> UNLOCK TABLES;

    掛在快照卷並備份數據:

mount -o ro  /dev/myvg/mydata-snap /mnt
cp -a /mnt/* /backup

    刪除快照卷:

umount /mnt
lvremove --force /dev/myvg/mydata-snap

還原:

cp -a /backup/* /mydata/data

6.使用xtrabackup進行數據庫備份

1).xtrabackup進行完全備份與恢復

a. xtrabackup進行完全備份

innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/
    #/path/to/BACKUP-DIR/表示備份文件保存的位置
    #innobackupex命令封裝了支持各種不同MySQL版本的xtrabackup工具

    在備份的同時,innobackupex還會在備份目錄中創建如下文件:
    (1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
    注:每個InnoDB頁(通常爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
    (2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置;
    (3)xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position;
    (4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
    (5)backup-my.cnf —— 備份命令用到的配置選項信息;

b. 準備(prepare)一個完全備份
    一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處於不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

innobackupex --apply-log  /path/to/BACKUP-DIR

c. 從一個完全備份中恢復數據

innobackupex --copy-back  /path/to/BACKUP-DIR

    當數據恢復至DATADIR目錄以後,還需要確保所有數據文件的屬主和屬組均爲正確的用戶,如mysql,否則,在啓動mysqld之前還需要事先修改數據文件的屬主和屬組。如:

# chown -R  mysql:mysql  /mydata/data/

2).xtrabackup進行增量備份並還原

a. 進行增量備份

innobackupex --incremental /backup --incremental-basedir=BASEDIR
    #/backup表示增量備份文件保存的位置
    #--incremental-basedir指定完全備份所在的目錄或上一次增量備份所在目錄

注:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。

b. 準備(prepare)增量備份

    “準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:

    (1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份數據將合併到完全備份上。

    (2)基於所有的備份將未提交的事務進行“回滾”。

innobackupex --apply-log --redo-only BASE-DIR
    #--redo-only表示跳過rollback階段,只進行redo階段
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

    其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作。

c. 還原數據

    因爲準備階段已經將所有數據全部合併到完全備份上,所有還原時只需還原完全備份即可。

innobackupex --copy-back  BASE-DIR
chown -R  mysql:mysql  /mydata/data/

參考資料:

MySQL數據備份與恢復:http://www.cnblogs.com/wenanry/archive/2010/05/18/1737939.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章