MariaDB數據庫的備份和還原

                                 MariaDB數據庫備份和還原

-------------------------------------------------------------------------------------------------------------------------------------------

1、備份和恢復

    (1)爲什麼要備份?

        災難恢復:硬件故障、軟件故障、自然災害、******、誤操作

        測試,做還原測試,用於測試備份的可用性

    (2)要注意的要點

        能容忍最多丟失多少數據,99.999%比99.99%成功率是多了10倍

        恢復數據需要在多長時間內完成,儘可能儘量短的時間內恢復完成

        需要恢復哪些數據     

2、備份類型:

    (1)完全備份,部分備份

    (2)完全備份:整個數據集

    (3)部分備份:只備份數據子集

3、還原要點

    (1)做還原測試,用於測試備份的可用性

    (2)還原演練,便於在發生萬一時可以從容面對快速恢復數據

4、完全備份、增量備分、差異備份

    (1)增量備份:以某個固定時間爲週期,這個時間內到上一次變化的數據就是增量,僅備份最近一次完全備份或增量備份(如果存在增量)以來變化的數據,還原時候完全備份+增量備份1+增量備份2+...增量備份n,從完全備份後有幾個增量備份就要加幾個增量備份,這種方式還原麻煩,但節省空間

    (2)差異備份:僅備份最近一次完全備份以來變化的數據,還原時候是完全備份+差異備份,相對增量備份比較佔用空間

    (3)一般使用策略是完全備份+增量備份或者完全備份+差異備份,不能增量備份和差異備份混用

5、熱備份、溫備份、冷備份

    (1)熱備份:線上系統讀寫操作均可操作,mysql引擎不支持

    (2)溫備份:線上系統讀操作可執行,但寫操作不行

    (3)冷備份:線上系統讀寫操作不可執行

    注意:MyISAM引擎:溫備,不能熱備;InnoDB,引擎:可以做熱備、溫備

6、物理備份、邏輯備份

    (1)物理備份:直接複製數據文件進行備份,只需要直接複製即可

    (2)邏輯備份:從數據可中“導出”數據另存而進行的備份,需要專業的協議客戶端,與存儲引擎無關

7、備份時需要考慮的因素:

    溫備持鎖多久、備份過程的時長、備份負載、恢復過程的時長

8、備份內容

    數據、二進制日誌和InnoDB的事務日誌、代碼(存儲過程、存儲函數、觸發器、時間調度器)、服務器的配置文件

9、設計備份方案:

    (1)數據集:完全+增量

    (2)備份手段:物理,邏輯

10、備份工具

    (1)mysqldump:邏輯備份工具,適用所有存儲引擎,支持溫備,不支持熱備,但對於InnoDB存儲引擎支持熱備,該工具同時可做完全備份、部分備份

    (2)cp,tar等複製歸檔工具,物理備份工具,使用所有存儲引擎,只能做冷備,可用來做完全備份和部分備份

    (3)lvm2的快照:幾乎熱備,藉助於文件系統管理工具

    (4)mysqlhotcopy:幾乎冷備,僅適用於MyISAM存儲引擎

    (5)備份工具的選擇

        <1>mysqldump+複製binlog(二進制日誌),時間較慢,支持遠程操作

            mysqldump:完全備份

            複製binlog中指定時間範圍內的event完成做增量備份

        <2>lvm2快照+複製binlog

            lvm2快照:使用cp或tar等做物理備份,完全備份

            複製binlog中指定時間範圍內的event完成做增量備份

        <3>xtrabackup

            由Percona提供的支持對InnoDB做熱備(物理備份)的工具

            完全備份、增量備份

11、邏輯備份工具

    mysqldump、mydumper、phpMyAdmin

    mysqldump:客戶端命令,通過mysql協議連接至mysqld服務器

    mysqldump [OPTION] DBNAME [TBLNAME],語句中帶有[]內內容代表不是必須有的

                -A,--all-databases

                -B DBNAME,--databases DBNAME [TBLNAME]

    區別: mysqldump DBNAME TBLNAME,不會自動創建數據庫,而-A,--all-databases和-B DBNAME,--databases DBNAME [TBLNAME]會自動創建數據庫

12、實現冷備

    (1)停止數據庫,進入數據庫存放目錄,tar Jcvf /DIR/SQL.tar /數據庫存放目錄/,過程中如果日誌在其它目錄,也需要一併拷貝

    (2)還原:停止服務,解壓備份數據,拷貝至需要還原的數據庫,解壓縮,檢查用戶權限組權限是否都爲mysql,之後配置文件放到對應的位置後,重啓數據庫服務

    注意:拷貝單個數據庫時候最好打包後拷貝至需要還原的數據庫,同時拷貝事務日誌,同時注意文件的用戶和組權限

