开发者学堂课程【Shell 编程入门到精通:mysql 数据库自动备份脚本】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/453/detail/5602
mysql 数据库自动备份脚本
内容介绍
一、前期准备
二、mysql 脚本
三、测试案例 mysql 脚本
一、前期准备
首先需要登录到服务器上,分为安装 mysql-server 和开启 mysql-server。
1、安装 mysql-server
通过命令
[root@xuegod63 test]# yum install -y mysql mysql-server
安装服务器,软件包mysql 是mysql数据库linux下的客户端,而软件包mysql-server 才是真正的mysql数据库。
2、开启 mysql-server
安装完成后再通过命令
[root@xuegod test2]# /etc/init.d/mysqld restart
启动服务,第一次启动会弹出很多消息,只要显示Starting mysql: [OK]就代表启动成功了,再次
[root@xuegod test2]# /etc/init.d/mysqld
re
start
则代表重启服务。
连接mysql是通过#which mysql查看mysql所在目录,再执行# rpm -qf /usr/bin/mysql进入客户端,之后直接mysql回车即可连接mysql,show databases可查看数据库,执行exit;退出,分号可加可不加,连接mysql也可以默认的命令#mysql -uroot -p连接mysql,p后可直接跟登录密码,但此处案例没有密码,如:
[root@xuegod test2]#
which
mysql
/usr/bin/mysql
[root@xuegod63 test]# which mysq
l
/usr/bin/mysq
l
mysql-5.1.52-1.el6_ 0.1.x86_ _64
[root@xuegod63 test]#
mysql
Welcome
to
the
MYSQL…
…state ment
m
ysql>
s
how databases
+
-
-------------+
| Database
|
+-----------------+
| information_ schema |
| mysql
|test
3 rows in set (0.00 sec)
mysql>
exit;
[root@xuegod63 test]#
mysql
-
u
root
-p
E
nter password:
二、案例 mysql 脚本
案例 mysql 脚本如下:
#!/bin/sh
#auto backup mysql
#xuegod.cn 2015-2-10 /
#Define PATH 定义变量
BAKDIR=/data/backup/mysql/idate +%Y - %om-%d^
MYSQL .DB=test
#MYSQLDB=webapp
#要备份的数据名
#MYSQLPW=backup
#mysql数据库密码
MYSQLUSR=root
#MYSQLUSR=backup
#must use root user run scripts
必须使用root用户运行,$UID为系统变量
if
[$UID-ne
0
];then
echo
This script must use the root user ! ! !
sleep 2
exit 0
fi
#Define DIR and mkdir DIR
判断目录是否存在,不存在则新建
if
[!-d$BAKDIR];then
mkdir -p $BAKDIR
else .
echo This is $BAKDIR exists....
fi
#Use mysqldump backup
mysql使用mysqldump备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -d $MYSQLDB >$BAKDIR/webapp_db. sql
#/usr/bin/mysqldump - u$MYSQLUSR - p$MYSQLPW -d $MYSQLDB > $BAKDIR/webapp db
. sql
cd $BAKDIR ; tar -czf webapp_ mysql_ db.tar .gz *.sql
#查找备份目录下以.sq[结尾的文件并删除
#find . -type f -name * .sql |xargs rm -rf
#或
find . -type f -name *.sql -exec rm -rf {} \;
#如何数据库备份成功,则打印成功,并删除备份目录30天以前的目录
[ $? -eq 0 ] && echo“This 、date +%Y-%m-%d、MySQL BACKUP is SUCCESS"
cd /data/backup/mysql/ ; find ,- type d -mtime +30 | xargs rm -rf
echo "The mysql backup successfully
前几行是自定义脚本注释,Define PATH定义变量,常用的变量如BAKDIR,后面跟的数据库要备份路径,MYSQL .DB 为备份那个数据库,此处备份 test 数据库,MYSQLPW 后跟 mysql 数据库密码,因为此处没有密码所以是注释掉的,MYSQLUSR 后跟账号 root,也可以改其他账号如 backup,必须使用 root 用户运行,$UID 为系统变量。如果$UID不等于0,则执行This script must use the root user ! ! !,如 root 下$UID执行为0,而 mk 下执行$UID则为500,如,
[ root@xuegod63 test]# echo $UID
0
[ root@xuegod63 test]# useradd mk
[ root@xuegod63
test]# Su - mk
[mk@xuegod63 ~]$ echo $UID
500
[mk@xuegod63 ~]$ id mk
uid=500(mk) gid=500 (mk) groups=500 (mk )
判断完用户后 Define DIR and mkdir DIR 判断目录是否存在,不存在则创建,通过!查看-d如果不存在就 mkdir -p $BAKDIR 去创建,否则显示这个目录存在,接下来使用 mysqldump 命令备份,-u指定用户 $MYSQLUSR,-d指定数据库$MYSQLDB,输出到 webapp_db. sql,vim 查看文件内容,如,
[ root@xuegod63 test] # which mysqldump
/usr/bin/ mysqldump
[root@xuegod63 test]#mysqldump -uroot -d test > /opt/webapp_ db.sql
[ root@xuegod63 test]# echo $?
0
[ rootaxuegod63 test]# vim /opt/webapp_db.sql
/usr/bin/mysqldump -d $MYSQLDB >$BAKDIR/webapp_db. sql
如果-d判断$BAKDIR目录存在,则加!就是取否的意思,目录不存在,备份用$MYSQLUSR,可以用 root 用户,也可以用其他用户,因为 mysql 里面不同的用户有不同的权限,用户要有备份的权限才行,相当于 linux 下面最大权限的 root 用户,然后cd进入到$BAKDIR,tar对数据进行打包,打包后find查找当前目录下name 为.sql的文件,有的话则执行 rm -rf把他删除,或者查找后使用xargs传递给rm -rf 执行删除,执行后$ -eq判断删除命令是否执行成功,为0则为执行成功,date显示年月日,如,
[ rootaxuegod63
opt
]#
date
+%Y-%
m
-%d
2015-02-10
并打印 mysql 备份完毕,然后 cd 到 mysql 找到30天前创建的文件夹,执行删除,完成后打印数据库备份成功
:wq保存退出执行一下脚本,
[root@xuegod63 test]# . /mysql- back-auto. sh
This 2015-02-10 MySQL BACKUP
is SUCCESS"
执行成功后进行验证下
# vim mysql- back-auto.sh
打开脚本后 BAKDIR 变量应该得到一个路径,如/data/backup/mysql/,ls查看路径会发现创建了一个目录,目录下创建了webapp_mysql_db.tar.gz数据库,如,
[ root@xuegod63 opt]# ls /data/backup/mysql/
2015-02-10
[ root@xuegod63 opt]# ls /data/backup/mysql/2015-02-10/
webapp_ mysq
l
_ db. tar.gz
备份完后可解压查看,如,
[ root@xuegod632015-02-10]# tar zxvf webapp mysql db.tar.gz
webapp_ db. sql
[ root@xuegod632015-02-10]# ls
webapp_db. sql webapp_mysqL_db.tar.gz
[ root@xuegod632015-02-10]# vim webapp_ db.sql
vim 打开后可查看到数据库 Database:test,备份成功。
三、测试案例 mysql 脚本
测试在其他用户下运行脚本,因为 root 不允许其他用户访问,所以需要把脚本复制到其他用户下,案例中复制到 mk 用户的 tmp 目录下,这样设置后谁都可以执行,所以再次cd到tmp下,执行脚本,会发现提示这个脚本必须是root用户下执行,之后等待2秒钟会自动退出,如,
[ root@xuegod63 test]# cp mysql-back-auto.sh /tmp/
[ root@xuegod63 test]# ll /tmp/mysql- back-auto.sh
- rwxr-xr-x 1 root root 1289 Feb 10 21:24 /tmp/mysqL- back-auto.sh
[ root@xuegod63 test]# ll !$
ll
/tmp/ mysql- back-auto. sh
-rwxr-xr-x 1 root root 1289 Feb 10 21:24 /tmp/mysql-back-auto. sh
[mk@xuegod63] $
cd
/tmp/
[mk@xuegod63 tmp]$ . /mysql- back-auto. sh
This script must use the root user ! ! !
[mk@xuegod63 tmp] $
测试成功,然后是if判断路径是否存在,存在就打印exists,不存在就创建,最后备份数据库,cd $BAKDIR后面跟路径进行打包。打包完成后没用的数据进行删除,删除30天前的数据可以通过if进行判断,也可以简写$? -eq。
此处提醒要定期检查数据是否备份成功,看懂脚本内容,不能只看执行后弹出的 The mysql backup successfully。
验证30天后是否删除成功,执行脚本后更改日期为30天后,再次执行脚本查看执行脚本时创建的目录是否存在,如,
[ root@xuegod63 test]# ./mysql- back-auto.sh
“
This 2015-02-10 MySQL BACKUP is SUCCESS"
The mysql backup successfully
[ root@xuegod63 mysql]# date -
s
"2015-3-10 20:20:11"
Tue Mar 10 20:20:11 CST 2015
[ root@xuegod63 test]# ./mysql- back-auto.sh
“
This 2015-3-10 MySQL BACKUP is SUCCESS"
The mysql backup successfully
[ root@xuegod63 mysql]# date -
s
"2015-3-11"
Tue Mar 11 20:20:11 CST 2015
[ root@xuegod63 test]# ./mysql- back-auto.sh
“
This 2015-3-11 MySQL BACKUP is SUCCESS"
The mysql backup successfully
[ root@xuegod63 mysql]#
ls
2015-2-10 2015-3-10 2015-3-11
[ root@xuegod63 mysql]# date -
s
"2015-3-21"
Tue Mar 21 20:20:11 CST 2015
[ root@xuegod63 test]# ./mysql- back-auto.sh
“
This 2015-03-21 MySQL BACKUP is SUCCESS"
The mysql backup successfully
[ root@xuegod63 mysql]#
ls
2015-3-10 2015-3-11 2015-3-21
所以30天后删除成功
注意:写脚本时要加上注释,而且常用变量写规范,这样更改时就只用更改相应变量内容而不是脚本内部,最后重点牢记脚本代码。