linux利用shell+crontab自动备份mysql数据库

一.准备条件,得先安装一个mysql数据库

mysql5.7数据库安装教程
https://www.cnblogs.com/magepi/p/16983507.html

 二.然后准备编写shell脚本

 编写备份单个库shell脚本

#!/bin/bash

#保存备份个数,备份3天数据
number=3
#备份保存路径
backup_dir=/opt/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具(mysql自带得备份工具)
tool=mysqldump
#用户名
username=root
#密码
password=123456
#将要备份的数据库(-A备份所有)
database_name=home

#如果文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi

#简单写法  mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
$tool -u $username -p$password $database_name > $backup_dir/$dd.sql

#写创建备份日志
echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt

#找出需要删除的备份
delfile=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | head -1`

#判断现在的备份数量是否大于$number
count=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | wc -l`

if [ $count -gt $number ]
then
  #删除最早生成的备份,只保留number数量的备份
  rm -f $delfile
  #写删除文件日志
  echo "delete $delfile" >> $backup_dir/log.txt
fi

备份多个库且每个库分别备份命名

#!/bin/bash

#保存备份个数,备份3天数据
number=3
#备份保存路径
backup_dir=/opt/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=123456
#host=127.0.0.1
#将要备份的数据库(-A备份所有)
#database_name=chinaoly_test

#如果文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi
#查询mysql所有的表
DATABASES=$(mysql -u$username -p$password  -s -e "SHOW DATABASES")

for db in $DATABASES; do
#去掉系统默认表    
 if [ "$db" != "information_schema" ] && [ "$db" != "mysql" ] && [ "$db" != "sys" ] && [ "$db" != "performance_schema" ]; then
 echo "backed up successfully"

#简单写法  mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
$tool -u $username -p$password --skip-lock-tables $db > $backup_dir/"$db"_$dd.sql
#进行压缩
gzip $backup_dir/"$db"_$dd.sql

#写创建备份日志
echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt

#找出需要删除的备份
delfile=`ls -l -crt  $backup_dir/"$db"* | awk '{print $9 }' | head -1`

#判断现在的备份数量是否大于$number
count=`ls -l -crt  $backup_dir/"$db"* | awk '{print $9 }' | wc -l`

if [ $count -gt $number ]
then
  #删除最早生成的备份,只保留number数量的备份
  rm -f $delfile
  #写删除文件日志
  echo "delete $delfile" >> $backup_dir/log.txt
fi

fi

done

echo "All databases backed up successfully"

三. 编写crontab定期执行备份脚本

#每分钟执行一次该脚本mysql_backup.sh
*/1 * * * * /opt/mysqlbackup/mysql_backup.sh

四.验证备份脚本与crontab定时任务

准备得数据库及数据表

 name表中有两个字段

编写单个数据库备份脚本

[root@VM-0-3-linux mysqlbackup]# pwd
/opt/mysqlbackup
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# cat mysql_backup.sh 
#!/bin/bash

#保存备份个数,备份3天数据
number=3
#备份保存路径
backup_dir=/opt/mysqlbackup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具(mysql自带得备份工具)
tool=mysqldump
#用户名
username=root
#密码
password=123456
#将要备份的数据库(-A备份所有)
database_name=home

#如果文件夹不存在则创建
if [ ! -d $backup_dir ]; 
then     
    mkdir -p $backup_dir; 
fi

#简单写法  mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
$tool -u $username -p$password $database_name > $backup_dir/$dd.sql

#写创建备份日志
echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt

#找出需要删除的备份
delfile=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | head -1`

#判断现在的备份数量是否大于$number
count=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | wc -l`

if [ $count -gt $number ]
then

编写crontab脚本

[root@VM-0-3-linux mysqlbackup]# ls
mysql_backup.sh  mysqlRollBack.cron
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# cat mysqlRollBack.cron 
*/1 * * * * /opt/mysqlbackup/mysql_backup.sh
[root@VM-0-3-linux mysqlbackup]# 

然后先单独测试下备份脚本mysql_backup.sh看能不能创建成功

执行报错,找不到mysqldump工具
[root@VM-0-3-linux mysqlbackup]# sh mysql_backup.sh mysql_backup.sh: line 25: mysqldump: command not found [root@VM-0-3-linux mysqlbackup]#

将mysqldump建立软连接

ln -s  /usr/local/mysql/bin/mysqldump  /usr/bin

