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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

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

  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--


本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1678653,如需转载请自行联系原作者



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
132 68
|
21天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
1月前
|
缓存 监控 Shell
如何使用 HBase Shell 进行数据的实时监控和备份?
如何使用 HBase Shell 进行数据的实时监控和备份?
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
108 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
47 3
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
120 3
|
2月前
|
SQL 关系型数据库 MySQL
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
89 8
|
2月前
|
Oracle 关系型数据库 MySQL
shell获取多个oracle库mysql库所有的表
请注意,此脚本假设你有足够的权限访问所有提到的数据库。在实际部署前,请确保对脚本中的数据库凭据、主机名和端口进行适当的修改和验证。此外,处理数据库操作时,务必谨慎操作,避免因错误的脚本执行造成数据损坏或服务中断。
49 0
|
4月前
|
关系型数据库 MySQL Shell
MySQL数据库一键安装脚本,适合任何版本
MySQL数据库一键安装脚本,适合任何版本
168 2