加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-02-18 15:00:16 所属栏目:PHP教程 来源:互联网
导读:文章介绍了二种数据库备案的代码,一种是我们php写的常用的数据库备份类,另一种是为linux朋友提供的一个自动定时备份mysql数据库的代码,有需要的同学可以参考一下. 把下面php代码保存成backdata.class.php文件,代码如下: ?php /* * *简单的一个Mysql备份数据
  文章介绍了二种数据库备案的代码,一种是我们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));
                  }//开源代码Cuoxin.com
                  $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.com #管理员邮箱地址,用以发送备份失败消息提醒
  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下也可以利用计划任务来实现了.

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!