【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
## 前提
在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要。
但是每次都直接导出整个数据库的sql文件,显然是不现实的。对数据库的性能影响比较大。
##
## mysql备份的三种方式
* 热备 : 不关闭mysql服务的情况下,请求可以继续操作数据库,实现备份
* 温备 : 不关闭mysql服务的情况下,支持读,不支持写,实现备份
* 冷备 : 关闭mysql服务的情况下,实现备份
## 备份的类型
* 全量备份 : 一次性备份整个数据库的数据结构为sql文件
* 增量备份 : 备份增量的日志文件,日志文件中有操作数据库数据结构的记录,我们可以使用这个来作为增量备份的恢复文件
# 方案
1.mysqldump 是mysql中自带的一个备份工具
使用mysqldump备份数据库,使用mysqladmin备份数据日志,编写两个脚本一个全量备份数据库的脚本databak.sh,一个增量备份日志的脚本binlogbak.sh,使用crontab定时任务,每个星期日凌晨3:00执行完全备份脚本,周一到周六凌晨3:00做增量备份。
# 实践
1.mysql开启增量备份,在my.cnf添加 : log-bin=/var/lib/mysql/mysql-bin
vim /etc/my.cnf
my.cof :
\[mysqld\]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
\# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
\# Settings user and group are ignored when systemd is used.
\# If you need to run mysqld under a different user or group,
\# customize your systemd unit file for mariadb according to the
\# instructions in http://fedoraproject.org/wiki/Systemd
\# enable log_bin
log-bin=/var/lib/mysql/mysql-bin
\[mysqld_safe\]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
\# include all files from the config directory
#
!includedir /etc/my.cnf.d
2.创建备份文件存放的路径
mkdir -p /home/mysql/backup
3.创建mysql全量备份的脚本
vim /home/mysql/databak.sh
databak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
BakDir=/home/mysql/backup
LogFile=/home/mysql/backup/bak.log
Date=\`date +%Y%m%d\`
Begin=\`date +"%Y年%m月%d日 %H:%M:%S"\`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
mysqldump -uroot -p123456 --databases test --flush-logs --delete-master-logs --single-transaction > $DumpFile
tar -czvf $GZDumpFile $DumpFile
rm $DumpFile
count=$(ls -l *.tgz |wc -l)
if \[ $count -ge 5 \]
then
file=$(ls -l *.tgz |awk '{print $9}'|awk 'NR==1')
rm -f $file
fi
#只保留过去四周的数据库内容
Last=\`date +"%Y年%m月%d日 %H:%M:%S"\`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
cd $BakDir/daily
rm -f *
4.创建mysql增量备份的脚本
vim /home/mysql/binlogbak.sh
binlogbak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
BakDir=/home/mysql/backup/daily
BinDir=/var/lib/mysql
LogFile=/home/mysql/backup/binlog.log
BinFile=/var/lib/mysql/mysql-bin.index
mysqladmin -uroot -p123456 flush-logs
#这个是用于产生新的mysql-bin.00000*文件
Counter=\`wc -l $BinFile |awk '{print $1}'\`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的。
for file in \`cat $BinFile\`
do
base=\`basename $file\`
#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
NextNum=\`expr $NextNum + 1\`
if \[ $NextNum -eq $Counter \]
then
echo $base skip! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BakDir
echo $base copying >> $LogFile
fi
fi
done
echo \`date +"%Y年%m月%d日 %H:%M:%S"\` Bakup succ! >> $LogFile
5.为databak.sh和binlogbak.sh添加执行权限
chmod 777 binlogbak.sh databak.sh
6.开启定时任务
vi /etc/crontab
crontab:
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /home/mysql/databak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /home/mysql/binlogbak.sh >/dev/null 2>&1
使上述定时任务生效
crontab /etc/crontab
查看定时任务
crontab -l
这是我的公众号 有最新的it咨询,和个人工作的记录:
![扫码_搜索联合传播样式-微信标准绿版.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODU1NzgxMy05YzcxMDlkZjgzMmJlOTc2LnBuZw?x-oss-process=image/format,png)
这是我的个人微信遇到问题欢迎,提问:
![微信图片_20190614200326.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODU1NzgxMy03NjJmYTFlOGFlOWZjMjk3LmpwZw?x-oss-process=image/format,png)
最后加上高质量的淘宝店:如有质量问题随时滴滴我,童叟无欺!
![微信图片_20191111194455.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xODU1NzgxMy1iZjlkMjQzYjg5OWIyYTA1LnBuZw?x-oss-process=image/format,png)
来源:oschina
链接:https://my.oschina.net/u/4115084/blog/3143529