13、邏輯卷快照實現數據庫幾乎熱備

    (1)創建兩個邏輯卷(一個給數據庫,一個給二進制日誌),新建文件系統,並掛載新建的備份存放目錄

    (2)vim /etc/my.cnf,在[mysqld_safe]下寫入信息datadir=/數據庫備份存放目錄/

    (3)請求鎖定所有表:進入數據庫 FLUSH TABLES with READ LOCK;

    (4)記錄二進制日誌文件及事件位置

        <1>FLUSH LOGS;

        <2>SHOW MASTER STATUS;,或者mysql -e 'SHOW MASTER STATUS' > /DIR/pos.`date + F%`,記下binlog的時間點

    (5)創建快照lvcreate -L SIZE -n LVNAME-snap -p r -s /dev/LVMDIR/LVNAME,創建邏輯卷/dev/LVMDIR/LVNAME的快照,SIZE大小,名稱叫LVNAME-snap,只讀r屬性

    (6)釋放鎖,進入數據庫UNLOCK TABLES;

    (7)掛載邏輯卷快照臨時到某個目錄

    (8)轉到快照目錄下,cp -a mysql/ /tmp

    (9)備份完成後,刪除快照卷,lvremove

    (10)制定好策略後,通過原卷備份二進制日誌,mysqlbinlog --start-position=7697 binlog.00001 > /root/binlog.sql,mysqlbinlog  binlog.00002 >>binlog.sql,7697是剛纔記錄的binlog的時間點

    (11)還原,將/tmp/mysql/拷貝至需要還原的數據庫存放目錄,將binlog放置對應目錄中,mysql < 導入後重啓mysql服務

