IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類(lèi)|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MYSQL → MySQL數(shù)據(jù)庫(kù)備份恢復(fù)的兩個(gè)實(shí)用方法

MySQL數(shù)據(jù)庫(kù)備份恢復(fù)的兩個(gè)實(shí)用方法

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(1)

方法1:

/*

* 功能:數(shù)據(jù)備份/恢復(fù)文件簡(jiǎn)易方法

* 以日期為單位,一天一個(gè)備份文件,以當(dāng)天最后備份為準(zhǔn)

* 用提交表單的形式進(jìn)行操作,

* 其中$_POST["tbl_name"]為預(yù)備份表名稱數(shù)組

* $_POST["sqlfile"]為預(yù)恢復(fù)數(shù)據(jù)文件的名稱

* 注意:該備份沒(méi)有結(jié)構(gòu)備份,只有數(shù)據(jù)備份

*

* 備份文件格式:

* `表名稱1`{{數(shù)據(jù)1}}`表名稱2`{{數(shù)據(jù)2}}`表名稱3`{{數(shù)據(jù)3}}...

*

* 創(chuàng)建時(shí)間:2005-02-25

* E-mail: kingerq AT msn.com

* 來(lái)源:http://blog.csdn.net/kingerq

*/

include

("../inc/globals.inc.php");//省略包函文件db_mysql.inc和MYSQL連接信息

set_time_limit(0);

$dbdir = "d:/site/dbbak/";//用絕對(duì)路徑

$txtname = array();

if($_POST){

if(!is_writable($dbdir)) {

echo "對(duì)不起!指定的備份目錄不可寫(xiě)!請(qǐng)修改權(quán)限";

exit;

}

//op為一個(gè)隱形域,識(shí)別備份或者恢復(fù)

if($_POST["op"]){//備份數(shù)據(jù)

//生成每個(gè)表的臨時(shí)備份文件

foreach($_POST["tbl_name"] as $tbl){

$txtname[] = $tbl.".txt";

$sql = "SELECT * FROM `$tbl`

INTO OUTFILE '".$dbdir.end($txtname)."'";

$db->query($sql);

}

//將生成的臨時(shí)備份文件合在一起

$outfile = date("Y-m-d").".sql";

if(file_exists($dbdir.$outfile)) @unlink($dbdir.$outfile);

$fpr = fopen($dbdir.$outfile, "a");

foreach($txtname as $txt){

if(file_exists($dbdir.$txt)){

//讀取臨時(shí)備份文件

$tdata = readfiles($dbdir.$txt);

//生成備份文件

$tbl = explode(".", $txt);

$str = "`".$tbl[0]."`{{".$tdata."}}";

if(fwrite($fpr, $str)){

echo $tbl[0]."...寫(xiě)入 $outfile 成功!

\n";

}else{

echo $tbl[0]."...寫(xiě)入 $outfile 失敗!

\n";

}

@unlink($dbdir.$txt);

}

}

fclose($fpr);

}else{//恢復(fù)數(shù)據(jù)

$tdata = readfiles($dbdir.$_POST["sqlfile"]);

preg_match_all("/`(.*)`\{\{(.*)\}\}/isU", $tdata, $data_ar);

foreach($data_ar[1] as $k => $tt){

if(empty($data_ar[2][$k])) continue;

$tfile = $dbdir.$tt.".txt";

$fp = fopen($tfile, "w");

if(fwrite($fp, $data_ar[2][$k])){

//清空表

$sql = "TRUNCATE TABLE `$tt`";

$db->query($sql);

//重新裝入數(shù)據(jù)

$sql = "LOAD DATA LOW_PRIORITY INFILE '

".$dbdir.$tt.".txt"."' INTO TABLE `$tt`";

if($db->query($sql)){

fclose($fp);

echo $tt."表數(shù)據(jù)恢復(fù)成功!

\n";

unlink($dbdir.$tt.".txt");

}else{

echo $tt."表數(shù)據(jù)恢復(fù)失敗!

\n";

}

}

}

//echo $tdata;

//print_r($data_ar);

//exit;

}

}

/*

* 讀取文件內(nèi)容

* 參數(shù) $file 為文件名及完整路徑

* 返回文件內(nèi)容

*/

function readfiles($file){

$tdata = "";

$fp = fopen($file, "r");

if(filesize($file) <= 0) return;

while($data = fread($fp, filesize($file))){

$tdata .= $data;

}

fclose($fp);

return $tdata;

}

?>

方法2:

想在PHP后臺(tái)管理直接能夠備份數(shù)據(jù)庫(kù),于是想呀想,一直沒(méi)有什么思路,一開(kāi)始是考慮用php來(lái)訪問(wèn)服務(wù)器安裝mysql的目錄,比如 /usr/local/mysql/data目錄,直接把下面對(duì)應(yīng)的文件進(jìn)行備份,但是出現(xiàn)了問(wèn)題:

第一、運(yùn)行php的是apche的用戶,比如是nobody,那么它一般是沒(méi)有權(quán)限訪問(wèn)/usr/local/mysql/data目錄的。

第二、就算能夠訪問(wèn),那么你如何能夠把/usr/local/mysql/data目錄下的文件拷貝出來(lái)呢?因?yàn)閙ysql在運(yùn)行的時(shí)候是不運(yùn)行訪問(wèn)的,那么nobody用戶有權(quán)限停止mysql的服務(wù),不可能!

越想越不對(duì)勁,沒(méi)有辦法,看能不能從PHP操作數(shù)據(jù)庫(kù)入手,于是就去看了下phpMyadmin和Discuz!的代碼,呵呵,于是偷抄了Discuz!的代碼,形成了如下備份數(shù)據(jù)庫(kù)的方法。

備份數(shù)據(jù)庫(kù)有兩種方式,一種是只備份數(shù)據(jù)庫(kù)的結(jié)構(gòu),一種把是結(jié)構(gòu)和所有的數(shù)據(jù)都備份出來(lái),顯然還是第二種方法比較好。

以下為引用的內(nèi)容:

/****** 備份數(shù)據(jù)庫(kù)結(jié)構(gòu) ******/

/*

函數(shù)名稱:table2sql()

函數(shù)功能:把表的結(jié)構(gòu)轉(zhuǎn)換成為SQL

函數(shù)參數(shù):$table: 要進(jìn)行提取的表名

返 回 值:返回提取后的結(jié)果,SQL集合

函數(shù)作者:heiyeluren

*/

function table2sql($table)

{

global $db;

$tabledump = "DROP TABLE IF EXISTS $table;\n";

$createtable = $db->query("SHOW CREATE TABLE $table");

$create = $db->fetch_row($createtable);

$tabledump .= $create[1].";\n\n";

return $tabledump;

}

/****** 備份數(shù)據(jù)庫(kù)結(jié)構(gòu)和所有數(shù)據(jù) ******/

/*

函數(shù)名稱:data2sql()

函數(shù)功能:把表的結(jié)構(gòu)和數(shù)據(jù)轉(zhuǎn)換成為SQL

函數(shù)參數(shù):$table: 要進(jìn)行提取的表名

返 回 值:返回提取后的結(jié)果,SQL集合

函數(shù)作者:heiyeluren

*/

function data2sql($table)

{

global $db;

$tabledump = "DROP TABLE IF EXISTS $table;\n";

$createtable = $db->query("SHOW CREATE TABLE $table");

$create = $db->fetch_row($createtable);

$tabledump .= $create[1].";\n\n";

$rows = $db->query("SELECT * FROM $table");

$numfields = $db->num_fields($rows);

$numrows = $db->num_rows($rows);

while ($row = $db->fetch_row($rows))

{

$comma = "";

$tabledump .= "INSERT INTO $table VALUES(";

for($i = 0; $i < $numfields; $i++)

{

$tabledump .= $comma."'".mysql_escape_string($row[$i])."'";

$comma = ",";

}

$tabledump .= ");\n";

}

$tabledump .= "\n";

return $tabledump;

}

/****** 具體實(shí)現(xiàn)操作 ******/

好,我們既然把代碼都寫(xiě)出來(lái)了,

那么我們?nèi)绾卧诰唧w的程序種去實(shí)現(xiàn)備份呢,我們看下面的代碼。

/* 備份數(shù)據(jù)庫(kù) */

// 注意:我們一下的數(shù)據(jù)庫(kù)操作采用了phplib的DB類(lèi)

// 定義要保存的數(shù)據(jù)表、前綴、保存到何處

$tables = array('us_sort', 'us_download',

'us_article', 'us_guestbook'); //定義要保存的數(shù)據(jù)表,一個(gè)數(shù)組

$prefix = 'us_'; // 要保存的.sql文件的前綴

$saveto = 'server'; // 要保存到什么地方,是本地還是服務(wù)器上,默認(rèn)是服務(wù)器

$back_mode = 'all'; // 要保存的方式,是全部備份還是只保存數(shù)據(jù)庫(kù)結(jié)構(gòu)

$admin = 'heiyeluren'; //管理員名稱

$admin_email = '[email protected]'; // 管理員郵箱

// 定義數(shù)據(jù)保存的文件名

$local_filename = $prefix.date('Ymd_His').'.sql"';

關(guān)鍵詞標(biāo)簽:MySQL,數(shù)據(jù)庫(kù)

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 Xbox Game Pass Xbox Game Pass 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 MySQL常用維護(hù)管理工具 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié)

相關(guān)下載

    人氣排行 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫(kù)啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯(cuò)誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實(shí)際操作步驟匯總 MySQL無(wú)法啟動(dòng)、無(wú)法停止各種解決方法總結(jié) 三種常用的MySQL建表語(yǔ)句

    <sup id="pitcr"></sup><sub id="pitcr"><span id="pitcr"></span></sub>
    <button id="pitcr"><li id="pitcr"></li></button>

    <th id="pitcr"></th>
      <tt id="pitcr"><rp id="pitcr"></rp></tt>