一、常用的备份方式
物理备份缺点:
-跨平台性差,从Linux和Windows的Mysql文件不兼容
-备份时间长,数据冗余,占用较大的物理空间
Mysql自带的备份方式mysqldump缺点:
-效率较低,备份与恢复时间长,锁表
-在备份过程中,插入数据和更新删除操作被阻塞
谁都不希望在做备份的时候不允许访问数据库,这是不允许的,你在网上购物的时候难道希望突然之间读取不了商品信息吗?
为了解决常用备份的缺点,我们应该使用功能强大的专用于做数据备份的一些工具,例如Percona的Xtrabackup软件
Percona公司官网:https://www.percona.com/
二、Xtrabackup工具
-备份过程不锁表
-由Percona公司提供,专业啊
-两个组件:xtrabackup(C语言编写,支持Innodb/XtraDB),innobackupex(以Perl脚本封装xtrabackup,我们通过使用innobackupex来实现xtrabackup)
Xtrabackup安装:
下载地址:
- ]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
- ]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
- ]# rpm -qa | grep -i percona //看看装成功没
- percona-xtrabackup-24-2.4.7-1.el7.x86_64
Xtrabackup帮助手册:
innobackupex --help //查看简单帮助
man innobackupex //查看详细帮助
Innobackupex命令:
首先要明确innobackupex和xtrabackup的关系,你可以将innobackupex当做传话员而xtrabackup是真正帮你做事的
三、完全备份
备份命令:
用户名密码是登录mysql的用户密码,备份目录是你存放备份文件的目录
innobackupex --user 用户名 --password 密码 备份目录名 [选项]
恢复命令:
完全恢复分两部,准备恢复和拷贝数据
准备恢复:innobackupex --apply-log 备份目录名
执行恢复:innobackupex --copy-back 备份目录名
案例:
备份所有的数据到/allbak下,完全备份会将所有数据备份到allbak目录下
]# innobackupex --user root --password 123456 /allbak --no-timestamp
完全恢复的步骤:
1)删除当前数据库文件
2)准备恢复
3)执行恢复
4)文件夹赋权
首先你要停止mysqld服务并且清楚mysql文件下当前的文件,然后执行恢复命令.恢复完成之后要赋予文件权限
]#systemctl stop mysqld
]#rm -fr /var/lib/mysql/*
]#innobackupex --apply-log /allbak
]#innobackupex --copy-back /allbak
]#chown -R mysql:mysql /var/lib/mysql
四、增量备份
增量备份在完全备份的基础上备份数据(参照binlog日志),不需要停止mysql服务,并且单次备份数据较小
备份命令:
innobackupex --user 用户名 --password 密码 --incremental 增量目录名 --incremental-dir=完全备份目录名 [选项]
恢复命令
准备恢复:innobackupex --apply-log --redo-only --incremental 增量目录名 --incremental-dir=完全备份目录名
执行恢复:innobackupex --copy-back 增量目录名
案例:
每周的第一天进行完全备份,2-7执行增量备份
周一的完全备份
]# innobackupex --user root --password 123456 /allbak --no-timestamp
周2-7执行增量备份
]# innobackupex --apply-log --redo-only --incremental /newdir1 --incremental-dir=/allbak --no-timestamp
]# innobackupex --apply-log --redo-only --incremental /newdir2 --incremental-dir=/allbak --no-timestamp
.............
数据恢复:
]#systemctl stop mysqld
]#rm -fr /var/lib/mysql/*
]#innobackupex --apply-log --redo-only /allbak
]#innobackupex --apply-log --redo-only --incremental /allbak --incremental-dir = /newdir1
]#innobackupex --copy-back /allbak
]#chown -R mysql:mysql /var/lib/mysql
补充:你应该可以看出来增量备份的工作机制,即合并数据(选项--redo-only),以完全备份数据为核心,将增量备份数据合并到完全备份目录里,重新构建完全备份数据,所以你每次进行的增量备份都会改变完全备份目录中的数据.如果没有这个机制,如果你想恢复星期天的数据,你是不是要先恢复2-6的数据,因为你参照的标准是完全备份的数据,除非你每天都做完全备份.
所以按照增量备份的工作机制,如果你想恢复星期2到星期天的数据,(你丢失了这一个星期的数据),那么你需要做的是执行6次日志合并,即执行六次准备恢复的命令.
五、恢复单张表
XtraBackup软件也提供了恢复单张表的功能,主要是利用到了mysql目录下的.frm和.ibd文件
1.后缀名为.frm的文件:这个文件主要是用来描述数据表结构和字段长度灯信息
2.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
3.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
4.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
5.ibdata1文件:主要作用也是储存数据信息和索引信息
一个数据库表是由一个表结构文件(.frm),和表数据文件(.ibd)组成的,当你不小心删除了一个表,其实将.ibd中的数据文件清空了,如果你做了备份,只需要将这个文件替换掉就好了
XtraBackup在做备份的时候额外产生了两个文件*.exp和*.cfg,这两个文件用于将数据空间导入时使用,在导入成功后删除即可
1)执行删除数据命令
- [root@host50 ~]# mysql –uroot -p123456
- mysql> delete from db3.user2; //误删除数据操作
- mysql>
2) 删除表空间
- mysql> alter table db3.user2 discard tablespace;
3) 导出表信息
- [root@host50 ~ ]# innobackupex --apply-log --export /allbak
4) 拷贝表信息文件到数据库目录下
- [root@host50 ~]# cp /allbak/db3/user2.{cfg,exp,ibd} /var/lib/mysql/db3/
5) 修改表信息文件的所有者及组用户为mysql
- [root@host50 ~]# chown mysql:mysql /var/lib/mysql/db3/user2.*
6) 导入表空间
- mysql> alter table db3.user2 import tablespace;
7) 查看表记录
- mysql> select * from db3.user2;
8) 删除数据库目录下的表信息文件
- [root@host50 ~]# rm -rf /var/lib/mysql/db3/user2.cfg
- [root@host50 ~]# rm -rf /var/lib/mysql/db3/user2.exp