• +86 400-9955-698
  • support@vinchin.com
logo
关于我们

技术分享

技术分享 linux备份mysql数据库

linux备份mysql数据库

2020-04-08

 MYSQL定期备份是一项重要的工作,但人工操作太繁琐,也难避免有所疏漏,使用下

面的方法即可让系统定期备份数据。
  1、创建备份文件夹
  #cd /www
  #makedir backup
  2、编写运行脚本
  #vi autobackup
  写入以下内容:
  filename=`date +%Y%m%d`
  mysql_bin_dir/mysqldump –opt dataname-u user-ppassword| gzip

>/www/mysqlbackup/name$filename.gz
  保存退出?
  说明:
  (1)mysql_bin_dir:mysql的bin路径
  (2)dataname:数据库名;
  (3)user:数据库用户名;
  (4)password:用户密码;
  (5)name:自定义备份文件前缀标识。
  如上例,将自动备份mysql数据库,并以gzip压缩方式存储,文件名为

name20080101.gz的形式。
  3、为脚本添加执行权限
  #chmod +x autobackup
  4、让crontab来完成定期执行的任务
  这一步中,Redhat的方法会不一样,后面专门给出。
  编辑crontab:
  #vi /etc/crontab
  在最后一行中加入:
  01 5* * * root /www/autobackup
  每天5点运行脚本,也可以修改5为其他指定时间。
  Redhat方法:
  Redhat的crontab采用按时间调用4个目录(/etc/cron.hourly:每小

时;/etc/cron.daily:每天;/etc/cron.weekly:每周;/etc/cron.monthly:每月

)中脚本出来运行的方式。
  Redhat中只需要将刚才编辑的脚本复制到相应的目录即可。
  5、重启crontab
  #/etc/rc.d/init.d/crond restart
  完成
  其实原理很简单,自己制作一个脚本,让Linux系统自动运行。我们还可以再扩展

一下,编辑一个自动备份网站文件的脚本,让Linux来完成,每天自动备份整个网站,

等等……
==========================================================================
MySQL :: Linux 下自动备份数据库的 shell 脚本
Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本

,结合 crontab,定时备份数据库。其实非常简单,主要就是使用 MySQL 自带的

mysqldump 命令。
脚本内容如下:
本地备份脚本
#!/bin/sh
# File: /home/mysql/backup.sh
# Database info
DB_NAME="test"
DB_USER="username"
DB_PASS="password"
# Others vars
BIN_DIR="/usr/local/mysql/bin"
BCK_DIR="/home/mysql/backup"
DATE=`date +%F`
# TODO
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS $DB_NAME | gzip >

$BCK_DIR/db_$DATE.gz
然后使用将此脚本加到 /etc/crontab 定时任务中:
01 5 * * 0 mysql /home/mysql/backup.sh
好了,每周日凌晨 5:01 系统就会自动运行 backup.sh 文件备份 MySQL 数据库了。
/home/www/inc/back
远程备份
首先你要到mysql的官网上下载mysql client 那是一个rpm包来的,之后就安装到你要

存放备份文件的那台服务器上
把上边最后一句话改成
mysqldump -h dbIp -u$DB_USER -p$DB_PASS $DB_NAME | gzip >

$BCK_DIR/db_$DATE.gz
其它不变,保存,run一下,ok
===========================
适合对象
  本文是在linux下,mysql 4.1.14版本下测试的,经过适当修改可能适合mysql

4.0,5.0及其其他版本.  
  本文适合于没有启动复制功能的mysql,如果启动了复制,可能不需要采取这种备份

策略或者需要修改相关参数.  
  每个人的备份策略都可能不同,所以请根据实际情况修改,做到举一反三,不要照搬

照抄,可能会造成不必要的损失. 
  希望你明白这个脚本要干什么工作   
脚本描述
  每7天备份一次所有数据,每天备份binlog,也就是增量备份  
  (如果数据少,每天备份一次完整数据即可,可能没必要做增量备份) 
  作者对shell脚本不太熟悉,所以很多地方写的很笨 :)
开启 bin log
  在mysql 4.1版本中,默认只有错误日志,没有其他日志.可以通过修改配置打开bin

log.方法很多,其中一个是在/etc/my.cnf中的mysqld部分加入:  
  [mysqld]
  log-bin 
  这个日志的主要作用是增量备份或者复制(可能还有其他用途). 
  如果想增量备份,必须打开这个日志. 
  对于数据库操作频繁的mysql,这个日志会变得很大,而且可能会有多个.
  在数据库中flush-logs,或者使用mysqladmin,mysqldump调用flush-logs后并且使

用参数delete-master-logs,这些日志文件会消失,并产生新的日志文件(开始是空的).
  
  所以如果从来不备份,开启日志可能没有必要.
  
  完整备份的同时可以调用flush-logs,增量备份之前flush-logs,以便备份最新的

数据.  
完整备份脚本
  如果数据库数据比较多,我们一般是几天或者一周备份一次数据,以免影响应用运

