天天看點

使用innobackupex線上增量備份及恢複mysql資料庫

線上熱備份有免費開源的,也收費的産品,在這裡我們值讨論免費的産品,支援熱備的的軟體mysqlLVM以及接下來的這款 Xtrabackup;Xtrabackup是由percona開發的一個開源軟體,它是innodb熱備工具ibbackup(收費的商業軟體)的一個 開源替代品。Xtrabackup由個部分組成:xtrabackup和innobackupex,其中xtrabackup工具用于備份innodb和 xtraDB引擎的表;而innobackupex工具用于備份myisam和innodb引擎的表,本文将介紹如何用innobackupex工具做全 量和增量備份。

<code>注意:innobackupex 增量備份僅針對InnoDB這類支援事務的引擎,對于MyISAM等引擎,則仍然是全備。</code>

<code>&lt;br data-filtered=</code><code>"filtered"</code><code>&gt;</code>

一、安裝解壓

1.安裝資料庫

<code>官網:http:</code><code>//www.percona.com</code>

<code>下載下傳位址:http:</code><code>//www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz</code>

<code>yum -y install mysql mysql-libs mysql-server MySQL-python</code>

2.建立資料庫

<code>create database dotatest;</code>

<code>mysql -uroot -p dotatest &gt; zhan_data.sql</code>

<code>python mysql_update.py --host localhost --user root --passwd </code><code>""</code> <code>--db dotatest</code>

<code>use</code> <code>dotatest;</code>

<code>show tables;</code>

<code>desc item;</code>

<code>insert into item (player, item, count) values (</code><code>1</code><code>, </code><code>1</code><code>, </code><code>1</code> <code>);    插入一條資料</code>

<code>insert into item (player, item, count) values (</code><code>2</code><code>, </code><code>2</code><code>, </code><code>2</code> <code>);</code>

<code>select * from item;</code>

3.安裝依賴包(如果安裝新版本需要安裝)

<code>yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt libgcrypt-devel perl-Time-HiRes</code>

4.解壓安裝

<code>[root@localhost home]# tar xf percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code><code>-</code><code>587</code><code>.tar.gz</code>

<code>[root@localhost home]# mysql --version</code>

<code>mysql  Ver </code><code>14.14</code> <code>Distrib </code><code>5.1</code><code>.</code><code>61</code><code>, </code><code>for</code> <code>redhat-linux-gnu (x86_64) using readline </code><code>5.1</code>

<code>[root@localhost percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code><code>]# pwd</code>

<code>/home/percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code>

<code>[root@localhost percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code><code>]# cp bin/</code>

<code>innobackupex        xbstream            xtrabackup_51       xtrabackup_56     </code>

<code>innobackupex-</code><code>1.5</code><code>.</code><code>1</code>  <code>xtrabackup          xtrabackup_55     </code>

<code>[root@localhost percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code><code>]# cp bin/innobackupex /usr/bin/</code>

<code>[root@localhost percona-xtrabackup-</code><code>2.0</code><code>.</code><code>8</code><code>]# cp bin/xtrabackup* /usr/bin/</code>

二、正常備份檔案以及對單個資料庫備份

<code>備份全部資料庫</code>

<code>[root@localhost /]# mkdir /home/data/backup/</code>

<code>[root@localhost /]# innobackupex --defaults-file=/etc/my.cnf --user=root  /home/data/backup/</code>

<code>--defaults-file 指定mysql的配置檔案</code>

<code>--user 指定使用者</code>

<code>/home/data/backup/ 備份檔案的路徑</code>

<code>需要注意的是 如果不指定--defaults-file 預設會讀取/etc/my.cnf。如果你的配置檔案是自定義的,那麼一定要指定目錄,然後會在目錄下建立一個時間戳的目錄(我們本次建立的/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code><code>)</code>

<code>檢視備份是否成功</code>

<code>[root@localhost /]# cd /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code><code>/</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code><code>]# pwd</code>

<code>/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code><code>]# ls</code>

<code>backup-my.cnf  ibdata1  test               xtrabackup_binlog_info  xtrabackup_logfile</code>

<code>dotatest       mysql    xtrabackup_binary  xtrabackup_checkpoints  zabbix</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_11-</code><code>08</code><code>-</code><code>23</code><code>]#</code>

<code>隻針對一個資料庫備份</code>

<code>--database 是指定需要備份的資料庫</code>

<code>[root@localhost ~]# innobackupex --user=root  --defaults-file=/etc/my.cnf --database=dotatest  /home/data/backup/</code>

三、正常恢複資料庫

恢複之前先停止資料庫,并且要删除資料和日志檔案

<code>01</code><code>.首先停止資料庫</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>]# /etc/rc.d/init.d/mysqld stop</code>

<code>Stopping mysqld:                                           [  OK  ]</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>]#</code>

<code>02</code><code>.備份删除mysql檔案</code>

