mysql数据库备份、数据库数据还原类
1、数据库备份使用说明:
1):引入类库文件,然后实例化类
2):最后调用备份方法,并传入相关参数
//------1. 数据库备份(导出)--------------------
require './DbManage.php';
# 分别是主机,用户名,密码,数据库名,数据库编码
$config = [
'hostname' => 'localhost',
'database' => 'test',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
$db = new DBManage($config);
# 参数1[必选]:string 备份目录
# 参数2[可选]:string 备份哪个表(默认备份全部)
# 参数3[可选]:int 分卷大小 (默认不分卷)
$db->backup ('./backup/');2、数据库导入使用说明:
1):引入类库文件,然后实例化类
2):最后调用导入方法,并传入相关参数
//------1. 数据库还原(导入)--------------------
require './DbManage.php';
# 分别是主机,用户名,密码,数据库名,数据库编码
$config = [
'hostname' => 'localhost',
'database' => 'test',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
$db = new DBManage($config);
# 参数1[必选]:string sql文件目录
# 参数3[可选]:boolean false单文件导入(默认) true多文件导入
$db->import('./backup/20190628test_1.sql');类源码:
<?php
// +----------------------------------------------------------------------
// | Title : Mysql数据库备份类
// +----------------------------------------------------------------------
// | Author: xiaochuan <28126649@qq.com>
// +----------------------------------------------------------------------
// | Blog : www.youhutong.com
// +----------------------------------------------------------------------
// | Date : 2019-05-30
// +----------------------------------------------------------------------
/*
1. 数据库备份(导出)---------
$config = [
'hostname' => 'localhost',
'database' => 'demo',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
$db = new DBManage($config);
$db->backup('./backup/');
2. 数据库恢复(导入)---------
$config = [
'hostname' => 'localhost',
'database' => 'demo',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
$db = new DBManage($config);
$db->backup('./backup/database.sql');
*/
class DbManage
{
# 数据库链接
private $db;
# 当前数据库名
private $database;
# 分卷大小,默认无限止
private $size = 0;
# 备份目录
private $path;
# 待写入文件内容
private $value = '';
# 当前分卷
private $page = 1;
# 数据库配置数组
private $config = [
# 服务器地址
'hostname' => 'localhost',
# 数据库名
'database' => 'test',
# 用户名
'username' => 'root',
# 密码
'password' => 'root',
# 数据库编码
'charset' => 'utf8',
];
/**
* 构造方法
* @param array $config 数据库配置数组
*/
public function __construct(array $config=[])
{
date_default_timezone_set('PRC');
set_time_limit(0);
@ob_end_flush();
# 处理配置数据
if(!empty($config)){
$this->config = array_merge($this->config, $config);
}
# 链接数据库
$this->db = @mysqli_connect(
$this->config['hostname'],
$this->config['username'],
$this->config['password'],
$this->config['database']
);
if(!$this->db){
$this->showLog('链接数据库失败: '.mysqli_connect_error(), true);
}
# 数据库编码方式
@mysqli_query($this->db, 'set names '.$this->config['charset']);
}
/**
* 输出运行信息
* @access private
* @param string $msg [可选]运行信息
* @param boolean $type [可选]是否退出程序
* @return string
*/
private function showLog($msg='', $type=false)
{
$tpl = '<div style="color:red;">%s</div>';
echo sprintf($tpl, $msg);
flush();
if($type) die;
}
/**
* 写入数据库备份基础信息
* @access private
* @return string
*/
private function addHeader()
{
$this->value = '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= '-- | Title : Mysql数据库备份文件' . PHP_EOL;
$this->value .= '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= '-- | Author : xiaochuan <28126649@qq.com>' . PHP_EOL;
$this->value .= '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= '-- | Blog : www.youhutong.com' . PHP_EOL;
$this->value .= '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= '-- | Date : '. date('Y-m-d H:i:s') . PHP_EOL;
$this->value .= '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= '-- | 主机 : ' . $this->config['hostname'] . PHP_EOL;
$this->value .= '-- | Mysql版本: ' . mysqli_get_server_info($this->db) . PHP_EOL;
$this->value .= '-- | PHP 版本 : ' . phpversion() . PHP_EOL;
$this->value .= '-- | 数据库名 : ' . $this->config['database'] . PHP_EOL;
$this->value .= '-- | 导出时间 : ' . date('Y-m-d H:i:s') . PHP_EOL;
$this->value .= '-- +------------------------------------------------------' . PHP_EOL;
$this->value .= PHP_EOL . PHP_EOL;
return $this->value;
}
/**
* 写入表结构
* @access private
* @param string $table 数据库表名
* @return string
*/
private function addTable($table)
{
# 获取创建表语句
$obj = mysqli_query($this->db, 'show create table `' . $table . '`');
$result = mysqli_fetch_array($obj);
$this->value .= '-- ------------------------------------' . PHP_EOL;
$this->value .= '-- ['. $table .']表结构和数据' . PHP_EOL;
$this->value .= '-- ------------------------------------' . PHP_EOL;
$this->value .= '-- 结构' . PHP_EOL;
$this->value .= 'DROP TABLE IF EXISTS `' . $table . '`;'. PHP_EOL;
$this->value .= $result[1] . ';' . PHP_EOL;
return $this->value;
}
/**
* 写入表数据
* @access private
* @param string $table 数据库表名
* @return null
*/
private function addData($table)
{
# 获取表中数据
$obj = mysqli_query($this->db, 'SELECT * FROM ' . $table);
# 判断如果没有数据
$count = mysqli_num_rows($obj);
if(!$count){
$this->value .= '-- '.$table.'表无数据' . PHP_EOL . PHP_EOL . PHP_EOL;
return;
}else{
$this->value .= '-- 数据' . PHP_EOL;
}
# 统计有多少个字段
$count = mysqli_num_fields($obj);
while($result = mysqli_fetch_array($obj)){
$comma = '';
$this->value .= 'INSERT INTO `' . $table . '` VALUES(';
for($i=0; $i<$count; $i++){
$str = mysqli_real_escape_string($this->db, $result[$i]);
$this->value .= ($comma . '\'' . $str . '\'');
$comma = ', ';
}
$this->value .= ");" . PHP_EOL;
# 判断是否设置分卷大小 并 达到设置分卷大小
if($this->size && strlen($this->value) >= $this->size){
$ste = $this->saveFile();
if($ste){
$msg = '正在进行备份第' .($this->page + 1). '卷......'. PHP_EOL;
$this->showLog($msg);
$this->addHeader();
}else{
$msg = '备份失败,请重新备份'. PHP_EOL;
$this->showLog($msg, true);
}
$this->page = $this->page + 1;
}
}
$this->value .= PHP_EOL . PHP_EOL;
unset($obj, $result);
}
/**
* 写入文件
* @access private
* @return null
*/
private function saveFile()
{
$filename = date('Ymd') . $this->config['database'] . '_' . $this->page .'.sql';
$ste = @file_put_contents($this->path .'/'. $filename, $this->value);
if(!$ste) $this->showLog("写入sql文件失败!");
# 写入正常
$msg = '第'. $this->page .'卷备份完成,地址:'. $this->path .'/'. $filename . PHP_EOL;
$this->showLog($msg);
return $ste;
}
/**
* 数据库备份(主调用方法)
* @access public
* @param string $path [必须]备份目录
* @param string $table [可选]备份单表,默认全部
* @param int $size [可选]分卷大小, 默认不分卷
* @return string
*/
public function backup($path='', $table='', $size='')
{
$this->size = (int)$size;
# 直接转成字节大小
$this->size = $this->size * 1024 * 1024;
if(empty($path)) $this->showLog('请指定备份文件存放目标', true);
if(!is_dir($path)){
mkdir($path, 0777, true) or $this->showLog('创建备份目录失败', true);
}
$this->path = $path;
# 只备份某个表
if(!empty($table)){
$result = mysqli_query($this->db, 'show tables like \''.$table.'\'');
$count = mysqli_num_rows($result);
if(!$count){
$this->showLog('表['. $table .']不存在,请先检查!', true);
}
$this->showLog('开始进行备份数据: ');
# 写入备份文件头部描述信息
$this->addHeader();
# 写入表结构信息
$this->showLog('处理备份表['. $table[0] .']中......');
$this->addTable($table);
# 写入表数据信息
$this->addData($table);
}else{
$tables = mysqli_query($this->db, 'show tables');
$count = mysqli_num_rows($tables);
if(!$count){
$this->showLog('读取数据库表失败!', true);
}
$this->showLog('开始进行备份数据: ');
# 写入备份文件头部描述信息
$this->addHeader();
while($table = mysqli_fetch_array($tables)){
# 写入表结构信息
$this->showLog('处理备份表['. $table[0] .']中......');
$this->addTable($table[0]);
# 写入表数据信息
$this->addData($table[0]);
}
}
# 最后一份写入文件
$filename = date('Ymd') . $this->config['database'] . '_' . $this->page .'.sql';
$ste = $this->saveFile();
if($ste){
$msg = '恭喜您,全部备份成功,共'. $this->page .'份文件'. PHP_EOL;
$this->showLog($msg, true);
}else{
$msg = '备份失败,请重新备份'. PHP_EOL;
$this->showLog($msg, true);
}
}
# ------------上:数据库导出-----------分割线----------下:数据库导入-------------
/**
* 数据库导入(主调用方法)
* @access public
* @param string $sqlfile [必须]sql文件目录
* @param int $type [可选]false单文件导入(默认),true多文件导入
* @return string
*/
public function import($sqlfile='', $type=false)
{
# 判断文件是否存在
if(!file_exists($sqlfile)) $this->showLog('sql文件不存在!请检查', true);
if($type === true){
# 多文件导入(分卷)
$this->showLog('暂时不支持分卷同时导入,请更换成单文件按顺序一个一个导入谢谢', true);
}else{
# 单文件导入
$start_time = time();
$this->showLog('开始导入数据库文件......');
$f = fopen($sqlfile, 'rb');
$sql = '';
$table = '';
while (!feof($f)){
# 获取每一行数据
$line = fgets($f);
$line = trim($line);
# 判断是不是注释,以--开头
if(strpos($line, '--') === 0 || empty($line)) continue;
# 判断是不是创建表语句,以CREATE开头
if(strpos($line, 'CREATE') === 0 || strpos($line, 'create') === 0){
if($table) $this->showLog($table.':完成导入');
preg_match_all('/`(.*)`/', $line, $mat);
$table = empty(current(end($mat))) ? '': current(end($mat));
if($table) $this->showLog($table.':正在导入...');
}
# 如果结尾不是';'(即还不是一个完整的语句,需要先拼接)
if(strrchr($line, ';') != ';'){
$sql .= $line;
continue;
}else{
$sql .= $line;
}
# 执行sql语句
if(!mysqli_query($this->db, $sql)){
$this->showLog(mysqli_error($this->db), true);
}
$sql = '';
}
fclose($f);
$time = time() - $start_time;
$this->showLog('全部导入完成:共花 '.$time.'');
}
}
/**
* 锁定数据库(以免备份或导入时出错)
* @access private
* @return null
*/
private function lock($table, $op='write')
{
mysqli_query($this->db, 'lock tables ' . $table . ' ' . $op );
}
/**
* 解锁数据库
* @access private
* @return null
*/
private function unlock()
{
mysqli_query($this->db, 'unlock tables');
}
/**
* 析构方法
* @access private
* @return null
*/
public function __destruct()
{
if($this->db){
mysqli_query($this->db, 'unlock tables');
mysqli_close($this->db);
}
}
}转载请注明来源地址:小川编程 » https://www.youhutong.com/index.php/article/index/234.html
1、本站发布的内容仅限用于学习和研究目的.请勿用于商业或非法用途,下载后请24小时内删除。
2、本站所有内容均不能保证其完整性,不能接受请勿购买或下载,如需完整程序,请去其官方购买正版使用
3、本站联系方式Email:admin@youhutong.com ,收到邮件会第一时间处理。
4、如侵犯到任何版权问题,请立即告知本站(立即在线告知),本站将及时删除并致以最深的歉意