再次执行 sh mysql_backup.sh

#对密码得警告不影响数据备份
[root@VM-0-3-linux mysqlbackup]# sh mysql_backup.sh mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@VM-0-3-linux mysqlbackup]#

可以看到生成了sql文件且对应的日志文件log.txt也生成了

du -sh *|sort -h(对文件夹大小进行排序命令)

[root@VM-0-3-linux mysqlbackup]# ls 2024-01-29-11-37-21.sql log.txt mysql_backup.sh mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]# du -sh *|sort -h 4.0K 2024-01-29-11-37-21.sql 4.0K log.txt 4.0K mysql_backup.sh 4.0K mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]#

这个库的备份sql已经生成,那我们将原来home库中name表的数据修改下

 然后将备份sql下载下来在navicat运行sql即可

 

刷新一下就还原回原本数据了

只有上面备份脚本还不行, 必需结合linux自带的定时器crontab使用

# 添加定时任务   mysqlRollBack.cron这个文件内的定时任务
crontab mysqlRollBack.cron

执行 crontab -l 查看定时任务是否已经生效

[root@VM-0-3-linux mysqlbackup]# crontab mysqlRollBack.cron
[root@VM-0-3-linux mysqlbackup]# crontab -l
*/1 * * * * /opt/mysqlbackup/mysql_backup.sh
[root@VM-0-3-linux mysqlbackup]# 

过了一分钟后发现没生成sql文件,后面通过查找资料定位到crontab没有生效

使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:sh mysql_backup.sh)又可以正常执行,这主要是因为无法读取环境变量的原因
#这是crontab的相关文档,里面有记录原因及怎么配置(脚本无法执行问题)
https://www.runoob.com/linux/linux-comm-crontab.html

crontab新的执行文件改成这样就可以执行

*/1 * * * * . /etc/profile;/bin/sh /opt/mysqlbackup/mysql_backup.sh

查看/opt/mysqlbackup文件夹发现sql文件始终是三个, log.txt记录了创建及删除备份的操作记录(备份脚本定义保存三个)

[root@VM-0-3-linux mysqlbackup]# ls
2024-01-29-11-58-01.sql  2024-01-29-11-59-01.sql  2024-01-29-12-00-01.sql  log.txt  mysql_backup.sh  mysqlRollBack.cron
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# cat log.txt 
create /opt/mysqlbackup/2024-01-29-11-37-21.dupm
create /opt/mysqlbackup/2024-01-29-11-55-01.dupm
create /opt/mysqlbackup/2024-01-29-11-56-01.dupm
create /opt/mysqlbackup/2024-01-29-11-57-02.dupm
delete /opt/mysqlbackup/2024-01-29-11-37-21.sql
create /opt/mysqlbackup/2024-01-29-11-58-01.dupm
delete /opt/mysqlbackup/2024-01-29-11-55-01.sql
create /opt/mysqlbackup/2024-01-29-11-59-01.dupm
delete /opt/mysqlbackup/2024-01-29-11-56-01.sql
create /opt/mysqlbackup/2024-01-29-12-00-01.dupm
delete /opt/mysqlbackup/2024-01-29-11-57-02.sql
[root@VM-0-3-linux mysqlbackup]# 

其实备份全部库也是一样,执行命令都差不多,无非把单个的脚本换成备份多个的脚本

逻辑相当于先查询了该mysql所有数据库,然后依次遍历数据库进行一个一个的生成备份sql(去掉了四个默认数据库,不去掉会报错)

mysql创建两个数据库

 将mysql_backup.sh脚本替换成备份全部的

重新执行 crontab mysqlRollBack.cron

[root@VM-0-3-linux mysqlbackup]# ls
home_2024-01-29-12-33-01.sql.gz  home_2024-01-29-12-35-02.sql.gz      homeTest_2024-01-29-12-34-01.sql.gz  log.txt          mysqlRollBack.cron
home_2024-01-29-12-34-01.sql.gz  homeTest_2024-01-29-12-33-01.sql.gz  homeTest_2024-01-29-12-35-02.sql.gz  mysql_backup.sh
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# 
[root@VM-0-3-linux mysqlbackup]# 

每个库生成自己对应的sql文件且最多也只有三个(生成sql时间可能跟系统时间差8小时,可以自己调整下)

posted @ 2024-01-29 20:37  马革皮  阅读(210)  评论(0编辑  收藏  举报