设为首页 收藏本站
查看: 851|回复: 0

[经验分享] Mysql备份工具xtraback全量和增量测试

[复制链接]

尚未签到

发表于 2016-10-10 07:36:16 | 显示全部楼层 |阅读模式
【转载】http://blog.iyunv.com/space.php?uid=25266990&do=blog&id=3314699
 
 
xtrabackup 是 percona 的一个开源项目,可以热备份innodb ,XtraDB,和MyISAM(会锁表)
 
官方网址http://www.percona.com/docs/wiki/percona-xtrabackup:start


    Xtrabackup是由percona开发的一个开源软件,此软件可以说是innodb热备工具ibbackup的一个开源替代品。这个软件是由2个部分组成的:xtrabackup和innobackupex。Xtrabackup专门用于innodb引擎和 xtraDB引擎;而innobackupex是专门用于myisam和innodb引擎,及混合使用的引擎。
一、安装
1、RPM安装:
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/RPM/rhel5/x86_64/percona-xtrabackup-debuginfo-2.0.0-417.rhel5.x86_64.rpm
  rpm -ivh –nodeps percona-xtrabackup-debuginfo-2.0.0-417.rhel5.x86_64.rpm
–nodeps(不检查软件间的依赖关系),因为安装xtrabackup需要mysql_client,但是我的是通过源码安装的。所以环境变量要设置正确
比如 exportPATH=$PATH:/usr/local/mysql/bin 如果mysql没有设置到PATH里会报错。
2、下载二进制源码包:
wgethttp://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz
tar-zxvf percona-xtrabackup-2.0.0.tar.gz
mv percona-xtrabackup-2.0.0 /usr/loca/xtrabackup
3、使用源代码方式安装
如果你想使用源代码方式安装的话,则会发现其安装方式有点古怪,这是因为它采用的在MySQL源代码上打补丁构建的方式。
tarzxf xtrabackup-0.8.tar.gz
cd xtrabackup-0.8
./configure
make
进行到这里时,千万别惯性使然接着make install,那样就会接着安装MySQL了,正确方法是接着:
cd innobase/xtrabackup/
make
make install
查看版本号:
DSC0000.jpg
mysqld配置文件:(多实例时备份必须要)

  • [mysqld]

  • innodb_data_home_dir            = /www/mysqldata/ibdata   #用来储存文件的数据

  • innodb_log_group_home_dir       = /www/mysqldata/iblogs

  • innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend

  • innodb_log_files_in_group = 2

  • innodb_log_file_size = 1G

注:文本测试中没有多实例,使用默认my.cnf。


二、xtrabackup备份和恢复
 
    Xtrabackup有两个主要的工具:xtrabackup、innobackupex。   xtrabackup只能备份InnoDB和XtraDB两种数据表,支持在线热备份,不会锁表 innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表,如果你的数据库里有innodb和myisam存储引擎,只能使用innobackupex备份。
*xtrabackup - 用于热备份innodb, xtradb表的工具,不能备份其他表。
*innobackupex - xtrabackup封装的perl脚本,提供了myisam表备份的能力。(能进行整库和数据表备份)。本文旨在介绍Xtrabackup工具对数据库进行增量备份实践。
1、innobackupex-1.5.1备份
 
在实施备份时,需要在数据库运行的情况下在线执行,并先提前建立用于备份的路径。

  • innobackupex[--defaults-file=/etc/my.cnf] –user=root [--host=192.168.10.198] [--password=xxx] [--port=3306]  /www/backup/ 2>/www/backup/backup.log

