当前位置:首页 > PHP教程 > php应用 > 列表

php实例分享之mysql数据备份

发布:smiling 来源: PHP粉丝网  添加日期:2020-12-25 16:43:53 浏览: 评论:0 

本代码实现了表结构和数据完全分开,默认有一个文件会记录所有表的结构,然后表中数据的备份 如果超过分卷的大小则会分成多个文件,不然则一个文件。

备份:表结构和数据完全分开,默认有一个文件会记录所有表的结构,然后表中数据的备份 如果超过分卷的大小则会分成多个文件,不然则一个文件,参考了别人的代码,不过写的嘛,差强 人意,以后慢慢改吧。。。

代码如下:

  1. <?php 
  2. /* 
  3.  * Created on 2014 
  4.  * Link for 527891885@qq.com 
  5.  * This is seocheck backup class 
  6.  */ 
  7. class DbBackUp { 
  8.     private $conn
  9.     private $dbName
  10.     private $host
  11.     private $tag = '_b'
  12.     //构造方法 链接数据库 
  13.     public function __construct($host='localhost'$dbUser='root'$dbPwd=''$dbName="seocheck"$charset='utf8') { 
  14.         @ob_start(); 
  15.         @set_time_limit(0); 
  16.         $this->conn = mysql_connect($host$dbUser$dbPwd, true); 
  17.         if(!$this->conn) die("数据库系统连接失败!"); 
  18.         mysql_query("set names ".$charset$this->conn); 
  19.         mysql_select_db($dbName$this->conn) or die("数据库连接失败!"); 
  20.         $this->host = $host
  21.         $this->dbName = $dbName
  22.     } 
  23.     //获取数据库所有表名 
  24.     public function getTableNames () { 
  25.         $tables = array(); 
  26.         $result = mysql_list_tables($this->dbName, $this->conn); 
  27.         if(!$resultdie('MySQL Error: ' . mysql_error()); 
  28.         while($row = mysql_fetch_row($result)) { 
  29.             $tables[] = $row[0]; 
  30.         } 
  31.         return $tables
  32.     } 
  33.  
  34.     //获取数据库表的字段信息 
  35.     public function getFieldsByTable ($table) { 
  36.         $fields = array(); 
  37.         $str = ''
  38.         $res = mysql_query("SHOW CREATE TABLE `{$table}`"$this->conn); 
  39.         if(!$resdie('MySQL Error: ' . mysql_error()); 
  40.         while($rows = mysql_fetch_assoc($res)) { 
  41.             $str = str_replace("CREATE TABLE `{$table}` ("""$rows['Create Table']);//DROP TABLE IF EXISTS `{$table}`\n 
  42.             $str = "--\n-- Table structure for table `{$table}`\n--\n\nCREATE TABLE IF NOT EXISTS `{$table}` ( ".$str
  43.             $str = str_replace(","", "$str); 
  44.             $str = str_replace("`) ) ENGINE=InnoDB ""`)\n ) ENGINE=InnoDB "$str); 
  45.             $str .=";\n\n"
  46.             //$str = $str.";\n\n--\n-- Dumping data for table `{$table}`\n--\n\n"; 
  47.             $fields[$rows['Table']] = $str
  48.         } 
  49.         return $fields
  50.     } 
  51.  
  52.     //获取表中的数据 
  53.     public function getDataByTable($table) { 
  54.         $data = array(); 
  55.         $str = ''
  56.         $res = mysql_query("SELECT * FROM `{$table}`"$this->conn); 
  57.         if(!$resdie('MySQL Error: ' . mysql_error()); 
  58.         while($rows = mysql_fetch_assoc($res)) { 
  59.             if(!emptyempty($rows)) { 
  60.                 $data[] = $rows
  61.             } 
  62.         } 
  63.         $keys = array_keys($data[0]); 
  64.         foreach ($keys as $k=>$v) { 
  65.             $keys[$k] = '`'.$v.'`'
  66.         } 
  67.         $key = join(', '$keys); 
  68.         $str = "INSERT INTO `{$table}` ({$key}) VALUES\n"
  69.         foreach ($data as $k=>$v) { 
  70.             $str.="("
  71.             while (list($key$val) = each($v)) { 
  72.                 if(!is_numeric($val)) { 
  73.                     $str.= "'".$val."', "
  74.                 } else { 
  75.                     $str.= $val.', '
  76.                 } 
  77.             } 
  78.             $str = substr($str, 0, -2);// 后边有空格 所以从-2 开始截取 
  79.             if($k+1 == count($data)) { 
  80.                 $str.=");\n\n-- --------------------------------------------------------\n\n"
  81.             } else { 
  82.                 $str.="),\n"
  83.             } 
  84.         } 
  85.         return $str
  86.     } 
  87.  
  88.      //备份数据库 
  89.     public function getBackUpDataByTable ($tables$path=''$fileName = 'seocheck'$subsection = '2') { 
  90.         if(emptyempty($tables)) $this->_showMsg('未能指定要备份的表!!!', true); 
  91.         $page = 0;//卷数 
  92.         $path = emptyempty($path) ? $_SERVER['DOCUMENT_ROOT'].'/core/Runtime/Data/'.$fileName.'Demo/' : $path
  93.         if(!file_exists($path)) { 
  94.             mkdir($path, 0777, true); 
  95.         } 
  96.         $mysql_info = $this->_retrieve(); 
  97.         $fieldsByTable = array(); 
  98.         if(is_array($tables)) { 
  99.             $this->_showMsg('开始备份,数据正在初始化中,请勿关闭浏览器...'); 
  100.             $fw = $this->writeFileByBackUpData($path.$this->dbName.'_table.sql'$mysql_info$method="ab+"); 
  101.             if($fw !== false) { 
  102.                 $this->_showMsg('备份数据库基本信息成功。。。'); 
  103.             } 
  104.             foreach ($tables as $table) { 
  105.                 $tableInfo = $this->getFieldsByTable($table); 
  106.                 if(!emptyempty($tableInfo)) { 
  107.                     $this->_showMsg('获取表['.$table.']结构成功。。。'); 
  108.                     $fw = $this->writeFileByBackUpData($path.$this->dbName.'_table.sql'$tableInfo[$table], $method="ab+"); 
  109.                     if($fw === false) { 
  110.                         $this->_showMsg('备份表['.$table.']结构失败。。。', true); 
  111.                     } else { 
  112.                         $this->_showMsg('备份表['.$table.']结构成功,开始获取数据。。。'); 
  113.                     }; 
  114.                 } else { 
  115.                     $this->_showMsg('获取数据库['.$this->dbName.']表结构失败,请稍后再试!。。。', true); 
  116.                 } 
  117.                 $this->_insertSqlByTableForAll($path$table$subsection); 
  118.             } 
  119.         } else { 
  120.             $this->_showMsg('开始备份,数据正在初始化中,请勿关闭浏览器...'); 
  121.             $tableInfo = $this->getFieldsByTable($tables); 
  122.             if(!emptyempty($tableInfo)) { 
  123.                 $this->_showMsg('获取表['.$tables.']结构成功。。。'); 
  124.                 $fw = $this->writeFileByBackUpData($path.$this->dbName.'_'.$tables.'_table.sql'$mysql_info.$tableInfo[$tables]); 
  125.                 if($fw === false) { 
  126.                     $this->_showMsg('备份表['.$tables.']结构失败。。。', true); 
  127.                 } else { 
  128.                     $this->_showMsg('备份表['.$tables.']结构成功,开始获取数据。。。'); 
  129.                 } 
  130.             } else { 
  131.                 $this->_showMsg('获取表['.$tables.']结构失败,请稍后再试!。。。', true); 
  132.             } 
  133.             $res = $this->_insertSqlByTableForAll($path$tables$subsection); 
  134.         } 
  135.     } 
  136.  
  137.     //数据库基本信息 
  138.     private function _retrieve() { 
  139.         $backUp  = ''
  140.         $backUp .= '--' . "\n"
  141.         $backUp .= '-- MySQL database dump' . "\n"
  142.         $backUp .= '-- Created by DbBackUp class, Power By chujiu. ' . "\n"
  143.         $backUp .= '--' . "\n"
  144.         $backUp .= '-- 主机: ' . $this->host . "\n"
  145.         $backUp .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . "\n"
  146.         $backUp .= '-- MySQL版本: ' . mysql_get_server_info () . "\n"
  147.         $backUp .= '-- PHP 版本: ' . phpversion () . "\n"
  148.         $backUp .= "\n\n"
  149.         $backUp .= "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO';\n"
  150.         $backUp .= "SET time_zone = '+00:00';\n\n"
  151.         $backUp .= "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n"
  152.         $backUp .= "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n"
  153.         $backUp .= "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n"
  154.         $backUp .= "/*!40101 SET NAMES utf8*/;\n\n"
  155.         $backUp .= "--\n-- Database: `{$this->dbName}`\n--\n\n-- --------------------------------------------------------\n\n"
  156.         return $backUp
  157.     } 
  158.  
  159.     /** 
  160.      * 插入单条记录 
  161.      * 
  162.      * @param string $row 
  163.      */ 
  164.     private function _insertSql($row$table) { 
  165.         // sql字段逗号分割 
  166.         $insert = ''
  167.         $insert .= "INSERT INTO `" . $table . "` VALUES("
  168.         foreach($row as $key=>$val) { 
  169.             $insert .= "'".$val."',"
  170.         } 
  171.         $insert = substr($insert, 0 ,-1); 
  172.          $insert .= ");" . "\n"
  173.         return $insert
  174.     } 
  175.  
  176.     /** 
  177.      * 生成一个表的inser语句 
  178.      * @param string $table 
  179.      * @param string $subsection 分卷大小 
  180.      */ 
  181.     private function _insertSqlByTableForAll($path$table$subsection) { 
  182.         $i = 0; 
  183.         $insertSqlByTable = ''
  184.         $res = mysql_query("SELECT * FROM `{$table}`"$this->conn); 
  185.         if(!$resdie('MySQL Error: ' . mysql_error()); 
  186.         while($rows = mysql_fetch_assoc($res)) { 
  187.             $insertSqlByTable .= $this->_insertSql($rows$table); 
  188.             $size = strlen($insertSqlByTable); 
  189.             if($size > $subsection*1024*1024) { 
  190.                 $fw = $this->writeFileByBackUpData($path.$table.$i.$this->tag.'.sql'$insertSqlByTable); 
  191.                 if($fw === false) $this->_showMsg('数据库表['.$table.'],卷 '.$i.' 写入文件失败,请稍后再试!!!',true); 
  192.                 $this->_showMsg('数据库表['.$table.'],卷 '.$i.' 备份成功!备份文件:[ '.$path.$table.$i.$this->tag.'.sql ]'); 
  193.                 $insertSqlByTable = ''
  194.                 $i+=1; 
  195.             } 
  196.         } 
  197.         // insertSqlByTable大小不够分卷大小 
  198.         if ($insertSqlByTable != "") { 
  199.             $fw = $this->writeFileByBackUpData($path.$table.$this->tag.'.sql'$insertSqlByTable); 
  200.             if($fw === false) $this->_showMsg('数据库表['.$table.']写入文件失败,请稍后再试!!!备份文件:[ '.$path.$table.$this->tag.'.sql ]',true); 
  201.             $this->_showMsg('数据库表['.$table.'] 备份成功!备份文件:[ '.$path.$table.$this->tag.'.sql ]'); 
  202.         } 
  203.         $this->_showMsg('数据库表['.$table.']全部备份成功!'); 
  204.     } 
  205.  
  206.     // 写入文件 
  207.     public function writeFileByBackUpData($fileName$data$method="rb+"$iflock=1, $check=1, $chmod=1){ 
  208.         $check && @strpos($fileName'..')!==false && exit('Forbidden'); 
  209.         @touch($fileName); 
  210.         $handle = @fopen($fileName$method); 
  211.         if($iflock) { 
  212.             @flock($handle,LOCK_EX); 
  213.         } 
  214.         $fw = @fwrite($handle,$data); 
  215.         if($method == "rb+") ftruncate($handlestrlen($data)); 
  216.         fclose($handle); 
  217.         $chmod && @chmod($fileName,0777); 
  218.         return $fw
  219.     } 
  220.  
  221.     /** 
  222.      * path: 生成压缩包的路径 
  223.      * fileName : 要压缩的文件名 通常和path 同一目录 
  224.      */ 
  225.     public function createZipByBackUpFile($path) { 
  226.         $db_base_files = $this->getFileByBackUpDir($path); 
  227.         if(!emptyempty($db_base_files)) { 
  228.             $zip = new ZipArchive; 
  229.             if($zip->open($path.$this->dbName.date('Ymd').'.zip', ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) !== true) 
  230.                 die ("cannot open".$this->dbName.date('Ymd')."zip for writing."); 
  231.             foreach ($db_base_files as $key => $value) { 
  232.                 if(is_file($value)) { 
  233.                     $file_name = basename($value); 
  234.                     $info[] = $zip->addFile($value$file_name);// 避免压缩包里有文件的路径 
  235.                 } 
  236.             } 
  237.             $zip->close(); 
  238.             if(file_exists($path.$this->dbName.date('Ymd').'.zip')) 
  239.             foreach ($db_base_files as $val) { 
  240.                 unlink($val); 
  241.             } 
  242.             if(count(array_filter($info)) > 0) return true; 
  243.         } 
  244.         return false; 
  245.     } 
  246.  
  247.     //获取文件 
  248.     public function getFileByBackUpDir($path) { 
  249.         $info = array(); 
  250.         $db_base_files = array(); 
  251.         if( @file_exists($path) && is_dir($path) ) { 
  252.             if ($dh = opendir($path)) { 
  253.                 while (($file = readdir($dh)) !== false) { 
  254.                     if($file != '.' && $file != '..') { 
  255.                         ifstrripos($file'seocheck') !== false ) { 
  256.                             $db_base_files[] = $path.$file
  257.                         } 
  258.                     } 
  259.                 } 
  260.                 closedir($dh); 
  261.             } 
  262.         } 
  263.         return $db_base_files
  264.     } 
  265.  
  266.     /** 
  267.      * @path: 生成压缩包的路径 
  268.      * @fileName : 要解压的文件名 默认解压到path 目录 
  269.      */ 
  270.     public function uncompressZip($path$zipName) { 
  271.         $path = emptyempty($path) ? $_SERVER['DOCUMENT_ROOT'].'/core/Runtime/Data/' : $path
  272.         $zip = new ZipArchive; 
  273.         if ($zip->open($path.$zipName) === TRUE) { 
  274.             $zip->extractTo($path); 
  275.             $zip->close(); 
  276.             return true; 
  277.         } else { 
  278.             return false; 
  279.         } 
  280.     } 
  281.  
  282.     //导入数据库 
  283.     public function importingDataBySqlFile () { 
  284.  
  285.     } 
  286.  
  287.     //  及时输出信息 
  288.     private function _showMsg($msg,$err=false){ 
  289.         if($err === true) { 
  290.             echo "<p style='font-size:14px;'><span style='color:red;'>ERROR: --- " . $msg . "</span></p>";exit
  291.         } 
  292.         echo "<p style='font-size:14px;'><span style='color:green;'>OK: --- " . $msg . "</span></p>"
  293.     } 
  294.  
  295.     // 锁定数据库,以免备份或导入时出错 
  296.     private function lock($table$op = "WRITE") { 
  297.         if (mysql_query ( "lock tables " . $table . " " . $op )) 
  298.             return true; 
  299.         else 
  300.             return false; 
  301.     } 
  302.  
  303.     // 解锁 
  304.     private function unlock() { 
  305.         if (mysql_query ( "unlock tables" )) 
  306.             return true; 
  307.         else 
  308.             return false; 
  309.     } 
  310.  
  311.     // 析构 
  312.     public function __destruct() { 
  313.         if($this->conn){ 
  314.             mysql_query ( "unlock tables"$this->conn ); 
  315.             mysql_close ( $this->conn ); 
  316.         } 
  317.     } 
  318. ?> 

Tags: mysql数据备份

分享到: