php专区

 首页 > php专区 > PHP应用 > php类库 > php类实现MySQL数据库备份、还原 - php类库

php类实现MySQL数据库备份、还原 - php类库

分享到:
【字体:
导读:
          这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的在dbmange中配置好连接地址用户名与数据库即可,下面我们一起来看这个例子,代码如下:?php/***创建时间:2012年5月21日...

php类实现MySQL数据库备份、还原

这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的在dbmange中配置好连接地址用户名与数据库即可,下面我们一起来看这个例子,代码如下:

  1. /**  
  2.  * 创建时间: 2012年5月21日  
  3.  *  
  4.  * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql)  
  5.  * 功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入  
  6.  * 使用方法:  
  7.  *  
  8.  * ------1. 数据库备份(导出)------------------------------------------------------------  
  9. //分别是主机,用户名,密码,数据库名,数据库编码  
  10. $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );  
  11. // 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)  
  12. $db->backup ();  
  13.  * ------2. 数据库恢复(导入)------------------------------------------------------------  
  14. //分别是主机,用户名,密码,数据库名,数据库编码  
  15. $db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );  
  16. //参数:sql文件  
  17. $db->restore ( './backup/20120516211738_all_v1.sql');  
  18.  *----------------------------------------------------------------------  
  19.  */  
  20. class DBManage   
  21. {   
  22.     var $db// 数据库连接   
  23.     var $database// 所用数据库   
  24.     var $sqldir// 数据库备份文件夹   
  25.     var $record;   
  26.     // 换行符   
  27.     private $ds = "n";   
  28.     // 存储SQL的变量   
  29.     public $sqlContent = "";   
  30.     // 每条sql语句的结尾符   
  31.     public $sqlEnd = ";";   
  32.     /**  
  33.      * 初始化  
  34.      *  
  35.      * @param string $host  
  36.      * @param string $username  
  37.      * @param string $password  
  38.      * @param string $thisatabase  
  39.      * @param string $charset  
  40.      */  
  41.     function __construct($host = 'localhost'$username = 'root'$password = ''$thisatabase = 'test'$charset = 'utf8')   
  42.     {   
  43.         $this->host = $host;   
  44.         $this->username = $username;   
  45.         $this->password = $password;   
  46.         $this->database = $thisatabase;   
  47.         $this->charset = $charset;   
  48.         // 连接数据库   
  49.         $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." );   
  50.         // 选择使用哪个数据库   
  51.         mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" );   
  52.         // 数据库编码方式   
  53.         mysql_query ( 'SET NAMES ' . $this->charset, $this->db );   
  54.     }   
  55.     
  56.     /*  
  57.       * ------------------------------------------数据库备份start----------------------------------------------------------  
  58.       */  
  59.     
  60.     /**  
  61.      * 数据库备份  
  62.      * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)  
  63.      *  
  64.      * @param $string $dir  
  65.      * @param int $size  
  66.      * @param $string $tablename  
  67.      */  
  68.     function backup($tablename = ''$dir = ''$size = 2000)   
  69.     {   
  70.         //$dir = $dir ? $dir : 'backup/';   
  71.         //$size = $size ? $size : 2000;   
  72.         $sql = '';   
  73.         // 只备份某个表   
  74.         if (! emptyempty ( $tablename ))   
  75.         {   
  76.             echo '正在备份表' . $tablename . '';   
  77.             // 插入dump信息   
  78.             $sql = $this->_retrieve();   
  79.             // 插入表结构信息   
  80.             $sql .= $this->_insert_table_structure ( $tablename );   
  81.             // 插入数据   
  82.             $data = mysql_query ( "select * from " . $tablename );   
  83.             // 文件名前面部分   
  84.             $filename = date ( 'YmdHis' ) . "_" . $tablename;   
  85.             // 字段数量   
  86.             $num_fields = mysql_num_fields ( $data );   
  87.             // 第几分卷   
  88.             $p = 1;   
  89.             // 循环每条记录   
  90.             while ( $record = mysql_fetch_array ( $data ) )   
  91.             {   
  92.                 // 单条记录   
  93.                 $sql .= $this->_insert_record ( $tablename$num_fields$record );   
  94.                 // 如果大于分卷大小,则写入文件   
  95.                 if (strlen ( $sql ) >= $size * 1000)   
  96.                 {   
  97.                     $file = $filename . "_v" . $p . ".sql";   
  98.                     if ($this->_write_file ( $sql$file$dir ))   
  99.                     {   
  100.                         echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 $dir$filename";   
  101.                     }   
  102.                     else  
  103.                     {   
  104.                         echo "备份表-" . $tablename . "-失败";   
  105.                     }   
  106.                     // 下一个分卷   
  107.                     $p ++;   
  108.                     // 重置$sql变量为空,重新计算该变量大小   
  109.                     $sql = "";   
  110.                 }   
  111.             }   
  112.             // sql大小不够分卷大小   
  113.             if ($sql != "")   
  114.             {   
  115.                 $filename .= "_v" . $p . ".sql";   
  116.                 if ($this->_write_file ( $sql$filename$dir ))   
  117.                 {   
  118.                     echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 $dir$filename";   
  119.                 }   
  120.                 else  
  121.                 {   
  122.                     echo "备份卷-" . $p . "-失败";   
  123.                 }   
  124.             }   
  125.         }   
  126.         else  
  127.         { // 备份全部表   
  128.             if ($tables = mysql_query ( "show table status from " . $this->database ))   
  129.             {   
  130.                 echo "读取数据库结构成功!";   
  131.             }   
  132.             else  
  133.             {   
  134.                 exit ( "读取数据库结构成功!" );   
  135.             }   
  136.             // 插入dump信息   
  137.             $sql .= $this->_retrieve();   
  138.             // 文件名前面部分   
  139.             $filename = date ( 'YmdHis' ) . "_all";   
  140.             // 查出所有表   
  141.             $tables = mysql_query ( 'SHOW TABLES' );   
  142.             // 第几分卷   
  143.             $p = 1;   
  144.             // 循环所有表   
  145.             while ( $table = mysql_fetch_array ( $tables ) )   
  146.             {   
  147.                 // 获取表名   
  148.                 $tablename = $table [0];   
  149.                 // 获取表结构   
  150.                 $sql .= $this->_insert_table_structure ( $tablename );   
  151.                 $data = mysql_query ( "select * from " . $tablename );   
  152.                 $num_fields = mysql_num_fields ( $data );   
  153.     
  154.                 // 循环每条记录   
  155.                 while ( $record = mysql_fetch_array ( $data ) )   
  156.                 {   
  157.                     // 单条记录   
  158.                     $sql .= $this->_insert_record ( $tablename$num_fields$record );   
  159.                     // 如果大于分卷大小,则写入文件   
  160.                     if (strlen ( $sql ) >= $size * 1000)   
  161.                     {   
  162.     
  163.                         $file = $filename . "_v" . $p . ".sql";   
  164.                         // 写入文件   
  165.                         if ($this->_write_file ( $sql$file$dir ))   
  166.                         {   
  167.                             echo "-卷-" . $p . "-数据备份完成,生成备份文件$dir$file";   
  168.                         }   
  169.                         else  
  170.                         {   
  171.                             echo "备份卷-" . $p . "-失败";   
  172.                         }   
  173.                         // 下一个分卷   
  174.                         $p ++;   
  175.                         // 重置$sql变量为空,重新计算该变量大小   
  176.                         $sql = "";   
  177.                     }   
  178.                 }   
  179.             }   
  180.             // sql大小不够分卷大小   
  181.             if ($sql != "")   
  182.             {   
  183.                 $filename .= "_v" . $p . ".sql";   
  184.                 if ($this->_write_file ( $sql$filename$dir ))   
  185.                 {   
  186.                     echo "-卷-" . $p . "-数据备份完成,生成备份文件 $dir$filename";   
  187.                 }   
  188.                 else  
  189.                 {   
  190.                     echo "备份卷-" . $p . "-失败";   
  191.                 }   
  192.             }   
  193.         }   
  194.     }   
  195.     
  196.     /**  
  197.      * 插入数据库备份基础信息  
  198.      *  
  199.      * @return string  
  200.      */  
  201.     private function _retrieve() {   
  202.         $value = '';   
  203.         $value .= '--' . $this->ds;   
  204.         $value .= '-- MySQL database dump' . $this->ds;   
  205.         $value .= '-- Created by DBManage class, Power By yanue. ' . $this->ds;   
  206.         $value .= '-- http://yanue.net ' . $this->ds;   
  207.         $value .= '--' . $this->ds;   
  208.         $value .= '-- 主机: ' . $this->host . $this->ds;   
  209.         $value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds;   
  210.         $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds;   
  211.         $value .= '-- PHP 版本: ' . phpversion () . $this->ds;   
  212.         $value .= $this->ds;   
  213.         $value .= '--' . $this->ds;   
  214.         $value .= '-- 数据库: `' . $this->database . '`' . $this->ds;   
  215.         $value .= '--' . $this->ds . $this->ds;   
  216.         $value .= '-- -------------------------------------------------------';   
  217.         $value .= $this->ds . $this->ds;   
  218.         return $value;   
  219.     }   
  220.     
  221.     /**  
  222.      * 插入表结构  
  223.      *  
  224.      * @param unknown_type $table  
  225.      * @return string  
  226.      */  
  227.     private function _insert_table_structure($table) {   
  228.         $sql = '';   
  229.         $sql .= "--" . $this->ds;   
  230.         $sql .= "-- 表的结构" . $table . $this->ds;   
  231.         $sql .= "--" . $this->ds . $this->ds;   
  232.     
  233.         // 如果存在则删除表   
  234.         $sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds;   
  235.         // 获取详细表信息   
  236.         $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );   
  237.         $row = mysql_fetch_array ( $res );   
  238.         $sql .= $row [1];   
  239.         $sql .= $this->sqlEnd . $this->ds;   
  240.         // 加上   
  241.         $sql .= $this->ds;   
  242.         $sql .= "--" . $this->ds;   
  243.         $sql .= "-- 转存表中的数据 " . $table . $this->ds;   
  244.         $sql .= "--" . $this->ds;   
  245.         $sql .= $this->ds;   
  246.         return $sql;   
  247.     }   
  248.     
  249.     /**  
  250.      * 插入单条记录  
  251.      *  
  252.      * @param string $table  
  253.      * @param int $num_fields  
  254.      * @param array $record  
  255.      * @return string  
  256.      */  
  257.     private function _insert_record($table$num_fields$record) {   
  258.         // sql字段逗号分割   
  259.         $insert = $comma = "";   
  260.         $insert .= "INSERT INTO `" . $table . "` VALUES(";   
  261.         // 循环每个子段下面的内容   
  262.         for($i = 0; $i < $num_fields$i ++) {   
  263.             $insert .= ($comma . "'" .mysql_real_escape_string ( $record [$i] ) . "'");   
  264.             $comma = ",";   
  265.         }   
  266.         $insert .= ");" . $this->ds;   
  267.         return $insert;   
  268.     }   
  269.     
  270.     /**  
  271.      * 写入文件  
  272.      *  
  273.      * @param string $sql  
  274.      * @param string $filename  
  275.      * @param string $dir  
  276.      * @return boolean  
  277.      */  
  278.     private function _write_file($sql$filename$dir) {   
  279.         $dir = $dir ? $dir : './backup/';   
  280.         // 不存在文件夹则创建   
  281.         if (! file_exists ( $dir )) {   
  282.             mkdir ( $dir );   
  283.         }   
  284.         $re = true;   
  285.         if (! @$fp = fopen ( $dir . $filename"w+" )) {   
  286.             $re = false;   
  287.             echo "打开文件失败!";   
  288.         }   
  289.         if (! @fwrite ( $fp$sql )) {   
  290.             $re = false;   
  291.             echo "写入文件失败,请文件是否可写";   
  292.         }   
  293.         if (! @fclose ( $fp )) {   
  294.             $re = false;   
  295.             echo "关闭文件失败!";   
  296.         }   
  297.         return $re;   
  298.     }   
  299.     
  300.     /*  
  301.       *  
  302.       * -------------------------------上:数据库导出-----------分割线----------下:数据库导入--------------------------------  
  303.       */  
  304.     
  305.     /**  
  306.      * 导入备份数据  
  307.      * 说明:分卷文件格式20120516211738_all_v1.sql  
  308.      * 参数:文件路径(必填)  
  309.      *  
  310.      * @param string $sqlfile  
  311.      */  
  312.     function restore($sqlfile)   
  313.     {   
  314.         // 检测文件是否存在   
  315.         if (! file_exists ( $sqlfile ))   
  316.         {   
  317.             exit ( "文件不存在!请检查" );   
  318.         }   
  319.         $this->lock ( $this->database );   
  320.         // 获取数据库存储位置   
  321.         $sqlpath = pathinfo ( $sqlfile );   
  322.         $this->sqldir = $sqlpath ['dirname'];   
  323.         // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷   
  324.         $volume = explode ( "_v"$sqlfile );   
  325.         $volume_path = $volume [0];   
  326.         echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损";   
  327.         echo "正在导入备份数据,请稍等!";   
  328.         if (emptyempty ( $volume [1] ))   
  329.         {   
  330.             echo "正在导入sql:" . $sqlfile . '';   
  331.             // 没有分卷   
  332.             if ($this->_import ( $sqlfile )) {   
  333.                 echo "数据库导入成功!";   
  334.             }   
  335.             else  
  336.             {   
  337.                 exit ( '数据库导入失败!' );   
  338.             }   
  339.         }   
  340.         else  
  341.         {   
  342.             //$volume_id = array();   
  343.             // 存在分卷,则获取当前是第几分卷,循环执行余下分卷   
  344.             $volume_id = explode ( ".sq"$volume [1] );   
  345.             // 当前分卷为$volume_id   
  346.             $volume_id = intval ( $volume_id [0] );   
  347.             while ( $volume_id )   
  348.             {   
  349.                 $tmpfile = $volume_path . "_v" . $volume_id . ".sql";   
  350.                 // 存在其他分卷,继续执行   
  351.                 if (file_exists ( $tmpfile )) {   
  352.                     // 执行导入方法   
  353.                     echo "正在导入分卷" . $tmpfile . '';   
  354.                     if ($this->_import ( $tmpfile ))   
  355.                     {   
  356.     
  357.                     }   
  358.                     else  
  359.                     {   
  360.                         exit ( "导入分卷" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' );   
  361.                     }   
  362.                 }   
  363.                 else  
  364.                 {   
  365.                     echo "此分卷备份全部导入成功!";   
  366.                     return;   
  367.                 }   
  368.                 $volume_id++;   
  369.             }   
  370.         }   
  371.     }   
  372.     
  373.     /**  
  374.      * 将sql导入到数据库(普通导入)  
  375.      *  
  376.      * @param string $sqlfile  
  377.      * @return boolean  
  378.      */  
  379.     private function _import($sqlfile) {   
  380.         // sql文件包含的sql语句数组   
  381.         $sqls = array ();   
  382.         $f = fopen ( $sqlfile"rb" );   
  383.         // 创建表缓冲变量   
  384.         $create = '';   
  385.         while ( ! feof ( $f ) ) {   
  386.             // 读取每一行sql   
  387.             $line = fgets ( $f );   
  388.             // 如果包含'-- '等注释,或为空白行,则跳过   
  389.             if (trim ( $line ) == '' || preg_match ( '/--*?/'$line$match )) {   
  390.                 continue;   
  391.             }   
  392.             // 如果结尾包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句),   
  393.             if (! preg_match ( '/;/'$line$match ) || preg_match ( '/ENGINE=/'$line$match )) {   
  394.                 // 将本次sql语句与创建表sql连接存起来   
  395.                 $create .= $line;   
  396.                 // 如果包含了创建表的最后一句   
  397.                 if (preg_match ( '/ENGINE=/'$create$match )) {   
  398.                     // 则将其合并到sql数组   
  399.                     $sqls [] = $create;   
  400.                     // 清空当前,准备下一个表的创建   
  401.                     $create = '';   
  402.                 }   
  403.                 // 跳过本次   
  404.                 continue;   
  405.             }   
  406.             $sqls [] = $line;   
  407.         }   
  408.         fclose ( $f );   
  409.         // 循环sql语句数组,分别执行   
  410.         foreach ( $sqls as $sql ) {   
  411.             str_replace ( "n"""$sql );   
  412.             if (! mysql_query ( trim ( $sql ) )) {   
  413.                 echo mysql_error ();   
  414.                 return false;   
  415.             }   
  416.         }   
  417.         return true;   
  418.     }   
  419.     
  420.     /*  
  421.       * -------------------------------数据库导入end---------------------------------  
  422.       */  
  423.     
  424.     // 关闭数据库连接   
  425.     private function close() {   
  426.         mysql_close ( $this->db );   
  427.     }   
  428.     
  429.     // 锁定数据库,以免备份或导入时出错   
  430.     private function lock($tablename$op = "WRITE") {   
  431.         if (mysql_query ( "lock tables " . $tablename . " " . $op ))   
  432.             return true;   
  433.         else  
  434.             return false;   
  435.     }   
  436.     
  437.     // 解锁   
  438.     private function unlock() {   
  439.         if (mysql_query ( "unlock tables" ))   
  440.             return true;   
  441.         else  
  442.             return false;   
  443.     }   
  444.     
  445.     // 析构   
  446.     function __destruct() {   
  447.         mysql_query ( "unlock tables"$this->db );   
  448.         mysql_close ( $this->db );   
  449.     }  //开源代码phpfensi.com 
  450.  
  451. $db = new DBManage ( 'localhost''root''''tao''gbk' );  
  452. //$db->backup ('tao_admin');   
  453. $db->restore ( './backup/20140228222713_tao_admin_v1.sql'); 
  454. ?> 
分享到:
PHP 数据库缓存Memcache操作类 - php类库
PHP 数据库缓存Memcache操作类 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了一个Memcache数据缓存操作类库文件,希望对各位会有帮助了. PHP 数据库缓存Memcache操作类...
php Mysql类(查询 删除 更新) - php类库
php Mysql类(查询 删除 更新) php Mysql类一般都包括了几乎我们常用的数据库操作方法,这里只提供了查询 删除 更新三种操作,算不是很全只是一个简单的数据库查询类了,实例代码如下: class mysql  {      private $host;      private $user;      private $p...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……