参数:
/www/backup/   #备份的目录
2>/www/backup/backup.log   #将备份过程中的输出信息重定向到/www/backup/backup.log
–slave-info #会记录复制主日志的复制点,便于重新做复制用。(用在备份从机器用)
xtrabackup_binlog_info  #存放binlog的信息。(binlog需要另外拷贝备份,如果需要binlog的话)
xtrabackup_checkpoints   #存放备份的起始位置和结束位置。
–-stream=tar  #告诉xtrabackup,备份需要以tar的文件流方式输出。
–-include='test'  #备份包含的库表,如例:意思是要备份test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:tableA & tableB,则写成:–-include='test.tableA|test.tableB';再如果test库下只有2个前缀是 table的表,你还可以写成:–-include='test.table*'。
–-throttle=500   #xtrabackup在备份过程中,IO操作比较多,因此需要限定一下IO操作。以免服务器压力过大,不过好像作用不太明显,也不知道是不是设置的还是过大。待测…
–-socket=/data/mysql/backup/mysql.sock  #指定mysql.sock所在位置,以便备份进程登录mysql
--apply-log
--redo-only
 
(1)、完整数据备份
例如:

  • mysql> showdatabases;


  • +--------------------+

  • |Database|

  • +--------------------+

  • |information_schema |

  • |jss                |

  • |my_db              |

  • |mysql              |

  • |test               |

  • +--------------------+

  • 5 rows inset(0.00 sec)

全量备份:

  • innobackupex  --defaults-file=/etc/my.cnf  /www/backup/

DSC0001.jpg
将在/www/backup/  目录下产生一个按当前日期时间命令的目录,如 2012-07-18_15-05-06,在恢复时,注意要先关闭服务器,并且将 datadir 的目录先清空,在恢复数据后一定需要重置该目录的权限。
模拟故障,具体操作如下:
/usr/local/mysql5/bin/mysqladmin  -uroot shutdown
mv/www/mysqldata  /tmp/
mkdir/www/mysqldata
应用全量备份:


  • innobackupex --apply-log /www/backup/2012-07-18_15-05-06/

DSC0002.jpg
 

  • innobackupex --copy-back /www/backup/2012-07-18_15-05-06/

DSC0003.jpg
ln-s /usr/local/mysql5/share/english /www/mysqldata/mysql/english  #恢复初始目录树,否则无法启动

chown-R mysql.mysql /www/mysqldata
/usr/local/mysql5/bin/mysqld_safe  --user=mysql &
DSC0004.jpg
提示,可以在备份时直接压缩以节约磁盘空间:

  • innobackupex  --defaults-file=/etc/my.cnf --stream=tar /www/backup/  |  gzip > /www/backup/compress/mysql_backup.tar.gz

不过注意解压需要手动进行,并加入 -i 的参数,否则无法解压出所有文件。

  • tar  zxfi  /www/backup/compress/mysql_backup.tar.gz

  • innobackupex --apply-log  /www/backup/compress

  • innobackupex --copy-back  /www/backup/compress

(2)Innobackupex针对某个库增量备份:
 
    增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备了。
全量备份:

  • innobackupex-1.5.1 --defaults-file=/etc/my.cnf  --databases="jss"  /www/backup/full/

DSC0005.jpg
登录到数据库,创建几个新的对象:

  • mysql> use jss;

  • Database changed

  • mysql> show tables;

  • +---------------+

  • | Tables_in_jss |

  • +---------------+

  • | j1            |

  • +---------------+

  • 1 row in set (0.00 sec)

  • mysql> truncate table j1;

  • Query OK, 0 rows affected (0.01 sec)

  • mysql> create table ja(id int);

  • Query OK, 0 rows affected (0.04 sec)

  • mysql> insert into ja values (1);

  • Query OK, 1 row affected (0.01 sec)

完整备份目录上做第一次增量备份


  • innobackupex-1.5.1--defaults-file=/etc/my.cnf  --databases="jss"   --incremental --incremental-basedir=/www/backup/full/2012-07-18_19-47-49/   /www/backup/inc

