mysql-automatic-backup-script.png

I. 主理人说

做好数据备份,是每个博客主的基本功。

利用 Dropbox的免费存储空间与API与Crontab程序自动备份,不费吹灰之力。本博客基于 LNMP ,想必大都如此,所以以下的脚本应该会适用大多数数据库情况;

辛辛苦苦劳作了一年,服务器炸了?我想最好提前抢救一下。

Ubuntu 18.04
MySQL 5.7

当前博客数据库以及图片资源已经完美的备份到了Dropbox;

MySQL-backup-to-Dropbox.png

数据库大小:5Mb
图片资源:2.4Gb

II. 备份思路(Dropbox)

自动备份数据库至Dropbox思路:利用 Crontab 程序,自动执行脚本:1.导出MySQL数据库文件至服务器本地某个文件夹->>2.执行Dropbox_uploader.sh 脚本将 已导出的MySQL数据库文件上传至 Dropbox;

III. 备份工具准备

1.Dropbox 账号;
2.利用数据库自动导出脚本 点此 查看完整脚本;
3.dropbox_uploader.sh 上传Dropbox脚本;
4.本文以名为 typecho 的数据库举例;

IV. 具体操作步骤

第一步 数据库导出到本地

typecho.mysql.sh 导出数据库脚本点此查看完整脚本;

#!/bin/bash

# 以下配置信息请自己修改
mysql_user="root" #MySQL备份用户
mysql_password="urpassword" #MySQL备份用户的密码
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8" #MySQL编码
backup_db_arr=("typecho") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
backup_location=/home/typecho.bak/  #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效

# 本行开始以下不需要修改
backup_time=`date +%Y%m%d%H%M`  #定义备份详细时间
backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd  #备份文件夹全路径
welcome_msg="Welcome to use MySQL backup tools!" #欢迎语

# 判断MYSQL是否启动,mysql没有启动则备份退出
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo "ERROR:MySQL is not running! backup stop!"
        exit
else
        echo $welcome_msg
fi

# 连接到mysql数据库,无法连接则备份退出
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end

flag=`echo $?`
if [ $flag != "0" ]; then
        echo "ERROR:Can't connect mysql server! backup stop!"
        exit
else
        echo "MySQL connect ok! Please wait......"
        # 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
        if [ "$backup_db_arr" != "" ];then
                #dbnames=$(cut -d ',' -f1-5 $backup_database)
                #echo "arr is (${backup_db_arr[@]})"
                for dbname in ${backup_db_arr[@]}
                do
                        echo "database $dbname backup start..."
                        `mkdir -p $backup_dir`
                        `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset >$backup_dir/$dbname-$backup_time.sql`
                        `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz`  
                        flag=`echo $?`
                        if [ $flag == "0" ];then
                                echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
                        else
                                echo "database $dbname backup fail!"
                        fi

                done
        else
                echo "ERROR:No database to backup! backup stop"
                exit
        fi
        # 如果开启了删除过期备份,则进行删除操作
        if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
                 #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
                 `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
                 echo "Expired backup data delete complete!"
        fi
        echo "All database backup success! Thank you!"
        exit
fi

## 导出数据库命令
# mysqldump -uroot -ppassword abc >db_abc.sql
# mysqldump -uroot -ppassword abc | gzip > db_abc.sql.tar.gz
# mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz #压缩

## 导入数据库命令
# mysql -uroot -ppassword abc < /root/backup/db_abc.sql
# gunzip < /root/backup/abc.sql.tar.gz | mysql -uroot -ppassword abc
# gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename #还原

#参考 http://www.cooool.online/index.php/archives/23/
#参考 https://catdeacon.com/note/683.html

第二步 上传数据库至Dropbox

0.https://www.dropbox.com/developers/apps/create 登录你的Dropbox,创建应用并获得(App Key)与(App Secret);

Dropbox Api.png

Typecho-Backup-Mysql.jpg

记得保存(App Key)与(App Secret);

搞定了Api,下载脚本;dropbox_uploader.sh 脚本对应GitHub仓库:https://github.com/andreafabrizi/Dropbox-Uploader

1.下载脚本 dropbox_uploader.sh 到服务器本地;

$ git clone https://github.com/andreafabrizi/Dropbox-Uploader.git 

2.赋权并运行脚本;

$chmod +x dropbox_uploader.sh
$./dropbox_uploader.sh
$ /home/dropbox_uploader.sh upload /home/typecho.bak/* /typecho/sql/; #备份压缩后的数据库文件

常用命令使用方法

$./dropbox_uploader.sh [PARAMETERS] COMMAND...
对应为脚本-参数-命令

点击展开查看说明

$./dropbox_uploader.sh upload /etc/Avideo.mp4 /Study/ #上传视频到 Dropbox 学习资料文件夹下
$./dropbox_uploader.sh download /backup.zip #下载Dropbox上的/backup.zip文件到服务器本地
$./dropbox_uploader.sh delete /backup.zip

更多命令参考:https://github.com/andreafabrizi/Dropbox-Uploader Readme.MD 部分;

V. Crontab 设置

50 23 * * * /home/typecho.mysql.sh; #压缩数据库并导出
55 23 * * * /home/dropbox_uploader.sh upload /home/typecho.bak/* /typecho/sql/; #备份压缩后的数据库文件

以上;

Faq

暂无。

最后修改:2023 年 03 月 23 日 04 : 19 PM