php数据库备份还原类分享


Posted in PHP onMarch 20, 2014
<?php
/**
 * 数据库备份还原类
 * @author xialeistudio<admin@xialeistudio.net>
 * Class DatabaseTool
 */
class DatabaseTool
{
 private $handler;
 private $config = array(
  'host' => 'localhost',
  'port' => 3306,
  'user' => 'root',
  'password' => '',
  'database' => 'test',
  'charset' => 'utf-8',
  'target' => 'sql.sql'
 );
 private $tables = array();
 private $error;
 private $begin; //开始时间
 /**
  * 架构方法
  * @param array $config
  */
 public function __construct($config = array())
 {
  $this->begin = microtime(true);
  $config = is_array($config) ? $config : array();
  $this->config = array_merge($this->config, $config);
  //启动PDO连接
  if (!$this->handler instanceof PDO)
  {
   try
   {
    $this->handler = new PDO("mysql:host={$this->config['host']}:{$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']);
   }
   catch (PDOException $e)
   {
    $this->error = $e->getMessage();
    return false;
   }
   catch (Exception $e)
   {
    $this->error = $e->getMessage();
    return false;
   }
  }
 }
 /**
  * 备份
  * @param array $tables
  * @return bool
  */
 public function backup($tables = array())
 {
  //存储表定义语句的数组
  $ddl = array();
  //存储数据的数组
  $data = array();
  $this->setTables($tables);
  if (!empty($this->tables))
  {
   foreach ($this->tables as $table)
   {
    $ddl[] = $this->getDDL($table);
    $data[] = $this->getData($table);
   }
   //开始写入
   $this->writeToFile($this->tables, $ddl, $data);
  }
  else
  {
   $this->error = '数据库中没有表!';
   return false;
  }
 }
 /**
  * 设置要备份的表
  * @param array $tables
  */
 private function setTables($tables = array())
 {
  if (!empty($tables) && is_array($tables))
  {
   //备份指定表
   $this->tables = $tables;
  }
  else
  {
   //备份全部表
   $this->tables = $this->getTables();
  }
 }
 /**
  * 查询
  * @param string $sql
  * @return mixed
  */
 private function query($sql = '')
 {
  $stmt = $this->handler->query($sql);
  $stmt->setFetchMode(PDO::FETCH_NUM);
  $list = $stmt->fetchAll();
  return $list;
 }
 /**
  * 获取全部表
  * @return array
  */
 private function getTables()
 {
  $sql = 'SHOW TABLES';
  $list = $this->query($sql);
  $tables = array();
  foreach ($list as $value)
  {
   $tables[] = $value[0];
  }
  return $tables;
 }
 /**
  * 获取表定义语句
  * @param string $table
  * @return mixed
  */
 private function getDDL($table = '')
 {
  $sql = "SHOW CREATE TABLE `{$table}`";
  $ddl = $this->query($sql)[0][1] . ';';
  return $ddl;
 }
 /**
  * 获取表数据
  * @param string $table
  * @return mixed
  */
 private function getData($table = '')
 {
  $sql = "SHOW COLUMNS FROM `{$table}`";
  $list = $this->query($sql);
  //字段
  $columns = '';
  //需要返回的SQL
  $query = '';
  foreach ($list as $value)
  {
   $columns .= "`{$value[0]}`,";
  }
  $columns = substr($columns, 0, -1);
  $data = $this->query("SELECT * FROM `{$table}`");
  foreach ($data as $value)
  {
   $dataSql = '';
   foreach ($value as $v)
   {
    $dataSql .= "'{$v}',";
   }
   $dataSql = substr($dataSql, 0, -1);
   $query .= "INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\r\n";
  }
  return $query;
 }
 /**
  * 写入文件
  * @param array $tables
  * @param array $ddl
  * @param array $data
  */
 private function writeToFile($tables = array(), $ddl = array(), $data = array())
 {
  $str = "/*\r\nMySQL Database Backup Tools\r\n";
  $str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n";
  $str .= "Database:{$this->config['database']}\r\n";
  $str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n";
  $str .= "SET FOREIGN_KEY_CHECKS=0;\r\n";
  $i = 0;
  foreach ($tables as $table)
  {
   $str .= "-- ----------------------------\r\n";
   $str .= "-- Table structure for {$table}\r\n";
   $str .= "-- ----------------------------\r\n";
   $str .= "DROP TABLE IF EXISTS `{$table}`;\r\n";
   $str .= $ddl[$i] . "\r\n";
   $str .= "-- ----------------------------\r\n";
   $str .= "-- Records of {$table}\r\n";
   $str .= "-- ----------------------------\r\n";
   $str .= $data[$i] . "\r\n";
   $i++;
  }
  echo file_put_contents($this->config['target'], $str) ? '备份成功!花费时间' . (microtime(true) - $this->begin) . 'ms' : '备份失败!';
 }
 /**
  * 错误信息
  * @return mixed
  */
 public function getError()
 {
  return $this->error;
 }
 public function restore($path = '')
 {
  if (!file_exists($path))
  {
   $this->error('SQL文件不存在!');
   return false;
  }
  else
  {
   $sql = $this->parseSQL($path);
   try
   {
    $this->handler->exec($sql);
    echo '还原成功!花费时间', (microtime(true) - $this->begin) . 'ms';
   }
   catch (PDOException $e)
   {
    $this->error = $e->getMessage();
    return false;
   }
  }
 }
 /**
  * 解析SQL文件为SQL语句数组
  * @param string $path
  * @return array|mixed|string
  */
 private function parseSQL($path = '')
 {
  $sql = file_get_contents($path);
  $sql = explode("\r\n", $sql);
  //先消除--注释
  $sql = array_filter($sql, function ($data)
  {
   if (empty($data) || preg_match('/^--.*/', $data))
   {
    return false;
   }
   else
   {
    return true;
   }
  });
  $sql = implode('', $sql);
  //删除/**/注释
  $sql = preg_replace('/\/\*.*\*\//', '', $sql);
  return $sql;
 }
}
PHP 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
PHP file_exists问题杂谈
May 07 PHP
PHP Directory 函数的详解
Mar 07 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
PHP版微信公众平台红包API
Apr 02 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
php实现微信支付之现金红包
May 30 PHP
PHP获取MySQL执行sql语句的查询时间方法
Aug 21 PHP
PHP实现微信公众平台音乐点播
Mar 20 #PHP
一个PHP针对数字的加密解密类
Mar 20 #PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 #PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 #PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
Mar 20 #PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 #PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 #PHP
You might like
火车头采集器3.0采集图文教程
2007/03/17 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
Python3基础之输入和输出实例分析
2014/08/18 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
座谈会主持词
2014/03/20 职场文书
地质灾害防治方案
2014/05/14 职场文书
2015年元旦促销方案书
2014/12/09 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
Docker官方工具docker-registry案例演示
2022/04/13 Servers