DSC0006.jpg
如果默认存储引擎是基于MyISAM,那么增量备份时备份的文件分别是.frm、.MYD、.MYI。
如果默认存储引擎是基于InnoDB,那么增量备份时备份的只会是.frm文件,我的配置文件所采用的是独立表空间。
在 /www/backup/rec/下会产生增量文件:
[iyunv@localhostjss]# cd /www/backup/inc/2012-07-18_19-55-17/
[iyunv@localhost2012-07-18_19-55-17]# ls -l
total384
-rw-r--r--1 root root    250 Jul 18 19:55backup-my.cnf
-rw-r-----1 root root 360448 Jul 18 19:55 ibdata1.delta
-rw-r-----1 root root     18 Jul 18 19:55ibdata1.meta
drwxr-xr-x2 root root   4096 Jul 18 19:55 jss
-rw-r--r--1 root root     13 Jul 18 19:55xtrabackup_binary
-rw-r--r--1 root root     26 Jul 18 19:55xtrabackup_binlog_info
-rw-r-----1 root root     81 Jul 18 19:55xtrabackup_checkpoints
-rw-r-----1 root root   2560 Jul 18 19:55xtrabackup_logfile.
[iyunv@localhost2012-07-18_19-55-17]# cd jss/
[iyunv@localhostjss]# ls -l
total28
-rw-r--r--1 mysql mysql   61 Jul 18 19:18 db.opt
-rw-r--r--1 mysql mysql 8556 Jul 18 19:18 j1.frm
-rw-rw----1 mysql mysql 8556 Jul 18 19:53 ja.frm

note:此过程仅影响XtraDB或基于InnoDB的表,其他带不同存储引擎的表会在增量备份出现时被完全复制

恢复过程也需要用到prepare
首先,提交事务必须重新执行每一个备份
然后,未提交事务必须回退

模拟故障
rm-rf  /www/mysqldata/jss
将完整备份中的数据恢复到数据库中

  • innobackupex-1.5.1   --defaults-file=/etc/my.cnf   --databases="jss" --apply-log /www/backup/full/2012-07-18_19-47-49/

DSC0007.jpg
第一个增量备份应用到完整备份

  • innobackupex-1.5.1--defaults-file=/etc/my.cnf   --databases="jss" --apply-log /www/backup/full/2012-07-18_19-47-49/  --incremental-dir=/www/backup/inc/2012-07-18_19-55-17/

DSC0008.jpg
在完整备份目录下会看到一个新增文件:
DSC0009.jpg
经过分析,原来是在prepare时,XtraBackup并没有将增量备份集中,属于新建对象的.frm文件复制到完整备份集目录,因此在执行copy-back时,这部分文件自然也就没有复制回数据文件路径。只有手动还原到datadir。
拷贝到datadir目录下
cp-rp  2012-07-18_19-47-48jss   /www/mysqldata/jss
进入datadir查看文件:
[iyunv@localhostbackup]# cd  /www/mysqldata
[iyunv@localhostmysqldata]# ls
ibdata1  ib_logfile0 ib_logfile1  jss  my_db mysql  test  xtrabackup_binlog_pos_innodb  xtrabackup_checkpoints
[iyunv@localhostmysqldata]# chown  -R mysql.mysql/www/mysqldata
重启mysql
DSC00010.jpg


2、xtrabackup备份详解
 
xtrabackup只备份InnoDB数据文件,表结构是不备份的,所以恢复的时候,你必须有对应表结构文件(.frm)
 mysql
 use jss;
 alter table j1 engine=innodb;
(1)全量备份及恢复
(使用xtrabackup,仅限InnoDB和xtradb表,且注意mysql配置文件my.cnf中“default_table_type = InnoDB”否则不成功)。

  • xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/backup/

执行两次:

  • xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  • xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

将数据库停掉,删除数据库下的ib*(ib开头的所有)文件。
DSC00011.jpg 将/www/backup/目录下的ib*文件拷贝到数据库目录。
  设置权限:
#chown mysql:mysql ib*
重启数据库后测试,是否成功。
[iyunv@localhost backup]# cp ib* /www/mysqldata/                                      
[iyunv@localhost backup]# chown  mysql.mysql /www/mysqldata/ib*                       
[iyunv@localhost backup]#/usr/local/mysql/bin/mysqld_safe --user=mysql &
[1] 1695
[iyunv@localhost backup]# 120719 15:56:19mysqld_safe Logging to '/www/mysqldata/localhost.localdomain.err'.
120719 15:56:19 mysqld_safe Starting mysqlddaemon with databases from /www/mysqldata
 