<code>[root@localhost lib]# cp -a mysql/ mysql.bak</code>

<code>[root@localhost lib]# ls</code>

<code>alternatives  dav   dhclient  games             misc     mysql      nfs  plymouth  postfix  random-seed  rpm      stateles</code>

<code>authconfig    dbus  fprint    logrotate.status  mlocate  mysql.bak  ntp  polkit-</code><code>1</code>  <code>prelink  readahead    rsyslog  udev</code>

<code>[root@localhost lib]# cd mysql</code>

<code>[root@localhost mysql]# ls</code>

<code>dotatest  ibdata1  ib_logfile0  ib_logfile1  mysql  test  zabbix</code>

<code>[root@localhost mysql]# rm -rf *</code>

03.來恢複檔案

恢複檔案分兩步,

第1步是apply-log,為了加快速度,一般建議設定--use-memory,這個步驟完成之後,目錄/backup/mysql/data/2013-10-29_09-05-25下的備份檔案已經準備就緒。

因為我們的檔案比較少,是以我們不需要設定--user-memory産數檔案

第2步是copy-back,即把備份檔案拷貝至原資料目錄下。

<code>[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root  --apply-log /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/</code>

<code>[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/</code>

04.修改權限 啟動服務

[root@localhost lib]# chown mysql:mysql /var/lib/mysql/ -R

[root@localhost lib]# /etc/rc.d/init.d/mysqld start

Starting mysqld: [ OK ]

[root@localhost lib]#

四、配置增量備份

增量備份及其恢複

注意:innobackupex 增量備份僅針對InnoDB這類支援事務的引擎,對于MyISAM等引擎,則仍然是全備。

01.首先在資料庫插入一條資料

<code>mysql&gt; </code><code>use</code> <code>dotatest;</code>

<code>Reading table information </code><code>for</code> <code>completion of table and column names</code>

<code>You can turn off </code><code>this</code> <code>feature to </code><code>get</code> <code>a quicker startup </code><code>with</code> <code>-A</code>

<code>Database changed</code>

<code>mysql&gt; select * from item;</code>

<code>+----+--------+------+-------+</code>

<code>| id | player | item | count |</code>

<code>|  </code><code>1</code> <code>|      </code><code>1</code> <code>|    </code><code>1</code> <code>|     </code><code>1</code> <code>|</code>

<code>|  </code><code>2</code> <code>|      </code><code>2</code> <code>|    </code><code>2</code> <code>|     </code><code>2</code> <code>|</code>

<code>2</code> <code>rows </code><code>in</code> <code>set</code> <code>(</code><code>0.00</code> <code>sec)</code>

<code>mysql&gt; insert into item (player, item, count) values (</code><code>3</code><code>, </code><code>3</code><code>, </code><code>3</code> <code>);</code>

<code>Query OK, </code><code>1</code> <code>row affected (</code><code>0.00</code> <code>sec)</code>

<code>|  </code><code>3</code> <code>|      </code><code>3</code> <code>|    </code><code>3</code> <code>|     </code><code>3</code> <code>|</code>

<code>3</code> <code>rows </code><code>in</code> <code>set</code> <code>(</code><code>0.00</code> <code>sec)</code>

<code>mysql&gt;</code>

02.增量備份是基于一個資料庫的全部備份檔案的,在剛才我們備份了一個全備份,我們現在的增量備份就基于剛才的全部備份來做(2014-03-11_16-52-44)

需要注意如下兩個參數:

--incremental-basedir指向全備目錄;

--incremental指向增量備份的目錄;

<code>[root@localhost backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/ --incremental /home/data/backup/</code>

<code>……略……</code>

<code>innobackupex: Backup created </code><code>in</code> <code>directory </code><code>'/home/data/backup/2014-03-11_17-33-57'</code>

<code>innobackupex: MySQL binlog position: filename </code><code>''</code><code>, position</code>

<code>140311</code> <code>17</code><code>:</code><code>34</code><code>:</code><code>16</code>  <code>innobackupex: completed OK!</code>

03.檢視是否有備份檔案,最新的配置檔案就是我們剛才的增量備份檔案

<code>[root@localhost backup]# pwd</code>

<code>/home/data/backup</code>

<code>[root@localhost backup]# ls</code>

<code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code>  <code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code>

<code>[root@localhost backup]#</code>

<code>在如下的檔案中我們可以發現增量備份的檔案from_lsn剛好等于全部備份的to_lsn</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>]# cat xtrabackup_checkpoints    增量備份檔案</code>

<code>backup_type = incremental (增量備份)</code>

<code>from_lsn = </code><code>657645</code>

<code>to_lsn = </code><code>659090</code>

<code>last_lsn = </code><code>659090</code>   

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>]# cat ../</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/xtrabackup_checkpoints     全局備份</code>

<code>backup_type = full-prepared(全備)</code>

<code>from_lsn = </code><code>0</code>

<code>to_lsn = </code><code>657645</code>

<code>last_lsn = </code><code>657645</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>]#</code>

