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

 

posted @ 2023-02-16 11:31  全琪俊  阅读(565)  评论(0编辑  收藏  举报