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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

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

  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,如需转载请自行联系原作者



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
656 3
Linux系统初始化脚本
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
570 9
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
567 2
|
6月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
964 1
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
469 158
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1116 152
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
858 156
|
6月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
469 156