2013-10-18 shell脚本练习题

回复 收藏

设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup  . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

参考答案:

#! /bin/bash

### backup mysql

### Writen by Aming.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/texlive/2012/bin/i386-linux:/usr/local/mysql/bin:/usr/local/mysql/bin:/root/bin

d1=`data +%w`

d2=`date +%d`

pass="your_mysql_password"

bakdir=/bak/mysql

r_bakdir=192.168.123.30::backup

exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log

echo "mysql backup begin at `date +"%F %T"`."

mysqldump -uroot -p$pass --default-character-set=gbk discuz >$bakdir/$d1.sql

rsync -a $bakdir/$d1.sql $r_bakdir/$d2.sql

echo "mysql backup end at `date +"%F %T"`."

然后加入cron

0 3 * * * /bin/bash /usr/local/sbin/mysqlbak.sh

2013-10-18 14:00 举报
已邀请:
0

西瓜.M

赞同来自:

学习
0

西瓜.M

赞同来自:

学习
0

牛牛牛爱洗澡

赞同来自:

学习下
0

branttsai

赞同来自:

study,tks
0

xzzlamp

赞同来自:

11
0

alvinnull

赞同来自:

学习
0

linuxcp

赞同来自:

ok
0

星空的衣角

赞同来自:

学习
0

我是学渣

赞同来自:

{:4_99:}
0

stone

赞同来自:

mysqldump -uroot -ppassword "discuz" > /bak/mysql/discuz`date +%F`.sql
rsync -av  192.168.123.30::backup/ /bak/mysql/
find /bak/mysql -ctime +30 |xargs rm -f
rsync -av --delete /bak/mysql 192.168.123.30::backup/
find /bak/mysql -ctime +7 |xargs rm -f
0

xpgong

赞同来自:

kankan
0

elvis

赞同来自:

学习一下
0

我想吃西瓜

赞同来自:

我只看看不说话
0

jxcia2018

赞同来自:

本帖最后由 jxcia 于 2016-6-6 19:04 编辑
  1. #!/bin/bash
  2. ##written by lin
  3. mysqldump -uroot -plin discuz > /bak/mysql/mysql.backup
  4. find / -name mysql.backup -mtime +7 -exec rm -rf {} \;
  5. rsync -av /bak/msyql/mysql.backup root@192.168.123.30::backup
  6. mysql -uroot -plin -h 192.168.123.30
  7. find / -name mysql.backup -mtime +30 -exec rm -rf {} \;
0

jxcia2018

赞同来自:


另外,老师的脚本没感觉有删除的动作?
0

漠林sky

赞同来自:

学习
0

Toornix

赞同来自:

看下答案
0

shc1985

赞同来自:

看看
0

monga

赞同来自:

xuexi
0

jonnylin

赞同来自:

学习
0

kevinjin

赞同来自:

看答案
0

郭贞

赞同来自:

{:4_91:}
0

yangjian319

赞同来自:

学习。
0

午夜DJ

赞同来自:

学习
0

a_leon

赞同来自:

想不出来了,参考参考
0

a_leon

赞同来自:

太厉害了,不过
  1. rsync -a $bakdir/$d.sql $r_bakdir/$d2.sql
0

a_leon

赞同来自:

rsync -a $bakdir/$d.sql $r_bakdir/$d2.sql   这一行少了个1
0

13805775620

赞同来自:

学习
0

hmh

赞同来自:

.
0

十月鱼

赞同来自:

学习
0

庚庚

赞同来自:

aa
0

上海-KL

赞同来自:

学习
0

riverxyz

赞同来自:

#/bin/bash
db=`date +%y%m%d`
dblocal=`date -d "-5day"`
dbremote=`date -d "-1month"`
/usr/local/mysql/bin/msyqldump -uroot -pabc.123 discuz >/tmp/$db.sql
rm -f /tmp/$dblocal.sql
rsync -avzp /tmp/$db.sql 192.168.123.30::backup/
使用rsync删除一个月以前的数据不懂
0

a1138665328

赞同来自:

kk
0

s269143569

赞同来自:

学习了
0

13600827194

赞同来自:

学习

0

凌乱

赞同来自:

#!/bin/bash
#设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数
据,远程保存一个月。
#假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192
.168.1.212,远程提供了一个rsync服务,备份的地址是 192.168.1.212::javazgq02  . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

d=`date +%F`
week=`date -d "-1day" +%F`
month=`date -d "-2day" +%F`
mysqldump -uroot  discuz > /bak/mysql/"$d"discuz.sql
rsync -a /bak/mysql/"$d"discuz.sql 192.168.1.212::javazgq02
rm -rf /bak/mysql/"$week"discuz.sql
mkdir -p  /bak/remotemysql/
rsync -a 192.168.1.212::javazgq02 /bak/remotemysql/
rm -rf /bak/mysql/"$month"discuz.sql
rsync -a /bak/remotemysql/  192.168.1.212::javazgq02
rm -rf /bak/remotemysql

