shell进行完整和增量备份mysql数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

文档介绍

本文档采用mysqldump对数据库进行备份,mysqldump是采用SQL级别的备份机制,它将数据表导成 SQL脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法,mysqldump比直接拷贝要慢些。

本文描述Mysql数据库的自动备份,包括完全备份和增量备份。其中,完全备份每周执行一次,增量备份每天都会执行。备份成功后会自动上传到FTP服务器。mysql需要开启二进制日志。


备份策略布置

把脚本放到/usr/bin 目录下面

1)、启用二进制日志

采用binlog的方法相对来说更灵活,省心省力,而且还可以支持增量备份。

启用binlog时必须要重启mysqld。首先,关闭mysqld,打开/etc/my.cnf,加入以下几行:

[mysqld]

log-bin

然后启动mysqld就可以了。运行过程中会产生HOSTNAME-bin.000001以及HOSTNAME-bin.index,前面的文件是mysqld记录所有对数据的更新操作,后面的文件则是所有binlog的索引,都不能轻易删除。关于binlog的更详细信息请查看手册。

2)、设置crontab任务,每天执行备份脚本

shell> vi /etc/crontab

添加以下:

0 00 * * * root /usr/bin/backap_mysql.sh

脚本如下:

#!/bin/bash 

#set -x 

#此脚本的主要用途是备份mysql服务器上的数据库。并且自动通过FTP上传到服务器。备份完后都会发送一封邮件。 

#变量说明 pass mysql账户口令,name mysql账户名称,DATA_DIR mysql存储路径,DATE 时间,MYSQL_BIN 是mysql命令路径, WAN_DIR 完全备份目录,ZENG_BACK 增量备份的目录。Host FTP服务器的IP,Username FTP账户口令,Passwd FTP账户名称, db_name 备份的数据库名, error_log 当天备份错误日志, backup_log 保存当天的备份日志,db 保存要备份的数据库名文件 

echo -e "此脚本的主要用途是备份mysql服务器上的数据库.并且自动通过FTP上传到服务器。"

Host=www.chlinux.net 

pass=chenqibin 

name=root 

DATE=`date +"%Y%m%d"` 

WAN_DIR="/wan_dir"

ZENG_BACK="/backup"

DATA_DIR="/usr/local/mysql/data"

MYSQL_BIN="/usr/local/mysql/bin"

error_log="$WAN_DIR/backup_error_$DATE.log"

backup_log="$ZENG_DIR/backup_$DATE.log"

gzdumpfile="$DATE.sql.tar.gz"

db="/var/log/backup_$DATE.txt"

cd $DATA_DIR 

ls -l $DATA_DIR | grep "^d" | awk -F " "'{print $9}' >>$db 

function wan() { 

#检测完全备份目录是否存在,如果不存在就创建。 

if [ -d $WAN_DIR ] 

then

    echo "完全备份目录存在" >>$backup_log 

else

    echo "完全备份目录不存在,开始创建......."

    /bin/mkdir $WAN_DIR 

fi 

eMailFile="$WAN_DIR/mail.log"

email=kelly@r2games.net 

    echo "       " > $eMailFile 

    echo "-----------------------" >> $eMailFile 

    echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile 

    echo "-------------------------" >> $eMailFile 

cd $WAN_DIR 

for dbname in $(cat $db) 

    do 

       mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql

        if [ $? = 0 ] 

then

             find $ZENG_BACK -name"*.log" -mtime +32 -exec rm -f {} \; >/dev/null 2>&1 

             cd $WAN_DIR  

             tar -zcvf $dbname.$gzdumpfile $dbname.sql 

             echo "Backup MySQL succeed" >>$eMailFile 

             mail -s "MySQL Backup" $email < $eMailFile 

else

             echo "Backup MySQL fail" >>$eMailFile 

             mail -s "MySQL Backup fail" $email < $eMailFile 

        fi 

    done 

#完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件 

find $ZENG_BACK -name"*.sql.tar.gz"--mtime +7 -exec rm -f {} \; >>$backup_log 

#将备份好的上传到FTP服务器 

cd $WAN_DIR 

for db_back in $(cat $db) 

do 

    ftp -nv $Host <<EOF 

user wolf "chenqibin"

    put $db_back.$gzdumpfile 

    quit 

EOF 

done 

function zeng() { 

/bin/mkdir /zeng_dir 

eMailFile="$ZENG_DIR/mail.log"

email=kelly@r2games.net 

echo "       " > $eMailFile 

echo "-----------------------" >> $eMailFile 

echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile 

echo "-------------------------" >> $eMailFile 

TIME=$(date"-d 10 day ago" +%Y-%m-%d %H:%M:%S)  

StartTime=$(date"-d 1 day ago" +"%Y-%m-%d %H:%M:%S") 

Start="--start-datetime"

#删除10天前的二进制文件 

mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile 

filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/"'{print $2}'` 

cd /zeng_dir 

for i in $filename 

do 

     echo "$StartTime start backup binlog" >> $eMailFile 

for db_name in $(cat $db) 

     do 

           mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql 

        if [ $? = 0 ] 

then

             cd /zeng_dir 

             tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql 

             echo "Backup MySQL succeed" >>$eMailFile 

             mail -s "MySQL Backup" $email < $eMailFile 

else

             echo "Backup MySQL fail" >>$eMailFile 

             mail -s "MySQL Backup fail" $email < $eMailFile 

        fi 

     done 

done 

find $ZENG_BACK -name "*.log" -name +32 -exec rm -f {} \; >/dev/null 2>&1 

cd /zeng_dir 

#删除上次备份的完整备份的文件 

find $WAN_DIR -name"*.tar.gz"--mtime +7 -exec rm -f {} \;

#将备份好的上传到FTP服务器 

for db_back in $(cat $db) 

do 

    ftp -nv $Host <<EOF 

user wolf "chenqibin"

    put $db_back.$gzdumpfile 

    quit 

EOF 

done 

backfile=`ls -l /wan_dir | wc -l` 

if [ $backfile != 0 ] 

then

    echo "完整备份已经存在,现在进行增量备份"

    sleep 10 

    zeng 

else

    echo "还没进行完整备份,现在进行完整备份"

    sleep 30 

    wan 

fi 

主要变量说明:

Host     #FTP的IP

pass     #FTP的密码

name     #FTP和mysql的用户名

DATE     #时间

WAN_DIR  #完整备份的目录

ZENG_BACK  #增量备份的目录

DATA_DIR   #mysql数据目录

error_log  #错误日志

gzdumpfile #压缩后的后缀名

db          #mysql数据库名

更多博文请移步:linux开源技术博客:http://www.chlinux.net/


有些朋友反应复制后脚本不能用,我已经把脚本上传到下载中心,提供免豆下载:下载地址 :http://down.51cto.com/data/762627 

1
<br>


本文转自1594cqb 51CTO博客,原文链接:http://blog.51cto.com/wolfchen/1162304,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
346 10
|
6月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
413 36
|
6月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
263 5
|
6月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
264 0
|
8月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
367 28
|
8月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
201 15
|
8月前
|
SQL Oracle 关系型数据库
在MySQL Shell里 重启MySQL 8.4实例
在MySQL Shell里 重启MySQL 8.4实例
227 2
|
关系型数据库 MySQL Shell
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
MySQL【实践 01】Linux 环境 MySQL 数据库备份 shell 脚本(脚本源码及说明+定时任务配置+数据库恢复测试)粘贴可以
350 0
|
SQL 关系型数据库 Shell
MySQL数据库备份的shell脚本
linux系统下 MySQL的备份脚本
1718 0
|
关系型数据库 MySQL Shell

推荐镜像

更多