广告
返回顶部
首页 > 资讯 > 数据库 >浅析mysql 定时备份任务
  • 514
分享到

浅析mysql 定时备份任务

mysql定时备份mysql备份mysql定时备份任务 2022-05-29 23:05:23 514人浏览 八月长安
摘要

简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容M

简介

在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容Mysql备份。
本文章的mysql数据库是安装在Docker容器当中,以此为例进行讲解。没有安装到docker容器当中也可以参照参照。

contab定时任务

使用crontab -e来编写我们的定时任务。


0 5 * * 1 [command]

前面的5个数字分别代表分、时、日、月、周,后面的 command为你的执行命令。
假如你需要在每天晚上8点整执行定时任务,那么可以这么写


0 8 * * * [command]

扩展:

  • crontab -l 可以查看自己的定时任务
  • crontab -r 删除当前用户的所有定时任务

mysql备份

快速上手

这里我的mysql数据库是docker容器。假如你需要在每天晚上8点整执行定时任务,那么可以这么写。
首先执行命令crontab -e。


0 8 * * * docker exec mysql_container mysqldump -uroot -proot_passWord database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

mysql_container 为你的数据库容器名
mysqldump 是mysql数据库导出数据的指令
-u 填写root账号
-p 填写root密码
database_name 需要备份的数据库名
/var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql 备份文件,后面是文件名的格式

如果你没什么要求,单纯的只是想要备份,那么上面那个命令就可以帮你进行定时备份。

小坑: mysql备份的时候我使用了docker exec -it mysqldump ... 这样的命令去做bash脚本,因为-i参数是有互动的意思,导致在crontab中执行定时任务的时候,没有输出数据到sql文件当中。所以使用crontab定时的对docker容器进行备份命令的时候不要添加-i参数。

crontab优化

我不建议直接在crontab -e里面写要执行的命令,任务多了就把这个文件写的乱七八招了。
建议把数据库备份的命令写成一个bash脚本。在crontab这里调用就好了
如:建立一个/var/backups/mysql/mysqldump.sh文件,内容如下


docker exec mysql_container mysqldump -uroot -pmypassword database_name > /var/backups/mysql/$(date +%Y%m%d_%H%M%S).sql

然后把文件改为当前用户可执行的:


chmod 711 /var/backups/mysql/mysqldump.sh

执行crontab -e命令修改成如下:


0 20 * * * /var/backups/mysql/mysqldump.sh

那么这样就比较规范了。

mysql备份优化

因为sql文件比较大,所以一般情况下都会对sql文件进行压缩,不然的话磁盘占用就太大了。
假设你做了上面这一步 crontab优化,我们可以把mysqldump.sh脚本改成下面这样:


export mysqldump_date=$(date +%Y%m%d_%H%M%S) && \
docker exec mysql_container mysqldump -uroot -pmypassword database_name> /var/backups/mysql/$mysqldump_date.sql && \
gzip /var/backups/mysql/$mysqldump_date.sql
find /var/backups/mysql/ -name "*.sql" -mtime +15 -exec rm -f {} \;

export 在系统中自定义了个变量mysqldump_date,给备份和压缩命令使用
gzip 为压缩命令,默认压缩了之后会把源文件删除,压缩成.gz文件
find ... 这行命令的意思为,查询/var/backups/mysql/目录下,创建时间15天之前(-mtime +15),文件名后缀为.sql的所有文件 执行删除命令-exec rm -f {} \;。总的意思就是:mysql的备份文件只保留15天之内的。15天之前的都删除掉。

数据恢复

若一不小心你执行drop database,稳住,淡定。我们首先要创建数据库被删除的数据库。


>mysql create database database_name;

然后恢复最近备份的数据。恢复备份的命令:


docker exec -i mysql_container mysql -uroot -proot_password database_name < /var/backups/mysql/20200619_120012.sql

虽然恢复了备份文件的数据,但是备份时间点之后的数据我们却没有恢复回来。
如:晚上8点进行定时备份,但是却在晚上9点drop database,那么晚上8点到晚上9点这一个小时之内的数据却没有备份到。这时候就要使用binlog日志了。

binlog日志

binlog 是mysql的一个归档日志,记录的数据修改的逻辑,如:给 ID = 3 的这一行的 money 字段 + 1。
首先登录mysql后查询当前有多少个binlog文件:


> mysql show binary logs;
+---------------+-----------+-----------+
| Log_name   | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |    729 | No    |
| binlog.000002 |   1749 | No    |
| binlog.000003 |   1087 | No    |
+---------------+-----------+-----------+

查看当前正在写入的binlog


mysql> show master status\G;

生成新的binlog文件,mysql的后续操作都会写入到新的binlog文件当中,一般在恢复数据都时候都会先执行这个命令。


mysql> flush logs

查看binlog日志


mysql> show binlog events in 'binlog.000003';

小知识点:初始化mysql容器时,添加参数--binlog-rows-query-log-events=ON。或者到容器当中修改/etc/mysql/my.cnf文件,添加参数binlog_rows_query_log_events=ON,然后重启mysql容器。这样可以把原始的SQL添加到binlog文件当中。

