一:关于备份
备份目标:1,数据的一致性;2:服务的可用性
备份技术:物理备份/冷备份,直接复制数据库文件,适用于大型数据库环境,不收存储引擎的限制,但不能恢复到不同的MYSQL版本,优点是快,缺点是服务需要停止
逻辑备份/热备份,备份的是建表,建库,插入等操作所执行sql语句,适用于中小型数据库,服务不需要停止即可实行备份
备份种类:完全备份:每一次备份都是备份数据库中的所有数据。无论做哪一种备份都需要先做一次完全备份。
增量备份:每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
差异备份:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。
二:percona-xtrabackup
它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
1:安装percona-xtrabackup
下载地址是:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
yum install -y https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm #安装MySQL官方源
yum install -y yum-utils #安装yum工具
yum repolist all | grep mysql #查看mysql可用版本
yum-config-manager --disable mysql80-community #禁用80版本
yum-config-manager --enable mysql57-community #启用57版本
yum -y install mysql-community-libs-compat #安装MySQL兼容工具包,因为如果不安装后面安装xtrabackup会出现报错
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm #安装 Percona yum 存储库
yum -y install percona-xtrabackup-24.x86_64 #YUM安装percona-xtrabackup
rpm -ql percona-xtrabackup-24 #查新安装结果
到这里就安装完成了
2:完全备份流程
innobackupex --user=root --password='DaBai@123' /beifen/wanquanbeifen #完全备份示例
ls /beifen/wanquanbeifen #查看备份目录。数据库,配置文件,日志文件
cat /beifen/wanquanbeifen/2020-08-28_19-47-28/xtrabackup_binlog_info #观察二进制日志文件,开启二进制日志的方法在我上一篇文章里
systemctl stop mysqld #停止数据库
rm -rf /var/lib/mysql/* #删库。模拟数据库损坏,接下来进行完全还原
rm -rf /var/log/mysqld.log
innobackupex --apply-log /beifen/wanquanbeifen/2020-08-28_19-47-28/ #生成回滚日志
innobackupex --copy-back /beifen/wanquanbeifen/2020-08-28_19-47-28/ #恢复文件
chown -R mysql.mysql /var/lib/mysql /修改mysql文件的用户组和用户为mysql
systemctl start mysqld #启动MySQL服务
3: 增量备份流程
上面已经做了一个完整备份,下面我再次创建两个增量备份
mysql -uroot -p'DaBai@123' #进入数据库
create database test1; #创建一个数据库,库名为test1
innobackupex --user=root --password='DaBai@123' /beifen2/wanquanbeifen #备份,备份的目录在/beifen2/wanquanbeifen/ 中,
mysql -uroot -p'DaBai@123' #进入数据库
create database test2; #创建一个数据库,库名为test2
innobackupex --user=root --password='DaBai@123' --incremental /beifen2/wanquanbeifen --incremental-basedir=/beifen2/wanquanbeifen/2020-08-28_20-24-12 #增量备份,增量备份的目录在/beifen2/wanquanbeifen/ 中,增量备份文件是基于/beifen2/wanquanbeifen/2020-08-28_20-24-12 的日志文件
systemctl stop mysqld #停止数据库
rm -rf /var/lib/mysql/* #删库。模拟数据库损坏,接下来进行完全还原
innobackupex --apply-log --redo-only /beifen2/wanquanbeifen/2020-08-28_20-24-12/ #创建完全备份的回滚合并日志
innobackupex --apply-log --redo-only /beifen2/wanquanbeifen/2020-08-28_20-24-12/ --incremental-dir=/beifen/wanquanbeifen/2020-08-28_21-23-40 #合并2020-08-28_21-23-40备份文件到2020-08-28_20-24-12备份文件中
innobackupex --copy-back /beifen2/wanquanbeifen/2020-08-28_20-24-12/ #执行还原操作,进行还原2020-08-28_20-24-12就等于还原了两个备份文件,也就是test2被还原了
chown -R mysql.mysql /var/lib/mysql /修改mysql文件的用户组和用户为mysql
systemctl start mysqld #启动MySQL服务
如果有第三个依次做下去,先进入数据库,创建新的数据库,进行增量备份,停止数据库,删库,合并最新生成的备份文件到2020-08-28_20-24-12 中,还原该文件,修改用户组和用户,启动MySQL服务。
二:mysqldump + binlog 备份恢复
优势:1 自动记录日志position位置;2:可用性,一致性,锁表机制
语法:mysqldump -h服务器 -u用户名 -p密码 数据库名 >备份文件名.mysql
参数说明:库的范围:-A --all-databases 所有库 school 数据库名 school id name 是指school数据库下的表id,name
-B --databases aas bbs ccs 库的范围是多个数据库aas.bbs.ccs
--single-transaction #InnoDB 一致性 服务可用性
--master-data=1|2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释。1和2都可以
高级选项: --opt #同时启动各种高级选项;-R, --routines #备份存储过程和存储函数; -F, --flush-logs #备份之前刷新日志,截断日志。备份之后新binlog;--triggers #备份触发器
清理数据库test3,test2,只留下test,执行mysqldump备份。
mysql> drop database test2; #进入mysql界面实行删库操作
mysql> drop database test3;
mysqldump -h'localhost' -u'root' -p'DaBai@123' --all-databases --single-transaction --master-data=1 --flush-logs >/beifen/`date +%F-%H-%M`-all.sql #进行备份,master-data=1,注释掉日志记录
binlog 备份恢复
在完成备份之后,创建一个数据库,库名为test2,把所有的二进制日志文件全部进行备份,然后停库,删除数据库,模拟数据库损坏。数据库备份点到数据库崩溃点这一段时间的数据全在二进制日志里面,备份文件中没有,所以需要恢复二进制文件来恢复这中间的数据。
mysql -p'DaBai@123' < /backup/2020-08-29_19-24-12-mysql-all.sql #还原数据库
vim /backup/2020-08-29_19-24-12-mysql-all.sql #查看日志备份到那个日志文件
mysqlbinlog localhost-bin.000002 localhost-bin.000003 --start-position=154 | mysql -p'DaBai@123' #由于我是备份到localhost-bin.000002这个日志文件,所以我是从这里开始将后面的二进制日志文件往里面导入的