中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用xtrabackup工具備份與恢復MySQL數據庫的方法

發布時間:2020-05-11 10:48:18 來源:億速云 閱讀:307 作者:三月 欄目:MySQL數據庫

下面一起來了解下使用xtrabackup工具備份與恢復MySQL數據庫的方法,相信大家看完肯定會受益匪淺,文字在精不在多,希望使用xtrabackup工具備份與恢復MySQL數據庫的方法這篇短內容是你想要的。

一. 為什么需要備份

在實際生產環境中誤刪操作,硬件損壞都會導致數據不可用,這個時候我們就需要備份來實現災難恢復。還需注意的是硬件級的冗余,例如raid,也不能取代備份操作,因為數據誤刪之后數據也是沒有的,所以備份必不可少。

二. 備份的分類

1.物理備份和邏輯備份

物理備份 : 它是直接拷貝mysql的存儲在磁盤上的數據文件。這種備份使用的空間大,特別是innodb存儲數據使用的表空間,因為表空間分配大小是按一定的比例增長,所以存在沒有使用的空間。但是恢復時使用的時間少。
邏輯備份 : 將數據以sql語句的形式導出。導出數據和恢復數據所用的時間多,但占用空間小。

2.熱備、溫備、冷備

熱備 : 對線上環境不見任何鎖,不影響線上任何數據庫操作。
溫備 : 在備份之間要獲取鎖,并施加鎖。在加鎖期間會影響某些操作。
冷備 : 備份之前停掉云服務器,然后在備份。

使用xtrabackup工具備份與恢復MySQL數據庫的方法

三. XtraBackup

XtraBackup是Percona旗下的一款開源熱備工具,能夠在不鎖數據庫的情況下備份MySQL數據。它能夠備份InnoDB,XtraDB,MyISAM表,MySQL版本支持5.1,5.5,5.5,5.7。
XtraBackup具有如下功能:

能夠對InnoDB實現熱備,無需暫停數據庫
能夠對MySQL進行增量備份
對MySQL備份能夠實現流式壓縮并傳輸給其他云服務器
MySQL服務運行時能夠在MySQL云服務器之間進行表的遷移
能夠很容易創建一個MySQL從云服務器
備份MySQL時不會增加云服務器負擔

XtraBackup能夠帶InnoDB引擎創建的表實現熱備,對MyISAM引擎實現溫備。

四. XtraBackup如何實現備份

XtraBackup在備份數據是先備份InnoDB數據,再備份MyISAM數據,最后再記錄此次備份的信息。

1.XtraBackup如何對InnoDB實現備份

在解釋原理之前我們需要介紹InnoDB引擎的兩個重要特性,一個事務特性,一個是存儲數據所使用的表空間

1)事務

在InnoDB引擎中,一旦用戶的操作涉及到修改MySQL數據,他并不會直接寫入磁盤,就會產生一個事務,并將事務是記錄在事務日志中的,而記錄日志是使用的round-robin方式,事務日志空間大小一定,也就說后面的事務日志會覆蓋前面。只有當用戶提交事務后,數據才會持久化到磁盤。

2)表空間

InnoDB存儲數據使用的是表空間,在這個空間中,InnoDB自行組織數據,所有的數據放在page上,每個page的大小固定默認是16KB,你可以通過innodb_page_size將其調大調小。一個page中除了存儲數據庫數據,還存儲了這個表的元數據,用于描述此page。其中一個元數據就是log sequence number日志序列號,它是進行增量備份的基礎。

3)備份原理

XtraBackup在開始的時候會記錄日志序列號(LSN),然后開始拷貝磁盤上的數據文件。在此期間如果數據改變了,那么數據就處于不同的位置。數據改變了,我們不一定要拷貝變化的數據,我們可以記錄在此期間的改變的事務日志即可,因為事務日志也記錄了數據的改變。所以在拷貝數據期間,XtraBackup會啟動一個后臺進程監控事務日志,并拷貝在此期間寫入的事務日志。這個過程是一個持續過程,因為事務日志會覆蓋前面的。

4)增量備份實現原理

在前面提到過增量備份的實現依賴于LSN,它是一個page所具有的屬性。那么在備份時如何利用他實現增量備份呢?首先我們對數據進行完全備份,完全備份時數據有四個頁,頁的編號為1,2,3,4。完全備份后如果LSN編為1的page數據改變了,此時他的LSN的編號在最大的LSN編號加1,也就是說他的編號會變為5,而不是2。同理如果LSN為3的變化了,他的LSN編號會變為6。增量備份的時候我們只需要備份lsn編號為5,6的page即可。
由于MyISAM引擎存儲數據沒有LSN所以在物理備份下實現增量備份。

2.XtraBackup備份MyISAM表

