首页 > 数据库 >MySQL数据库定时备份的几种实现方法

MySQL数据库定时备份的几种实现方法

时间:2024-08-27 09:37:39浏览次数:10  
标签:备份 MySQL echo mysql date path backup 数据库

MySQL数据库定时备份的几种实现方法

更新时间:2024年07月22日 10:44:48   作者:师小师  本文主要介绍了MySQL数据库定时备份的几种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 +
目录

AI可以解决你遇到的任何问题,ChatGPT+国内所有大模型 免费用!
 点击立即使用 (对话+绘画) 

1、查看 MySQL 是否安装了 crontab

1 2 yum -y install vixie-cron yum -y install crontabs

2、crontab 常用命令

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 查看进程是否正在进行 ps aux | grep crond # 查看运行状态 systemctl status crond   或者 service crond status # 启动服务 systemctl start crond  或者 service crond status # 关闭服务 systemctl stop crond  或者 service crond status # 重启服务 systemctl restart crond  或者 service crond restart # 重新载入配置 systemctl reload crond # 加入开机启动 systemctl enable crond # 查看定时任务 crontab -l # 编辑 crontab -e

3、编写 dump_mysql.sh 脚本

方式一:简单版

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 设置mysql的登录用户名和密码(根据实际情况填写) mysql_user="root" mysql_password="123456" mysql_host="101.133.170.222" mysql_port="3306" mysql_charset="utf8" # 备份文件存放地址(根据实际情况填写) backup_location=/data/mysql/bakup    # 是否删除过期数据 expire_backup_delete="ON" expire_days=7 backup_time=`date +%Y%m%d%H%M` backup_dir=$backup_location welcome_msg="Welcome to use MySQL backup tools!" # 备份指定数据库中数据(此处假设数据库是ruoyi )mysql容器里面找到mysqldump我的路径是/usr/bin/mysqldump docker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B ruoyi > $backup_dir/mysql-$backup_time.sql # 删除过期数据 if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then         `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`         echo "Expired backup data delete complete!" fi

方式二:复杂版

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 49 50 mysql_user="root"  #MySQL备份用户 mysql_password="123456" #MySQL备份用户的密码 mysql_host="101.133.170.222" mysql_port="3306"  mysql_charset="utf8" #MySQL编码0 2 * * * docker exec -i mysql sh /root/mysql8.0.20/mysqlbfplus/run.sh backup_db_arr=("ruoyi") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3") backup_location=/data/mysql/bakup  #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹 expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭 expire_days=7 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效 backup_time=`date +%Y%m%d%H%M`  #定义备份详细时间 backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间 #backup_day_ago=`date -d 'expire_days days ago' +%Y-%m-%d` #备份之前的日期 backup_dir=$backup_location/$backup_Ymd  #备份文件夹全路径 welcome_msg="Welcome to use MySQL backup tools!" #欢迎语 mysql_ps=`ps -ef |grep mysql |wc -l` mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then         echo "ERROR:MySQL is not running! backup stop!"         exit else         echo $welcome_msg   echo "MySQL connect ok! Please wait......" fi # 判断有没有定义备份的数据库,如果有定义则开始备份,否则退出备份 if [ "$backup_db_arr" != "" ];then         #dbnames=$(cut -d ',' -f1-5 $backup_database)         #echo "arr is (${backup_db_arr[@]})"         for dbname in ${backup_db_arr[@]}         do                 echo "database $dbname backup start..."                 `mkdir -p $backup_dir`                 docker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz                  flag=`echo $?`                  if [ $flag == "0" ];then                          echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"                  else                          echo "database $dbname backup fail!"                  fi          done else         echo "ERROR:No database to backup! backup stop"         exit fi # 如果开启了删除过期备份,则进行删除操作 if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then          #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`          `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`          echo "Expired backup data delete complete!" fi

方式三:docker定时备份,根据备份数量删除

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 #用户名 mysql_user="root" #密码 mysql_password="root" mysql_host="101.133.170.222" #端口号 mysql_port="3306" #将要备份的数据库 database_name="ruoyi" #编码格式 mysql_charset="utf8"   #保存备份文件最多个数 count=3 #备份保存路径 backup_path=/data/mysql/bakup #日期 date_time=`date +%Y-%m-%d-%H-%M`   #如果文件夹不存在则创建 if [ ! -d $backup_path ]; then        mkdir -p $backup_path; fi #查看MySQL是否在运行 mysql_ps=`ps -ef |grep mysql |wc -l` echo "查看MySQL是否在运行:$mysql_ps" >> $backup_path/dump.log mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then         echo "ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log         exit else         echo "Welcome to use MySQL backup tools!" >> $backup_path/dump.log   echo "MySQL connect ok! Please wait......" >> $backup_path/dump.log fi #开始备份 echo "开始备份..." >> $backup_path/dump.log docker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sql     #开始压缩 cd $backup_path tar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql #更新备份日志 echo "压缩原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log   #删除源文件 rm -rf $backup_path/$database_name-$date_time.sql   echo "压缩后删除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log   #找出需要删除的备份 delfile=`ls -l -crt  $backup_path/*.tar.gz | awk '{print $9 }' | head -1`   #判断现在的备份数量是否大于阈值 number=`ls -l -crt  $backup_path/*.tar.gz | awk '{print $9 }' | wc -l`   if [ $number -gt $count ] then   #删除最早生成的备份,只保留count数量的备份   rm $delfile   #更新删除文件日志   echo "$date 删除 $count 前的文件 delete $delfile" >> $backup_path/dump.log fi

