返回顶部
首页 > 资讯 > 数据库 >mysqldump5.7以下版本如何实现并发备份
  • 232
分享到

mysqldump5.7以下版本如何实现并发备份

2024-04-02 19:04:59 232人浏览 独家记忆
摘要

这篇文章主要为大家展示了“Mysqldump5.7以下版本如何实现并发备份”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysqldump5.7以下版本如何实现

这篇文章主要为大家展示了“Mysqldump5.7以下版本如何实现并发备份”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysqldump5.7以下版本如何实现并发备份”这篇文章吧。

mysqldump5.7以下版本多线程备份单表

【背景说明】

mysqldump适用于备份单表,或者数量级较小的库的备份。一般情况下innobackupex备份数量级大的库,速度是很快的。但是其瓶颈在于如果业务需要多实例部分对象迁移到新的实例里,此时就无法满足该情况。(mysqldumper在此不做讨论)。

下面简单列举mysqldump适用的场景:

  • 备份多个单表

  • 备份一个或多个库

  • 备份存储过程、自定义函数或事件

  • 只备份数据不备份表结构

  • 只备份表结构不备份数据

  • 其他

mysqldump虽然使用起来比较灵活,但是它无法实现并发备份,故本文描述的就是实现如何用mysqldump实现并发备份

【思路说明】

把需要备份的一个库或多个库,提取这些库下面所有的表进行一个个备份:这样可以利用脚本进行多线程备份这些单表,从而实现库级的并发备份

【具体脚本】

