在线热备份有免费开源的,也收费的产品,在这里我们值讨论免费的产品,支持热备的的软件mysqlLVM以及接下来的这款 Xtrabackup;Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个 开源替代品。Xtrabackup由个部分组成:xtrabackup和innobackupex,其中xtrabackup工具用于备份innodb和 xtraDB引擎的表;而innobackupex工具用于备份myisam和innodb引擎的表,本文将介绍如何用innobackupex工具做全 量和增量备份。
<code>注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。</code>
<code><br data-filtered=</code><code>"filtered"</code><code>></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 > 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> </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> 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> 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></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> 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,如需转载请自行联系原作者