方式四:不是 docker 安装备份

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #用户名 mysql_user="root" #密码 mysql_password="root" mysql_host="101.133.170.222" #端口号 mysql_port="3306" #将要备份的数据库 database_name="ruoyi" #编码格式 mysql_charset="utf8"   #保存备份文件最多个数 count=3 #备份保存路径 backup_path=/data/mysql/bakup #日期 date_time=`date +%Y-%m-%d-%H-%M`   #如果文件夹不存在则创建 if [ ! -d $backup_path ]; then        mkdir -p $backup_path; fi #查看MySQL是否在运行 mysql_ps=`ps -ef |grep mysql |wc -l` echo "$date_time 查看MySQL是否在运行:$mysql_ps" >> $backup_path/dump.log mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l` if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then         echo "$date_time ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log         exit else         echo "$date_time Welcome to use MySQL backup tools!" >> $backup_path/dump.log   echo "$date_time MySQL connect ok! Please wait......" >> $backup_path/dump.log fi #开始备份 echo "$date_time 开始备份...$backup_path" >> $backup_path/dump.log docker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sql echo "$date_time 备份完成...$backup_path" >> $backup_path/dump.log   #开始压缩 cd $backup_path tar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql #更新备份日志 echo  "$date_time 压缩原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log   #删除源文件 rm -rf $backup_path/$database_name-$date_time.sql   echo "$date_time 压缩后删除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log   #找出需要删除的备份 delfile=`ls -l -crt  $backup_path/*.tar.gz | awk '{print $9 }' | head -1`   #判断现在的备份数量是否大于阈值 number=`ls -l -crt  $backup_path/*.tar.gz | awk '{print $9 }' | wc -l`   if [ $number -gt $count ] then   #删除最早生成的备份,只保留count数量的备份   rm $delfile   #更新删除文件日志   echo "$date_time 删除 $count 前的文件 delete $delfile" >> $backup_path/dump.log   echo "$date_time 备份成功" >> $backup_path/dump.log fi

4、配置定时任务

时间格式:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 常用时间格式 每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 * * 每年执行 0 0 1 1 * # crontab 文件的格式 {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}  minute: 区间为 0 – 59  hour: 区间为0 – 23  day-of-month: 区间为0 – 31  month: 区间为1 – 12. 1 是1月. 12是12月.  Day-of-week: 区间为0 – 7. 周日可以是0或7.

常用时间:

1 2 3 4 # 执行 crontab -e 命令,写入以下命令保存,每 5 分钟执行一次 */5 * * * *  sh /data/mysql/dump_mysql.sh # 每天凌晨 5 点执行 0 5 * * * sh /data/mysql/dump_mysql.sh

保存如果 出现一下问题

在这里插入图片描述

进入/var/spool下查看cron目录是正常的,但是在cron里面没有权限建立文件这个根源。

(1)可以尝试先在/var/spool/cron目录下用vim编辑一个测试文件,看是否可以保存在这个cron目录下,如果无法保存提示权限问题。那么可能目录有什么特殊的地方,root用户也被约束了

1 2 3 4 5 6 # 查看是否有特殊的属性 [root@izuf61151k3ad2dso6mo9oz cron]# lsattr /var/spool/cron/root # 去掉特殊的属性 [root@izuf61151k3ad2dso6mo9oz cron]# chattr -ai /var/spool/cron/root # 再次编辑定时任务 [root@izuf61151k3ad2dso6mo9oz cron]# crontab -e

执行 lsattr /var/spool/cron/root 我们可以看到和常规的权限设置不一样,所以清楚这些特殊的属性

在这里插入图片描述

清除属性我们可以看到正常的权限的问题

在这里插入图片描述

再次执行 crontab -e ,编辑模式,添加 */5 * * * * sh /data/mysql/dump_mysql.sh ,保存即可

在这里插入图片描述

补充说明

crontab 时间格式说明

1 0 5 * * * /root/bin/backup.sh

到此这篇关于MySQL数据库定时备份的几种实现方法的文章就介绍到这了,更多相关MySQL 定时备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


@echo off

echo 设置MySql数据库的连接信息
set host=127.0.0.1
set port=
set user=
set pass=

