使用mysql提供的mysqldump备份,binlog日志备份的效率比较低。在数据备份的过程中会锁表。
Percona是mysql的一个分支,可以对mysql做热备份。备份时不锁表。
使用Percona可以做完全备份,增量备份。
Percona提供了两个备份命令:
1、xtrabackup:可以做完全备份,仅能对InnoDB、XtarDB存储引擎对增量备份。
2、innobackupex:在xtarbackup的基础上增加了对MYISAM存储引擎的增量备份。
安装percona:
rpm -ivh libev-4.03-3.el6.x86_64.rpm #安装percona依赖
yum -y install percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm #安装percona
完全备份:
完全备份:(192.168.4.50)
innobackupex --user root --password 123456 /fullbak --no-timestamp
# /fullbak表示了备份数据存放的位置
# --no-timestamp表名不在/fullbak下创建一备份时间为名字的目录
完全恢复:(192.168.4.51,目的主机也要安装percona)
1、把备份文件拷贝到目的主机
scp /fullbak root@192.168.4.51:/
2、清空数据库文件
rm -fr /var/lib/mysql/*
3、准备恢复数据
innobackupex--apply-log --redo-only /fullback
4、使用percona命令把数据拷贝到 /var/lib/mysql下
innobackupex --copy-back /fullback
5、拷贝完毕之后/var/lib/mysql下的所有文件的所有者都是root,因此要修改文件所有者
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysqld #重启服务
恢复单张表的数据:(192.168.4.50)
备份test数据库:
innobackupex --user root --password 123456 /table_bak --databases="test" --no-timestamp
# /table_bak表示了备份数据存放的位置
# --databases="test"指明了需要备份的数据库为test
# 可以是多个表:db1 db2 db3
# 可以是某个数据库下的表:db1.table1
# 如果没有这个字段则表示备份所有数据库
删除test数据库下的user表的数据:
mysql> delete from user;
恢复user表的数据:
1、删除表空间:
mysql> alter table test.user discard tablespace;
# 在/var/lib/mysql/test中有.ibd .rfm文件
# .ibd代表的是表空间文件,存放的是表的数据
# .rfm存放的是表的结构
2、在备份目录下导出表信息:
innobackupex --apply-log --export /table_bak
3、把导出的表信息拷贝到数据库目录下:
cp /allbak/test/user.{cfg,exp,ibd} /var/lib/mysql/test/
# .cfg .exp是备份相关文件
4、修改文件所有者:
chown mysql:mysql /var/lib/mysql/test/user*
5、导入表空间:
mysql> alter table test.user import tablespace;
6、删除无关文件
rm -rf /var/lib/mysql/test/user.cfg
rm -rf /var/lib/mysql/test/user.exp
# 不删除在之后会影响数据库工作
systemctl restart mysqld #重启服务
增量备份:第一次一定是完全备份,之后才可以增量备份
完全备份:(192.168.4.50)
innobackupex --user root --password 123456 /fullbak --no-timestamp
第一次增量备份:
nnobackupex --user root --password 123456 --incremental /inc_bak1 \
--incremental-basedir=/fullbak --no-timestamp
# --incremental /inc_bak1代表增量备份的目录是 /inc_bak1
# --incremental-basedir=/fullbak代表上一次备份的目录是/fullbak
第二次增量备份:
nnobackupex --user root --password 123456 --incremental /inc_bak2 \
--incremental-basedir=/inc_bak1 --no-timestamp
# --incremental /inc_bak2代表增量备份的目录是 /inc_bak2
# --incremental-basedir=/inc_bak1代表上一次备份的目录是/inc_bak1
增量恢复:(192.168.4.51,根据日志进行合并)
1、把相关备份文件拷贝到51主机上:
scp /fullbak root@192.168.4.51:/
scp /inc_bak1 root@192.168.4.51:/
scp /inc_bak2 root@192.168.4.51:/
2、清空数据库目录:
rm -fr /var/lib/mysql
3、准备恢复数据:
innobackupex --apply-log --redo-only /fullbak #准备恢复数据
4、合并日志:(由于做了两次增量备份,所以需要合并两次)
innobackupex --apply-log --redo-only /fullbak --incremental-dir=/inc_bak1 #合并日志
innobackupex --apply-log --redo-only /fullbak --incremental-dir=/inc_bak2 #合并日志
# 由于日志已经合并,所以删除增量备份,释放资源
rm-fr /inc_back1
rm -fr /inc_back2
5、使用percona命令把数据拷贝到 /var/lib/mysql下
innobackupex --copy-back /fullbak
6、修改/var/lib/mysql/*的所有者
chown -R mysql:mysql /var/lib/mysql
systemctl restart mysqld #重启服务
写总结的第三十六天!!!