XtraBackup是在備份完InnoDB表之后,會運行LOCK TABLES FOR BACKUP拷貝MyISAM表和.frm文件。這個鎖是在InnoDB數據拷貝后添加這個鎖是一個backup lock他比FLUSH TABLES WITH READ LOCK這個鎖更加輕量級。而且在加鎖期間并不會影響InnoDB DML操作,這也就是為什么說XtraBackup備份InnoDB是熱備,備份MyISAM是溫備。
拷貝MyISAM時,并不影響InnoDB數據的操作,也就是說InnoDB數據在改變。這樣會導致MyISAM和InnoDB數據在某一時刻并不是一致的。為了能讓其數據一致,拷貝完之后還需要事務日志和二進制日志。而這個過程他要施加LOCK BINLOG FOR BACKUP鎖,拷貝完成之后才會對二進制日志和table解鎖。

3.備份創建的文件解釋

  • backup-my.cnf:它并不是原始的my.cnf,而是Xtrabackup在備份時獲取的InnoDB引擎的相關數據。預還原的時候它會讀取此文件的內容,或者從 XtraBackup --defaults-file指明的文件中讀取。
  • xtrabackup_checkpoints:描述備份的類型(全備或增量備份)、它的狀態(例如prepared)和他的LSN范圍。可看如下示例
    完全備份
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 15188961605
    last_lsn = 15188961605

    增量備份

    backup_type = incremental
    from_lsn = 15188961605
    to_lsn = 15189350111
    last_lsn = 15189350111
  • xtrabackup_binlog_info:在備份的那一刻云服務器二進制所處的位置,通過SHOW MASTER STATUS獲取
  • xtrabackup_binlog_pos_innodb:InnoDB表當前所處的二進制位置。與InnoDB事務相關
  • xtrabackup_logfile:在備份過程中拷貝的事務日志,用于預還原

五.實驗

本實驗將會演示備份和還原操作,使用innobackup命令。
操作系統為centos 7.2
MySQL版本為5.5

1.安裝Percona-Xtrabackup

~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar
展開tarball 其中包含三個rpm,
percona-xtrabackup-24:包含最新的Percona XtraBackup GA 二進制以及相關文件
percona-xtrabackup-24-debuginfo:用于調試percona-xtrabackup-24中的二進制程序
percona-xtrabackup-test-24:Percona Xtrabackup測試組件
~]# tar xf Percona-XtraBackup-2.4.4-rdf58cf2-el7-x86_64-bundle.tar    
~]# yum install -y percona-xtrabackup-24-debuginfo-2.4.4-1.el7.x86_64.rpm percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm percona-xtrabackup-test-24-2.4.4-1.el7.x86_64.rpm

2.對數據進行完全備份及其還原

1)創建完全備份

~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456  /backups/full
完全備份成功的話,最后的輸出信息會出現completed OK!

  • 參數解釋
    --defaults-file:讀取mysql默認的參數,這個要是命令行的第一個參數,不能是符號鏈接文件。
    --user --host --password 登錄主機,用戶名和密碼
    /backups/full:備份目錄,如果沒有會自動創建
  • 生成文件

    [root@slave ~]# ls -l /backups/full/
    total 0
    drwxr-x---. 7 root root 227 Mar 16 14:20 2018-03-16_14-20-35
    [root@slave ~]# ls -l /backups/full/2018-03-16_14-20-35/
    total 18460
    -rw-r-----. 1 root root      417 Mar 16 14:20 backup-my.cnf
    drwxr-x---. 2 root root      272 Mar 16 14:20 hellodb
    -rw-r-----. 1 root root 18874368 Mar 16 14:20 ibdata1
    drwxr-x---. 2 root root     4096 Mar 16 14:20 mysql
    drwxr-x---. 2 root root     4096 Mar 16 14:20 performance_schema
    drwxr-x---. 2 root root       62 Mar 16 14:20 pt
    drwxr-x---. 2 root root       20 Mar 16 14:20 test
    -rw-r-----. 1 root root       25 Mar 16 14:20 xtrabackup_binlog_info
    -rw-r-----. 1 root root      113 Mar 16 14:20 xtrabackup_checkpoints
    -rw-r-----. 1 root root      522 Mar 16 14:20 xtrabackup_info
    -rw-r-----. 1 root root     2560 Mar 16 14:20 xtrabackup_logfile

    innobackupex會在指定存放數據的目錄下用當前時間創建一個目錄,所有生成的備份文件都會這個時間目錄下。

  • __查看xtrabackup_checkpoints文件__
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 1843549
    last_lsn = 1843549
    compact = 0
    recover_binlog_info = 0

    可以通過backup_type看到這是一個完全備份,lsn從0到1843549。

2)完全備份還原

這個備份不能用于恢復,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務,此時數據文件處于不一致的狀態。因此,我們現在就是要通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處于一致性狀態。

  • 預還原
    ~]# innobackupex --apply-log --redo-only /backups/full/2018-03-16_14-20-35/
    預還原成功的話,最后的輸出信息會出現completed OK!
    參數說明

    --apply-log:應用在備份期間產生的事務日志。
    --redo-only:表明應用日志的方式,將提交的日志重新提交,沒有提交的事務不要回滾,因為他很有可能在下個備份中提交了。
  • 還原
    還原時,mysql云服務器需要關閉,而且數據目錄需要為空。
    ~]# systemctl stop mariadb
    ~]# mv /var/lib/mysql /tmp
    ~]# mkdir /var/lib/mysql
    ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back  /backups/full/2018-03-16_14-20-35/
    ~]# chown -R mysql.mysql /var/lib/mysql
    ~]# systemctl start mariadb

