您的位置:首页 > 运维架构 > Linux

linux备份mysql数据库

2009-10-29 13:43 162 查看
 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语法,自己写了一个 :) 

  适合自己的,就是最好的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: