好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php中实现mysql数据库备份与linux自动定时备份代码

php中实现mysql数据库备份与linux自动定时备份代码

文章介绍了二种数据库备案的代码,一种是我们php写的常用的数据库备份类,另一种是为linux朋友提供的一个自动定时备份mysql数据库的代码,有需要的同学可以参考一下.

把下面php代码保存成backdata.class.php文件,代码如下:

<?php  /*   *   *简单的一个Mysql备份数据类    *   */   class  backupData{       private      $mysql_link ; //链接标识        private      $dbName ;     //数据库名        private      $dataDir ;      //数据所要存放的目录        private      $tableNames ; //表名          public   function  __construct( $mysql_link ){            $this ->mysql_link =  $mysql_link ;      }       public   function  backupTables( $dbName , $dataDir , $tableNames ){ //开始备份            $this ->dbName  =  $dbName ;           $this ->dataDir  =  $dataDir ;           $this ->tableNames =  $tableNames ;           $tables = $this ->delarray( $this ->tableNames);           $sqls = '' ;           foreach ( $tables   as   $tablename ){               if ( $tablename == '' ){ //表不存在时                    continue ;              }                             //************************以下是形成SQL的前半部分**************                //如果存在表,就先删除                $sqls  .=  "DROP TABLE IF EXISTS $tablename;n" ;               //读取表结构                $rs  = mysql_query( "SHOW CREATE TABLE $tablename" , $this ->mysql_link);                 $row =mysql_fetch_row( $rs );               //获得表结构组成SQL                $sqls .= $row [ '1' ]. ";nn" ;              unset( $rs );              unset( $row );                             //************************以下是形成SQL的后半部分**************                //查寻出表中的所有数据                $rs =mysql_query( "select * from $tablename" , $this ->mysql_link);               //表的字段个数                $field =mysql_num_fields( $rs );               //形成此种SQL语句:"INSERT INTO `groups` VALUES('1499e0ca25988d','主任','','0');"                while ( $rows =mysql_fetch_row( $rs )){                   $comma = '' ; //逗号                    $sqls .= "INSERT INTO `$tablename` VALUES(" ;                   for ( $i =0; $i < $field ; $i ++){                       $sqls .= $comma . "'" . $rows [ $i ]. "'" ;                       $comma = ',' ;                  }                   $sqls .= ");nnn" ;              }          }           $backfilepath = $this ->dataDir. date ( "Ymdhis" ,time()). '.sql' ;                     //写入文件            $filehandle  =  fopen ( $backfilepath ,  "w" );          fwrite( $filehandle ,  $sqls );          fclose( $filehandle );      }       private   function  delarray( $array ){     //处理传入进来的数组            foreach ( $array   as   $tables ){               if ( $tables == '*' ){     //所有的表(获得表名时不能按常规方式来组成一个数组)                    $newtables =mysql_list_tables( $this ->dbName, $this ->mysql_link);                   $tableList  =  array ();                   for  ( $i  = 0;  $i  < mysql_numrows( $newtables );  $i ++){                       array_push ( $tableList ,mysql_tablename( $newtables ,  $i ));                  } //开源代码phpfensi测试数据                    $tableList = $tableList ;              } else {                   $tableList = $array ;                   break ;              }          }           return   $tableList ;      }  }    ?> 

我们再创建一个新的文件与backdata.class.php保存在同一目录,使用方法,代码如下:

require_once ( "backdata.class.php" );  $link  = @mysql_connect( "localhost" , "数据库名" , "密码" )  or   die  ( 'Could not connect to server.' );  mysql_query( "use cms" , $link );  mysql_query( "set names utf8" , $link );  $dbbck = new  backupData( $link ); //实例化它,只要一个链接标识就行了    //备份数据时,如想备份一个数据库中的所有表,你可这样写:    $dbbck ->backupTables( "cms" , "./" , array ( '*' ));  //备份数据时,如想备份一个数据库中的仅一个表时,你可这样写:    $dbbck ->backupTables( "cms" , "./" , array ( 'user' ));  //备份数据时,如想备份一个数据库中的多个表时,你可这样写:    $dbbck ->backupTables( "cms" , "./" , array ( 'user' , 'acl' , 'informatoin' ));  //注解:$dbbck->backupTables("参1","参2",array());中,   

参1为:数据库名.

参2为:要存放备份数据的位置,即目录地址.

第三个为:你要保存那些表.

下面为linux中的自动定时备份的代码,参考了网上的很多教程,外加自己的测试,以下脚本经测试可用,代码如下:

#!/bin/bash   #Shell Command For Backup MySQL Database Everyday Automatically By Crontab   #Author : Carlos Wong   #Date : 2010-08-24   #配置参数     USER=root #数据库用户名" >用户名  PASSWORD=××××× #数据库用户密码  DATABASE=TIENIUZAI    #数据库名称  WEBMASTER=tieniuzai@qq测试数据 #管理员邮箱地址,用以发送备份失败消息提醒  BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径  LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径  DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)  DUMPFILE=$DATE.sql #备份文件名  ARCHIVE=$DATE.sql.tgz #压缩文件名  OPTIONS=]-u$USER -p$PASSWORD –opt –extended-insert= false  –triggers= false  -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE]  #mysqldump 参数 详情见帮助 mysqldump -help    #判断备份文件存储目录是否存在,否则创建该目录   if  [ ! -d $BACKUP_DIR ] ;  then  mkdir -p [$BACKUP_DIR]  fi    #开始备份之前,将备份信息头写入日记文件   echo ] ] >> $LOGFILE  echo ] ] >> $LOGFILE  echo [———————————————–] >> $LOGFILE  echo [BACKUP DATE:] $(date +]%y-%m-%d %H:%M:%S]) >> $LOGFILE  echo [———————————————– ] >> $LOGFILE    #切换至备份目录   cd $BACKUP_DIR  #使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件   mysqldump $OPTIONS > $DUMPFILE  #判断数据库备份是否成功   if  [[ $? == 0 ]]; then  #创建备份文件的压缩包   tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1  #输入备份成功的消息到日记文件   echo [[$ARCHIVE] Backup Successful!] >> $LOGFILE  #删除原始备份文件,只需保 留数据库备份文件的压缩包即可   rm -f $DUMPFILE  else   echo [Database Backup Fail!] >> $LOGFILE    #备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持   #mail -s [Database:$DATABASE Daily Backup Fail] $WEBMASTER   fi  #输出备份过程结束的提醒消息   echo [Backup Process Done] 

使用方法:

将以上代码保存到:/usr/sbin/DataBackup,文件名随意,只要不跟系统原有的命令同名即可,代码可以放到任何地方,放在sbin目录下只是为了方便执行,sbin目录下的文件/目录可在终端直接调用,类似于windows下PATH变量指定的目录.

为脚本添加可执行权限:sudo chmod +x  /usr/sbin/DataBackup 

执行脚本:sudo  DataBackup 

如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了.

01 3 * * * root /usr/sbin/DataBackup #它代表着将于每天3点执行DataBackup脚本

注意: linux 下的shell脚本定义变量的格式为:key=value,注意他们两者之间的] = [前后不能出现空格,否则系统无法确认该变量.

第一个类似单引号的字符]`]其实不是单引号,它的输入键在键盘ESC键下方。 

这个脚本只适合用于一些小站点的备份,因为它是对数据库进行全部备份而不是增量备份,不适合大容量的数据库备份.

相对于两种方法定时备份算是最好的方法了,这样可以节省时间让机器在最少人访问时自动备案,而php备份类需要人为操作,当然在windows下也可以利用计划任务来实现了.

查看更多关于php中实现mysql数据库备份与linux自动定时备份代码的详细内容...

  阅读:44次