备份脚本整理和总结

让linux每天定时备份MySQL数据库并删除五天前的备份文件

MYSQL定期备份是一项重要的工作,但人工操作太繁琐,也难避免有所疏漏,使用下面的方法即可让系统定期备份数据。利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。

1、创建备份文件夹
#cd /bak
#mkdir mysqldata  

2、编写运行脚本
#nano -w /usr/sbin/bakmysql.sh
注:如使用nano编辑此代码需在每行尾添加'&&'或';'连接符,否则生成的文件名末尾字符为乱码

代码:
#!/bin/bash
# Name:bakmysql.sh
# This is a ShellScript For Auto DB Backup and Delete old Backup
#
backupdir=/bak/mysqlbak
time=` date +%Y%m%d%H `
mysql_bin_dir/mysqldump -u user -ppassword dataname1 | gzip > $backupdir/name1$time.sql.gz
mysql_bin_dir/mysqldump -u user -ppassword dataname2 | gzip > $backupdir/name2$time.sql.gz
#
find $backupdir -name "name_*.sql.gz" -type f -mtime +5 -exec rm {} \; > /dev/null 2>&1


保存退出

说明:
代码中time=` date +%Y%m%d%H `也可以写为time="$(date +"%Y%m%d$H")"
其中`符号是TAB键上面的符号,不是ENTER左边的'符号,还有date后要有一个空格。
mysql_bin_dir:mysql的bin路径;
dataname:数据库名;
user:数据库用户名;
password:用户密码;
name:自定义备份文件前缀标识。
-type f    表示查找普通类型的文件,f表示普通文件。
-mtime +5   按照文件的更改时间来查找文件,+5表示文件更改时间距现在5天以前;如果是 -mmin +5 表示文件更改时间距现在5分钟以前。
-exec rm {} \;   表示执行一段shell命令,exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
/dev/null 2>&1  把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面;其中的& 表示让该命令在后台执行。

3、为脚本添加执行权限
# chmod +x /usr/sbin/bakmysql.sh

4、修改/etc/crontab(在centOS5中测试可行)
#nano -w /etc/crontab  
在最后一行中加入:  
00 3 * * * root /usr/sbin/bakmysql.sh
表示每天3点00分执行备份

注:crontab配置文件格式如下:
分 时 日 月 周  命令

Redhat方法:
Redhat的crontab采用按时间调用4个目录(/etc/cron.hourly:每小时;/etc/cron.daily:每天;/etc/cron.weekly:每周;/etc/cron.monthly:每月)中脚本出来运行的方式。
Redhat中只需要将刚才编辑的脚本复制到相应的目录即可。

5、重启crontab
# /etc/rc.d/init.d/crond restart  
完成。  

6、恢复数据备份文件:

非压缩备份文件恢复:
   #mysql -u root -p dataname < name2008010103.sql

从压缩文件直接恢复:
   #gzip < name2008010103.sql.gz | mysql -u root -p dataname
或:
# zcat name2008010103.sql.gz  | mysql -u root -p

利用Crontab为Linux定时备份Mysql数据库
利用系统Crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。
  利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的。
  1、创建保存备份文件的路径/mysqldata
  #mkdir /mysqldata
  2、创建/usr/sbin/bakmysql文件
  #vi /usr/sbin/bakmysql
  输入
  rq=` date +%Y%m%d `
  tar zcvf /mysqldata/mysql$rq.tar.gz /var/lib/mysql
  或者写成
  rq=` date +%Y%m%d `
  mysqldump ――all-databases -u root -p密码 > /mysqldata/mysql$rq.sql
  /var/lib/mysql是你数据库文件的目录,部分用户是/usr/local/mysql/data,每个人可能不同
  /mysqldata/表示保存备份文件的目录,这个每个人也可以根据自己的要求来做。
  3、修改文件属性,使其可执行
  # chmod +x /usr/sbin/bakmysql
  4、修改/etc/crontab
  #vi /etc/crontab
  在下面添加
  01 3 * * * root /usr/sbin/bakmysql
  表示每天3点钟执行备份
  5、重新启动crond
  # /etc/rc.d/init.d/crond restart
  完成。
  这样每天你在/mysqldata可以看到这样的文件
  mysql20040619.tar.gz
 

在linux中常用的shell备份脚本

 备份脚本:
  备份网站内容
  #!/bin/bash
  #指定运行的脚本shell
  #运行脚本要给用户执行权限
  bakdir=/backup
  month=`date +%m`
  day=`date +%d`
  year=`date +%Y`
  hour=`date +%k`
  min=`date +%M`
  dirname=$year-$month-$day-$hour-$min
  mkdir $bakdir/$dirname
  mkdir $bakdir/$dirname/conf
  mkdir $bakdir/$dirname/web
  mkdir $bakdir/$dirname/db
  #备份conf,检测通过
  gzupload=upload.tgz
  cp /opt/apache2/conf/httpd.conf $bakdir/$dirname/conf/httpd.conf
  cd /opt/apache2/htdocs/php
  tar -zcvf $bakdir/$dirname/web/$gzupload ./upload
  #远程拷贝的目录要有可写权限
  scp -r /backup/$dirname [email protected]:/backup
  备份数据库:
  #!/bin/bash
  #指定运行的脚本shell
  #运行脚本要给用户执行权限
  bakdir=/backup
  month=`date +%m`
  day=`date +%d`
  year=`date +%Y`
  hour=`date +%k`
  min=`date +%M`
  dirname=$year-$month-$day-$hour-$min
  mkdir $bakdir/$dirname
  mkdir $bakdir/$dirname/conf
  mkdir $bakdir/$dirname/web
  mkdir $bakdir/$dirname/db
  #热备份数据库
  cp /opt/mysql/my.cnf $bakdir/$dirname/db/my.cnf
  cd /opt/mysql
  mysqldump --opt -u zhy -p --password=1986 test>$bakdir/$dirname/db/test.sql
  mysqldump --opt -u zhy -p --password=1986 phpwind>$bakdir/$dirname/db/phpwind.sql
  #远程拷贝的目录要有可写权限
  scp -r /backup/$dirname [email protected]:/backup


Linux下按日期删除文件
1.
find / -mtime +n -exec rm -rf {} ;
 
2.
find . -ctime +3 -type f | xargs rm -rf

find相关参数
参  数:
 -amin<分钟>  查找在指定时间曾被存取过的文件或目录,单位以分钟计算。
 -anewer<参考文件或目录>  查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录。
 -atime<24小时数>  查找在指定时间曾被存取过的文件或目录,单位以24小时计算。
 -cmin<分钟>  查找在指定时间之时被更改的文件或目录。
 -cnewer<参考文件或目录>  查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。
 -ctime<24小时数>  查找在指定时间之时被更改的文件或目录,单位以24小时计算。
 -daystart  从本日开始计算时间。
 -depth  从指定目录下最深层的子目录开始查找。
 -expty  寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录。
 -exec<执行指令>  假设find指令的回传值为True,就执行该指令。
 -false  将find指令的回传值皆设为False。
 -fls<列表文件>  此参数的效果和指定"-ls"参数类似,但会把结果保存为指定的列表文件。
 -follow  排除符号连接。
 -fprint<列表文件>  此参数的效果和指定"-print"参数类似,但会把结果保存成指定的列表文件。
 -fprint0<列表文件>  此参数的效果和指定"-print0"参数类似,但会把结果保存成指定的列表文件。
 -fprintf<列表文件><输出格式>  此参数的效果和指定"-printf"参数类似,但会把结果保存成指定的列表文件。
 -fstype<文件系统类型>  只寻找该文件系统类型下的文件或目录。
 -gid<群组识别码>  查找符合指定之群组识别码的文件或目录。
 -group<群组名称>  查找符合指定之群组名称的文件或目录。
 -help或--help  在线帮助。
 -ilname<范本样式>  此参数的效果和指定"-lname"参数类似,但忽略字符大小写的差别。
 -iname<范本样式>  此参数的效果和指定"-name"参数类似,但忽略字符大小写的差别。
 -inum<inode编号>  查找符合指定的inode编号的文件或目录。
 -ipath<范本样式>  此参数的效果和指定"-ipath"参数类似,但忽略字符大小写的差别。
 -iregex<范本样式>  此参数的效果和指定"-regexe"参数类似,但忽略字符大小写的差别。
 -links<连接数目>  查找符合指定的硬连接数目的文件或目录。
 -iname<范本样式>  指定字符串作为寻找符号连接的范本样式。
 -ls  假设find指令的回传值为True,就将文件或目录名称列出到标准输出。
 -maxdepth<目录层级>  设置最大目录层级。
 -mindepth<目录层级>  设置最小目录层级。
 -mmin<分钟>  查找在指定时间曾被更改过的文件或目录,单位以分钟计算。
 -mount  此参数的效果和指定"-xdev"相同。
 -mtime<24小时数>  查找在指定时间曾被更改过的文件或目录,单位以24小时计算。
 -name<范本样式>  指定字符串作为寻找文件或目录的范本样式。
 -newer<参考文件或目录>  查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。
 -nogroup  找出不属于本地主机群组识别码的文件或目录。
 -noleaf  不去考虑目录至少需拥有两个硬连接存在。
 -nouser  找出不属于本地主机用户识别码的文件或目录。
 -ok<执行指令>  此参数的效果和指定"-exec"参数类似,但在执行指令之前会先询问用户,若回答"y"或"Y",则放弃执行指令。
 -path<范本样式>  指定字符串作为寻找目录的范本样式。
 -perm<权限数值>  查找符合指定的权限数值的文件或目录。
 -print  假设find指令的回传值为True,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称之前皆有"./"字符串。
 -print0  假设find指令的回传值为True,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行。
 -printf<输出格式>  假设find指令的回传值为True,就将文件或目录名称列出到标准输出。格式可以自行指定。
 -prune  不寻找字符串作为寻找文件或目录的范本样式。
 -regex<范本样式>  指定字符串作为寻找文件或目录的范本样式。
 -size<文件大小>  查找符合指定的文件大小的文件。
 -true  将find指令的回传值皆设为True。
 -typ<文件类型>  只寻找符合指定的文件类型的文件。
 -uid<用户识别码>  查找符合指定的用户识别码的文件或目录。
 -used<日数>  查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算。
 -user<拥有者名称>  查找符合指定的拥有者名称的文件或目录。
 -version或--version  显示版本信息。
 -xdev  将范围局限在先行的文件系统中。
 -xtype<文件类型>  此参数的效果和指定"-type"参数类似,差别在于它针对符号连接检查。


Mysql 新建只有备份(mysqldump)权限的帐号


Mysql数据库创建一个只有备份(mysqldump)权限的帐号来备份数据,既然要备份所有的数据库,至少要拥有select *.*的权限,再加上lock tables的权限。

grant select,lock tables on *.* to 'bak'@'localhost' IDENTIFIED BY 'password';





你可能感兴趣的:(mysql,备份,脚本)