MySQL 日志管理、备份与恢复
1.数据库备份的分类
数据备份的重要性:备份的主要目的是灾难恢复;在生产环境中,数据的安全性至关重要;任何数据的丢失都可能产生严重的后果;造成数据丢失的原因(程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃)
(1)数据库备份的分类
(1)物理备份
直接对数据库的物理文件(数据文件、日志文件等)进行备份
物理备份方法:
冷备份(脱机备份):是在关闭数据库的时候进行的
热备份(联机备份):数据库处于运行状态,依赖于数据库的日志文件
温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作
(2)逻辑备份
对数据库对象(库、表)的数据以SQL语句的形式导出进行备份
(2)备份策略
完全备份:每次备份都备份完整的库或表数据
差异备份:只备份上一次完全备份后的更新数据
增量备份:只备份上一次完全备份或增量备份后的更新数据

(3)备份工具
tar压缩打包(完全备份,物理冷备)
mysqldump(完全备份,逻辑热备)
mysqlhotcopy(完全备份,逻辑热备,仅支持MyISAM和ARCHIVE引擎表)
二进制日志(增量备份)
PXB XtraBackup 、innobackupex(完全备份、增量备份,物理热备)
注:Xtrabackup中主要包含两个工具:xtrabackup:是用于热备份innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构。
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
2.MySQL完全备份与恢复
(1)MySQL完全备份
是对整个数据库、数据库结构和文件结构的备份
保存的是备份完成时刻的数据库
是差异备份与增量备份的基础
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复、占用大量的备份空间、备份与恢复时间长
(2)物理冷备
先关闭数据库,使用 tar 命令压缩打包备份数据库的数据目录和文件 mysql/data/



物理冷备做的数据迁移



(3)mysqldump 逻辑热备
mysqldump -u root -p密码 --databases 库1 [库2 ....] > XXX.sql #备份一个或多个指定的库及库中所有的表
mysqldump -u root -p密码 --all-databases > XXX.sql #备份所有库
mysqldump -u root -p密码 库名 > XXX.sql #只备份指定库中的所有表(不包含库对象本身)
mysqldump -u root -p密码 库名 表1 [表2 ....] > XXX.sql #只备份指定库中的一个或多个指定的表(不包含库对象本身)





(4)完全恢复
1)先登录数据库,再执行 source sql文件路径
(如果sql文件里只备份了表,需要先 use 切换库再执行 source)
2)mysql -u root -p密码 < sql文件路径
cat sql文件路径 | mysql -u root -p密码 #恢复库
mysql -u root -p密码 库名 < sql文件路径
cat sql文件路径 | mysql -u root -p密码 库名 #恢复表






3.MySQL增量备份与恢复
(1)增量备份
使用mysqldump进行完全备份存在的问题:备份数据中有重复数据;备份时间与恢复时间过长
是自上一次备份后增加/变化的文件或者内容
(1)增量备份特点
没有重复数据,备份量不大,时间短
恢复需要上次完全备份及完全备份之后所有的增量备份才.能恢复,而且要对所有增量备份进行逐个反推恢复
(2)MySQL没有提供直接的增量备份方法
可通过MySQL提供的二进制日志间接实现增量备份
MySQL二进制日志对备份的意义:二进制日志保存了所有更新或者可能更新数据库的操作;二进制日志在启动MySQL服务器后开始记录,并在文件达到max_binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件;只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。

通过刷新二进制日志实现增量备份
mysqladmin -u root -p密码 flush-logs
查看二进制日志内容
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二进制文件路径
使用二进制日志增量恢复
mysqlbinlog --no-defaults 二进制文件路径 | mysql -u root -p密码
二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式)






(2)增量恢复
(1)一般恢复
将所有备份的二进制日志内容全部恢复
(2)断点恢复
(1)基于位置恢复
数据库在某一时间点可能既有错误的操作也有正确的操作
可以基于精准的位置跳过错误的操作
mysqlbinlog --no-defaults --start-position='开始位置点' --stop-position='结束位置点' 二进制文件路径 | mysql -u root -p密码



(2)基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-datetime='YYYY-mm-dd HH:MM:SS' 二进制文件路径 | mysql -u root -p密码

(3)断点恢复的原则
如果要恢复到某条sql语句之前的所有数据,就stop在这个语句的位置点或时间点之前
如果要恢复某条sql语句及其之后的所有数据,就从这个语句的位置点或时间点开始start
4.你们公司数据库的备份是如何做的?
通过crontab 结合 数据库备份脚本 实现每周N 做一次全量/完全备份,其余每天做增量备份
全量/完全备份 mysqldump(逻辑备份) ;xtrabackup(PXB 物理备份)
增量备份 刷新二进制日志 xtrabackup(PXB)



浙公网安备 33010602011771号