2.完全備份+增量備份及其還原

  • 備份
    完全備份
    ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456  /backups/full
    第一次增量備份
    ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 --incremental /backups/incr-1  --incremental-basedir=/backups/full/2018-03-16_14-20-35/
    第二次增量備份
    ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --password=123456 /backups/incr-2 /backups/incr-2 --incremental-basedir=/backups/incr-1/2018-03-16_15-20-32/
    參數說明

    --incremental 表明此備份為增量備份。
    --incremental-basedir 指明增量備份一誰為基礎。
    /backups/incr-1 指明備份所放置的目錄
  • 預還原
    完全備份預還原
    ~]#  innobackupex --apply-log --redo-only /backups/full/2018-03-16_14-20-35/
    第一次增量備份預還原
    ~]#  innobackupex --apply-log --redo-only /backups/incr-1/2018-03-16_15-20-32/ --incremental-dir=/backups/full/2018-03-16_14-20-35/
    第二次增量備份與還原
    ~]#  innobackupex --apply-log --redo-only /backups/incr-1/2018-03-16_16-01-44/ --incremental-dir=/backups/full/2018-03-16_14-20-35/

    --incremental-dir:指明以哪個備份作為還原處理。
  • 還原
    參考備份還原

六. 備份腳本

#!/bin/bash
# Description: innobackupex backup MySQL
# Date: 2018-01-23
# Version: 0.1.0
# Author: lirou

#這個備份計劃以一周為一個周期,周一為完全備份,周二到周日都是以周一為基礎的增量備份。
#以一周還原的時候只需要周一的完全備份和周日的增量備份即可。

backup_dir_parent=/var/lib/mysql/backups
backup_dir=
full_backup_dir=
increment_backup_dir=
backup_times=
backup_max_times=5

#登錄云服務器參數
mysql_host=127.0.0.1
mysql_user=root
mysql_password=123456
#MySQL服務配置文件
defaults_file=/etc/my.cnf

#記錄備份是輸出的信息
backup_log=/var/log/innobackup/innobackup.log
#記錄每次備份是否成功
backup_status=/var/log/innobackup/innobackup.status

! [ -d $backup_dir_parent ] && mkdir -pv $backup_dir_parent
! [ -d $backup_log ] && mkdir -pv $backup_log

week=$(date "+%u")

if [ $week -eq 1 ]; then

    backup_times=$(ls -l $backup_dir_parent | grep -i '^d.*backup.*' | wc -l)   
    if [ $backup_times -ge $backup_max_times ];then
        rm -rf ${backup_dir_parent}/$(ls -lt $backup_dir_parent |tail -l)
    fi

    backup_dir=${backup_dir_parent}/backup-$(date "+%Y-%m-%d")
    full_backup_dir=${backup_dir}/full
    innobackupex --defaults-file=${defaults_file} --host=${mysql_host} --user=${mysql_user} --password=${mysql_password} ${full_backup_dir} &> $backup_log
else
    backup_dir=${backup_dir_parent}/$(ls  -lt $backup_dir_parent | grep -i '^d.*backup.*' | head -1 | grep -o 'backup.*')
    increment_backup_dir=${backup_dir}/incr-${week}
    innobackupex --defaults-file=${defaults_file} --host=${mysql_host} --user=${mysql_user} --password=${mysql_password} --incremental=${backup_dir}/full ${increment_backup_dir} &> $backup_log 
fi

echo "$(date '+%Y-%m-%d'):$?" >>  $backup_status    

此備份腳本在制作定時任務時,一定要確保周一的完全備份執行了,因為周二到周日的增量都以他為基礎。

看完使用xtrabackup工具備份與恢復MySQL數據庫的方法這篇文章后,很多讀者朋友肯定會想要了解更多的相關內容,如需獲取更多的行業信息,可以關注我們的行業資訊欄目。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇阳县| 新乡县| 隆回县| 象州县| 鸡泽县| 泾源县| 建始县| 莱阳市| 太谷县| 沁阳市| 武邑县| 仪陇县| 石楼县| 武汉市| 贵德县| 葫芦岛市| 上蔡县| 霍林郭勒市| 淳化县| 平遥县| 公主岭市| 江门市| 灵川县| 澳门| 土默特右旗| 筠连县| 水城县| 喀喇沁旗| 海门市| 怀仁县| 璧山县| 锡林浩特市| 湖北省| 鱼台县| 阿拉善右旗| 溧水县| 大姚县| 卓资县| 东城区| 乌拉特前旗| 沙坪坝区|