您好,登錄后才能下訂單哦!
下面一起來了解下使用xtrabackup工具備份與恢復MySQL數據庫的方法,相信大家看完肯定會受益匪淺,文字在精不在多,希望使用xtrabackup工具備份與恢復MySQL數據庫的方法這篇短內容是你想要的。
在實際生產環境中誤刪操作,硬件損壞都會導致數據不可用,這個時候我們就需要備份來實現災難恢復。還需注意的是硬件級的冗余,例如raid,也不能取代備份操作,因為數據誤刪之后數據也是沒有的,所以備份必不可少。
物理備份 : 它是直接拷貝mysql的存儲在磁盤上的數據文件。這種備份使用的空間大,特別是innodb存儲數據使用的表空間,因為表空間分配大小是按一定的比例增長,所以存在沒有使用的空間。但是恢復時使用的時間少。
邏輯備份 : 將數據以sql語句的形式導出。導出數據和恢復數據所用的時間多,但占用空間小。
熱備 : 對線上環境不見任何鎖,不影響線上任何數據庫操作。
溫備 : 在備份之間要獲取鎖,并施加鎖。在加鎖期間會影響某些操作。
冷備 : 備份之前停掉云服務器,然后在備份。
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在備份數據是先備份InnoDB數據,再備份MyISAM數據,最后再記錄此次備份的信息。
在解釋原理之前我們需要介紹InnoDB引擎的兩個重要特性,一個事務特性,一個是存儲數據所使用的表空間
在InnoDB引擎中,一旦用戶的操作涉及到修改MySQL數據,他并不會直接寫入磁盤,就會產生一個事務,并將事務是記錄在事務日志中的,而記錄日志是使用的round-robin方式,事務日志空間大小一定,也就說后面的事務日志會覆蓋前面。只有當用戶提交事務后,數據才會持久化到磁盤。
InnoDB存儲數據使用的是表空間,在這個空間中,InnoDB自行組織數據,所有的數據放在page上,每個page的大小固定默認是16KB,你可以通過innodb_page_size將其調大調小。一個page中除了存儲數據庫數據,還存儲了這個表的元數據,用于描述此page。其中一個元數據就是log sequence number日志序列號,它是進行增量備份的基礎。
XtraBackup在開始的時候會記錄日志序列號(LSN),然后開始拷貝磁盤上的數據文件。在此期間如果數據改變了,那么數據就處于不同的位置。數據改變了,我們不一定要拷貝變化的數據,我們可以記錄在此期間的改變的事務日志即可,因為事務日志也記錄了數據的改變。所以在拷貝數據期間,XtraBackup會啟動一個后臺進程監控事務日志,并拷貝在此期間寫入的事務日志。這個過程是一個持續過程,因為事務日志會覆蓋前面的。
在前面提到過增量備份的實現依賴于LSN,它是一個page所具有的屬性。那么在備份時如何利用他實現增量備份呢?首先我們對數據進行完全備份,完全備份時數據有四個頁,頁的編號為1,2,3,4。完全備份后如果LSN編為1的page數據改變了,此時他的LSN的編號在最大的LSN編號加1,也就是說他的編號會變為5,而不是2。同理如果LSN為3的變化了,他的LSN編號會變為6。增量備份的時候我們只需要備份lsn編號為5,6的page即可。
由于MyISAM引擎存儲數據沒有LSN所以在物理備份下實現增量備份。
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解鎖。
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
本實驗將會演示備份和還原操作,使用innobackup命令。
操作系統為centos 7.2
MySQL版本為5.5
~]# 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
~]# 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會在指定存放數據的目錄下用當前時間創建一個目錄,所有生成的備份文件都會這個時間目錄下。
backup_type = full-backuped from_lsn = 0 to_lsn = 1843549 last_lsn = 1843549 compact = 0 recover_binlog_info = 0
可以通過backup_type看到這是一個完全備份,lsn從0到1843549。
這個備份不能用于恢復,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務,此時數據文件處于不一致的狀態。因此,我們現在就是要通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處于一致性狀態。
預還原
~]# innobackupex --apply-log --redo-only /backups/full/2018-03-16_14-20-35/
預還原成功的話,最后的輸出信息會出現completed OK!
參數說明
--apply-log:應用在備份期間產生的事務日志。 --redo-only:表明應用日志的方式,將提交的日志重新提交,沒有提交的事務不要回滾,因為他很有可能在下個備份中提交了。
備份
完全備份
~]# 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數據庫的方法這篇文章后,很多讀者朋友肯定會想要了解更多的相關內容,如需獲取更多的行業信息,可以關注我們的行業資訊欄目。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。