点击(此处)折叠或打开

  1. #!/bin/bash

  2. #注释:mysqldump多线程备份多表

  3. #Auther:cyt

  4. #date:2016-06-23

  5. #按照多实例循环框架

  6. function instance()

  7. {

  8.         for port in `ps -ef | grep -v -E "mysqld_safe|awk" | awk '/mysqld /,/port=/''{for(i=1;i<=NF;i++){if($i~/port=/) print gsub(/--port=/,""),$i}}' | awk '{print $2}'`

  9.           do

  10.              ##避免循环的port和sock不匹配

  11.              sock=`ps -ef | grep "${port}"| grep -v -E "mysqld_safe|awk" | awk '/mysqld /,/Socket=/''{for(i=1;i<=NF;i++){if($i~/socket=/) print gsub(/--socket=/,""),$i}}' | awk '{print $2}'`

  12.              #由于该脚本是并行备份,以防由于繁忙,导致获取不到dump连接,故将该参数调大(备份完后会调小)

  13.              mysql -u$DB_USER -p$DB_PASSWord --host= --socket=$sock --host=$host -BN -e "SET GLOBAL net_write_timeout=1800";

  14.              #调用输出备份命令的日志函数

  15.              log

  16.              echo "-----端口号为"$port"的mysql实例开始按表并发备份:开始时间为"`date "+%Y-%m-%d %H:%M:%S"`

  17.              #调用备份函数

  18.              dumpAllTable

  19.              #计算备份所用时间

  20.              END=`date "+%Y-%m-%d %H:%M:%S"`

  21.              END_T=`date -d "$END" +%s`

  22.              TIME_INVENTAL_M=$[($END_T-$BEGIN_T)/60]

  23.              TIME_INVENTAL_S=$[($END_T-$BEGIN_T)%60]

  24.              echo '-----端口号为'$port'的mysql实例于' $END '备份完成,使用时间为 '$TIME_INVENTAL_M'分钟'$TIME_INVENTAL_S'秒'

  25.              #调用tardump函数,对备份文件进行压缩,注意本次压缩会删掉原文件

  26.              tardump

  27.              #将参数改为默认,以防耗尽内存

  28.              mysql -u$DB_USER -p$DB_PASSWORD --host= --socket=$sock --host=$host -BN -e "SET GLOBAL net_write_timeout=60";

  29.         done

  30. }




  31. #将要备份的单表从大到小输出到日志里面

  32. function log()

  33. {

  34.             BACKUP_DIR=/data/backup/$DATE/$port;

  35.             mkdir -p  $BACKUP_DIR

  36.             #过滤掉MySQL自带的DB

  37.             if [ -e ${BACKUP_DIR}/cyt.log ];

  38.             then rm -rf ${BACKUP_DIR}/cyt.log;

  39.             fi;

  40.             for a in `mysql -u$DB_USER -p$DB_PASSWORD --socket=$sock --host=$host -BN -e"show databases;" |sed '/^perfORMance_schema$/'d|sed '/^mysql/'d |sed '/^information_schema$/'d|sed '/^information_schema$/'d|sed '/^test$/'d|sed '/^sys$/'d  `

  41.                  do

  42.                     mkdir -p ${BACKUP_DIR}/${a}

  43.                     for j in `mysql -u$DB_USER -p$DB_PASSWORD --host= --socket=$sock --host=$host -BN -e "select table_name from information_schema.tables where table_schema='${a}' order by table_rows desc;"`

  44.                     do

  45.                           echo 'mysqldump -u'$DB_USER' -p'$DB_PASSWORD' --socket='$sock' --host='$host' --set-gtid-purged=OFF -c --single_transaction=OFF -q --skip-add-locks ' ${a} ${j}'>'$BACKUP_DIR'/'${a}'/'${j}'.sql'>>$BACKUP_DIR/cyt.log;

  46.                     done

  47.                  done

  48. }


  49.    


  50. #调用函数log,查看log日志调用并发函数实现多线程备份

  51. function dumpAllTable()

  52. {

  53.         local schemaFile="${BACKUP_DIR}/cyt.log"

  54.         #最大的表先备份(因多进程并发,最短完成时间依赖于最大表的完成)

  55.         allTable=`cat $schemaFile | wc -l`

  56.         i_import=0

  57.         declare -a array_cmds

  58.         i_array=0

  59.         while read file; do

  60.                 i_import=`expr $i + 1`

  61.                 array_cmds[i_array]="${file}"

  62.                 i_array=`expr ${i_array} + 1`

  63.         done < ${BACKUP_DIR}/cyt.log

  64.         execConcurrency "${threadsNum}" "${array_cmds[@]}"

  65. }






  66. #并发函数

  67. function execConcurrency()

  68. {

  69.         #并发数据量

  70.         local thread=$1

  71.         #并发命令

  72.         local cmd=$2

  73.         #定义管道,用于控制并发线程

  74.         tmp_fifofile="/tmp/$$.fifo"

  75.         mkfifo $tmp_fifofile

  76.         #输入输出重定向到文件描述符6

  77.         exec 6<>$tmp_fifofile

  78.         rm -f $tmp_fifofile

  79.         #向管道压入指定数据的空格

  80.         for ((i=0;i<$thread;i++)); do

  81.                 echo

  82.         done >&6

  83.         #遍历命令列表

  84.         while [ "$cmd" ]; do

  85.                 #从管道取出一个空格(如无空格则阻塞,达到控制并发的目的)

  86.                 read -u6

  87.                 #命令执行完后压回一个空格

  88.                 { eval $2;echo >&6; } & #> /dev/null 2>&1 &

  89.                 shift

  90.                 cmd=$2

  91.         done

  92.         #等待所有的后台子进程结束

  93.         wait

  94.         #关闭df6

  95.         exec 6>&-

  96. }


  97. #压缩备份文件

  98. function tardump()

  99. {

  100.     #使用tar压缩

  101.     if [ -d ${BACKUP_DIR} ] && [ -n ${port} ]

  102.     then

  103.         echo "-----开始进行压缩端口号为"$port"的mysql实例的备份:开始时间"`date "+%Y-%m-%d %H:%M:%S"`

  104.         cd $BACKUP_DIR;

  105.         for b in `find $BACKUP_DIR -maxdepth 1 -type d ! -iname "${port}*" ! -iname '*.sql' ! -iname '*tar.gz' `

  106.             do

  107.                 c=`basename $b`

  108.                 tar -zcvf $c'_'$(date +%F_%H-%M).tar.gz $c --remove-files > /dev/null

  109.         done

  110.      else echo "没有可以进行压缩的文件";

  111.     fi;

  112.     echo "-----压缩端口号为"$port"的mysql实例的备份文件:结束时间"`date "+%Y-%m-%d %H:%M:%S"`

  113. }


  114. #主函数

  115. function main()

  116. {

  117.         #获取本地IP地址

  118.         host=`ifconfig | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`

  119.         DATE=`date +%F`

  120.         #本次备份mysqldump --host --socket如果是本地用户备份,建议去掉host;(多实例本地用户密码问题需注意)

  121.         #数据库用户

  122.         DB_USER='cyt'

  123.         #数据库用户对应的密码

  124.         DB_PASSWORD='cyt'

  125.         #记录开始的时间

  126.         BEGIN=`date "+%Y-%m-%d %H:%M:%S"`

  127.         BEGIN_T=`date -d "$BEGIN" +%s`

  128.         echo '--------------开始按表并发备份:开始时间为 '$BEGIN

  129.         #设置并发备份的线程数

  130.         threadsNum=10

  131.         #调用instance函数

  132.         instance

  133.         echo '--------------backup all database successfully!!!结束时间:' `date "+%Y-%m-%d %H:%M:%S"`

  134. }


  135. main

【脚本说明】

  • 由于该脚本是并行备份,以防由于繁忙,导致获取不到dump连接,故将该参数调大(该数据库版本是5.6.19,脚本在备份完后会调小)

mysql -u$DBUSER -p$DBPASSWORD --host= --socket=$sock --host=$host -BN -e "SET GLOBAL netwritetimeout=1800";

  • 由于想要利用并发函数,将要使用的命令导入到${BACKUP_DIR}/cyt.log日志里,然后通过并发函数execConcurrency和数组dumpAllTable来实现本脚本的目的

  • 本脚本可以实现多实例备份,如果多实例备份的用户名和密码不同,可以使用case命令,下面是简单举例

    点击(此处)折叠或打开



    1. if [ $port -eq 3306 ]; then

    2.         case $IP in

    3.          '10.240.5.11')

    4.             DB_USER='CYT1'

    5.             DB_PASSWORD='1'

    6.             ;;

    7.             '10.240.5.12')

    8.             DB_USER='CYT2'

    9.             DB_PASSWORD='2'

    10.             ;;

    11.             '10.240.5.13')

    12.             DB_PASSWORD='3'

    13.             ;;

    14.            esac

    15.         else

    16.           DB_PASSWORD='4'

    17.       fi

