在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
简介 在生产环境上,为了避免数据的丢失,通常情况下都会定时的对数据库进行备份。而Linux的crontab指令则可以帮助我们实现对数据库定时进行备份。首先我们来简单了解crontab指令,如果你会了请跳到下一个内容mysql备份。 contab定时任务 使用crontab -e来编写我们的定时任务。 0 5 * * 1 [command] 前面的5个数字分别代表分、时、日、月、周,后面的 0 8 * * * [command] 扩展:
mysql备份 快速上手 这里我的mysql数据库是docker容器。假如你需要在每天晚上8点整执行定时任务,那么可以这么写。 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 为你的数据库容器名 如果你没什么要求,单纯的只是想要备份,那么上面那个命令就可以帮你进行定时备份。 小坑: mysql备份的时候我使用了 crontab优化 我不建议直接在 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文件进行压缩,不然的话磁盘占用就太大了。 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 {} \;
数据恢复 若一不小心你执行 >mysql create database database_name; 然后恢复最近备份的数据。恢复备份的命令: docker exec -i mysql_container mysql -uroot -proot_password database_name < /var/backups/mysql/20200619_120012.sql 虽然恢复了备份文件的数据,但是备份时间点之后的数据我们却没有恢复回来。 binlog日志 binlog 是mysql的一个归档日志,记录的数据修改的逻辑,如:给 ID = 3 的这一行的 money 字段 + 1。 > 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文件当中。 恢复数据 拿回上面例子的这段话。
首先进入到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的数据; 恢复命令格式: mysqlbinlog [options] file | mysql -uroot -proot_password database_name mysqlbinlog常用参数:
恢复备份数据和binlog数据前建议先登录mysql后执行 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 /* xid=2021 */ | | binlog.000004 | 660 | Anonymous_Gtid | 1 | 739 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' | | binlog.000004 | 739 | Query | 1 | 822 | drop database hotel_server /* xid=26 */ | +---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------- 根据上面的日志,我们可以看到,在 mysqlbinlog --start-datetime=2020-06-19 20:00:00 --stop-position=660 /var/lib/mysql/binlog.000003 | mysql -uroot -proot_password datbase_name 如果你的范围包括了822的位置,那么就会帮你执行 总结 因为mysql定时备份是在生产环境上必须的任务。是很常用的。所以我就迫不及待的写博客。当然也很感谢我同事的帮助。这篇文章已经写了三天了,因为我也是在不断地试错,不断的更新文章。避免把错误的知识点写出来。如果帮到你了,关注我一波呗!谢谢。 以上就是浅析mysql 定时备份任务的详细内容,更多关于mysql 定时备份任务的资料请关注极客世界其它相关文章! |
请发表评论