小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复
1、安装软件仓库(不要问我为什么不用源码安装,好吧,其实我懒。)
|
1
2
3
4
5
6
7
8
|
wget https://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpmrpm -ivh percona-release-0.1-3.noarch.rpmrpm -ql percona-release /etc/pki/rpm-gpg/RPM-GPG-KEY-Percona /etc/yum.repos.d/percona-release.repo /usr/share/doc/percona-release-0.1 /usr/share/doc/percona-release-0.1/RPM-GPG-KEY-Perconayum -y install percona-xtrabackup |
2、备份策略及准备测试数据
采用先全备份加增量备份的方案。在利用xtrabackup对innodb表做备份工作时,建议mysql启用“innodb_file_per_table=1”变量且同时启用innodb_file_per_table = 1 innodb_expand_import = 1
这样使每表都有一个自己的表空间,不然很难进行单表备份和还原。还有二进制日志文件就不要与数据文件放在同一个目录了,你不想当数据丢失时,二进制日志也一同丢了。
测试数据:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
mysql> SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.5.36-log | +------------+ 1 row in set (0.00 sec) mysql> SHOW DATABASES; #创建了一个mydb1数据库 +--------------------+ | Database | +--------------------+ | information_schema | | mydb1 | | mysql | | performance_schema | | test | +--------------------+ mysql> SELECT * FROM mydb1.tb1; #表中只有一条数据 +----+------+------+ | id | name | age | +----+------+------+ | 1 | tom | 10 | +----+------+------+ |
创建备份数据存放目录:
|
1
2
3
|
mkdir -pv /backup/{fullbackup,incremental} #fullbackup 存放全备份数据 #incremental 存放增量备份数据 |
创建复制用户:
|
1
2
|
mysql> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkuser'@'localhost' IDENTIFIED BY '123456'; mysql> FLUSH PRIVILEGES; |
3、全备份数据
|
1
2
3
4
5
6
7
8
9
10
11
12
|
innobackupex --user=bkuser --password=123456 /backup/fullbackup/ #最后出现“150415 16:30:23 innobackupex: completed OK!”这样的信息表示备份完成 ls /backup/fullbackup/2015-04-15_16-30-19/ backup-my.cnf mysql xtrabackup_binary xtrabackup_logfile ibdata1 performance_schema xtrabackup_binlog_info mydb1 test xtrabackup_checkpoints cat /backup/fullbackup/2015-04-15_16-30-19/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 1644877 last_lsn = 1644877 compact = 0 |
4、增量备份数据
先做一些数据修改:
|
1
2
3
4
5
6
7
8
|
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('jack',20); mysql> SELECT * FROM tb1; #增加一条数据 +----+------+------+ | id | name | age | +----+------+------+ | 1 | tom | 10 | | 2 | jack | 20 | +----+------+------+ |
做第一次增量备份:
|
1
2
3
4
5
6
7
8
9
10
11
|
innobackupex --user=bkuser --password=123456 --incremental /backup/incremental/ --incremental-basedir=/backup/fullbackup/2015-04-15_16-30-19/ ls /backup/incremental/2015-04-15_16-42-00/ backup-my.cnf mydb1 test xtrabackup_checkpoints ibdata1.delta mysql xtrabackup_binary xtrabackup_logfile ibdata1.meta performance_schema xtrabackup_binlog_info cat /backup/incremental/2015-04-15_16-42-00/xtrabackup_checkpoints backup_type = incremental from_lsn = 1644877 #这是全备时的"to_lsn"值 to_lsn = 1645178 last_lsn = 1645178 compact = 0 |
再做数据修改:
|
1
2
3
4
5
6
7
8
9
|
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('jason',30); mysql> SELECT * FROM tb1; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 10 | | 2 | jack | 20 | | 3 | jason | 30 | +----+-------+------+ |
做第二次增量备份:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
innobackupex --user=bkuser --password=123456 --incremental /backup/incremental/ --incremental-basedir=/backup/incremental/2015-04-15_16-42-00/ #这里的"--incremental-basedir"是指向第一次增量备份的目录 ls /backup/incremental/2015-04-15_16-49-07/ backup-my.cnf mydb1 test xtrabackup_checkpoints ibdata1.delta mysql xtrabackup_binary xtrabackup_logfile ibdata1.meta performance_schema xtrabackup_binlog_info cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_checkpoints backup_type = incremental from_lsn = 1645178 #这是第一次增量的"to_lsn"值 to_lsn = 1645463 last_lsn = 1645463 compact = 0 |
再来做一次数据修改,以便演示根据二进制日志做时间点的恢复:
|
1
2
3
4
5
6
7
8
9
10
|
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('lucky',40); mysql> SELECT * FROM tb1; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 10 | | 2 | jack | 20 | | 3 | jason | 30 | | 4 | lucky | 40 | +----+-------+------+ |
5、恢复
5.1、数据破坏
|
1
2
|
service mysqld stop rm -rf /mnt/mydata/data/* #把数据目录数据全部删除 |
对于xtrabackup做数据恢复的理解:
xtrabackup做数据恢复与mysqldump这样的逻辑备份工作的恢复有很大的区别,xtrabackup进行数据恢复时需要把各个增量的数据备份与全备份的数据进行合并,
对每次增量备份的合并只能将已提交的事务进行重放(redo),对合备份的数据恢复也只能做redo操作,把各个增量都合并完成后再把没有提交的事务进行回滚(undo)操作,
合并完增量备份后,全备份的“xtrabackup_checkpoints”文件中的“last_lsn”应该是最后一次增量备份时的值,这些合并做redo的过程就是恢复数据前的准备工作(prepare)。
而真正在做数据恢复,建议先把全备和增量备份的文件都copy一份为副本,避免操作失误导致备份文件的损坏。
5.2、数据恢复的准备(prepare)工作
|
1
2
3
4
5
6
|
#准备全备份的数据 innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ #准备第一次增量数据 innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-42-00/ #准备第二次增量数据 innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-49-07/ |
|
1
2
3
4
5
6
|
cat /backup/fullbackup/2015-04-15_16-30-19/xtrabackup_checkpoints backup_type = full-prepared from_lsn = 0 to_lsn = 1645463 #这是最后一次增量备份的位置,到此数据已全部合并 last_lsn = 1645463 compact = 0 |
5.3、真正数据恢复
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
innobackupex --copy-back /backup/fullbackup/2015-04-15_16-30-19/ #仅一个“--copy-back”选项 ls /mnt/mydata/data/ ibdata1 mydb1 mysql performance_schema testchown -R mysql.mysql /mnt/mydata/data/ #修改恢复数据的属主与属组 service mysqld start Starting MySQL.. SUCCESS! mysql> SELECT * FROM mydb1.tb1; #检查数据 +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 10 | | 2 | jack | 20 | | 3 | jason | 30 | +----+-------+------+ #lucky信息还没有恢复 |
5.4、利用二进制日志文件基于时间点恢复
|
1
2
3
4
5
|
查看最后一次增量备份时的二进制日志文件及position信息:cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_binlog_info mysql-bin.000031 1665 mysqlbinlog --start-position=1665 /var/log/mysql_log/mysql-bin.000031 > /tmp/position.sql #用mysqlbinlog工具导出最后一次增量备份后的sql操作 |
|
1
2
3
4
5
6
7
8
9
10
11
12
|
导入数据:mysql> source /tmp/position.sql mysql> SELECT * FROM mydb1.tb1; +----+-------+------+ | id | name | age | +----+-------+------+ | 1 | tom | 10 | | 2 | jack | 20 | | 3 | jason | 30 | | 4 | lucky | 40 | +----+-------+------+ #数据全部恢复 |
6、总结
利用innobackupex工具可对在有混合存储引擎的场景下对数据库进行全备份,当是备份innodb表时innobackupex脚本内部会自动调用xtrabackup工具来进行备份操作,
在数据还原时应停止mysql实例,清空数据目录,然后先做prepare准备工作,第二步才是真正的数据还原(–copy-back),数据还原到数据目录后不要忘记修改数据目录的权限。
当然innobackupex工具也能实现对单库单表的导出、导出,如果是对Innodb表,那建议直接用xtrabackup工具,这样更直观的使用各个选项进行备份。
============================华丽分隔线(下面是重点)================================================
背景:在到第5.3步的时候,数据库启动失败。why、what、fuck。说好的一条龙服务?
痛定思痛,上日志。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
151216 11:16:20mysqld_safe Starting mysqld daemon with databases from /data/mysql151216 11:16:20 [Note] /usr/libexec/mysqld (mysqld 5.5.47-log) starting as process 2931 ...151216 11:16:20 [Note] Plugin 'FEDERATED' is disabled.151216 11:16:20 InnoDB: The InnoDB memory heap is disabled151216 11:16:20 InnoDB: Mutexes and rw_locks use GCC atomic builtins151216 11:16:20 InnoDB: Compressed tables use zlib 1.2.3151216 11:16:20 InnoDB: Using Linux native AIO151216 11:16:20 InnoDB: Initializing buffer pool, size = 128.0M151216 11:16:20 InnoDB: Completed initialization of buffer poolInnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes #这里是48MInnoDB: than specified in the .cnf file 0 5242880 bytes! #这里是5M151216 11:16:20 [ERROR] Plugin 'InnoDB' init function returned error.151216 11:16:20 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. #注册引擎失败,打击好大151216 11:16:20 [ERROR] Unknown/unsupported storage engine: innodb #什么,又不支持innodb151216 11:16:20 [ERROR] Aborting 151216 11:16:20 [Note] /usr/libexec/mysqld: Shutdown complete 151216 11:16:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended |
首先我删除了恢复到/data/mysql目录下面的ibdata1和ib_logfile0、ib_logfile1,此时可以启动数据库,然而提示表不存在。
向各位老师请教后,修改innodb_log_file_size=48M并写入/etc/my.cnf,启动正常。
总结:innodb_log_file_size参数属于mysql系统参数,当配置不当时,mysql会启动失败。使用xtrabackup备份时默认值是5M,但是当迁移到新的环境后,初始化为48M,导致不匹配。后续应该将此参数写入/etc/my.cnf防止迁移带来的参数不匹配问题。
转载:linux运维部落 » 小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复
小型网站MYSQL问题二:Percona Xtrabackup实现数据库备份和恢复的更多相关文章
- 我的MYSQL学习心得(十四) 备份和恢复
我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- mysql如何用jsp代码进行数据库备份
mysql如何用jsp代码进行数据库备份 //导出 String mysql="mysqldump -uroot -proot --opt databasename > d:/test ...
- mysql 从陌生到熟练之----数据库备份恢复的实现方法
mysql 从陌生到熟练之----数据库备份恢复的实现方法 MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:roo ...
- mysql数据库-备份与还原-Percona XtraBackup 2.4备份工具使用
目录 xtrabackup 特点 备份生成的相关文件 xtrabackup 安装 xtrabackup 用法 1 备份 2 预备份 3 还原 4 其他 还原注意事项 xtrabackup实现完全备份及 ...
- 【mysql】使用xtrabackup在线增量备份及恢复数据库
一.Percona Xtrabackup 简介 1.Xtrabackup bin目录文件 介绍 1)innobackupex innobackupex 是xtrabackup的一个符号链接 . in ...
- mysql之使用xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉mysql再备份,一般很少用,因为很多应用不允许长时间停机,停机备份的可以直接CP数 ...
- mysql基础之数据库备份和恢复实操
一.基于二进制文件的恢复*** 1.算好要恢复数据的时间段,重定向输入到bin.sql文件中 [root@ren7 mysql]# mysqlbinlog --start-datetime=" ...
- xtrabackup进行物理备份、恢复、在线克隆从库、在线重做主从
http://www.lai18.com/content/4733997.html 注:图片来自<深入浅出MySQL 数据库开发 优化与管理维护 第2版> 物理备份和恢复 1.冷备份:停掉 ...
- mysql 数据库备份和恢复
物理备份对比逻辑备份 物理备份是指直接复制包含数据的文件夹和文件.这种类型的备份适用于大数据量且非常重要,遇到问题需要快速回复的数据库. 逻辑备份保存能够代表数据库信息的逻辑结构(CREATE DAT ...
随机推荐
- crc16算法,包括单片机和c#版本
c语言的#include <stdio.h> static short const wCRC16Table[256] = { 0x0000, 0xC0C1, 0xC181 ...
- ArcGIS ArcPy Python处理数据
1.使用搜索游标查看行中的字段值.import arcpy # Set the workspace arcpy.env.workspace = "c:/base/data.gdb" ...
- php导出excel(xls或xlsx)(解决长数字显示问题)
1)demo $titles = array('订单号','商品结算码','合同号','供应商名称','专柜','商品名称','商品货号','商品单价','商品总价','供应商结算金额','商品数量' ...
- hadoop程序MapReduce之MaxTemperature
需求:求每年当中最高的温度 样本:temp.log 2016080623 2016072330 2015030420 输出结果:2016 30 2015 20 MapReduce分析设计: Mappe ...
- Serlvet学习笔记之二—不同页面共享数据
一共有四种方法实现共享页面共享数据 1.cookie 2.sendRedirect 3.session 4.隐藏表单提交(form) 5.ServletContex 1.cookie:服务器在客户端保 ...
- java高级---->Thread之CompletionService的使用
CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...
- 【BZOJ3262】陌上花开 cdq分治
[BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...
- SHTML 教程
什么是 SHTML 使用SSI(Server Side Include)的html文件扩展名,SSI(Server Side Include),通常称为“服务器端嵌入”或者叫“服务器端包含”,是一种类 ...
- c# 计算文字高度
SizeF sizeF = g.MeasureString(listBox1.Items[e.Index].ToString(), e.Font, listBox1.Width);
- 证书:数字签名和验签&加密和解密
用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...