众所周知,数据对于一个产品来说是非常重要的,特别是已上线的产品,为了产品的健壮性,首先保证数据的安全。防止数据被恶意删除等情况的出现。所以,我们定时对数据库数据进行备份;
一.什么是全量备份与增量备份?
全量备份:指对某一个时间点上的所有数据或应用进行的一个完全拷贝。实际应用中就是用一盘磁带对整个系统进行全量备份,包括其中的系统和所有数据。这种备份方式最大的好处就是只要用一盘磁带,就可以恢复丢失的数据。因此大大加快了系统或数据的恢复时间。然而它的不足之处在于,各个全备份磁带中的备份数据存在大量的重复信息;另外,由于每次需要备份的数据量相当大,因此备份所需时间较长。
增量备份:针对于上一次备份(无论是哪种备份):备份上一次备份后(包含全量备份、差异备份、增量备份),所有发生变化的文件。(增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,既:备份后标记文件,换言之,清除存档属性);就是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加和者被修改的文件,这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一盘磁带,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。
二,开始进行mysql备份操作
1.增量备份
在进行增量备份之前,我们需要先打开mysql的binlog功能;
mysql binlog 的功能,会记录所有的用户的操作,可以依靠这个,配合全备份,将数据库回滚到某一个特殊的时刻。hhh
简单来说,比如我们每周做一次全备份,每天做一次增量备份,当数据库发生问题的时候,我们就可以先将数据库回滚到上一周我们的全备份的时间,然后再通过每天的增量备份(其实就是模拟所有的数据库操作,全部执行一遍),将数据恢复到我们想要的时间点。
知道它的原理之后,我们先来打开mysql的binlog功能,
mysql 的 binlog 功能需要在配置文件中打开,在 my.cnf 或者 mysqld.cnf 中添加以下几行:
[mysqld]
skip-name-resolve
port = 3306
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_name=1
max_allowed_packet=16M
datadir=/pro/mysql/data
以下是需要添加的内容
#binlog setting,
log-bin=/pro/mysql/mysql-bin
server-id=12345
# 需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-do-db=db1
binlog-do-db=db2
# 不需要备份的数据库,如果备份多个数据库,重复设置这个选项即可
binlog-ignore-db=db1
重启mysql服务
service mysql restart
查看 logbin 是否开启,进入到 myslq 命令行,输入如下命令:
show variables like '%log_bin%';
如下命令所示,则为未开启
mysql> show variables like '%log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | OFF |
| log_bin_basename |
/pro/mysql |
| log_bin_index |
/pro/mysql/mysql-bin.index|
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------+
然后退出mysql;我们来编写增量备份 自动化脚本
首先。我们进入到自己放置脚本的目录
cd /pro/bin
创建一个 xx.sh脚本
vim mysql_daily.sh
配置以下内容:
-----------------------------------------------------------脚本内容--------------------------------------------------------------------------------------------------
# 增量备份存放路径
backDir=/pro/mysql/daily
# binlog存放路径
binDir=/pro/mysql/ (上面开启binlog的路径,忘记了就通过mysql
show variables like '%log_bin%'; 进行查询)
# binlog.index 文件路径
binIndex=/pro/mysql/mysql-bin.index (上面开启binlog的路径,忘记了就通过mysql
show variables like '%log_bin%'; 进行查询)
# 日志文件
logFile=/pro/mysql/daily/bak-daily.log
# 将当前所有的日志写到磁盘,会新建一个00000*的binlog文件
mysqladmin -uroot -phhxxttxs flush-logs
# 获取当前有几条binlog文件(需要保证是从1开始的)
count=`wc -l $binIndex | awk '{print $1}'`
nextNum=0
for file in `cat $binIndex`
do
# 获取文件名,去除文件夹名
base=`basename $file`
# 遍历每个binlog文件,如果是最新的不做操作,否则备份
nextNum=`expr $nextNum + 1`
if [ $nextNum -eq $count ]
then
echo $base skip! >> $logFile
else
dest=$backDir/$base
# file already exist
if(test -e $dest)
then
echo $base exist! >> $logFile
else
cp $binDir/$base $backDir
echo $base copyed >> $logFile
fi
fi
done
echo `date +"%Y%m%d %H:%M:%S"` Backup succ! >> $logFile
-------------------------------------------脚本内容结束----------------------------------------------------------
至此配置完成。测试启动一下该脚本
sh /pro/bin/mysql_daily.sh start
查看有没有产生备份
cd /pro/mysql/data/daily
ll
我们会看到里面有个
mysql-bin.000001。这个文件里面会记录所有的用户的操作,可以依靠这个,配合全备份,将数据库回滚到某一个特殊的时刻
2.全量备份
首先。我们进入到自己放置脚本的目录
cd /pro/bin
创建一个 xx.sh脚本
vim mysql_weekly.sh
配置以下内容(相关路径根据自己的实际情况而定)
-------------------------------------------------------------脚本内容-----------------------------------------------------------------------------------------
# 全备份路径
backDir=/pro/
mysql/data/weekly
# 日志文件
logFile=/pro/mysql/data/weekly/weekly_all.log
# 获取当前时间,用于命名
nowDate=`date +%Y%m%d`
beginTime=`date +"%Y%m%d %H:%M:%S"`
# 进入备份文件夹
cd $backDir
dumpFile=$nowDate.sql
dumpFileTgz=$nowDate.sql.tgz
# mysqldump 导出所有数据库
echo dumping...
mysqldump -uroot -ppwd --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $dumpFile
echo compressing...
# 压缩文件
tar czvf $dumpFileTgz $dumpFile
rm $dumpFile
endTime=`date +"%Y%m%d %H:%M:%S"`
echo begin:$beginTime end:$endTime $dumpFileTgz succ >> $logFile
# 清除之前的增量备份
cd /pro/
mysql/data/daily (你的增量备份路径)
rm -f *
----------------------------------------------脚本内容结束-------------------------------------------------------
测试运行该脚本之后,你会发现知道存储路径下面有个
XXX.sql.tz的压缩包
3.配置定时任务,去定时启动这2个脚本
输入如下命令,进入定时任务编辑界面:
crontab -e
添加如下命令(注意:linux的定时规则与spring的不同)
每天2点启动一次增量备份
0 2 * * * sh /pro/bin/mysql_daily.sh
0 2 5 * * sh /pro/bin/mysql_weekly.sh