沟通很重要,沟通的渠道很重要。当团队需要配合的时候,要想办法将自己当下做的事情,以最有效的方式通知给团队其它成员,以避免不必要的伤害。
比如,刚刚发生了如下事情:
有一测试系统,历史的任务是完成上线前的最后一次测试,然后:
A 为了给客户演示系统的使用方法,在此系统上添加了大量的供演示用的支撑数据。
B 为了删除生产环境下冗余数据,用生产环境下的数据覆盖了测试的数据。
导致:
A很无奈:覆盖数据前竟然不和我打招呼!
B很无辜:测试系统不就是用来测试而可以随时覆盖的吗?
以上是闲谈,如果我们每日都对数据进行备份呢?是不是就可以解决A、B两个人的问题?
脚本
#!/usr/local/bin/bash`
# 注意: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=/usr/local/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute hour mday month wday command
然后,加入我们需要执行的sh
脚本,以及设置执行的时间。假设我每天晚上4:38执行一次。
SHELL=/usr/local/bin/bash
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=/usr/local/bin/bash PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/panjie LOGNAME=panjie /mengyunzhi/databak/sqlbak.sh
HOME=/home/panjie LOGNAME=panjie
中的panjie
应该分别设置为自己用户的路径及用户名。
执行后如果发现错误信息,请参考修正。
参考
https://www.freebsd.org/doc/h...
https://gist.github.com/NARKO...