恢复数据

拿回上面例子的这段话。

晚上8点进行定时备份,但是却在晚上9点drop database,那么晚上8点到晚上9点这一个小时之内的数据却没有备份到。。

首先进入到mysql容器后,切换到/var/lib/mysql目录下,查看binlog文件的创建日期


cd /var/lib/mysql
ls -l
...
-rw-r----- 1 mysql mysql   729 Jun 19 15:54 binlog.000001
-rw-r----- 1 mysql mysql   1749 Jun 19 18:45 binlog.000002
-rw-r----- 1 mysql mysql   1087 Jun 19 20:58 binlog.000003
...

从文件日期可以看出:当天时间为2020-06-21,binlog.000002文件的最后更新时间是 18:45 分,那么晚上8点的备份肯定包含了binlog.000002的数据;
binlog.000003的最后更新日期为 20:58 分,那么我们需要恢复的数据 = 晚上8点的全量备份 + binlog.000003的 20:00 - 执行drop database命令时间前的数据。

恢复命令格式:


mysqlbinlog [options] file | mysql -uroot -proot_password database_name

mysqlbinlog常用参数:

--start-datetime 开始时间,格式 2020-06-19 18:00:00
--stop-datetime 结束时间,格式同上
--start-positon 开始位置,(需要查看binlog文件)
--stop-position 结束位置,同上
...

恢复备份数据和binlog数据前建议先登录mysql后执行flush logs生成新的binlog日志,这样可以专注需要恢复数据的binlog文件。
首先我们需要查看binlog日志,在哪个位置进行了drop database操作:


mysql> show binlog events in 'binlog.000003';
+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name   | Pos | Event_type   | Server_id | End_log_pos | Info                                                                    |
+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| binlog.000003 |  4 | FORMat_desc  |     1 |     125 | Server ver: 8.0.20, Binlog ver: 4                                                      |
| binlog.000003 | 125 | Previous_gtids |     1 |     156 |                                                                       |
| binlog.000003 | 156 | Anonymous_Gtid |     1 |     235 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                    |
| binlog.000003 | 235 | Query     |     1 |     318 | BEGIN                                                                    |
| binlog.000003 | 318 | Rows_query   |     1 |     479 | # INSERT INTO `product_cateGory` SET `name` = '床上用品' , `create_time` = 1592707634 , `update_time` = 1592707634 , `lock_version` = 0   |
| binlog.000003 | 479 | Table_map   |     1 |     559 | table_id: 139 (hotel_server.product_category)                                                |
| binlog.000003 | 559 | Write_rows   |     1 |     629 | table_id: 139 flags: STMT_END_F                                                       |
| binlog.000003 | 629 | Xid      |     1 |     660 | COMMIT                                                             |
| binlog.000004 | 660 | Anonymous_Gtid |     1 |     739 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                    |
| binlog.000004 | 739 | Query     |     1 |     822 | drop database hotel_server                                                    |
+---------------+-----+----------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------

根据上面的日志,我们可以看到,在End_log_pos= 822 的位置执行了drop database操作,那么使用binlog恢复的范围就在2020-06-19 20:00:00 - 660 的位置。为什么是660?因为drop database的上一个事务的提交是660的位置,命令如下:


mysqlbinlog --start-datetime=2020-06-19 20:00:00 --stop-position=660 /var/lib/mysql/binlog.000003 | mysql -uroot -proot_password datbase_name

如果你的范围包括了822的位置,那么就会帮你执行drop database命令了。不信你试试?
执行完上面的命令,你的数据就会恢复到drop database前啦!开不开心,激不激动!

总结

因为mysql定时备份是在生产环境上必须的任务。是很常用的。所以我就迫不及待的写博客。当然也很感谢我同事的帮助。这篇文章已经写了三天了,因为我也是在不断地试错,不断的更新文章。避免把错误的知识点写出来。如果帮到你了,关注我一波呗!谢谢。

以上就是浅析mysql 定时备份任务的详细内容,更多关于mysql 定时备份任务的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 浅析mysql 定时备份任务