14、mysqldump的使用

    (1)備份

        mysqldump -uUSER --databases DBNAME > /DIR/*.sql,用重定向方式備份一個數據庫

        mysqldump -uUSER --databases DB1 DB2 > /DIR/DB12.sql,備份多個數據庫

    (2)鎖表

        MyISAM、InnoDB實現溫備

        mysqldump --lock-all-tables:鎖定所有庫的所有表

              --lock-tables:對於每個單獨的數據庫,在啓動備份之前鎖定該數據庫所有表

        InnoDB實現熱備

        mysqldump --single-transaction,啓動一個事務,當完成時纔會被提交,使用時配合-q一起使用,不適用MyISAM引擎,使用時候需要確保其他人不用增刪改和truncate命令

    (3)其它選項

        mysqldump -E,--events:備份指定數據庫相關的所有event scheduler,事件調度器

                            -R,--routines:備份指定數據庫可相關的所有存儲過程和存儲函數

                            --triggers:備份表相關的觸發器

                            --master-data=NUM,此選項須啓用二進制日誌,NUM爲1:所備份的數據之前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1,記錄二進制日誌POS點,從此點之後沒做備份;NUM爲2:記錄爲註釋的CHANGE MASTER TO語句,此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啓--single-transaction)

                            -F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會導致刷新多次數據庫。建議在同一時刻執行轉儲和日誌刷新,可通過和--single-transaction或-x,--master-data 一起使用實現,此時只刷新一次日誌

                            --compact 去掉註釋,適合調試,生產不使用

                            -d, --no-data 只備份表結構

                            -t, --no-create-info 只備份數據,不備份create table

                            -n,--no-create-db 不備份create database,可被-A或-B覆蓋

                            --flush-privileges 備份mysql或相關時需要使用

                            -f, --force 忽略SQL錯誤,繼續執行

                            --hex-blob 使用十六進制符號轉儲二進制列(例如,“abc”變爲0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT的列時使用,避免亂碼,生產中帶有二進制日誌數據建議加

                            -q, --quick 不緩存查詢,直接輸出,加快備份速度

15、完全備份,並還原至最新狀態

    (1)啓用二進制日誌,並分離存放vim /etc/my.cnf,[mysqld]下log-bin=/DIR/

    (2)mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/`date +%F`.sql.gz

    (3)模擬破壞,停止數據庫並刪庫

    (4)還原到備份時狀態,直到還原結束一直不允許其他用戶連接數據庫,解壓數據備份,gzip -d *.sql.gz,systemctl start mariadb(數據庫無內容),關閉二進制,進入數據庫,mysql >set sql_log_bin=off,mysql > source / *.sql.gz

    (5)還原到最新狀態grep "CHANGE MASTER" /data/*.sql,查看position,比如說245

        mysqlbin --start-potion=245 mysql-bin.0002 > /data/incr.sql

        mysqlbin mysql-bin.0003 >>  /data/incr.sql

        mysqlbin mysql-bin.0004 >> /data/incr.sql

        mysql

        >set sql_log_bin=off

        >source /data/incr.sql

        >set sql_log_bin=on

        附:備份時候壓縮:mysaldump -B DB | gzip > /DIR/*.sql.gz,解壓時候gzip -d

        注意:二進制日誌文件不應該與數據文件放在同一磁盤

16、恢復誤刪除

    (1)開啓二進制日誌功能

    (2)完全備份:mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/`date +%F`.sql.gz

    (3)修改數據庫:產生變化二進制文件

        刪除表:產生模擬事件

        修改數據庫

    (4)加讀鎖,flush tables with read lock,並拒絕用戶訪問數據庫

    (5)還原:<1>停止服務,清空數據庫,啓動數據庫,解壓備份的數據

                  <2>mysql

                        > set sql_log_bin=off

                        >source /DIR/完全備份的數據庫.sql

    (6)分析二進制日誌,找到丟失的表的drop table指令

        grep -i "change master" /data/all.sql 找到帶有drop table的二進制文件和pos點

        mysqlbinlog --start-position=POSNUM binlog.0000* > /data/incr.sql

        vim /data/incr.sql,註釋drop那一行

    (7)還原

        mysql>set sql_log_bin=off

        mysql> source /data/incr.sql;

        mysql>set sql_log_bin=on

    (8)複查數據完整

    (9)開放用戶

17、分庫備份腳本

    (1)mysql -e 'show databases' | grep -Ev  '^Database|info|performanc'|while read dbname;do mysqldump -B $dbname | gzip > /data/${dbname}_bak`date +%F`.gz;done

    (2)mysql -e 'show databases' | grep -Ev  '^Database|info|performanc' |sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1__bak`date +%F`.gz@' |bash

    (3)for db in `mysql -e 'show databases' | grep -Ev  '^Database|info|performanc'`; do mysqldump -B $db |gzip > /data/${db}_bak`date +%F`.gz;done

18、生產環境實戰備份策略

    (1)InnoDB建議備份策略

    mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

    (2)MyISAM建議備份策略

    mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

注:以上實驗在另一篇文章中實現數據庫備份和還原實驗

19、Xtrabackup

    (1)特點:

        <1>備份還原過程快速、可靠

        <2>備份過程不會打斷正在執行的事務

        <3>能夠基於壓縮等功能節約磁盤空間和流量

        <4>自動實現備份檢驗

        <5>開源,免費

    (2)xtrabackup是用來備份InnoDB表的,不能備份非InnoDB表,和MySQL沒有交互

    (3)innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上做了一層封裝實現的

    (4)雖然目前一般不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,因此備份基本都通過 innobackupex 命令進行

    (5)選項

        --user:該選項表示備份賬號

        --password:該選項表示備份的密碼

        --host:該選項表示備份數據庫的地址

        --databases:該選項接受的參數爲數據庫名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表

        --defaults-file:該選項指定從哪個文件讀取MySQL配置,必須放在命令行第一個選項位置

        --incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir

        --incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用

        --incremental-dir:該選項表示還原時增量備份的目錄

        --include=name:指定表名,格式:databasename.tablename

    (6)Prepare:innobackupex --apply-log [option] BACKUP-DIR

        選項說明:

        --apply-log:一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。此選項作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態

        --use-memory:和--apply-log選項一起使用,當prepare 備份時,做crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G

        --export:表示開啓可導出單獨的表之後再導入其他Mysql中

        --redo-only:此選項在prepare base full backup,往其中合併增量備份時候使用,不適用於最後一個增量備份

    (7)還原:innobackupex --copy-back [選項] BACKUP-DIR,還原的時候需要停止服務

        innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR

    選項說明:

        --copy-back:做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir

        --move-back:這個選項與--copy-back相似,唯一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本

    (8)還原注意事項:

        <1>datadir目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋

        <2>在restore之前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中

        <3>由於文件屬性會被保留,大部分情況下需要在啓動實例之前將文件的屬主改爲mysql,這些文件將屬於創建備份的用戶

            chown -R mysql:mysql /data/mysql

    以上需要在用戶調用innobackupex之前完成

        --force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。如果--copy-back和--move-back文件需要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

    (9)備份生成的相關文件

        使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中創建如下文件:

        <1>xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置

        <2>xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每個InnoDB頁(通常爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的

        <3>xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復

        <4>backup-my.cnf:備份命令用到的配置選項信息

        <5>xtrabackup_logfile:備份生成的日誌文件

20、xtrabackup的備份和還原

舊版:

    (1)xtrabackup使用進行熱備份,需要epel下載或者官網下載

        <1>確認數據庫表格的引擎是InnoDB或者XtraDB

        <2>vim /etc/my.cnf,在[mysqld]和[mysqld_safe]之間加入innodb_file_per_table=ON

        <3>重啓數據庫服務

        <4>創建臨時目錄 /backups

        <5>innobackupex --user=root /backups,該指令會自動備份二進制日誌文件,是整庫備份,生成的文件夾以日期顯示

        <6>scp -r /backups/2018-10-13_16-45-57/ 目標主機:/data/

    (2)還原:

        <1>注意vim /etc/my.cnf下[mysqld]內容中datadir指向路徑和預存放的數據庫路徑要一致,如果自己想在/data/mysql存放還原的數據庫,需要建立目錄後更改權限爲mysql.mysql,並在文件下添加datadir=/data/mysql

        <2>vim /etc/my.cnf,在[mysqld]和[mysqld_safe]之間加入innodb_file_per_table=ON

        <3>重啓數據庫服務

        <4>將備份的數據庫傳至本機,移動至本機的備份目錄/backups

        <5>innobackupex --apply-log /backups/日期顯示的文件夾

        <6>停止數據庫服務,刪除原來所有數據庫

        <7>完全恢復:innobackupex --copy-back /backups/2018-10-13_16-45-57/

        <8>更改/data/mysql目錄權限爲mysql.mysql

        <9>重啓服務

新版:兩邊的配置文件需要同步

        <1>在原主機做完全備份到/data/backups

        xtrabackup --backup --target-dir=/backups/

        scp -r /backups/* 目標主機:/backups

        <2>在目標主機上

            [1]預準備:確保數據一致,提交完成的事務,回滾未完成的事務

            xtrabackup --prepare --target-dir=/backups/

            [2]複製到數據庫目錄

            注意:數據庫目錄必須爲空,MySQL服務不能啓動

            xtrabackup --copy-back --target-dir=/backups/

            [3]還原屬性

            chown -R mysql:mysql /var/lib/mysql

            [4]啓動服務

            systemctl start mariadb

21、xtrabackup的增量備份和還原

舊版

    (1)在原主機

        innobackupex /backups

        mkdir /backups/inc{1,2}

        修改數據庫內容

        innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(完全備份生成的路徑)

        再次修改數據庫內容

        innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量備份生成的路徑)

        scp -r /backups/* 目標主機:/data/

    (2)在目標主機

        不啓動mariadb

        rm -rf /var/lib/mysql/*

        innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/

        innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17

        innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/

        ls /var/lib/mysql/

        innobackupex --copy-back /data/2018-02-23_14-21-42/

        chown -R mysql.mysql /var/lib/mysql/

        systemctl start mariadb

新版:

    (1)備份過程

        [1]完全備份:xtrabackup --backup --target-dir=/backups/base

        [2]第一次修改數據

        [3]第一次增量備份:xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/base

        [4]第二次修改數據

        [5]第二次增量:xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1

        [6]scp -r /backups/* 目標主機:/backups/

    (2)備份過程生成三個備份目錄

        /backups/{base,inc1,inc2}

    (3)還原過程

        [1]預準備完成備份,此選項--apply-log-only阻止回滾未提完成的事務

        xtrabackup --prepare --apply-log-only --target-dir=/backups/base

        [2]合併第1次增量備份到完全備份,xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1

        [3]合併第2次增量備份到完全備份:最後一次還原不需要加選項--apply-log-only

        xtrabackup --prepare --target-dir=/backups/base --incremental-dir=/backups/inc2

        [4]複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動

        xtrabackup --copy-back --target-dir=/data/backups/base

        [5]還原屬性:chown -R mysql:mysql /var/lib/mysql

        [6]啓動服務:systemctl start mariadb

22、Xtrabackup單表導出和導入

    (1) 單表備份

        innobackupex --include='hellodb.students' /backups

    (2)備份表結構

        mysql -e 'show create table hellodb.students' > student.sql

    (3)刪除表

        mysql -e 'drop table hellodb.students‘

    (4)innobackupex --apply-log --export /backups/2018-02-23_15-03-23/

    (5) 創建表

        mysql>CREATE TABLE `students` (

        `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,

        `Name` varchar(50) NOT NULL,

        `Age` tinyint(3) unsigned NOT NULL,

        `Gender` enum('F','M') NOT NULL,

        `ClassID` tinyint(3) unsigned DEFAULT NULL,

        `TeacherID` int(10) unsigned DEFAULT NULL,

        PRIMARY KEY (`StuID`)

        ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

    (6)刪除表空間

        alter table students discard tablespace;

    (7)cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/

    (8)chown -R mysql.mysql /var/lib/mysql/hellodb/

    (9)mysql>alter table students import tablespace;

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