行,如果数据量比较小,那么一天备份一次也无所谓了.
  下载假设我们的数据量比较大,备份脚本如下:(参考过网络上一个mysql备份脚本,

致谢 :))

  #!/bin/sh 
  # mysql data backup script
  # by scud http://www.jscud.com
  # 2005-10-30
  #  
  # use mysqldump --help,get more detail.
  # 
  BakDir=/backup/mysql
  LogFile=/backup/mysql/mysqlbak.log
  
  DATE=`date +%Y%m%d`
  
  echo " " >> $LogFile
  echo " " >> $LogFile
  echo "-------------------------------------------" >> $LogFile
  echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
  echo "--------------------------" >> $LogFile
  cd $BakDir
  DumpFile=$DATE.sql
  GZDumpFile=$DATE.sql.tgz  
  
  mysqldump --quick --all-databases --flush-logs
    --delete-master-logs --lock-all-tables
           > $DumpFile             
  echo "Dump Done" >> $LogFile  
  tar czvf $GZDumpFile $DumpFile >> $LogFile 2>&1 
  echo "[$GZDumpFile]Backup Success!" >> $LogFile 
  rm -f $DumpFile  
  #delete previous daily backup files:采用增量备份的文件,如果完整备份后,

则删除增量备份的文件.
  cd $BakDir/daily 
  rm -f *            
  cd $BakDir          
  echo "Backup Done!"  
  echo "please Check $BakDir Directory!"
  echo "copy it to your local disk or ftp to somewhere !!!"  
  ls -al $BakDir
-----------------------------------------------------------------
   上面的脚本把mysql备份到本地的/backup/mysql目录,增量备份的文件放

在/backup/mysql/daily目录下.
  
  注意:上面的脚本并没有把备份后的文件传送到其他远程计算机,也没有删除几天

前的备份文件:需要用户增加相关脚本,或者手动操作.
------------------------------------------------------------------------ 
  增量备份的数据量比较小,但是要在完整备份的基础上操作,用户可以在时间和成

本上权衡,选择最有利于自己的方式.
  
  增量备份使用bin log,脚本如下:  
  #!/bin/sh  
  #
  # mysql binlog backup script
  #  
  /usr/bin/mysqladmin flush-logs  
  DATADIR=/var/lib/mysql
  BAKDIR=/backup/mysql/daily  
  ###如果你做了特殊设置,请修改此处或者修改应用此变量的行:缺省取机器

名,mysql缺省也是取机器名
  HOSTNAME=`uname -n` 
  cd $DATADIR  
  FILELIST=`cat $HOSTNAME-bin.index`
  ##计算行数,也就是文件数  
  COUNTER=0
  for file in $FILELIST
  do
    COUNTER=`expr $COUNTER + 1 `
  done
  
  NextNum=0
  for file in  $FILELIST
  do
            base=`basename $file`
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $COUNTER ]
    then
      echo "skip lastest"
                else
      dest=$BAKDIR/$base
      if(test -e $dest)
      then
        echo "skip exist $base"
      else
        echo "copying $base"
        cp $base $BAKDIR
      fi
    fi
  done
  echo "backup mysql binlog ok"
--------------------------------------------------------------------------
        增量备份脚本是备份前flush-logs,mysql会自动把内存中的日志放到文件里,

然后生成一个新的日志文件,所以我们只需要备份前面的几个即可,也就是不备份最后

一个.
  因为从上次备份到本次备份也可能会有多个日志文件生成,所以要检测文件,如果

已经备份过,就不用备份了.
  注:同样,用户也需要自己远程传送,不过不需要删除了,完整备份后程序会自动生

成.  
访问设置
  脚本写完了,为了能让脚本运行,还需要设置对应的用户名和密码,mysqladmin和

mysqldump都是需要用户名和密码的,当然可以写在脚本中,但是修改起来不太方便,假

设我们用系统的root用户来运行此脚本,那么我们需要在/root(也就是root用户的home

目录)创建一个.my.cnf文件,内容如下  
   [mysqladmin]
  password =password
  user= root
  [mysqldump]
  user=root
  password=password  
    注:设置本文件只有root可读.(chmod 600 .my.cnf ) 
  此文件说明程序使用mysql的root用户备份数据,密码是对应的设置.这样就不需要

在脚本里写用户名和密码了.
自动运行
  为了让备份程序自动运行,我们需要把它加入crontab. 
  有2种方法,一种是把脚本根据自己的选择放入

到/etc/cron.daily,/etc/cron.weekly这么目录里.
  一种是使用crontab -e放入到root用户的计划任务里,例如完整备份每周日凌晨3

点运行,日常备份每周一-周六凌晨3点运行. 
  具体使用,请参考crontab的帮助.      
所为何在网上没有找到类似的脚本,只好学习shell语法,自己写了一个 :) 
  适合自己的,就是最好的! 

  • 标签:
  • 技术分享

您可能感兴趣的新闻 换一批

现在下载,可享30天免费试用

立即下载