以上是“mysqldump5.7以下版本如何实现并发备份”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: mysqldump5.7以下版本如何实现并发备份

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

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

猜你喜欢
  • mysqldump5.7以下版本如何实现并发备份
    这篇文章主要为大家展示了“mysqldump5.7以下版本如何实现并发备份”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysqldump5.7以下版本如何实现...
    99+
    2024-04-02
  • ubuntu版本如何备份软件
    ubuntu版本备份软件的方法:不要删除/var/cache/apt/archives目录,执行以下命令,生成当前安装软件的内容列表,如:dpkg -–get-selections | grep -v deinstall >ubuntu.f...
    99+
    2024-04-02
  • mysql如何实现innobackupex备份脚本
    这篇文章主要为大家展示了“mysql如何实现innobackupex备份脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql如何实现innobackup...
    99+
    2024-04-02
  • vbs如何实现纯脚本备份
    这篇文章主要介绍vbs如何实现纯脚本备份,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说明:   不能说此脚本比驱动精灵更完美,但它确实弥补了驱动精灵的不足!   这个版本是我先前版本上(借助DevCon纯脚本备份驱...
    99+
    2023-06-09
  • 如何在PostgreSQL中实现多版本并发控制
    在PostgreSQL中,多版本并发控制是通过使用MVCC(Multi-Version Concurrency Control)机制...
    99+
    2024-04-09
    PostgreSQL
  • hbase如何实现全备增量备份脚本
    小编给大家分享一下hbase如何实现全备增量备份脚本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧![hadoop@robot-pbs-hadoop-master ...
    99+
    2023-06-03
  • Linux平台下如何实现RMAN 全备和增量备份shell脚本
    这篇文章主要介绍了Linux平台下如何实现RMAN 全备和增量备份shell脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。全备脚本以&n...
    99+
    2024-04-02
  • mysql如何实现按表备份脚本
    这篇文章主要为大家展示了“mysql如何实现按表备份脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql如何实现按表备份脚本”这篇文章吧。 ...
    99+
    2024-04-02
  • shell脚本实现自动化下载并检测ftp文件备份
    本篇内容介绍了“shell脚本实现自动化下载并检测ftp文件备份”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现代码:#!/bin/bas...
    99+
    2023-06-09
  • linux下实现ftp自动备份shell脚本
    利用here文档 #!/bin/sh ftp -ivn 210.29.28.124 <<EOF user yun yun2011 lcd /home/veyun cd /home/veyun/...
    99+
    2022-06-04
    脚本 自动备份 linux
  • linux下实现mysql自动备份的脚本
    这篇文章主要介绍“linux下实现mysql自动备份的脚本”,在日常操作中,相信很多人在linux下实现mysql自动备份的脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Shell脚本实现备份系统文件并邮件发送功能
    本篇内容介绍了“Shell脚本实现备份系统文件并邮件发送功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装MUTT邮件客户端# ...
    99+
    2023-06-09
  • 如何用脚本实现mysql自动备份?
    首先执行vi dbbackup.sh命令,在打开的编辑器输入:#!/bin/bash /usr/local/mysql/bin/mysqldump -uuser -ppasswd databasename ...
    99+
    2024-04-02
  • mysql如何实现定时备份shell脚本
    这篇文章给大家分享的是有关mysql如何实现定时备份shell脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 #!/bin/bashecho &q...
    99+
    2024-04-02
  • 如何实现alwayson的备份还原脚本
    这篇文章主要介绍如何实现alwayson的备份还原脚本,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 1、 备份数据库 在主副本上,将需要做AlwaysOn的数据库做一次全备和日...
    99+
    2024-04-02
  • 通过shell脚本实现对oracle RMAN备份集压缩并异地备份
    1、背景说明公司磁带库坏了。。每天oracle的备份往哪里放?2、备份方式重新规划原备份方式现备份方式3、备份脚本分享小白写了一个备份的shell脚本,分享出来#!/bin/bash # tar&...
    99+
    2024-04-02
  • Linux下如何实现mysql异地自动备份
    这篇文章主要讲解了Linux下如何实现mysql异地自动备份,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。前言:基本上不管是对于我们自己使用,还是给客户部署服务器,,mysql...
    99+
    2024-04-02
  • sqlserver如何实现查看备份日志脚本
    这篇文章主要介绍了sqlserver如何实现查看备份日志脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 s...
    99+
    2024-04-02
  • mongodb如何实现增量/全量备份脚本
    这篇文章主要介绍了mongodb如何实现增量/全量备份脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。功能定期对mongodb数据库数据进...
    99+
    2024-04-02
  • MySQL 5.5如何实现Slave节点备份脚本
    小编给大家分享一下MySQL 5.5如何实现Slave节点备份脚本,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! [root@localhost script]...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作