shell脚本每天自动备份mysql数据库

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

shell脚本每天⾃动备份mysql数据库
⼀、mysql提供了⼀个mysqldump的⼯具可以⽅便的导出导⼊数据库信息;
⼆、使⽤命令⾏shell测试执⾏mysqldump,理解必备的参数,查看⽣成的sql备份⽂件是否符合需求;
/usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
注解:
1、执⾏ /usr/bin/mysqldump;
2、--opt是quick,add-drop-table,add-locks,extended-insert,lock-tables⼏个参数的合称,⼀般都要使⽤,具体意思⾃⾏搜索;
3、-u数据库⽤户名 -p数据库⽤户密码 -h数据库地址数据库名 > 导出的⽂件路径;
4、`date +%F`是shell中⽣成当前⽇期,格式如2015-11-05,所以成功导出时⽣成的⽂件名为 db_2015-11-05.sql;
5、下载⽣成的 sql⽂件,⽤⽂本编辑器打开检查,本地导⼊测试数据库,看是否有问题;
三、整理编写⽐较灵活的shell脚本,⽅便重⽤;
#!/bin/sh
# Database info
DB_USER="batsing"
DB_PASS="batsingpw"
DB_HOST="localhost"
DB_NAME="timepusher"
# Others vars
BIN_DIR="/usr/bin"#the mysql bin path
BCK_DIR="/mnt/mysqlBackup"#the backup file directory
DATE=`date +%F`
# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST$DB_NAME > $BCK_DIR/db_$DATE.sql
#还原数据库
#⽤mysql-front导⼊前⼀天的 *.sql ⽂件即可恢复数据
保存到⽂件或上传到 /usr/local/apache/htdocs/timepusher/sqlBak/sqlAutoBak.sh
四、测试Shell脚本
1、进⼊到该脚本⽂件⽬录 chmod +x sqlAutoBak.sh 添加执⾏权限,否则会报错 Permission denied
2、./sqlAutoBak.sh ,如果是在windows编写上传的⽂件可能会报错
/bin/sh^M: bad interpreter: No such file or directory
这是不同系统编码格式引起的:在 windows系统中编辑的 .sh⽂件可能有不可见字符,所以在 Linux系统下执⾏会报以上异常信息。

可以在Windows上使⽤Notepad++转换成
Unix格式(菜单中选择:编辑>档案格式转换>转换成UNIX)
3、修改后上传继续执⾏ ./sqlAutoBak.sh ,没有报错。

再查看导出的sql⽂件。

五、压缩mysql的备份数据
1、查看导出来的sql⽂件,发现其⽂件⼤⼩⾮常⼤,mysqldump也提供了⽣成gzip压缩⽂件的参数设置
2、sqlAutoBak.sh修改为如下
#!/bin/sh
# Database info
DB_USER="batsing"
DB_PASS="batsingpw"
DB_HOST="localhost"
DB_NAME="timepusher"
# Others vars
BIN_DIR="/usr/bin"#the mysql bin path
BCK_DIR="/mnt/mysqlBackup"#the backup file directory
DATE=`date +%F`
# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql# $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/db_$DATE.sql $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME | gzip > $BCK_DIR/db_$DATE.sql.zip# 还原数据库
# 把 *.sql.zip 使⽤gunzip 或本地的解压软件解压为 *.sql ⽂件
# ⽤mysql-front导⼊前⼀天的 *.sql ⽂件即可恢复数据
3、修改后上传继续执⾏ ./sqlAutoBak.sh ,没有报错。

如果⽤⽂本编辑器查看导出的 *.sql.gz⽂件,应该是⼀堆乱码。

4、下载到本地使⽤解压软件打开,解压就能看到⾥⾯真正的 *.sql ⽂件了。

六、设置linux定时任务执⾏该脚本;
1、编辑定时任务列表
crontab -e
2、插⼊下⾯这⼀⾏,因为通常来说5点钟⽹站的访问量最低。

00 05 * * * /bin/sh /usr/local/apache/htdocs/timepusher/sqlBak/sqlAutoBak.sh
#每天早上 5:00am 执⾏
3、查看任务是否创建成功
crontab -l
七、第⼆天检查⾃动⽣成的sql⽂件是否符合要求
如果⽣成的⽂件和解压出来查看没有问题,那么这个⾃动定时备份数据库的脚本就算是完成了。

因为⽣成的⽂件多了会占⽤⼀定的空间,所以建议要定期(⽐如⼀个⽉)清理⼀下⽂件。

$、补充
1、如果该数据库的⽤户没有分配锁表的权限,则备份会报错 when using LOCK TABLES 。

那是因为mysqldump命令默认在导出时是要锁定表的,所以解决⽅式有两个。

⼀个是给该⽤户开放锁表的权限;另⼀个是在命令中加上 --skip-lock-tables 这个参数。

即是:
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables | gzip > $BCK_DIR/db_$DATE.sql.gz。

相关文档
最新文档