php数据库备份还原类分享

代码如下:

<?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;
 }
}

(0)

相关推荐

  • linux php mysql数据库备份实现代码

    但是出现了问题: 第一.运行php的是apche的用户,比如是nobody,那么它一般是没有权限访问/usr/local/mysql/data目录的 第二.就算能够访问,那么你如何能够把/usr/local/mysql/data目录下的文件拷贝出来呢?因为mysql在运行的时候是不运行访问的,那么nobody用户有权限停止mysql的服务,不可能! 越想越不对劲,没有办法,看能不能从php操作数据库入手,于是就去看了下phpMyadmin和Discuz!的代码,呵呵,于是偷抄了Discuz!的代

  • php实现mysql数据库备份类

    1.实例化DbBak需要告诉它两件事:数据服务器在哪里($connectid).备份到哪个目录($backupDir): require_once('DbBak.php');     require_once('TableBak.php');     $connectid = mysql_connect('localhost','root','123456');     $backupDir = 'data';     $DbBak = new DbBak($connectid,$backupD

  • 推荐没有虚拟主机的小巧的Mysql数据库备份脚本(PHP)

    最近工作中常常需要备份远程服务器上的Mysql数据库到本机,一开始采用直接备份Mysql的data目录的办法,但由于编码不同的原因经常产生问题.后来朋友推荐我使用一个非常方便小巧的PHP程序--MyDB.一共包含三个文件: 1. mydb.php //DB类 复制代码 代码如下: <? class db{ var $linkid; var $sqlid; var $record; function db($host="",$username="",$passw

  • php备份数据库类分享

    php备份数据库类分享 <?php /** * * @name php备份数据库 * @param string $DbHost 连接主机 * @param string $DbUser 用户名 * @param string $DbPwd 连接密码 * @param string $DbName 要备份的数据库 * @param string $saveFileName 要保存的文件名, 默认文件保存在当前文件夹中,以日期作区分 * @return Null * @example backup

  • PHP备份/还原MySQL数据库的代码

    以下是代码: 一.备份数据库并下载到本地[db_backup.php] 复制代码 代码如下: <?php // 设置SQL文件保存文件名 $filename=date("Y-m-d_H-i-s")."-".$cfg_dbname.".sql"; // 所保存的文件名 header("Content-disposition:filename=".$filename); header("Content-type:a

  • php实现MySQL数据库备份与还原类实例

    本文实例讲述了php实现MySQL数据库备份与还原类.分享给大家供大家参考.具体分析如下: 这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的在dbmange中配置好连接地址用户名与数据库即可,下面我们一起来看这个例子,代码如下: 复制代码 代码如下: <?php   /**   * 创建时间: 2012年5月21日   *   * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql)   * 功能:实现mysql数据库分卷备份,选

  • 备份mysql数据库的php代码(一个表一个文件)

    复制代码 代码如下: <?php $cfg_dbhost ='localhost';//mysql主机 $cfg_dbname ='sq_test';//数据库名 $cfg_dbuser ='root';//数据库用户名 $cfg_dbpwd ='jb51.net';//数据库用户密码 $cfg_db_language ='utf8';//数据库编码 class dbmysql{ public static $dbhost = 'localhost'; public static $dbname

  • PHP备份数据库生成SQL文件并下载的函数代码

    复制代码 代码如下: <!?php /****** 备份数据库结构 ******/ /* 函数名称:table2sql() 函数功能:把表的结构转换成为SQL 函数参数:$table: 要进行提取的表名 返 回 值:返回提取后的结果,SQL集合 函数作者:heiyeluren */ function table2sql($table) { global $db; $tabledump = "DROP TABLE IF EXISTS $table;n"; $createtable

  • php数据库备份还原类分享

    复制代码 代码如下: <?php/** * 数据库备份还原类 * @author xialeistudio<admin@xialeistudio.net> * Class DatabaseTool */class DatabaseTool{ private $handler; private $config = array(  'host' => 'localhost',  'port' => 3306,  'user' => 'root',  'password' =

  • Springboot 实现数据库备份还原的方法

    之前对电脑重装了一下,结果IDEA的项目目录没有备份,导致有几个平时会拿来参考的项目都丢失了,尤其有一个自己写的Springboot项目当初没有备份,这次是彻底无缘再见了,有的东西可以对外(开源)的还是放在博客园这些地方记录一下比较不错,偶尔再遇到这样的问题Ctrl+C&Ctrl+V即可解决了. 这回记录一下Springboot实现对数据库进行一个备份和通过备份数据对数据库进行恢复.当然不限于Springboot,对数据库备份还原中的代码,Java 相关的都可以使用. 备份数据库 备份通过命令行

  • sql server 2000数据库备份还原的图文教程

    MSSQL是微软公司的一款数据库管理系统,本文将详细介绍MSSQL2000中数据库的备份和还原功能. 1.首先请保证您的备份文件是bak文件,并且备份文件能够正常还原. 2.打开"企业管理器"→"数据库",选择您要还原的数据库,右键"所有任务"→"还原数据库".如图: MSSQL2000数据库备份还原的图文教程 3.如果需要还原以前备份过的文件,直接在"还原"选择"数据库",然后在下方选

  • Oracle数据库备份还原详解

    理论准备 oracle 数据库提供expdp和impdp命令用于备份和恢复数据库. 具体可查阅oracle官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sutil/database-utilities.pdf 备份和还原主要有 FULL_MODE:整个数据库进行备份还原. Schema Mode:默认导出模式,Schema 模式. Table Mode:表模式. Tablespace Mode:表空间模式

  • asp.net 数据库备份还原(sqlserver+access)

    /********************************************************************************** * * 功能说明:备份和恢复SQL Server数据库 * 作者: 刘功勋; * 版本:V0.1(C#2.0);时间:2007-1-1 * 当使用SQL Server时,请引用 COM组件中的,SQLDMO.dll组件 * 当使用Access中,请浏览添加引用以下两个dll * 引用C:\Program Files\Common

  • 自用mysql自带命令实现数据库备份还原的方法

    本文章介绍了都是mysql常用的命令一些数据导入导出的命令了,只要我们撑握这些命令就可以方法快速的给我们的数据库进行备份还原了 mysql数据到导入导出 500MB数据 问题:500M的库表数据,需要导入到新的数据库中. 首先通过控制台进入mysql mysql -u root -p 12345 CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; use demo:切换数据库 source file

  • sql server 2005数据库备份还原图文教程

    首先.点击桌面的"SQL Server Management Studio"打开,sql2005的管理器,点击"连接"登录,如图: 一.新建数据库 1.新建数据库 右键点击"数据库"--"新建数据库",如图: MSSQL2005备份还原图文教程 填写数据库名,如mydata,选择数据库保存路径,一般可以保持默认地址,点击"确定". 2.新建用户 右键点击"安全性"--"登录名&

  • 批处理写的 oracle 数据库备份还原工具

    这是针对oracle编写的,可以用在不同的电脑上,因为它会自动读取当前电脑的环境变量,从而取得oracle的安装路径,唯一有一点不足的地方是程序中运行过程中会产生一个中间文本文件,不过这并不碍大事,备份或者还原完了以后将会自动删除产生文本文件,代码如下: 复制代码 代码如下: @echo off&setlocal enabledelayedexpansion color 0a :start for /f "tokens=2 delims==" %%a in ('path') d

  • Android SQLite数据库操作代码类分享

    使用示例: package cn.hackcoder.beautyreader.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * Created by hackcoder on 15-1-25. */ public clas

  • Session保存到数据库的php类分享

    复制代码 代码如下: <?php class SessionToDB { private $_path = null; private $_name = null; private $_pdo = null; private $_ip = null; private $_maxLifeTime = 0; public function __construct(PDO $pdo) { session_set_save_handler( array(&$this, 'open'), array(

随机推荐