五、在增量備份的基礎上再做增量備份

<code>在備份之前我們在item表中再插入資料</code>

<code>mysql&gt; insert into item (player, item, count) values (</code><code>4</code><code>, </code><code>4</code><code>, </code><code>4</code> <code>);</code>

<code>Query OK, </code><code>1</code> <code>row affected (</code><code>0.03</code> <code>sec)</code>

<code>|  </code><code>4</code> <code>|      </code><code>4</code> <code>|    </code><code>4</code> <code>|     </code><code>4</code> <code>|</code>

<code>4</code> <code>rows </code><code>in</code> <code>set</code> <code>(</code><code>0.00</code> <code>sec)</code>

在增量備份的基礎上再做增量備份,我們需要添加如下參數

--incremental-basedir執行上一次增量備份的目錄

<code>如下備份:</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>/ --incremental /home/data/backup/</code>

<code>………中間部分略………</code>

<code>innobackupex: Backup created </code><code>in</code> <code>directory </code><code>'/home/data/backup/2014-03-11_18-03-54'</code>

<code>140311</code> <code>18</code><code>:</code><code>04</code><code>:</code><code>13</code>  <code>innobackupex: completed OK!</code>

<code>innobackupex: Backup created </code><code>in</code> <code>directory </code><code>'/home/data/backup/2014-03-11_18-10-13'</code>

<code>140311</code> <code>18</code><code>:</code><code>10</code><code>:</code><code>31</code>  <code>innobackupex: completed OK!</code>

然後來檢視lsn号來:

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_18-</code><code>10</code><code>-</code><code>13</code><code>]# cat xtrabackup_checkpoints</code>

<code>backup_type = incremental</code>

<code>from_lsn = </code><code>659090</code>

<code>to_lsn = </code><code>659214</code>

<code>last_lsn = </code><code>659090</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_18-</code><code>10</code><code>-</code><code>13</code><code>]# cat ../</code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>/</code>

<code>backup-my.cnf           ibdata1.meta            xtrabackup_binary       xtrabackup_logfile    </code>

<code>dotatest/               mysql/                  xtrabackup_binlog_info  zabbix/               </code>

<code>ibdata1.delta           test/                   xtrabackup_checkpoints</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_18-</code><code>10</code><code>-</code><code>13</code><code>]# cat ../</code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>/xtrabackup_checkpoints</code>

<code>[root@localhost </code><code>2014</code><code>-</code><code>03</code><code>-11_18-</code><code>10</code><code>-</code><code>13</code><code>]#</code>

六、恢複增量資料庫

<code>停止資料庫</code>

<code>[root@localhost backup]# /etc/rc.d/init.d/mysqld stop</code>

<code>備份資料庫</code>

<code>[root@localhost lib]# mv mysql mysql.bak.</code><code>2</code>

<code>[root@localhost lib]# pwd</code>

<code>/</code><code>var</code><code>/lib</code>

<code>[root@localhost lib]#</code>

這個恢複比恢複全部備份稍微複雜點,接下來我們來恢複,如果有多個增量備份,需要疊加就可以

<code>innobackupex --apply-log --redo-only BASE-DIR   BASE-DIR指完整的全部備份目錄</code>

<code>innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-</code><code>1</code>           <code>INCREMENTAL-DIR-</code><code>1</code><code>指第一次增量備份的目錄</code>

<code>innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-</code><code>2</code>                       <code>BASE-DIR指完整的全部備份目錄 INCREMENTAL-DIR-</code><code>2</code><code>第二次增量備份的目錄</code>

01.在我們的環境中我們來執行如下操作,因為我們隻有兩次的增量備份如下即可:

<code>innobackupex --apply-log --redo-only /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/</code>

<code>innobackupex --apply-log --redo-only /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code> <code>--incremental-dir=/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_17-</code><code>33</code><code>-</code><code>57</code><code>/</code>

<code>innobackupex --apply-log /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/ --incremental-dir=/home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_18-</code><code>10</code><code>-</code><code>13</code><code>/</code>

02.復原未完成的日志(需要注意的是恢複的時候,我們隻恢複全備份檔案就可以了)

<code>innobackupex --apply-log /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/</code>

<code>innobackupex --copy-back /home/data/backup/</code><code>2014</code><code>-</code><code>03</code><code>-11_16-</code><code>52</code><code>-</code><code>44</code><code>/</code>

03.授權啟動

<code>[root@localhost lib]# chown mysql:mysql /</code><code>var</code><code>/lib/mysql -R</code>

<code>[root@localhost lib]# /etc/rc.d/init.d/mysqld start</code>

<code>Starting mysqld:                                           [  OK  ]</code>

04.檢查備份是否回來

<code></code>

      本文轉自Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1603612,如需轉載請自行聯系原作者