mysql mariadb 备份恢复、主从
备份类型分为:
完全备份、增量备份、差异备份
热备、温备、冷备
逻辑备份、物理备份
每种类型区别:
增量备份:根据上一次备份的增量备份或完全备份备份
差异备份:根据上一次备份的完全
温备:备份过程中只支持读备份备份
热备:备份过程中支持读写
冷备:停服务备份
逻辑备份:schema和数据存储在一起,巨大的sql语句、单个巨大的备份文件,恢复备份较慢。优点可以还原于任何数据库引擎中(当数据文件达到G级别不建议使用)。
物理备份:相当于直接复制数据文件、备份速度较快恢复也较快,但只支持还原于相同数据库引擎中。
备份工具:
mysqldump:完全备份+备份2进制文件完成增量备份(热备是靠巨大的事务完成,数据量较大时速度慢,不建议使用) 逻辑备份。
lvm2:使用lvm快照功能实现备份,缺点需要锁表后执行快照功能以实现备份 物理备份。
xtrabackup:完全备份+增量备份,数据文件G级别以上建议使用此方法 物理备份。
…还有很多。
任何备份方式均不能实现时间点还原,因此,如果需要基于时间点还原需要配合二进制日志文件执行。
这里只演示用mysqldump和xtrabackup实现备份以及还原。
这里可以看到我有一个名为hellodb的库,库里面有一张students表,我就备份此表好了
-E:备份指定库的事件调度器
-R:备份存储过程和存储函数
–triggers:备份触发器
–master-data=2:指定此事件记载的2进制文件开始位置,及哪个文件
–flush-log:滚动一下日志,以方便用二进制日志文件进行时间点还原
–single-transaction:mysqldump热备时需要执行此选项,备份是启用一个大的事务完成的备份(在常用的两种数据库引擎中,myisam仅支持温备,innodb支持热备)
–databases:指定备份哪一个数据库
还实际工作中,我们还应该备份一下数据库的配置文件
接着我们就可以看一下我们备份出来的数据了
这里箭头所指出很重要,指明了此次备份完成后,二进制文件的截止事件位置,可以看到是一个新文件,而且处于刚开始的位置,这也是我们之前为什么要执行–flush-log的原因了,到时候我们根据时间点还原,不用去从哪个文件中间重读一遍。(当然这一切得先开启二进制文件)
现在我们在去删几条数据
我已经删了stuid为20-25之间的,也确实少了,现在假设存放数据的磁盘损坏了,并且二进制日志我们保存在其他位置(我们单独将二进制文件复制出来。)
我删除了数据目录下的所有文件(二进制文件已经备份出来了哦~)
接着我们重启mariadb,并且恢复备份的数据
可以看到我们之前备份出来的确实已经还原了,但连我们之前删除的stuid为20-25的也恢复出来了,接着我们继续做时间点还原
–start-positon=245: 指明开始重读的时间,之前已经提过了
另外我是CP二进制日志文件出来再TMP目录下的,实际应用过程中记得把二进制文件和数据文件分磁盘放!!!!!!!!!(另外二进制文件实际上都是写sql语句,以后如果需要修改什么可以直接修改在恢复),mysqldump的增量备份只有靠备份二进制文件来完成,这里就不演示了,已经演示了二进制日志还原了,无非就是每天flush-log一次然后直接CP命令复制出来即可
接着来xtrabackup
xtrabackup 是percona公司开源的项目,并没有收录进epel源中,需要在官网自行下载 https://www.percona.com/
发现在centos7的epel源中有一个测试版本??? 不过我已经在官网下了并且安装上了,就不管他了。
接着把数据库恢复最先的状态
就在此状态下,我在此备份一次
直接–databases指明备份哪个库,到哪个位置即可
最后我们看见completed ok!就代表成功了~ (另外这里提一句使用innobackupex,执行任何备份、恢复操作在结束处都应该见到complete ok,即代表成功)
接着我们就在来改动一下并进行增量备份
新建了一张表,并且插入了两条数据,接着去进行增量备份吧
–incremental:指明这次增量备份
–incremental-basedir:指明以那一次为基础的增量
另外可以在备份出来的目录里面看见type 一个为FULL 一个为increment (并且xtrabackup是根据名为LSN的序列号进行增量备份的,可以看见上图两个备份是完全接上的)
接着就可以去删数据目录了
先给完全备份进行事务的提交,这里只做了提交,因为我们后面还有增量备份,不一定需要回滚,说不定下个增量备份里面未提交的事务就已经提交了哟~ (另外此项操作其实可以不做,上问就提到过了xtrabackup属于物理备份,直接备份出来了文件,mariadb在启动时会自动进行事务的回滚和提交)
接着需要把增量备份给他重建只完全备份上!
–incremental-dir:指明增量备份是哪一个,其他选项和上面介绍的一样
查看完全备份的checkpoints文件,可以看到最后记录的lsn号码已经是增量备份的了,接着可以拿去还原了~
在次提醒 以上所有操作 均需在末尾见到“complete ok” 即代表成功
–copy-back:代表还原,要注意的是指明的目录为完全备份的目录,并且同样要看到complete ok
这里需要注意!! 在还原之前确定数据目录必须为空!!!否则还原报错, 还原过后注意权限是否正常,否则启动数据库报错!!!!
整个增量备份就是这样 ~ 完成了,另外如果需要进行时间点还原,仍然依赖二进制文件,步骤同上面的一样 就不演示了,至此备份恢复就到这
——————————————————————————————————————————————————————————————————————————————–
mysql主从
主服务器工作流程:
主服务器的dump线程负责接收从服务器的二进制文件请求并发送给对方
从服务器工作流程
从服务器的I/O线程负责向主服务器请求二进制文件,并记录与中继日志文件中
从服务器的SQL线程负责读取中继文件中的sql语句,进行重放,以此达到数据同步的效果(上面备份的时候已经提到过了二进制文件记录的是所有sql语句,所以从服务器拿来过后进行重新运行一遍就OK了~)
另外主从服务器的server id 不可重复,二进制文件中会标明serverid mysql的工作机制遇到同样的serverid 是不会进行重放的,以此避免循环复制
了解完这些过后配置就仅仅只有几步就可完成
主服务器启用二进制文件
标明serverid
提供一个有复制权限的账号
从服务器启用中继日志
标明serverid
使用有复制权限的账号
启动复制线程
主服务器my.cfg配置
从服务器my.cfg配置
接着就可以继续了,接着授权一个账号
grant replication client,replication slave on *.* to repli@192.168.20.105 identified by ‘111’;
只授予复制客户端和从服务器请求,并只给予105这个ip 因为我的从服务器是此IP
changemaster 指明从服务器是哪一个 其他选项挺好理解的。
master_log_file:指明从主服务哪个二进制文件开始同步
master_log_pos:指明从此文件哪个position开始同步
在主服务器授权完后使用 show master status 看一看,
启动线程变查看是否启动,接着我们就可以去主服务器创建数据库查看是否能同步了~至此主从也完了~
但是需要思考客户端进行写操作过后是否需要从服务器同步完成过后,在响应客户端,不然万一客户端进行读操作时被前端调度到了从服务器,从服务器还未同步,客户端访问之前提交的操作发现居然没有,这就很尴尬啊。
这个问题其实只需要装2个插件就能解决
semisync_master.so
semisync_slave.so
一个是主服务器安装,一个是从服务器安装,这里我是使用的yum安装,自行就有这两个插件
INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
分别在主从上安装两个插件
安装完插件过后会看到变量中会多了几个参数,接着我们只需要分别在主从上把插件功能打开~如果需要设置等待的超时时长修改就可以了,记得先在从服务器停掉同步线程在进行
一切做完以后,我们可以查看具体同步进行的数据了~ 随便新建几个数据库
可以看到客户端有一个~ 平均同步时间875毫秒~ 同步总耗时3503,同步次数4次..等等~~~