echo 设置要备份的MySql数据库名称
#(库名)
set dbname=forestrybureau_ys

echo 获取当天的日期格式,例如:20221102231300

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%

set backup_date=%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2%


echo 设置备份文件的路径 (注意路径!!!)
set backupfile=E:\lyxmjgzxxt\mysql_dataBack\forestrybureau_ys\%dbname%_backup_%backup_date%.sql

echo 使用mysqldump对指定的MySql进行备份
echo 注意mysqldump实际路径(注意路径!!!)

"E:\lyxmjgzxxt\mysql-5.7.44-win32\bin\mysqldump" -h%host% -P%port% -u%user% -p%pass% -c --add-drop-table %dbname% > %backupfile%

echo 删除过期文件,这里是超过60天就删除(注意路径!!!)

forfiles /p E:\lyxmjgzxxt\mysql_dataBack\forestrybureau_ys /s /m *.sql /d -60 /c "cmd /c del @file /f"S



标签:备份,MySQL,echo,mysql,date,path,backup,数据库
From: https://www.cnblogs.com/ios9/p/18382023

相关文章

  • java连接sqlite数据库
    首先下载jar包(每种数据库有自己jar包)然后idea里创建新项目并且在项目里创建lib文件里面放jar包接着导入jar包然后apply->ok这样就连上如果要可视化数据库DBBrowser最后测试连接TestConnection看数据库连上没结果:......
  • java一键生成数据库说明文档html格式
    要验收项目了,要写数据库文档,一大堆表太费劲了,直接生成一个吧,本来想用个别人的轮子,网上看了几个,感觉效果不怎么好,自己动手写一个吧。抽空再把字典表补充进去就OK了先看效果:目录快速导航生成效果关键代码try{ StringprefixTables="sys_monitor_db_ha......
  • 基于Java+SpringBoot+Mysql实现高校教务信息系统功能设计与实现二
    一、前言介绍:1.1项目摘要高校教务信息系统课题的提出,主要源于高校日常管理工作的复杂性和重要性。作为高校的基本任务,人才培养离不开教学与管理工作的有效组织和协调。教务管理作为高校日常管理的核心组成部分,涉及教学资源的合理配置、教学过程的科学规划以及教学质量的......
  • 基于Java+SpringBoot+Mysql实现高校教务信息系统功能设计与实现三
    一、前言介绍:1.1项目摘要高校教务信息系统课题的提出,主要源于高校日常管理工作的复杂性和重要性。作为高校的基本任务,人才培养离不开教学与管理工作的有效组织和协调。教务管理作为高校日常管理的核心组成部分,涉及教学资源的合理配置、教学过程的科学规划以及教学质量的......
  • 【含文档】基于Springboot+Vue的流浪猫狗救助救援系统(含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能该系统......
  • [Meachines] [Easy] Remote NFS备份文件泄露+Umbraco-RCE+TeamViewer权限提升
    信息收集IPAddressOpeningPorts10.10.10.180TCP:21,80,111,135,139,445,2049,5985,47001,49664,49665,49666,49667,49678,49679,49680nmap-p-10.10.10.180--min-rate1000-sC-sVPORTSTATESERVICEVERSION21/tcpopenftp......
  • OceanBase-OB备份异地恢复流程
    OB备份异地恢复流程——2023年5月9日一、【白屏操作】1、确定当前备份的OB版本: 2、新建备份目录授权(备份到本地目录为例):mkdir /obbackup/chown -R admin.admin /obbackup/保证能解析成功: 3、点击“备份”,查询操作系统的目录结构:4、拷贝租户层面数据文......
  • MySQL事务详细讲解和案例示范
    在数据库系统中,事务是确保数据一致性和完整性的关键机制。它是指一组要么全部执行,要么全部回滚的操作,从而保证数据的原子性。一、事务的ACID属性事务具有四个基本属性,简称为ACID属性。这四个属性是保障事务操作可靠性的重要基石。原子性(Atomicity):定义:事务中的所有操......
  • 数据库性能诊断利器 聚好看DBdoctor亮相中国数据库技术大会
       2024年8月22-24日,备受瞩目的第15届中国数据库技术大会(DTCC2024)于北京隆总召开。数字化创新浪潮汹涌澎湃,数据库作为信息技术的核心基础设施,正以前所未用的速度推动各行各业的智能化升级。作为在数据库技术领域率先掌握前沿eBPF技术的企业,聚好看科技于本次大会展示自研数据......
  • 数据库连接池的基本原理
    数据库连接池数据库池化技术,也常被称为连接池技术,是一种在数据库应用中广泛使用的技术,旨在减少数据库连接的开销,提高系统的性能和资源利用率。其核心思想是预先创建一定数量的数据库连接并将这些连接集中管理,形成一个连接池。当应用程序需要进行数据库操作时,它可以直接从连......