MySQL備份和還原

1.備份類型
html

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

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

    溫備份:在線,但僅能夠執行讀操做;數據庫

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

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

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

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

根據備分內容不一樣分爲:徹底備份、增量備份、差別備份。函數

    徹底備份:備份所有數據;工具

    增量備份:僅備份上次徹底備份或增量備份之後變化的數據;

    差別備份:僅備份上次徹底備份以來變化的數據;

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快照備份須要注意如下幾點:

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

備份:

    刷新表並施加讀鎖:

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

相關文章
相關標籤/搜索