亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

php實現MySQL數據庫備份與還原類實例

2020-03-22 18:25:27
字體:
來源:轉載
供稿:網友
本文實例講述了php實現html' target='_blank'>MySQL數據庫備份與還原類。分享給大家供大家參考。具體分析如下:這是一個非常簡單的利用php來備份mysql數據庫的類文件,我們只要簡單的在dbmange中配置好連接地址用戶名與數據庫即可,下面我們一起來看這個例子,代碼如下:復制代碼 代碼如下: php
/**
* 創建時間: 2012年5月21日
*
* 說明:分卷文件是以_v1.sql為結尾(20120522021241_all_v1.sql)
* 功能:實現mysql數據庫分卷備份,選擇表進行備份,實現單個sql文件及分卷sql導入
* 使用方法:
*
* ------1. 數據庫備份(導出)------------------------------------------------------------
//分別是主機,用戶名,密碼,數據庫名,數據庫編碼
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
// 參數:備份哪個表(可選),備份目錄(可選,默認為backup),分卷大小(可選,默認2000,即2M)
$db- backup ();
* ------2. 數據庫恢復(導入)------------------------------------------------------------
//分別是主機,用戶名,密碼,數據庫名,數據庫編碼
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//參數:sql文件
$db- restore ( './backup/20120516211738_all_v1.sql');
*----------------------------------------------------------------------
*/
class DBManage
{
var $db; // 數據庫連接
var $database; // 所用數據庫
var $sqldir; // 數據庫備份文件夾
var $record;
// 換行符
private $ds = "n";
// 存儲SQL的變量
public $sqlContent = "";
// 每條sql語句的結尾符
public $sqlEnd = ";";
/**
* 初始化
*
* @param string $host
* @param string $username
* @param string $password
* @param string $thisatabase
* @param string $charset
*/
function __construct($host = 'localhost', $username = 'root', $password = '', $thisatabase = 'test', $charset = 'utf8')
{
$this- host = $host;
$this- username = $username;
$this- password = $password;
$this- database = $thisatabase;
$this- charset = $charset;
// 連接數據庫
$this- db = mysql_connect ( $this- host, $this- username, $this- password ) or die ( "數據庫連接失敗." );
// 選擇使用哪個數據庫
mysql_select_db ( $this- database, $this- db ) or die ( "無法打開數據庫" );
// 數據庫編碼方式
mysql_query ( 'SET NAMES ' . $this- charset, $this- db );
}

/*
* ------------------------------------------數據庫備份start----------------------------------------------------------
*/

/**
* 數據庫備份
* 參數:備份哪個表(可選),備份目錄(可選,默認為backup),分卷大小(可選,默認2000,即2M)
*
* @param $string $dir
* @param int $size
* @param $string $tablename
*/
function backup($tablename = '', $dir = '', $size = 2000)
{
//$dir = $dir $dir : 'backup/';
//$size = $size $size : 2000;
$sql = '';
// 只備份某個表
if (! emptyempty ( $tablename ))
{
echo '正在備份表' . $tablename . ' br /
// 插入dump信息
$sql = $this- _retrieve();
// 插入表結構信息
$sql .= $this- _insert_table_structure ( $tablename );
// 插入數據
$data = mysql_query ( "select * from " . $tablename );
// 文件名前面部分
$filename = date ( 'YmdHis' ) . "_" . $tablename;
// 字段數量
$num_fields = mysql_num_fields ( $data );
// 第幾分卷
$p = 1;
// 循環每條記錄
while ( $record = mysql_fetch_array ( $data ) )
{
// 單條記錄
$sql .= $this- _insert_record ( $tablename, $num_fields, $record );
// 如果大于分卷大小,則寫入文件
if (strlen ( $sql ) = $size * 1000)
{
$file = $filename . "_v" . $p . ".sql";
if ($this- _write_file ( $sql, $file, $dir ))
{
echo "表-" . $tablename . "-卷-" . $p . "-數據備份完成,生成備份文件 span $dir$filename /span br /
}
else
{
echo "備份表-" . $tablename . "-失敗 br /
}
// 下一個分卷
$p ++;
// 重置$sql變量為空,重新計算該變量大小
$sql = "";
}
}
// sql大小不夠分卷大小
if ($sql != "")
{
$filename .= "_v" . $p . ".sql";
if ($this- _write_file ( $sql, $filename, $dir ))
{
echo "表-" . $tablename . "-卷-" . $p . "-數據備份完成,生成備份文件 span $dir$filename /span br /
}
else
{
echo "備份卷-" . $p . "-失敗 br /
}
}
}
else
{ // 備份全部表
if ($tables = mysql_query ( "show table status from " . $this- database ))
{
echo "讀取數據庫結構成功! br /
}
else
{
exit ( "讀取數據庫結構成功! br /
}
// 插入dump信息
$sql .= $this- _retrieve();
// 文件名前面部分
$filename = date ( 'YmdHis' ) . "_all";
// 查出所有表
$tables = mysql_query ( 'SHOW TABLES' );
// 第幾分卷
$p = 1;
// 循環所有表
while ( $table = mysql_fetch_array ( $tables ) )
{
// 獲取表名
$tablename = $table [0];
// 獲取表結構
$sql .= $this- _insert_table_structure ( $tablename );
$data = mysql_query ( "select * from " . $tablename );
$num_fields = mysql_num_fields ( $data );

// 循環每條記錄
while ( $record = mysql_fetch_array ( $data ) )
{
// 單條記錄
$sql .= $this- _insert_record ( $tablename, $num_fields, $record );
// 如果大于分卷大小,則寫入文件
if (strlen ( $sql ) = $size * 1000)
{

$file = $filename . "_v" . $p . ".sql";
// 寫入文件
if ($this- _write_file ( $sql, $file, $dir ))
{
echo "-卷-" . $p . "-數據備份完成,生成備份文件 span $dir$file /span br /
}
else
{
echo "備份卷-" . $p . "-失敗 br /
}
// 下一個分卷
$p ++;
// 重置$sql變量為空,重新計算該變量大小
$sql = "";
}
}
}
// sql大小不夠分卷大小
if ($sql != "")
{
$filename .= "_v" . $p . ".sql";
if ($this- _write_file ( $sql, $filename, $dir ))
{
echo "-卷-" . $p . "-數據備份完成,生成備份文件 span $dir$filename br /
}
else
{
echo "備份卷-" . $p . "-失敗 br /
}
}
}
}

/**
* 插入數據庫備份基礎信息
*
* @return string
*/
private function _retrieve() {
$value = '';
$value .= '--' . $this-
$value .= '-- MySQL database dump' . $this-
$value .= '-- Created by DBManage class, Power By yanue. ' . $this-
$value .= '-- http://yanue.net ' . $this-
$value .= '--' . $this-
$value .= '-- 主機: ' . $this- host . $this-
$value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年 ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this-
$value .= '-- MySQL版本: ' . mysql_get_server_info () . $this-
$value .= '-- PHP 版本: ' . phpversion () . $this-
$value .= $this-
$value .= '--' . $this-
$value .= '-- 數據庫: `' . $this- database . '`' . $this-
$value .= '--' . $this- ds . $this-
$value .= '-- -------------------------------------------------------';
$value .= $this- ds . $this-
return $value;
}

/**
* 插入表結構
*
* @param unknown_type $table
* @return string
*/
private function _insert_table_structure($table) {
$sql = '';
$sql .= "--" . $this-
$sql .= "-- 表的結構" . $table . $this-
$sql .= "--" . $this- ds . $this-

// 如果存在則刪除表
$sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this- sqlEnd . $this-
// 獲取詳細表信息
$res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );
$row = mysql_fetch_array ( $res );
$sql .= $row [1];
$sql .= $this- sqlEnd . $this-
// 加上
$sql .= $this-
$sql .= "--" . $this-
$sql .= "-- 轉存表中的數據 " . $table . $this-
$sql .= "--" . $this-
$sql .= $this-
return $sql;
}

/**
* 插入單條記錄
*
* @param string $table
* @param int $num_fields
* @param array $record
* @return string
*/
private function _insert_record($table, $num_fields, $record) {
// sql字段逗號分割
$insert = $comma = "";
$insert .= "INSERT INTO `" . $table . "` VALUES(";
// 循環每個子段下面的內容
for($i = 0; $i $num_fields; $i ++) {
$insert .= ($comma . "'" .mysql_real_escape_string ( $record [$i] ) . "'");
$comma = ",";
}
$insert .= ");" . $this-
return $insert;
}

/**
* 寫入文件
*
* @param string $sql
* @param string $filename
* @param string $dir
* @return boolean
*/
private function _write_file($sql, $filename, $dir) {
$dir = $dir $dir : './backup/';
// 不存在文件夾則創建
if (! file_exists ( $dir )) {
mkdir ( $dir );
}
$re = true;
if (! @$fp = fopen ( $dir . $filename, "w+" )) {
$re = false;
echo "打開文件失敗!";
}
if (! @fwrite ( $fp, $sql )) {
$re = false;
echo "寫入文件失敗,請文件是否可寫";
}
if (! @fclose ( $fp )) {
$re = false;
echo "關閉文件失??!";
}
return $re;
}

/*
*
* -------------------------------上:數據庫導出-----------分割線----------下:數據庫導入--------------------------------
*/

/**
* 導入備份數據
* 說明:分卷文件格式20120516211738_all_v1.sql
* 參數:文件路徑(必填)
*
* @param string $sqlfile
*/
function restore($sqlfile)
{
// 檢測文件是否存在
if (! file_exists ( $sqlfile ))
{
exit ( "文件不存在!請檢查" );
}
$this- lock ( $this- database );
// 獲取數據庫存儲位置
$sqlpath = pathinfo ( $sqlfile );
$this- sqldir = $sqlpath ['dirname'];
// 檢測是否包含分卷,將類似20120516211738_all_v1.sql從_v分開,有則說明有分卷
$volume = explode ( "_v", $sqlfile );
$volume_path = $volume [0];
echo "請勿刷新及關閉瀏覽器以防止程序被中止,如有不慎!將導致數據庫結構受損 br /
echo "正在導入備份數據,請稍等! br /
if (emptyempty ( $volume [1] ))
{
echo "正在導入sql: span " . $sqlfile . ' /span br /
// 沒有分卷
if ($this- _import ( $sqlfile )) {
echo "數據庫導入成功!";
}
else
{
exit ( '數據庫導入失?。? );
}
}
else
{
//$volume_id = array();
// 存在分卷,則獲取當前是第幾分卷,循環執行余下分卷
$volume_id = explode ( ".sq", $volume [1] );
// 當前分卷為$volume_id
$volume_id = intval ( $volume_id [0] );
while ( $volume_id )
{
$tmpfile = $volume_path . "_v" . $volume_id . ".sql";
// 存在其他分卷,繼續執行
if (file_exists ( $tmpfile )) {
// 執行導入方法
echo "正在導入分卷 span " . $tmpfile . ' /span br /
if ($this- _import ( $tmpfile ))
{

}
else
{
exit ( "導入分卷 span " . $tmpfile . ' /span 失??!可能是數據庫結構已損壞!請嘗試從分卷1開始導入' );
}
}
else
{
echo "此分卷備份全部導入成功! br /
return;
}
$volume_id++;
}
}
}

/**
* 將sql導入到數據庫(普通導入)
*
* @param string $sqlfile
* @return boolean
*/
private function _import($sqlfile) {
// sql文件包含的sql語句數組
$sqls = array ();
$f = fopen ( $sqlfile, "rb" );
// 創建表緩沖變量
$create = '';
while ( ! feof ( $f ) ) {
// 讀取每一行sql
$line = fgets ( $f );
// 如果包含'-- '等注釋,或為空白行,則跳過
if (trim ( $line ) == '' || preg_match ( '/--* /', $line, $match )) {
continue;
}
// 如果結尾包含';'(即為一個完整的sql語句,這里是插入語句),并且不包含'ENGINE='(即創建表的最后一句),
if (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) {
// 將本次sql語句與創建表sql連接存起來
$create .= $line;
// 如果包含了創建表的最后一句
if (preg_match ( '/ENGINE=/', $create, $match )) {
// 則將其合并到sql數組
$sqls [] = $create;
// 清空當前,準備下一個表的創建
$create = '';
}
// 跳過本次
continue;
}
$sqls [] = $line;
}
fclose ( $f );
// 循環sql語句數組,分別執行
foreach ( $sqls as $sql ) {
str_replace ( "n", "", $sql );
if (! mysql_query ( trim ( $sql ) )) {
echo mysql_error ();
return false;
}
}
return true;
}

/*
* -------------------------------數據庫導入end---------------------------------
*/

// 關閉數據庫連接
private function close() {
mysql_close ( $this- db );
}

// 鎖定數據庫,以免備份或導入時出錯
private function lock($tablename, $op = "WRITE") {
if (mysql_query ( "lock tables " . $tablename . " " . $op ))
return true;
else
return false;
}

// 解鎖
private function unlock() {
if (mysql_query ( "unlock tables" ))
return true;
else
return false;
}

// 析構
function __destruct() {
mysql_query ( "unlock tables", $this- db );
mysql_close ( $this- db );
}
}

$db = new DBManage ( 'localhost', 'root', '', 'tao', 'gbk' );
//$db- backup ('tao_admin');
$db- restore ( './backup/20140228222713_tao_admin_v1.sql');
希望本文所述對大家的PHP程序設計有所幫助。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区视频观看免费| 久久综合国产精品台湾中文娱乐网| 色哟哟亚洲精品一区二区| 国产成人小视频在线观看| 欧美日韩免费网站| 亚洲一区中文字幕在线观看| 日韩视频精品在线| 国产69精品久久久久久| 欧美二区在线播放| 欧美另类极品videosbestfree| 欧美另类精品xxxx孕妇| 欧美电影免费观看| 亚洲人成77777在线观看网| 欧美性xxxx极品高清hd直播| 亚洲最大福利网| 久久久97精品| 欧美日韩不卡合集视频| 97久久精品国产| 色婷婷**av毛片一区| 亚洲欧洲在线播放| 日韩精品中文在线观看| 中文字幕免费精品一区| 久久精品成人一区二区三区| 久久综合五月天| 在线电影中文日韩| 欧美最顶级丰满的aⅴ艳星| 日韩影视在线观看| 国产伦精品免费视频| 97在线视频精品| 国产亚洲精品久久久久动| 国产视频精品一区二区三区| 日韩电视剧在线观看免费网站| 18一19gay欧美视频网站| 性色av一区二区三区在线观看| 欧美日韩一区二区精品| 久久免费视频在线| 欧美性69xxxx肥| 97av在线播放| 亚洲综合在线小说| 成人久久精品视频| 国产一区二区黑人欧美xxxx| 午夜精品一区二区三区在线视| 亚洲欧美中文日韩v在线观看| 国产精品一区专区欧美日韩| 国产成人精品免费久久久久| 91免费在线视频| 亚洲一区中文字幕在线观看| 精品女厕一区二区三区| 亚洲精品电影网| 国模视频一区二区三区| 91av在线看| 国产精品成人v| 亚洲精品福利在线观看| 中文日韩在线观看| 欧美日韩一区二区免费在线观看| 亚洲国产另类 国产精品国产免费| 国产91精品久久久| 国产精品成人一区二区| 国产精品午夜视频| 国产日韩综合一区二区性色av| 2019av中文字幕| 精品国产网站地址| 日韩中文字幕视频在线| 亚洲精品视频久久| 免费不卡欧美自拍视频| 亚洲第一av在线| 欧美激情第99页| 日本亚洲欧洲色α| 亚洲精品久久久久久下一站| 欧美一级淫片播放口| 亚洲区一区二区| 精品国产视频在线| 欧美肥老妇视频| 最近2019中文字幕mv免费看| 国产日韩欧美综合| 成人免费看片视频| 欧美激情中文字幕在线| 成人激情电影一区二区| 亚洲人成网站色ww在线| 美女少妇精品视频| 欧美激情视频在线观看| zzijzzij亚洲日本成熟少妇| 国产精品一区二区久久| 欧美激情在线有限公司| 欧美日韩久久久久| 亚洲爱爱爱爱爱| 在线观看日韩www视频免费| 国产精品久久久久久久久久尿| 国产z一区二区三区| 久久精品视频在线观看| 欧美大肥婆大肥bbbbb| 国产91色在线播放| 97超碰国产精品女人人人爽| 在线视频国产日韩| 国产精品丝袜一区二区三区| 亚洲福利影片在线| 欧美视频在线观看免费网址| 韩剧1988在线观看免费完整版| 欧美另类交人妖| 国产va免费精品高清在线| 欧美大片免费看| 欧美第一黄网免费网站| 欧美性猛交xxxx黑人| 欧美性猛交xxxx黑人猛交| 久久偷看各类女兵18女厕嘘嘘| 欧美成人精品一区二区| 国产一区二区三区三区在线观看| 国产+成+人+亚洲欧洲| 成人妇女免费播放久久久| 97在线精品视频| 欧美疯狂做受xxxx高潮| 日韩少妇与小伙激情| 成人www视频在线观看| www.欧美三级电影.com| 日韩电影网在线| 亚洲欧洲偷拍精品| 中文字幕亚洲在线| 国产精品久久中文| 欧美日韩国产激情| 97在线日本国产| 精品呦交小u女在线| 91地址最新发布| 欧美日韩在线视频一区二区| 精品少妇一区二区30p| 国产999在线| 国产精品极品美女在线观看免费| 在线日韩av观看| 国产欧美日韩91| 一本色道久久综合亚洲精品小说| 欧美日韩国产限制| 国产一区二区三区四区福利| 国产成人免费91av在线| 欧美日韩国产91| 色中色综合影院手机版在线观看| 日韩美女av在线| 国产精品久久在线观看| 国产精品久久av| xxx欧美精品| 91精品国产91久久久| 亚洲综合在线中文字幕| 欧美精品在线免费播放| 97国产真实伦对白精彩视频8| 91在线观看免费高清完整版在线观看| 亚洲国内高清视频| 亚洲欧美综合精品久久成人| 久久久久久久久久国产精品| 亚洲级视频在线观看免费1级| 69**夜色精品国产69乱| 日韩精品在线电影| 深夜成人在线观看| 国产精品嫩草影院一区二区| 成人综合网网址| 日韩欧美在线视频日韩欧美在线视频| 在线观看精品自拍私拍| 亚洲深夜福利在线| 成人午夜一级二级三级| 91九色国产视频| 国产精品自拍小视频| 国产欧美精品一区二区| 国产精品久久久久久久久久久久| 精品中文字幕乱| 丰满岳妇乱一区二区三区| 国产精品偷伦一区二区| 国产亚洲欧洲高清|