[iyunv@localhost backup]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.57-log MySQL CommunityServer (GPL)
 
Type 'help;' or '\h' for help. Type '\c' toclear the buffer.
 
mysql> use jss;
Database changed
mysql> select * from j2;
+------+
| id  |
+------+
|   2 |
+------+
1 row in set (0.01 sec)
 
注意,xtrabackup只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候,你必须有对应表结构文件(.frm)。
 
(2)增量备份及恢复
    再次强调,xtrabackup做增量仅限InnoDB和xtradb表,且注意mysql配置文件my.cnf中“default_table_type= InnoDB”否则不成功。
做增量前当然要先进行全量备份,在全量的基础上来进行增量。
首先进行全量备份。

  • xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/backup/

在全量备份的基础上进行增量。

  • xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/www/inc/1 --incremental-basedir=/www/backup/

(注:/www/inc/1/是每次都需修改的。比如第二次增量就改成/www/inc/ 2,当然可以写个脚本进行自动备份,备份脚本将陆续奉上......恢复的时候也是一样)
增量恢复。(步骤同全量恢复,只是在执行恢复命令的时候中间多一步)

  • xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  • xtrabackup --target-dir=/www/backup/  --prepare --incremental-dir=/www/inc/1

  • xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/www/backup/

  将数据库停掉,删除数据库下 /www/mysqldata/ibdata 的ib*表文件。将/www/backup/目录下的ib*文件拷贝到数据库目录/www/mysqldata/ibdata。
设置权限:
#chown mysql:mysql ib*
重启后测试。是否成功。



注:备份前先登录数据库,打开一个表看看记录条数,然后进行备份,然后再对表最终的记录进行修改,然后在备份,再测试。
 
三、innobackupex-1.5.1 xtrabackup 相结合
备份策略:
整库备份直接用innobackupex-1.5.1脚本。
只对InnoDB或xtradb表,进行备份直接用xtrabackup。
    由于xtrabackup不能备份表结构,所以备份时首先用innobackupex-1.5.1脚本对数据库进行整库备份。再用xtrabackup进行表备份。分别进行。恢复时也分别进行恢复。如果发生表结构丢失则先使用innobackupex-1.5.1进行恢复,然后再用xtrabackup恢复增量数据。用生成的文件ib*覆盖用innobackupex-1.5.1恢复后的ib*文件。
=======================================================================================
首先,innobackupex-1.5.1全备份:

  • innobackupex  --defaults-file=/etc/my.cnf  /www/backup/full/ 2> /www/backup//1.log

#会生成一个时间文件夹,这里假如是2012-7-20_15-57-44
然后,xtrabackup 做增量备份:

  • innobackupex-1.5.1--defaults-file=/etc/my.cnf--incremental --incremental-basedir=/www/backup/full/2012-7-20_15-57-44/  /www/backup/inc/1

恢复:
首先停掉数据库,备份二进制日志(如果有的话),然后删除数据库目录下的所有数据库文件.
cd /www/mysqldata
rm-rf * # 删除数据目录里的所有文件
恢复全量备份:

  • innobackupex-1.5.1  --apply-log /www/backup/full/2012-7-20_15-57-44/  # 应用日志

  • innobackupex-1.5.1  --copy-back /www/backup/full/2012-7-20_15-57-44/ # 拷贝文件

恢复增量备份:

  • xtrabackup --prepare --target-dir=/www/backup/full/2012-7-20_15-57-44 --incremental-dir= /www/backup/inc/1

将/www/backup/目录下的ib*文件拷贝到数据库目录
重启mysql服务。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-283694-1-1.html 上篇帖子: MySQL重复安装时一直提示服务启动失败的解决办法! 下篇帖子: Managing Hierarchical Data in MySQL(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表