暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

生产环境:mysqlbackup物理备份的一种shell脚本实现

Ethan_Yang 2019-07-17
593

【此为本 第13篇文章】

【引言

最近一个MySQL需求,当库的数据量上去了后,在>100G的时候,使用MySQL自带的逻辑备份工具mysqldump大概需要1个小时时间。当数据库达到500G以上时,备份时间往往变得不可忍受,如果再加上库恢复时间,则整个业务中断时长将变得不可忍受。那有什么好的好方法能够缩短T级别以下的MySQL库的备份?我们首先想到的是使用物理备份。

物理备份方式有很多,常用的有:Percona xtrabackup、mysqlbackup。这里简单介绍下大家使用比较广泛的第三方开源工具xtrabackup,想具体了解的同学请想看【参考3】链接。

Xtrabackup属于物理备份,支持物理热备,开源

Xtrabackup支持增量备份、完整备份、差异备份,与binlog日志组合

Xtrabackup提供两个命令行工具:

1. Xtrabackup:可以备份innodbxtraDB存储引擎的表;

2. Innobackupex:支持备份innodbmyisam表的存储引擎,使用perl语言编写,执行过程中会执行一个读锁

因公司使用的是企业版(MySQL Enterprise Server - Commercial);故,本文将要介绍物理备份工具使用mysqlbackup,重点是如何使用该工具编写一个生产环境使用的shell全备份脚本。

对于物理备份和逻辑备份,如下有简介,想了解的朋友可以看下官方解释

logical backup

A backup that reproduces table structure and data, without copying the actual data files. For example, the mysqldump command produces a logical backup, because its output contains statements such as CREATE TABLE and INSERT that can re-create the data. Contrast with physical backup. A logical backup offers flexibility (for example, you could edit table definitions or insert statements before restoring), but can take substantially longer to restore than a physical backup.


physical backup

A backup that copies the actual data files. For example, the mysqlbackup command of the MySQL Enterprise Backup product produces a physical backup, because its output contains data files that can be used directly by the mysqld server, resulting in a faster restore operation. Contrast with logical backup. See Also backup, logical backup, MySQL Enterprise Backup, restore.

以下是本人编写的可使用于生产的一个shell全备份脚本;

    [root@mysql-01 backup]# cat  mysql_physical_fullback.sh
    #!/bin/bash
    #######################################################
    # $Name: mysql_physical_fullback.sh
    # $Version: v1.0
    # $Author: ethan_yang
    # $Create Date: 2019-07-16
    # $Description: MySQL full_backup all-databases
    #######################################################

    # .bash_profile
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    # User specific environment and startup programs
    PATH=/usr/local/mysql/bin:$PATH:$HOME/bin
    export PATH

    ################### Declare environment variables #########
    record_log=/mysqldata/backup/
    log_name=physical_fullback_record.log

    backup_dir=/mysqldata/backup/back_images
    metadata_dir=/mysqldata/backup/back_metadata

    echo "--------------------Full Backup Starting------------------" >> $record_log/$log_name
    date >> $record_log/$log_name

    mysqlbackup --user=root --password=XXXXXX --socket=/mysqldata/tmp/mysql.sock --host=localhost \
    --backup-image=$backup_dir/physical_fullback_`date '+%m-%d-%Y'`.mbi \
    --backup-dir=$metadata_dir/fullback_info_`date '+%m-%d-%Y'` backup-to-image

    date >> $record_log/$log_name
    echo "--------------------Full Backup Ended------------------" >> $record_log/$log_name

    ########## delete the physical_images and metadata_infor from 7 days ago #############

    images_dir=/mysqldata/backup/back_images
    find $images_dir -type f -name "physical_fullback_*.mbi" -mtime +7 -exec rm -rf {} \;

    metadata_dir=/mysqldata/backup/back_metadata
    find $metadata_dir -type d -name "fullback_info_*" -mtime +7 -exec rm -rf {} \;

    设置定时任务,为每周1,3,5的22点整开始备份

      [root@mysql-01 ~]# crontab -l
      0 22 * * 1,3,5 /mysqldata/backup/mysql_physical_fullback.sh >/dev/null 2>&1 


      注意脚本最后使用了如下shell命令,来删除7天以前的备份镜像和备份元数据信,即备份集只保留7天内的镜像文件。

      ######## delete the physical_images and metadata_infor from 7 days ago #############

      images_dir=/mysqldata/backup/back_images

      find $images_dir -type f -name "physical_fullback_*.mbi" -mtime +7 -exec rm -rf {} \;

       

      metadata_dir=/mysqldata/backup/back_metadata

      find $metadata_dir -type d -name "fullback_info_*" -mtime +7 -exec rm -rf {} \;

      其中,-type f为找出符合条件的文件,-type d 为找出符合条件的目录,并传递给rm进行删除。

       

      物理恢复命令如下:

      mysqlbackup --defaults-file=/etc/my.cnf --datadir=/mysqldata/data --backup-image=/mysqldata/backup/back_images/physical_fullback_16-07-2019.mbi --backup-dir=/mysql/tmp1 copy-back-and-apply-log --force

      find命令还是很好用的,以下是find命令的几种常用方式:

      根据文件类型进行搜索

      find . -type 类型参数

      类型参数列表:

      Ø 普通文件

      Ø 符号连接

      Ø 目录

      Ø 字符设备

      Ø 块设备

      Ø 套接字

      Ø p Fifo

      UNIX/Linux文件系统每个文件都有三种时间戳:

      Ø 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。

      Ø 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。

      Ø 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

       

      搜索最近七天内被访问过的所有文件

      Ø find . -type f -atime -7

      Ø 搜索恰好在七天前被访问过的所有文件

      Ø find . -type f -atime 7

      Ø 搜索超过七天内被访问过的所有文件

      Ø find . -type f -atime +7

      Ø 搜索访问时间超过10分钟的所有文件

      Ø find . -type f -amin +10

      Ø 找出比file.log修改时间更长的所有文件

      Ø find . -type f -newer file.log

      Ø 根据文件大小进行匹配

      find . -type f -size 文件大小单元

      Ø 文件大小单元:

      Ø b —— 块(512字节)

      Ø c —— 字节

      Ø w —— 字(2字节)

      Ø k —— 千字节

      Ø M —— 兆字节

      Ø G —— 吉字节

      搜索大于10KB的文件

      Ø find . -type f -size +10k

      Ø 搜索小于10KB的文件

      Ø find . -type f -size -10k

      Ø 搜索等于10KB的文件

      Ø find . -type f -size 10k


      【结语】

      1. 本文重点介绍了如何使用该工具编写一个生产环境使用的shell全备份脚本;脚本的重点在于一定要注意删除过期的备份集,否则磁盘空间多少都不够用。

      2. MySQL也是一直在学习中,该脚本已经上传至github上,有兴趣的朋友可以参考下。链接为:

        https://github.com/polestarYang/mysqlgit


        【参考1

        https://www.cnblogs.com/jiftle/p/9707518.html

        【参考2

        https://www.csdn.net/gather_2a/MtTaIg3sNDM1NC1ibG9n.html

        【参考3

        https://blog.51cto.com/xsboke/1925641


        如果大家觉得此文有帮助,欢迎关注个人微信 ;

        长按识别二维码或 搜索“一森咖记”



        最后修改时间:2020-05-07 22:28:33
        文章转载自Ethan_Yang,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论