時(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)閱讀
熱門(mén)文章 Xbox Game Pass 10款MySQL數(shù)據(jù)庫(kù)客戶端圖形界面管理工具推薦 MySQL常用維護(hù)管理工具 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ǔ)句
|