liunx系统mysql全量备份和增量备份
前提
在互联网项目中最终还是读数据进行操作,都离不开曾删改查,那么数据是重中之重,数据库的备份就显得格外重要。
但是每次都直接导出整个数据库的sql文件,显然是不现实的。对数据库的性能影响比较大。
## mysql备份的三种方式
- 热备 : 不关闭mysql服务的情况下,请求可以继续操作数据库,实现备份
- 温备 : 不关闭mysql服务的情况下,支持读,不支持写,实现备份
- 冷备 : 关闭mysql服务的情况下,实现备份
备份的类型
* 全量备份 : 一次性备份整个数据库的数据结构为sql文件
* 增量备份 : 备份增量的日志文件,日志文件中有操作数据库数据结构的记录,我们可以使用这个来作为增量备份的恢复文件
问题
mysql mysqladmin: command not found
解决方案: ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin
原因是此命令没有在系统默认的默认目录下
说明:/usr/local/mysql/bin/mysqladmin 是mysql安装目录得bin/mysqladmin
mysqldump: command not found mysqldump命令不存在的问题
Linux中找不到mysqldump命令的原因:系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,当然会找不到命令。
解决方法:1、知道mysql命令或mysqldump命令的完整路径,可以使用find命令查找
# find / -name mysqldump -print
比如mysql的路径是:/usr/local/mysql/bin/mysqldump
2、映射一个链接到/usr/bin目录下,相当于建立一个软链接文件
# ln -s /usr/local/mysql/bin/mysqldump /usr/bin
此时再使用mysqldump命令就可以了
方案
1.mysqldump 是mysql中自带的一个备份工具
使用mysqldump备份数据库,使用mysqladmin备份数据日志,编写两个脚本一个全量备份数据库的脚本databak.sh,一个增量备份日志的脚本binlogbak.sh,使用crontab定时任务,每个星期日凌晨3:00执行完全备份脚本,周一到周六凌晨3:00做增量备份。
实践
1.mysql开启增量备份,在my.cnf添加 : log-bin=/usr/local
/mysql/mysql-bin
vim /usr/local/mysql/my.cnf
my.cof :
[mysqld]
port = 13336
skip-name-resolve
lower_case_table_names=1
tmp_table_size = 32M
max_connections=2000
max_allowed_packet=80M
wait_timeout=250
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#datadir=/mnt/www/data
#socket=/usr/local/mysql/mysql.sock
# 5.7及以上版本的话,不加server-id重启mysql服务会报错,5.7以下版本就不用加了
#所以必须添加server-id这个参数!随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了。
#slave_id值同Master_id值一样,必须为1到232–1之间的一个正整数值。并且,从服务器的ID必须与主服务器的ID不相同。例如:
#如果不指定一个server-id值,如果没有定义master-host,则将它设置为1;否则设置为2。请注意如果server-id太长,
#主服务器 拒绝所有来自从服务器的连接,并且从服务器拒绝连接到主服务器。这样,省略server-id只适合用二进制日志备份。
#日志前缀最好也不要一样,我试了几次,前缀一样也有可能报错
log-bin=mysql-bin
server-id=1
# 需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-do-db=welfare_matchmaker
[mysqldump]
max_allowed_packet= 400M
user=xxx
password="xxx"
[mysqladmin]
max_allowed_packet= 400M
user=xxx
password="xxx"
2.创建备份文件存放的路径
mkdir -p /mnt/www/mysql/backup
3.创建mysql全量备份的脚本
vim /mnt/www/mysql/databak.sh
databak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
#生成备份存放的目录
BakDir=/mnt/www/mysql/backup
LogFile=/mnt/www/mysql/backup/bak.log
#数据库名称
db_name='welfare_matchmaker'
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H时%M分%S秒"`
current_time=$(date +'%Y年%m月%d日 %H时%M分%S秒')
filepath=$BakDir$current_time'.sql.gz'
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
#此处没有使用 $db_password $db_user, 已经写入到配置文件中
echo '开始导出数据库...'
#/usr/local/mysql/my.cnf这个是mysql具体的配置文件,根据自己实际安装路径填写
mysqldump --defaults-extra-file=/usr/local/mysql/my.cnf $db_name > $DumpFile
echo '导出成功,文件名为: '$filepath
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
/mnt/www
/mysql/binlogbak.sh
如下,则为未开启
binlogbak.sh :
#!/bin/bash
export LANG=en_US.UTF-8
# 增量备份存放路径
BakDir=/mnt/www/mysql/backup/daily
# binlog存放路径
#(上面开启binlog的路径,忘记了就通过mysql show variables like '%log_bin%'; 进行查询)
BinDir=/usr/local/mysql/data
# binlog.index 文件路径
#(上面开启binlog的路径,忘记了就通过mysql show variables like '%log_bin%'; 进行查询)
BinFile=/usr/local/mysql/data/mysql-bin.index
# 日志文件
LogFile=/mnt/www/mysql/backup/daily/bak-daily.log
#数据库名称
db_name='welfare_matchmaker'
echo '开始导出数据库...'
# 将当前所有的日志写到磁盘,会新建一个00000*的binlog文件
mysqladmin --defaults-extra-file=/usr/local/mysql/my.cnf flush-logs
echo '导出成功'
#这个是用于产生新的mysql-bin.00000*文件
# 获取当前有几条binlog文件(需要保证是从1开始的)
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前面的./
# 遍历每个binlog文件,如果是最新的不做操作,否则备份
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添加执行权限
cd /mnt/www/mysql
chmod 777 binlogbak.sh databak.sh
6.开启定时任务
vi /etc/crontab
crontab:
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /mnt/www/mysql/databak.sh
>/mnt/www/mysql/log/databak.log 2>&1 &
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /mnt/www/mysql/binlogbak.sh >/mnt/www/mysql/log/binlogbak.log 2>&1 &
#粘贴下面的内容, 大家根据自己的需要更改就可以了
0 1,12 * * *
/mnt/www/mysql/databak.sh
# 每天凌晨1点,中午12点备份一次数据
i#大家可以先使用下面这条做为测试哦,1分钟跑一次,我们只需要查看 ll /data/backup/mysql 这个文件夹就好了
*/1 * * * *
/mnt/www/mysql/
binlogbak
.sh
使上述定时任务生效
crontab /etc/crontab
crontab的停止和启动命令
启动:/sbin/service crond start
停止: /sbin/service crond stop
查看定时任务
crontab -l