日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

使用xtrabackup对MySQL进行备份和恢复

發布時間:2025/6/15 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用xtrabackup对MySQL进行备份和恢复 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Xtrabackup 是percona公司的開源項目,用以實現類似innodb官方的熱備份工具InnoDB Hot Backup的功能,能夠非常快速地備份與恢復MySQL數據庫。 Xtrabackup中包含兩個工具:

xtrabackup是用于熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構;

innobackupex是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。

由于innobackupex的功能更為全面和完善,所以,本文以innobackupex作為基礎進行研究描述。

下載和安裝

在以下地址可以下載到xtrabackup:http://www.percona.com/downloads/XtraBackup/,可以根據自己的需要選擇穩定版本或者最新版本以及操作系統、源碼包或者rpm包等等。

我下載到的是xtrabackup-1.6.tar,是一個二進制壓縮包,解壓后可直接使用。

將下載到的文件包進行解壓 tar zxvf xtrabackup-1.6.tar,然后在/usr/bin中建立相關應用的鏈接:

[plain]?view plain?copy

  • ln?-s?/usr/bin/innobackupex?/root/xtrabackup-1.6/bin/innobackupex??

  • ??

  • ln?-s?/usr/bin/xtrabackup?/root/xtrabackup-1.6/bin/xtrabackup??

  • ??

  • ln?-s?/usr/bin/xtrabackup_51?/root/xtrabackup-1.6/bin/xtrabackup_51??

  • ??

  • ln?-s?/usr/bin/tar4ibd?/root/xtrabackup-1.6/bin/tar4ibd??

  • 其中,

    innobackupex是我們要使用的備份工具;

    xtrabackup是被封裝在innobackupex之中的,innobackupex運行時需要調用它;

    xtrabackup_51是xtrabackup運行時需要調用的工具;

    tar4ibd是以tar流的形式產生備份時用來打包的工具。

    進行備份

    完整備份:

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--database=test?/mysqlbackup/??

  • 其中,--user指定連接數據庫的用戶名,--password指定連接數據庫的密碼,--defaults-file指定數據庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份的數據庫,這里指定的數據庫只對MyISAM表和InnoDB表的表結構有效,對于InnoDB 數據來說都是全備(所有數據庫中的InnoDB數據都進行了備份,不是只備份指定的數據庫,恢復時也一樣);/mysqlbackup是備份文件的存放位置。

    完整備份并打包:

    [plain]ain

  • innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--database=test?--stream=tar?/mysqlbackup?>?/mysqlbackup/dbbackup20110809.tar??

  • 其中,--stream指定流的格式,目前只支持tar。

    完整備份并打包壓縮:

    [plain]?view plain?copy

  • <strong></strong>innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--database=test?--stream=tar?/mysqlbackup/?|?gzip?/mysqlbackup/dbbackup20110809.tar.gz??

  • 完整備份到遠程主機:?

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=?MySQLPASSWORD?--defaults-file=/etc/my.cnf?--database=test?--stream=tar?/mysqlbackup?|?ssh?root@remote-host?cat?">"???/mysqlbackup/dbbackup20110809.tar??

  • 增量備份:

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--database=test?--incremental?--incremental-basedir=/mysqlbackup/2011-08-09_14-50-20/?/mysqlbackup/trn/??

  • 其中,--incremental指明是增量備份,--incremental-basedir指定上次完整備份或者增量備份文件的位置。這里的增量備份其實只針對的是InnoDB,對于MyISAM來說,還是完整備份。

    進行恢復

    完整備份恢復:

    在進行恢復前,如果完整備份在遠程主機上,首先將完整備份復制到本地主機上,如果是tar包,則需要先解包,解包命令為:tar –izxvf dbbackup20110809.tar,這里必須使用-i參數。然后停止mysql數據庫并刪除欲恢復的數據庫文件夾,如:

    [plain]?view plain?copy

  • service?mysql?stop??

  • ??

  • rm?/var/lib/mysql/test?–rf??

  • 然后將備份文件中的日志應用到備份文件中的數據文件上

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--apply-log?/mysqlbackup/full/2011-08-09_14-50-20/??

  • 這里的--apply-log指明是將日志應用到數據文件上,完成之后將備份文件中的數據恢復到數據庫中:

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--copy-back?/mysqlbackup/full/2011-08-09_14-50-20/??

  • 這里的—copy-back指明是進行數據恢復。數據恢復完成之后,需要修改相關文件的權限mysql數據庫才能正常啟動。

    [plain]?view plain?copy

  • chown?mysql:mysql?/var/lib/mysql/ib*??

  • ??

  • chown?mysql:mysql?/var/lib/mysql/test??

  • ??

  • service?mysql?start??

  • 注意:這里我雖然指定的是test數據庫,但實際上如果其他數據庫中也有InnoDB表,那么這些InnoDB表中的數據也會被恢復了。

    增量備份恢復:

    增量備份恢復的步驟和完整備份恢復的步驟基本一致,只是應用日志的過程稍有不同。增量備份恢復時,是先將所有的增量備份挨個應用到完整備份的數據文件中,然后再將完整備份中的數據恢復到數據庫中。命令如下:

    應用第一個增量備份

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--apply-log?/mysqlbackup/full/2011-08-09_14-50-20/?--incremental-dir=/mysqlbackup/trn/2011-08-09_15-12-43/??

  • 應用第二個增量備份

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--apply-log?/mysqlbackup/full/2011-08-09_14-50-20/?--incremental-dir=/mysqlbackup/trn/2011-08-05_15-15-47/??

  • 將完整備份中的數據恢復到數據庫中

    [plain]?view plain?copy

  • innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--copy-back?/mysqlbackup/full/2011-08-05_14-50-20/??

  • 其中,--incremental-dir指定要恢復的增量備份的位置

    相關原理

    完整備份的原理:

    對于InnoDB,XtraBackup基于InnoDB的crash-recovery功能進行備份。

    crash-recovery是這樣的:InnoDB維護了一個redo log,又稱為 transaction log,也叫事務日志,它包含了InnoDB數據的所有改動情況。InnoDB啟動的時候先去檢查datafile和transaction log,然后應用所有已提交的事務并回滾所有未提交的事務。

    XtraBackup在備份的時候并不鎖定表,而是一頁一頁地復制InnoDB的數據,與此同時,XtraBackup還有另外一個線程監視著transactions log,一旦log發生變化,就把變化過的log pages復制走(因為transactions log文件大小有限,寫滿之后,就會從頭再開始寫,新數據可能會覆蓋到舊的數據,所以一旦變化就要立刻復制走)。在全部數據文件復制完成之后,停止復制logfile。

    XtraBackup采用了其內置的InnoDB庫以read-write模式打開InnoDB的數據文件,然后每次讀寫1MB(1MB/16KB=64page)的數據,一頁一頁地遍歷,同時用InnoDB的buf_page_is_corrupted()函數檢查此頁的數據是否正常,如果正常則進行復制,如不正常則重新讀取,最多重讀10次,如果還是失敗,則備份失敗退出。復制transactions log的原理也是一樣的,只不過每次讀寫512KB(512KB/16KB=32page)的數據。

    由于XtraBackup其內置的InnoDB庫打開文件的時候是rw的,所以運行XtraBackup的用戶,必須對InnoDB的數據文件具有讀寫權限。

    由于XtraBackup要從文件系統中復制大量的數據,所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據(因為這些數據不會重用到了),從而提升性能。如果要緩存的話,大量的數據會對OS的虛擬內存造成很大的壓力,其它進程(如mysqld)很有可能會被swap出去,這樣就出問題了。同時,XtraBackup在讀取數據的時候還盡可能地預讀。

    由于不鎖表,所以復制出來的數據是不一致的,數據的一致性是在恢復的時候使用crash-recovery進行實現的。

    對于MyISAM,XtraBackup還是首先鎖定所有的表,然后復制所有文件。

    增量備份的原理:

    在完整備份和增量備份文件中都有一個文件xtrabackup_checkpoints會記錄備份完成時檢查點的LSN。在進行新的增量備份時,XtraBackup會比較表空間中每頁的LSN是否大于上次備份完成的LSN,如果是,則備份該頁,并記錄當前檢查點的LSN。

    其他

    目前XtraBackup的最新版本是1.6.2,但是我下載了1.6.2的rpm包xtrabackup-1.6.2-274.rhel5.i386,在CentOS5.5上安裝后,發現在恢復時有點問題。

    不指定數據庫的配置文件時(數據庫的配置文件為默認的/etc/my.cnf),執行命令

    [plain]?view plain?copy

  • innobackupex?--copy-back?/mysqlbackup/full/2011-08-09_14-09-43/??

  • 會報錯:

    [html]?view plain?copy

  • InnoDB?Backup?Utility?v1.5.1-xtrabackup;?Copyright?2003,?2009?Innobase?Oy??

  • ??

  • and?Percona?Inc?2009-2011.??All?Rights?Reserved.??

  • ??

  • ???

  • ??

  • This?software?is?published?under??

  • ??

  • the?GNU?GENERAL?PUBLIC?LICENSE?Version?2,?June?1991.??

  • ??

  • ???

  • ??

  • IMPORTANT:?Please?check?that?the?copy-back?run?completes?successfully.??

  • ??

  • ???????????At?the?end?of?a?successful?copy-back?run?innobackupex??

  • ??

  • ???????????prints?"completed?OK!".??

  • ??

  • ???

  • ??

  • Can't?exec?"autodetect":?No?such?file?or?directory?at?/usr/bin/innobackupex?line?1972.??

  • ??

  • innobackupex:?fatal?error:?no?'mysqld'?group?in?MySQL?options??

  • ??

  • innobackupex:?fatal?error:?OR?no?'datadir'?option?in?group?'mysqld'?in?MySQL?options??


  • 指定數據庫的配置文件時,執行命令

    [plain]?view plain?copy

  • innobackupex?--defaults-file=/etc/my.cnf?--copy-back?/mysqlbackup/full/2011-08-09_14-09-43/??

  • 會報錯:

    [plain]?view plain?copy

  • InnoDB?Backup?Utility?v1.5.1-xtrabackup;?Copyright?2003,?2009?Innobase?Oy??

  • ??

  • and?Percona?Inc?2009-2011.??All?Rights?Reserved.??

  • ??

  • ???

  • ??

  • This?software?is?published?under??

  • ??

  • the?GNU?GENERAL?PUBLIC?LICENSE?Version?2,?June?1991.??

  • ??

  • ???

  • ??

  • IMPORTANT:?Please?check?that?the?copy-back?run?completes?successfully.??

  • ??

  • ???????????At?the?end?of?a?successful?copy-back?run?innobackupex??

  • ??

  • ???????????prints?"completed?OK!".??

  • ??

  • ???

  • ??

  • sh:?autodetect:?command?not?found??

  • ??

  • innobackupex:?fatal?error:?no?'mysqld'?group?in?MySQL?options??

  • ??

  • innobackupex:?fatal?error:?OR?no?'datadir'?option?in?group?'mysqld'?in?MySQL?options

  • 本文出自http://blog.csdn.net/yongsheng0550/article/details/6682162

    轉載于:https://blog.51cto.com/lookingdream/1904820

    總結

    以上是生活随笔為你收集整理的使用xtrabackup对MySQL进行备份和恢复的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。