一 备份分类
1 根据服务是否在线继续
热备份 读写均不受影响
温备份 仅可执行读操作/写操作
冷备份 也称离线备份 读写操作均终止
2 根据备份时是否直接复制数据文件
物理备份 直接复制数据文件 速度快
逻辑备份 将数据对象导出至文本文件中 速度慢 丢失浮点精度(sql语句) 但方便使用文本根据直接进行处理 可移植能力强
3 根据备份数据内容
完全备份 备份全部数据
增量备份 仅备份上次完全备份或增量备份以后变化的数据
差异备份 仅备份上次完全备份以来变化的数据
4 备份时间选择
数据访问量较小的时候做备份
二 备份工具
mysqldump mysql官方提供的逻辑备份工具 备份和恢复速度较慢 不太合适数据库>50G
备份:
表 mysqldump -u用户 -p密码 库名 表1 [表2 ...] > /path/tables.sql
库 mysqldump -u用户 -p密码 -B 库1 [库2...] > /path/databases.sql
全备 mysqldump -u用户 -p密码 -A > /path/all.sql
恢复:
表 mysql -u用户 -p密码 库名 < /path/tables.sql
库 mysql -u用户 -p密码 < /path/databases.sql
全备 mysql -u用户 -p密码 < /path/all.sql
常用选项:
-B 做库备份时指定索要备份的库
-A 全库备份
-x 给所有的表加锁
-F 备份后刷新日志(启动新的日志记录)
2 Xtrabackup
介绍 Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)
原理 备份开始时首先会开启一个后台检测进程,实时检测mysq redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,
之后复制innodb的数据文件,系统表空间文件ibdatax,复制结束后,执行flush tables with readlock,然后复制.frm MYI MYD等文件,
完成后执行unlock tables,最后停止xtrabackup_log,备份完成
版本兼容性 MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3及以上,安装指导参见官方文档Percona XtraBackup 2.3
MySQL 5.7版本需要安装 Percona XtraBackup 2.4及以上,安装指导参见官方文档Percona XtraBackup 2.4
MySQL 8.0版本需要安装 Percona XtraBackup 8.0,安装指导参见官方文档Percona XtraBackup 8.0
安装 yum -y install xtrabackup
全备 innobackupex --user=用户 --password=密码 /backup/
innobackupex --user=用户 --password=密码 --no-timestamp /backup/full/ 指定已有目录
全备还原 innobackupex --apply-log /backup/full 还原准备 以保证数据一致性
/etc/init.d/mysqld stop 停掉数据库
rm -rf /data/mysql/* 删除数据目录中所有数据
innobackupex --copy-back /backup/full 执行还原操作
可能出现问题:1)找不到datadir
vim /etc/my.cnf 设置datadir = /data/mysql/
2)还原后数据库起不来(无权限)
chown mysql.mysql -R /data/mysql
增量备份(先做全备) innobackupex --user=用户 --password=密码 --incremental /backup/(备份后存放路径) --incremental-basedir=/backup/1(备份起始文件)
innobackupex --user=用户 --password=密码 --incremental /backup/ --incremental-basedir=/backup/2
增备还原 innobackupex --apply-log --redo-only /backup/1 #合并,还原准备
innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/2
innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/3
/etc/init.d/mysqld stop
rm -rf /data/mysql/*
innobackupex --copy-back /backup/full
三 定时备份
每周的周日进行一次全备;周一到周六每天做上一天增量,每周轮询一次。
备份方案: xtrabackup全备+增量
[root@localhost ~]# crontab -l
0 3 * * 7 /root/allbak.sh &> /dev/null
0 3 * * 1-6 /root/newbak.sh &> /dev/null
[root@localhost ~]# cat allbak.sh
#!/bin/bash
[ ! -e /backup ]&& mkdir /backup #新建个文件夹专门放备份文件
day=date +%F #定义日期是时间
user=root
pass=123456
#用innobackupex做完全备份
innobackupex --user $user --password $pass /backup/allbak${day} --no-timestamp
#启用binlog日志,每次完全备份之后,每周刷新一遍binlog日志
mysql -u$user -p$pass -e "flush logs"
[root@localhost ~]# cat newbak.sh
#!/bin/bash
d1=date +%F #定义时间,用日期来区分
d2=date +%F -d "-1 days" #找到昨天的日期,好指明上一次备份的备份文件
dir1=/backup/allbak${d2} #昨天做的完全备份文件
dir2=/backup/newbak${d2} #昨天做的增量备份文件
user=root
pass=123456
[ ! -e /backup ]&& mkdir /backup #如果文件不存在,则创建文件夹
if [ -e ${dir1} ];then #判断昨天做的是完全备份 Y指定昨天备份的完全备份文件
innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir1} --no-timestamp
elif [ -e ${dir2} ];then #判断昨天做的是增量备份 Y指定昨天备份的增量备份文件
innobackupex --user $user --password $pass --incremental /backup/newbak${d1} --incremental-basedir=${dir2} --no-timestamp
else #昨天既没有做增量备份,又没有做完全备份,则做一次完全备份。
innobackupex --user $user --password $pass /backup/allbak${d1} --no-timestamp
fi