本文链接: https://www.lsjlt.com/news/9641.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析mysql 定时备份任务
    简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容m...
    99+
    2022-05-29
    mysql 定时备份 mysql 备份 mysql 定时备份任务
  • mysql定时备份任务
    简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份。 本文章的...
    99+
    2019-03-23
    mysql定时备份任务
  • 定时任务备份mysql数据库,同时备份多个数据库
    编写备份数据库的shell脚本 创建脚本 mkdir -p /root/mysql_dump/data cd /root/mysql_dump vim mysql_back.sh 脚本内容如下 #!/bin/sh # File: ...
    99+
    2018-09-25
    定时任务备份mysql数据库,同时备份多个数据库
  • db2定时任务、备份脚本
    [db2inst1@db2 ~]$ crontab -l30 02 * * *  /bin/sh  /home/db2inst1/backup/backup.sh[db2inst1@db...
    99+
    2022-10-18
  • 浅析Shell中的定时任务 crontab
    crondtab定时任务 crondtab是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,crondtab进程每分钟会定期检查是否有要执行的任务,如果有要执行的任...
    99+
    2022-06-04
    shell 定时任务 定时任务 crontab shell 定时任务 crontab
  • mysql 定时备份
    mysql备份 mysqldump -uroot  -p111111 test > ~/mysqlBak/test`date "+%Y%m%d%H%M%S"`.sql cron编辑 crontab -e cron列表 crontab...
    99+
    2017-12-05
    mysql 定时备份
  • 浅析MySQL 备份与恢复
    1、简介 数据无价,MySQL作为一个数据库系统,其备份自然也是非常重要且有必要去做。备份的理由千千万,预防故障,安全需求,回滚,审计,删了又改的需求等等,备份的重要性不言而喻。除了备份本身, 如何使用备份来恢复 ...
    99+
    2022-05-20
    MySQL 备份 MySQL 恢复 MySQL备份与恢复
  • MySQL定时备份(全量备份+增量备份)
    参考 zmcyu 的 mysql数据库的完整备份、差异备份、增量备份 更多binlog的学习参考马丁传奇的 MySQL的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的。 如果查看binlog是出现语句加密的情况...
    99+
    2016-10-03
    MySQL定时备份(全量备份+增量备份)
  • mysql实现定时备份
    编写脚本xxx.bat @echo offecho 设置MySql数据库的连接信息set host=127.0.0.1set port=3306set user=rootset pass=123456...
    99+
    2023-09-01
    mysql 数据库 php
  • MySQL定时任务
    1、事件概述 在MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。它可以作为定时任务调度器,取代部分原来只能用操作系统的计划任务才能执行的工作。另外,更值得一提的是,MySQL的事件可以实现每秒钟...
    99+
    2023-08-16
    mysql 数据库 linux
  • MySQL 实现点餐系统的数据备份定时任务功能
    MySQL 实现点餐系统的数据备份定时任务功能随着互联网的发展,越来越多的餐饮店选择使用点餐系统来提高工作效率和客户满意度。而作为点餐系统的核心,数据库中存储了大量的数据,保证数据的安全性和完整性是至关重要的。本文将介绍如何使用MySQL来...
    99+
    2023-11-01
    MySQL 定时任务 点餐系统
  • 定时备份MySQL数据库
    MySQL 提供了 mysqldump 命令来实现导出数据库,命令用法如下: mysqldump -u root -p[password] [database_name] > [backup].sql...
    99+
    2023-09-28
    数据库 mysql linux
  • 浅析java中常用的定时任务框架-单体
    目录一、阅读收获二、本章源码下载三、Timer+TimerTask四、ScheduledExecutorService五、Spring Task5.1 单线程串行执行-@Schedu...
    99+
    2022-11-12
  • 深入浅析spring中的多线程与定时任务
    深入浅析spring中的多线程与定时任务?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.spring多线程任务的使用spring通过任务执行器TaskExecutor来实...
    99+
    2023-05-31
    spring 定时任务 多线程
  • navicat mysql 定时任务
    navicat  首先新建函数  选择过程 命名为test   新建事件       设置时间  navicat mysql 定时任务原文地址:https://www.cnblogs.com/jxfy/p/13384601.html...
    99+
    2019-09-17
    navicat mysql 定时任务 数据库入门 数据库基础教程 数据库 mysql
  • PHP实现数据库备份定时任务的方法
    随着互联网的快速发展,网站数据已经成为企业最重要的资产之一。然而不管是哪种类型的网站,难免会遇到数据丢失的问题。因此,数据库备份变得非常必要。本文将介绍一种使用PHP编写数据库备份的自动定时任务方法,既能保证数据的安全性,又能减轻管理员的工...
    99+
    2023-05-19
    PHP 定时任务 数据库备份
  • mysql怎么定时备份文件
    本篇内容主要讲解“mysql怎么定时备份文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql怎么定时备份文件”吧!i_定时备份文件mysql在cd /h...
    99+
    2022-10-18
  • Node定时备份MySQL的实现
    目录前言开发部署安装依赖编写代码pm2部署结语前言 前段时间发生了一件令我哭笑不得的事,部署在 Centos 服务器上的项目,因为需要重新上传· 部署,所以我执行了下面...
    99+
    2023-05-17
    Node定时备份MySQL MySQL定时备份
  • MySQL创建定时任务
    定时任务是老生常谈了,因为我们总是需要定时修改特定的数据。 实现它的方法肯定不止一种,但我在相当长一段时间里都是用程序编码去做的,今天突然想到“为什么一定要采用调用的方式...
    99+
    2022-11-13
  • 【MySQL-设置定时任务】
    在 MySQL 5.5 中,可以使用事件(Event)来创建定时任务。下面是一个例子,演示如何在 MySQL 5.5 中设置一个每天执行一次的定时任务: 首先,需要确保 MySQL 服务器启用了事件调度器(Event Scheduler)。...
    99+
    2023-08-16
    数据库 mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作