• mysql 数据库备份,恢复。。。。


    mysql 数据备份,恢复,恢复没写,这里只写了备份。。。 先暂作记录吧!

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

    代码如下:

      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     //获取数据库所有表名
     25     public function getTableNames () {
     26         $tables = array();
     27         $result = mysql_list_tables($this->dbName, $this->conn);
     28         if(!$result) die('MySQL Error: ' . mysql_error());
     29         while($row = mysql_fetch_row($result)) {
     30             $tables[] = $row[0];
     31         }
     32         return $tables;
     33     }
     34 
     35     //获取数据库表的字段信息
     36     public function getFieldsByTable ($table) {
     37         $fields = array();
     38         $str = '';
     39         $res = mysql_query("SHOW CREATE TABLE `{$table}`", $this->conn);
     40         if(!$res) die('MySQL Error: ' . mysql_error());
     41         while($rows = mysql_fetch_assoc($res)) {
     42             $str = str_replace("CREATE TABLE `{$table}` (", "", $rows['Create Table']);//DROP TABLE IF EXISTS `{$table}`
    
     43             $str = "--
    -- Table structure for table `{$table}`
    --
    
    CREATE TABLE IF NOT EXISTS `{$table}` ( ".$str;
     44             $str = str_replace(",", ", ", $str);
     45             $str = str_replace("`) ) ENGINE=InnoDB ", "`)
     ) ENGINE=InnoDB ", $str);
     46             $str .=";
    
    ";
     47             //$str = $str.";
    
    --
    -- Dumping data for table `{$table}`
    --
    
    ";
     48             $fields[$rows['Table']] = $str;
     49         }
     50         return $fields;
     51     }
     52 
     53     //获取表中的数据
     54     public function getDataByTable($table) {
     55         $data = array();
     56         $str = '';
     57         $res = mysql_query("SELECT * FROM `{$table}`", $this->conn);
     58         if(!$res) die('MySQL Error: ' . mysql_error());
     59         while($rows = mysql_fetch_assoc($res)) {
     60             if(!empty($rows)) {
     61                 $data[] = $rows;
     62             }
     63         }
     64         $keys = array_keys($data[0]);
     65         foreach ($keys as $k=>$v) {
     66             $keys[$k] = '`'.$v.'`';
     67         }
     68         $key = join(', ', $keys);
     69         $str = "INSERT INTO `{$table}` ({$key}) VALUES
    ";
     70         foreach ($data as $k=>$v) {
     71             $str.="(";
     72             while (list($key, $val) = each($v)) {
     73                 if(!is_numeric($val)) {
     74                     $str.= "'".$val."', ";
     75                 } else {
     76                     $str.= $val.', ';
     77                 }
     78             }
     79             $str = substr($str, 0, -2);// 后边有空格 所以从-2 开始截取
     80             if($k+1 == count($data)) {
     81                 $str.=");
    
    -- --------------------------------------------------------
    
    ";
     82             } else {
     83                 $str.="),
    ";
     84             }
     85         }
     86         return $str;
     87     }
     88 
     89      //备份数据库
     90     public function getBackUpDataByTable ($tables, $path='', $fileName = 'seocheck', $subsection = '2') {
     91         if(empty($tables)) $this->_showMsg('未能指定要备份的表!!!', true);
     92         $page = 0;//卷数
     93         $path = empty($path) ? $_SERVER['DOCUMENT_ROOT'].'/core/Runtime/Data/'.$fileName.'Demo/' : $path;
     94         if(!file_exists($path)) {
     95             mkdir($path, 0777, true);
     96         }
     97         $mysql_info = $this->_retrieve();
     98         $fieldsByTable = array();
     99         if(is_array($tables)) {
    100             $this->_showMsg('开始备份,数据正在初始化中,请勿关闭浏览器...');
    101             $fw = $this->writeFileByBackUpData($path.$this->dbName.'_table.sql', $mysql_info, $method="ab+");
    102             if($fw !== false) {
    103                 $this->_showMsg('备份数据库基本信息成功。。。');
    104             }
    105             foreach ($tables as $table) {
    106                 $tableInfo = $this->getFieldsByTable($table);
    107                 if(!empty($tableInfo)) {
    108                     $this->_showMsg('获取表['.$table.']结构成功。。。');
    109                     $fw = $this->writeFileByBackUpData($path.$this->dbName.'_table.sql', $tableInfo[$table], $method="ab+");
    110                     if($fw === false) {
    111                         $this->_showMsg('备份表['.$table.']结构失败。。。', true);
    112                     } else {
    113                         $this->_showMsg('备份表['.$table.']结构成功,开始获取数据。。。');
    114                     };
    115                 } else {
    116                     $this->_showMsg('获取数据库['.$this->dbName.']表结构失败,请稍后再试!。。。', true);
    117                 }
    118                 $this->_insertSqlByTableForAll($path, $table, $subsection);
    119             }
    120         } else {
    121             $this->_showMsg('开始备份,数据正在初始化中,请勿关闭浏览器...');
    122             $tableInfo = $this->getFieldsByTable($tables);
    123             if(!empty($tableInfo)) {
    124                 $this->_showMsg('获取表['.$tables.']结构成功。。。');
    125                 $fw = $this->writeFileByBackUpData($path.$this->dbName.'_'.$tables.'_table.sql', $mysql_info.$tableInfo[$tables]);
    126                 if($fw === false) {
    127                     $this->_showMsg('备份表['.$tables.']结构失败。。。', true);
    128                 } else {
    129                     $this->_showMsg('备份表['.$tables.']结构成功,开始获取数据。。。');
    130                 }
    131             } else {
    132                 $this->_showMsg('获取表['.$tables.']结构失败,请稍后再试!。。。', true);
    133             }
    134             $res = $this->_insertSqlByTableForAll($path, $tables, $subsection);
    135         }
    136     }
    137 
    138     //数据库基本信息
    139     private function _retrieve() {
    140         $backUp  = '';
    141         $backUp .= '--' . "
    ";
    142         $backUp .= '-- MySQL database dump' . "
    ";
    143         $backUp .= '-- Created by DbBackUp class, Power By chujiu. ' . "
    ";
    144         $backUp .= '--' . "
    ";
    145         $backUp .= '-- 主机: ' . $this->host . "
    ";
    146         $backUp .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . "
    ";
    147         $backUp .= '-- MySQL版本: ' . mysql_get_server_info () . "
    ";
    148         $backUp .= '-- PHP 版本: ' . phpversion () . "
    ";
    149         $backUp .= "
    
    ";
    150         $backUp .= "SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO';
    ";
    151         $backUp .= "SET time_zone = '+00:00';
    
    ";
    152         $backUp .= "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    ";
    153         $backUp .= "/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    ";
    154         $backUp .= "/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    ";
    155         $backUp .= "/*!40101 SET NAMES utf8*/;
    
    ";
    156         $backUp .= "--
    -- Database: `{$this->dbName}`
    --
    
    -- --------------------------------------------------------
    
    ";
    157         return $backUp;
    158     }
    159 
    160     /**
    161      * 插入单条记录
    162      *
    163      * @param string $row
    164      */
    165     private function _insertSql($row, $table) {
    166         // sql字段逗号分割
    167         $insert = '';
    168         $insert .= "INSERT INTO `" . $table . "` VALUES(";
    169         foreach($row as $key=>$val) {
    170             $insert .= "'".$val."',";
    171         }
    172         $insert = substr($insert, 0 ,-1);
    173          $insert .= ");" . "
    ";
    174         return $insert;
    175     }
    176 
    177     /**
    178      * 生成一个表的inser语句
    179      * @param string $table
    180      * @param string $subsection 分卷大小
    181      */
    182     private function _insertSqlByTableForAll($path, $table, $subsection) {
    183         $i = 0;
    184         $insertSqlByTable = '';
    185         $res = mysql_query("SELECT * FROM `{$table}`", $this->conn);
    186         if(!$res) die('MySQL Error: ' . mysql_error());
    187         while($rows = mysql_fetch_assoc($res)) {
    188             $insertSqlByTable .= $this->_insertSql($rows, $table);
    189             $size = strlen($insertSqlByTable);
    190             if($size > $subsection*1024*1024) {
    191                 $fw = $this->writeFileByBackUpData($path.$table.$i.$this->tag.'.sql', $insertSqlByTable);
    192                 if($fw === false) $this->_showMsg('数据库表['.$table.'],卷 '.$i.' 写入文件失败,请稍后再试!!!',true);
    193                 $this->_showMsg('数据库表['.$table.'],卷 '.$i.' 备份成功!备份文件:[ '.$path.$table.$i.$this->tag.'.sql ]');
    194                 $insertSqlByTable = '';
    195                 $i+=1;
    196             }
    197         }
    198         // insertSqlByTable大小不够分卷大小
    199         if ($insertSqlByTable != "") {
    200             $fw = $this->writeFileByBackUpData($path.$table.$this->tag.'.sql', $insertSqlByTable);
    201             if($fw === false) $this->_showMsg('数据库表['.$table.']写入文件失败,请稍后再试!!!备份文件:[ '.$path.$table.$this->tag.'.sql ]',true);
    202             $this->_showMsg('数据库表['.$table.'] 备份成功!备份文件:[ '.$path.$table.$this->tag.'.sql ]');
    203         }
    204         $this->_showMsg('数据库表['.$table.']全部备份成功!');
    205     }
    206 
    207     // 写入文件
    208     public function writeFileByBackUpData($fileName, $data, $method="rb+", $iflock=1, $check=1, $chmod=1){
    209         $check && @strpos($fileName, '..')!==false && exit('Forbidden');
    210         @touch($fileName);
    211         $handle = @fopen($fileName, $method);
    212         if($iflock) {
    213             @flock($handle,LOCK_EX);
    214         }
    215         $fw = @fwrite($handle,$data);
    216         if($method == "rb+") ftruncate($handle, strlen($data));
    217         fclose($handle);
    218         $chmod && @chmod($fileName,0777);
    219         return $fw;
    220     }
    221 
    222     /**
    223      * path: 生成压缩包的路径
    224      * fileName : 要压缩的文件名 通常和path 同一目录
    225      */
    226     public function createZipByBackUpFile($path) {
    227         $db_base_files = $this->getFileByBackUpDir($path);
    228         if(!empty($db_base_files)) {
    229             $zip = new ZipArchive;
    230             if($zip->open($path.$this->dbName.date('Ymd').'.zip', ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) !== true) 
    231                 die ("cannot open".$this->dbName.date('Ymd')."zip for writing.");
    232             foreach ($db_base_files as $key => $value) {
    233                 if(is_file($value)) {
    234                     $file_name = basename($value);
    235                     $info[] = $zip->addFile($value, $file_name);// 避免压缩包里有文件的路径
    236                 }
    237             }
    238             $zip->close();
    239             if(file_exists($path.$this->dbName.date('Ymd').'.zip'))
    240             foreach ($db_base_files as $val) {
    241                 unlink($val);
    242             }
    243             if(count(array_filter($info)) > 0) return true;
    244         }
    245         return false;
    246     }
    247 
    248     //获取文件
    249     public function getFileByBackUpDir($path) {
    250         $info = array();
    251         $db_base_files = array();
    252         if( @file_exists($path) && is_dir($path) ) {
    253             if ($dh = opendir($path)) {
    254                 while (($file = readdir($dh)) !== false) {
    255                     if($file != '.' && $file != '..') {
    256                         if( strripos($file, 'seocheck') !== false ) {
    257                             $db_base_files[] = $path.$file;
    258                         }
    259                     }
    260                 }
    261                 closedir($dh);
    262             }
    263         }
    264         return $db_base_files;
    265     }
    266     
    267     /**
    268      * @path: 生成压缩包的路径
    269      * @fileName : 要解压的文件名 默认解压到path 目录
    270      */
    271     public function uncompressZip($path, $zipName) {
    272         $path = empty($path) ? $_SERVER['DOCUMENT_ROOT'].'/core/Runtime/Data/' : $path;
    273         $zip = new ZipArchive;
    274         if ($zip->open($path.$zipName) === TRUE) {
    275             $zip->extractTo($path);
    276             $zip->close();
    277             return true;
    278         } else {
    279             return false;
    280         }
    281     }
    282 
    283     //导入数据库
    284     public function importingDataBySqlFile () {
    285         
    286     }
    287 
    288     //  及时输出信息
    289     private function _showMsg($msg,$err=false){
    290         if($err === true) {
    291             echo "<p style='font-size:14px;'><span style='color:red;'>ERROR: --- " . $msg . "</span></p>";exit;
    292         }
    293         echo "<p style='font-size:14px;'><span style='color:green;'>OK: --- " . $msg . "</span></p>";
    294     }
    295 
    296     // 锁定数据库,以免备份或导入时出错
    297     private function lock($table, $op = "WRITE") {
    298         if (mysql_query ( "lock tables " . $table . " " . $op ))
    299             return true;
    300         else
    301             return false;
    302     }
    303 
    304     // 解锁
    305     private function unlock() {
    306         if (mysql_query ( "unlock tables" ))
    307             return true;
    308         else
    309             return false;
    310     }
    311 
    312     // 析构
    313     public function __destruct() {
    314         if($this->conn){
    315             mysql_query ( "unlock tables", $this->conn );
    316             mysql_close ( $this->conn );
    317         }
    318     }
    319 }
    320 ?>
  • 相关阅读:
    常用的 HTML 头部标签
    placeholder的兼容处理方法
    用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式
    终于有人把P2P、P2C、O2O、B2C、B2B、C2C的区别讲透了!还有许多其它类别的类型分享
    JS判断android ios系统 PC端和移动端
    一路的前端编辑器
    图片压缩的在线好工具
    关于文本换行的问题
    字符、字节的概念及其区别
    application/x-www-form-urlencoded接口响应报文中文乱码
  • 原文地址:https://www.cnblogs.com/chujiuIt/p/3690957.html
Copyright © 2020-2023  润新知