freebsd下实现mysql的自动备份
沟通很重要,沟通的渠道很重要。当团队需要配合的时候,要想办法将自己当下做的事情,以最有效的方式通知给团队其它成员,以避免不必要的伤害。
比如,刚刚发生了如下事情:
有一测试系统,历史的任务是完成上线前的最后一次测试,然后:
A 为了给客户演示系统的使用方法,在此系统上添加了大量的供演示用的支撑数据。
B 为了删除生产环境下冗余数据,用生产环境下的数据覆盖了测试的数据。
导致:
A很无奈:覆盖数据前竟然不和我打招呼!
B很无辜:测试系统不就是用来测试而可以随时覆盖的吗?
以上是闲谈,如果我们每日都对数据进行备份呢?是不是就可以解决A、B两个人的问题?
脚本
#!/bin/sh #注意:liunx 系统请将上一行修改为:!/bin/bash # 备份数据库脚本 # 设置变量 MyUSER="用户名。建议单独建立个用户,给查询权限,防止权限问题" # DB_USERNAME MyPASS="密码" # DB_PASSWORD MyHOST="主机名" # DB_HOSTNAME Port="端口号" # 例3306 # 设置备份路径(该路径必须存在,且可写) DEST="/请使用实际的绝对路径" # 比如:/home/username/backups/DB # 接收通知的邮件 EMAIL="[email protected]" # 备份保留天数 DAYS=8 # 查找mysql、MYSQLDUMP、GZIP的位置 (该脚本依赖于GZIP,如果没有安装的话,先安装) MYSQL="/usr/local/bin/mysql" MYSQLDUMP="/usr/local/bin/mysqldump" GZIP="/usr/bin/gzip" # liunx系统请替换为(注意去除注释) # MYSQL="$(which mysql)" # MYSQLDUMP="$(which mysqldump)" # GZIP="$(which gzip)" # 以 年-月-日 的格式来获取当前日期 NOW="$(date +"%Y-%m-%d_%s")" # 创建备份文件夹 目标文件夹/时间/mysql MBD="$DEST/$NOW/mysql" install -d $MBD # 需要备份的数据表 SKIP="schedule measurement" # 获取所有的数据表 DBS="$($MYSQL -h $MyHOST -u $MyUSER -p$MyPASS -P $Port -Bse 'show databases')" # 备份数据表 for db in $DBS do skipdb=-1 if [ "$SKIP" != "" ]; then for i in $SKIP do [ "$db" == "$i" ] && skipdb=1 || : done fi if [ "$skipdb" == "1" ] ; then FILE="$MBD/$db.sql" $MYSQLDUMP -h $MyHOST -u $MyUSER -p$MyPASS $db > $FILE fi done # 压缩、归档,发送邮件通知 cd $DEST tar -cf $NOW.tar $NOW $GZIP -9 $NOW.tar echo "MySQL backup is completed! Backup name is $NOW.tar.gz" | mail -s "MySQL backup" $EMAIL rm -rf $NOW # 删除历史的冗余备份文件 find $DEST -mtime +$DAYS -exec rm -f {} \;
使用方法
将上面的代码保存为sqlbak.sh
-> 在sqlbak.sh
的同级目录下,执行bash sqlbak.sh
。执行后将在目录文件夹中生成如下文件:
2019-07-02_1562042395.tar.gz
即为备份文件
恢复备份
备份经过了1次打包(tar),一次压缩(gzip)。在使用时,先进行解压,再解包。
# gzip -d 2019-07-02_1562042395.tar.gz # ls 2019-07-02_1562042395.tar # tar -zxvf 2019-07-02_1562042395.tar # ls x 2019-07-02_1562042395/ x 2019-07-02_1562042395/mysql/ x 2019-07-02_1562042395/mysql/schedule.sql x 2019-07-02_1562042395/mysql/measurement.sql
有了sql文件,恢复相信不成问题了吧。
FREEBSD定时任务
为sqlbak.sh
加入执行权限 chmod +x sqlbak.sh
设置定时任务% crontab -e
如果是初次使用,请加入以下信息:
SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin # Order of crontab fields # minute hour mday month wday command
然后,加入我们需要执行的sh
脚本,以及设置执行的时间。假设我每天晚上4:38执行一次。
SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin # Order of crontab fields # minute hour mday month wday command 38 4 * * * /mengyunzhi/databak/sqlbak.sh
其中:/mengyunzhi/databak/sqlbak.sh
为脚本的绝对路径。
加入后,我们需要使用以下命令测试自己的脚本在执行自动任务时是否出错:env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/panjie LOGNAME=panjie /usr/home/dru/bin/mycustomscript.sh
HOME=/home/panjie LOGNAME=panjie
应该分别设置为自己用户的路径及用户名。
执行后如果发现错误信息,请参考修正。
参考
https://www.freebsd.org/doc/h...
https://gist.github.com/NARKO...