加入cron服务: 0  3  *  *  *   /bin/sh   /root/mysqldump_rsync.sh

0

有人喜欢蓝

赞同来自:

快快快

0

。。。

赞同来自:

学习

0

kw是id

赞同来自:

不会写 看看

补充:

有两个关键点不会,一个是date +%d这个命令忘了,另一个是不知道rsync还可以当mv用

#!/bin/bash
[ -d /bak/mysql ] || /bin/mkdir -p /bak/mysql
d1=
d2=
pass=login
exec >/var/log/mysqlbak.log 2>&1
bakdir=/bak/mysql
r_bakdir=192.168.123.30::backup
echo "mysql backup begin at "
/usr/local/mysql/bin/mysqldump -uroot -p$pass discuz >$bakdir/discuz_$d1.sql
/usr/bin/rsync -av $bakdir/discuz_$d1.sql root@$r_bakdir/discuz_$d2.sql
echo "mysql backup end at "

crontab -e增加一条计划任务

0 3 * * * /bin/sh /usr/local/sbin backup.sh

0

qwlp19910807

赞同来自:

学习了

0

qwlp19910807

赞同来自:

这边是直接覆盖sql文件 不需要另外再删除 很简便

0

重庆-刘鹏

赞同来自:

学习

0

hyhmnn

赞同来自:

#!/bin/bash[  -f /bak/mysql ] || [ mkdir /bak/nysql ]mysqldump -uroot -p discuz > /bak/mysql/discuz_`date +%F`/usr/bin/rsync -t /bak/mysql root@192.168.123.30::backupcrontab -e0 3 * * * /usr/bin/bash bak.sh

0

西瓜糖

赞同来自:

"远程保存一个月" 这个暂时没弄明白,参考下铭哥的

0

西瓜糖

赞同来自:

#!/bin/bash
#Description: This script is to backup speicified mysql and sync to remote host 
#Author: Jiazhi Yang
#Date: 16/11/2016
#Script Name: backupmysql.sh

##定义当前的时间
curtime=`date +%H:%m:%S`

##定义当前的日期
curdate=`date +%F`

##定义存放数据库备份文件的目录
backuppath=/bak/mysql

##定义5天前的日期
datea=`date -d "-5 day" +%F`

##定义30天前的日期
dateb=`date -d "-30 day" +%F`

##定义远程主机的IP及存放备份文件的目录
remotehost=192.168.9.213::backup

##定义标准输出及错误输出的日志存放位置
exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log

##定义密码
passwordfile='passw0rd.password'

##判断存放数据库备份文件的目录是否存在
if [ -d $backuppath/$curdate ]; then
        echo "$backuppath/$curdate exists." 
else
        mkdir -p $bakuppath/$curdate
        echo "$bakuppath/$curdate directory created."
fi

##开始备份数据库到指定的目录
echo "Now start to back up database... "
mysqldump -ujustcall -pjcdbup0932 justcall_db >/bak/mysql/$curdate-$curtime.sql 

##判断备份结果是否已执行成功
if [ $? eq 0 ]; then
        echo "Now backing up datebase ends at $curdate-$curtime..."
fi

##开始将本地的数据库备份文件同步到远程主机
echo "Now start to rsync backup files to remote hosts."
rsync -av --password-file=$passwordfile $backuppath/$curdate/$curtime.sql $remotehost/$curdate-$curtime.sql

##判断本次同步是否成功
if [ $? -eq 0 ]; then
        echo "Now rsync finished."
else
        echo "Error,rsync is not successfull."
fi

cd $backuppath
##删除5天前的数据库备份文件
rm ./$curdate/$datea.sql -rf

if [ $? -eq 0 ]; then
        echo "MySQL backup file deleted that saved in 5 days ago..."
else
        echo "Error,deleting is not successfull."
fi

0

nmzhaoliming

赞同来自:

学习

0

rjx3201

赞同来自:

see see

0

monga

赞同来自:

#!/bin/bash

fd=`date -d "-5days ago" +%y%m%d`

d=`date +%F-%T`

user=root

pw=123456

dblist=`mysql -u$user -p$pw -hlocalhost -e "show databases"`

denylist=(1,2,3,4,5,6,7)

exec 1>/var/log/mysqlbak.log 2>&1

for list in $dblist

  • do

      flag=1

      for dlist in denylist

  •   do

         if test $list = $dlist

           then

           flag=0

         fi

      done

      if [ $list -ne 0 ]

      then

          mysqldump -u$user -p$pw -hlocalhost $list > $list_$d.sql

          rm -rf $list_$fd.sql

          rsync -av $list_$d.sql 192.168.123.30::backup/$list_$d.sql 

      fi

    done

  • 回复帖子,请先登录注册

    退出全屏模式 全屏模式 回复
    评分
    可选评分理由: