开发者社区> shy丶gril> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)

简介:
+关注继续查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1678653

设计该脚本的一些设计、编写考虑:

  1. 该脚本适用于编译安装mysql和通过yum或apt-get等安装方式

  2. 该脚本可以反复执行,不会重复覆盖数据

  3. 可增加,删除N天前的备份以节省磁盘空间

  4. 充分利用mysqldump的自带锁表功能、刷新日志、复制等功能

利用mysqldump命令备份MySQL数据库的脚本(不带注释版,适合生产环境使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
MYSQLDBUSERNAME=root
MYSQLDBPASSWORD=password
MYSQBASEDIR=/usr/local/mysql
MYSQL=$MYSQBASEDIR/bin/mysql
MYSQLDUMP=$MYSQBASEDIR/bin/mysqldump
BACKDIR=/var/backup/db
DATEFORMATTYPE1=$(date +%Y-%m-%d)
DATEFORMATTYPE2=$(date +%Y%m%d%H%M%S)
[ -d $MYSQBASEDIR ] && MYSQDATADIR=$MYSQBASEDIR/data || MYSQDATADIR=/var/lib/mysql
[ -x $MYSQL ] || MYSQL=mysql
[ -x $MYSQLDUMP ] || MYSQLDUMP=mysqldump
[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}
[ -d ${BACKDIR}/${DATEFORMATTYPE1} ] || mkdir ${BACKDIR}/${DATEFORMATTYPE1}
DBLIST=`ls -p $MYSQDATADIR | grep / |tr -d /`
for DBNAME in $DBLIST
    do ${MYSQLDUMP} --user=${MYSQLDBUSERNAME} --password=${MYSQLDBPASSWORD} --routines --events --triggers --single-transaction --flush-logs --databases ${DBNAME} | gzip > ${BACKDIR}/${DATEFORMATTYPE1}/${DBNAME}-backup-${DATEFORMATTYPE2}.sql.gz
    [ $? -eq 0 ] && echo "${DBNAME} has been backuped successful" || echo "${DBNAME} has been backuped failed"
    /bin/sleep 5
done

利用mysqldump命令备份MySQL数据库的脚本(带注释版,适合学习和测试使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
# MYSQLDBUSERNAME是MySQL数据库的用户名,可自定义
MYSQLDBUSERNAME=root
# MYSQLDBPASSWORD是MySQL数据库的密码,可自定义
MYSQLDBPASSWORD=password
# MYSQBASEDIR是MySQL数据库的安装目录,--prefix=$MYSQBASEDIR,可自定义
MYSQBASEDIR=/usr/local/mysql
# MYSQL是mysql命令的绝对路径,可自定义
MYSQL=$MYSQBASEDIR/bin/mysql
# MYSQLDUMP是mysqldump命令的绝对路径,可自定义
MYSQLDUMP=$MYSQBASEDIR/bin/mysqldump
# BACKDIR是数据库备份的存放地址,可以自定义修改成远程地址
BACKDIR=/var/backup/db
# 获取当前时间,格式为:年-月-日,用于生成以这种时间格式的目录名称
DATEFORMATTYPE1=$(date +%Y-%m-%d)
# 获取当前时间,格式为:年月日时分秒,用于生成以这种时间格式的文件名称
DATEFORMATTYPE2=$(date +%Y%m%d%H%M%S)
# 如果存在MYSQBASEDIR目录,则将MYSQDATADIR设置为$MYSQBASEDIR/data,具体是什么路径,就把data改成什么路径,否则将MYSQBASEDIR设定为/var/lib/mysql,可自定义
[ -d $MYSQBASEDIR ] && MYSQDATADIR=$MYSQBASEDIR/data || MYSQDATADIR=/var/lib/mysql
# 如果mysql命令存在并可执行,则继续,否则将MYSQL设定为mysql,默认路径下的mysql
[ -x $MYSQL ] || MYSQL=mysql
# 如果mysqldump命令存在并可执行,则继续,否则将MYSQLDUMP设定为mysqldump,默认路径下的mysqldump
[ -x $MYSQLDUMP ] || MYSQLDUMP=mysqldump
# 如果不存在备份目录则创建这个目录
[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}
[ -d ${BACKDIR}/${DATEFORMATTYPE1} ] || mkdir ${BACKDIR}/${DATEFORMATTYPE1}
# 获取MySQL中有哪些数据库,根据mysqldatadir下的目录名字来确认,此处可以自定义,TODO
DBLIST=`ls -p $MYSQDATADIR | grep / |tr -d /`
# 从数据库列表中循环取出数据库名称,执行备份操作
for DBNAME in $DBLIST
    # mysqldump skip one table
    # -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
    # mysqldump --ignore-table=mysql.event
    # http://serverfault.com/questions/376904/mysqldump-skip-one-table
    # --routines,备份存储过程和函数
    # --events,跳过mysql.event表
    # --triggers,备份触发器
    # --single-transaction,针对InnoDB,在单次事务中通过转储所有数据库表创建一个一致性的快照,此选项会导致自动锁表,因此不需要--lock-all-tables
    # --flush-logs,在dump转储前刷新日志
    # --ignore-table,忽略某个表,--ignore-table=database.table
    # --master-data=2 ,如果启用MySQL复制功能,则可以添加这个选项
    # 将dump出的sql语句用gzip压缩到一个以时间命名的文件
    do ${MYSQLDUMP} --user=${MYSQLDBUSERNAME} --password=${MYSQLDBPASSWORD} --routines --events --triggers --single-transaction --flush-logs --ignore-table=mysql.event --databases ${DBNAME} | gzip > ${BACKDIR}/${DATEFORMATTYPE1}/${DBNAME}-backup-${DATEFORMATTYPE2}.sql.gz
    # 检查执行结果,如果错误代码为0则输出成功,否则输出失败
    [ $? -eq 0 ] && echo "${DBNAME} has been backuped successful" || echo "${DBNAME} has been backuped failed"
    # 等待5s,可自定义
    /bin/sleep 5
done

执行效果:

1
2
3
4
5
6
[root@htvm ~]# ./backupmysqlbydate.sh 
mysql has been backuped successful
test has been backuped successful
[root@htvm ~]# ls /var/backup/db/2015-07-27/
mysql-backup-20150727195515.sql.gz  test-backup-20150727195515.sql.gz
[root@htvm ~]#

标签:mysqldump,备份MySQL数据库,MySQL数据库备份,mysql备份,mysql备份脚本

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1678653

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
速查笔记(Linux Shell编程<上>)
零、shell中的内部变量: 1.    $?:    表示shell命令的返回值.2.    $$:    表示当前shell的pid.3.    $!:    最后一个放入后台作业的PID值.4.    $0:    表示脚本的名字.
980 0
【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技术,包括使用echo, tee, trap等命令输出关键信息,跟踪变量的值,在脚本中植入调试钩子,使用“-n”选项进行shell脚本的语法检查, 使用“-x”选项实现shell脚本逐条语句的跟踪,巧妙地利用shell的内置变量增强“-x”选项的输出信息等。
1200 0
Linux之shell编程基础
一、变量     变量在shell中分为:本地变量、环境变量、位置参数;   本地变量:仅可在用户当前shell生命期的脚本中使用的变量,本地变量随着shell进程的消亡而无效,本地变量在新启动的shell中依旧无效,类似于c、c++中的局部变量的概念;   环境变量:适用于所有登录进程所产生...
747 0
Linux学习笔记(八)——简单shell语法
                编写Shell脚本的简单语法   提到编程,条件、分支、循环等语法肯定少不了。shell脚本编程亦是如此,下面只是结合最近学习的一些简单语法做的笔记,如有错误,欢迎指正。
906 0
+关注
1876
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载