程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 一個MySQL數據備份/恢復的簡易方法

一個MySQL數據備份/恢復的簡易方法

編輯:關於MYSQL數據庫

方法一:

query($sql);
  }
 
  //將生成的臨時備份文件合在一起
  $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)){
    //讀取臨時備份文件
    $tdata = readfiles($dbdir.$txt);
        
    //生成備份文件
    $tbl = explode(".", $txt);
    $str = "`".$tbl[0]."`{{".$tdata."}}";
    if(fwrite($fpr, $str)){
     echo $tbl[0]."...寫入 $outfile 成功!
\n"; }else{ echo $tbl[0]."...寫入 $outfile 失敗!
\n"; } @unlink($dbdir.$txt); } } fclose($fpr); }else{//恢復數據 $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); //重新裝入數據 $sql = "LOAD DATA LOW_PRIORITY INFILE '".$dbdir.$tt.".txt"."' INTO TABLE `$tt`"; if($db->query($sql)){ fclose($fp); echo $tt."表數據恢復成功!
\n"; unlink($dbdir.$tt.".txt"); }else{ echo $tt."表數據恢復失敗!
\n"; } } } //echo $tdata; //print_r($data_ar); //exit; } } /* * 讀取文件內容 * 參數 $file 為文件名及完整路徑 * 返回文件內容 */ 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; } ?>

方法二:

想在PHP後台管理直接能夠備份數據庫,於是想呀想,一直沒有什麼思路,一開始是考慮用PHP來訪問服務器安裝mysql的目錄,比如 /usr/local/MySQL/data目錄,直接把下面對應的文件進行備份,但是出現了問題:

第一、運行PHP的是apche的用戶,比如是nobody,那麼它一般是沒有權限訪問/usr/local/MySQL/data目錄的

第二、就算能夠訪問,那麼你如何能夠把/usr/local/mysql/data目錄下的文件拷貝出來呢?因為mysql在運行的時候是不運行訪問的,那麼nobody用戶有權限停止MySQL的服務,不可能!

越想越不對勁,沒有辦法,看能不能從php操作數據庫入手,於是就去看了下PHPMyadmin和Discuz!的代碼,呵呵,於是偷抄了Discuz!的代碼,形成了如下備份數據庫的方法。(在這裡感謝Discuz!的開發者)

備份數據庫有兩種方式,一種是只備份數據庫的結構,一種把是結構和所有的數據都備份出來,當然是第二種方法好啦,不過我為了考慮可能的需求就都作啦。

/******  備份數據庫結構 ******/

/*
函數名稱:table2sql()
函數功能:把表的結構轉換成為SQL
函數參數:$table: 要進行提取的表名
返 回 值:返回提取後的結果,SQL集合
函數作者: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;
}


/****** 備份數據庫結構和所有數據 ******/
/*
函數名稱:data2sql()
函數功能:把表的結構和數據轉換成為SQL
函數參數:$table: 要進行提取的表名
返 回 值:返回提取後的結果,SQL集合
函數作者: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;
}


/****** 具體實現操作 ******/
好,我們既然把代碼都寫出來了,那麼我們如何在具體的程序種去實現備份呢,我們看下面的代碼。


/* 備份數據庫 */
// 注意:我們一下的數據庫操作采用了PHPlib的DB類

// 定義要保存的數據表、前綴、保存到何處
$tables = array('us_sort', 'us_download', 'us_article', 'us_guestbook'); //定義要保存的數據表,一個數組
$prefix = 'us_';    // 要保存的.sql文件的前綴
$saveto = 'server'; // 要保存到什麼地方,是本地還是服務器上,默認是服務器
$back_mode = 'all'; // 要保存的方式,是全部備份還是只保存數據庫結構
$admin = 'heiyeluren'; //管理員名稱
$admin_email = '[email protected]';  // 管理員郵箱

// 定義數據保存的文件名
$local_filename = $prefix.date('Ymd_His').'.sql"';
if (!$filename) { $filename = $db_backup_path . $prefix . date('Ymd_His_'). create_check_code(4) . ".sql"; }
$filename = $prefix.date(Ymd_His). create_check_ code(6).".sql";      // 保存在服務器上的文件名
// 注意後面的create_check_code()函數,這是一個生成隨機碼的函數,詳細可以參考:
// http://blog.csdn.Net/heiyeshuwu/archive/2005/01/26/268446.ASPx

// 獲取數據庫結構和數據內容
foreach($tables as $table) 
{
 if ($back_mode == 'all') { $sqldump .= data2sql($table); }
 if ($back_mode == 'table') { $sqldump .= table2sql($table); }
}

// 如果數據內容不是空就開始保存
if(trim($sqldump)) 
{
 // 寫入開頭信息
 $sqldump = 
  "# --------------------------------------------------------\n".
  "# 數據表備份\n".
  "#\n".
  "# 服務器: $db->Host\n".
  "# 數據庫:$db->Database\n".
  "# 備份編號: ". create_sess_id() ."\n". // 這裡有一個生成session id的函數
  "# 備份
        
        

							
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved