2010年2月20日 星期六

用PHP備份MySQL

很久以前寫的, 筆記一下...

/** 
*    File: backup_mysql.php
* Purpose: 資料庫備份程式, 包括資料庫schema
*   Usage: 1.修改資料庫連線變數
*          2.修改備份類型: full完整備份/data資料備份,
*            full:會備份所有資料庫,
*            data:不備份information_schema,mysql,test三個資料庫
*          3.直接執行(CLI/Browser),
*            將在同目錄下, 產生'mysql_YYYY-MM-DD.sql'的備份檔案
*  Modify: 2008-03-17
*/

//
// 資料庫連線
//
$DB_NAME = YOUR_DB_NAME;  // 主機名稱
$DB_USER = YORU_DB_USER;  // 資料庫使用者名稱
$DB_PASS = YOUR_DB_PASS;  // 資料庫使用者密碼

//
// 備份設定
//
$BACKUP_TYPE = "data";   // 備份類型: full完整備份/data資料備份
$IS_DISPLAY  = "0";      // 顯示SQL語法於螢幕?  1:是/0:否

// 判斷是由CLI執行或是Browser執行
if (isset($_SERVER['HTTP_USER_AGENT'])) {
  echo "<html><head>\n<meta http-equiv=\"Content-Type\" 
        content=\"text/html; charset=UTF-8\">\n</head><body>\n";
  $NEW_LINE = "<br>";
  $TRIPLE_NEW_LINE = "<br><br><br>";
} else {
  $NEW_LINE = "\n";
  $TRIPLE_NEW_LINE = "\n\n\n";
}

//
// 開始進行備份
//
// 1.建立備份檔案
$fp = fopen(getcwd()."/mysql_" . date("Y-m-d") . ".sql" ,"w+");

// 2.資料庫連線
$link = mysql_connect($DB_NAME, $DB_USER, $DB_PASS);
$db_list = mysql_list_dbs($link);

// SQL語法字串
$sql_str = "";

// 3.將每一資料庫備份
while ($obj = mysql_fetch_object($db_list)) {
  
  // 建立資料庫的SQL語法
  mysql_select_db($obj->Database);

  //
  // 判斷備份類型
  //
  if (($BACKUP_TYPE == "full") ||           // full完整備份
      ($BACKUP_TYPE == "data") &&           // data資料備份
      ("information_schema" != $obj->Database) && 
      ("mysql" != $obj->Database) && 
      ("test"  != $obj->Database)) {
    
    $sql_str = "CREATE DATABASE `$obj->Database` 
                DEFAULT CHARACTER SET utf8;\n";
    
    fputs($fp, $sql_str);               // 寫入到檔案
    if ($IS_DISPLAY) {
      echo $sql_str.$TRIPLE_NEW_LINE;   // 顯示在螢幕
    }
    
    // 讀出資料表名稱
    $show_table_result = 
      mysql_query("SHOW TABLES FROM ". $obj->Database);
    
    while ($table = mysql_fetch_row($show_table_result)) {
      
      $show_fields_result = 
      mysql_query("SHOW COLUMNS FROM ". $table[0]);
      
      //
      // Start 建立資料表的SQL
      //
      $sql_str = "CREATE TABLE `$table[0]` (\n";
      
      $sql_field = array();
      
      while($field_arr = mysql_fetch_assoc($show_fields_result)){
        
        // is NULL?
        switch ($field_arr['Null']) {
          case "NO":
            $sql_field['Null'] = " NOT NULL";
          break;
          
          default:
            $sql_field['Null'] = "";
          break;
        }      
        
        // is primary key/unique key?
        switch ($field_arr['Key']) {
          case "PRI":
            $sql_field['Key'] = " primary key";
          break;
          
          case "UNI":
            $sql_field['Key'] = " unique key";
          break;
          
          default:
            $sql_field['Key'] = "";
          break;
        }
        
        // default value
         switch ($field_arr['Default']) {
          case "":
            $sql_field['Default'] = "";
          break;
          
          default:
            $sql_field['Default'] = " default " .
                                    $field_arr['Default'];
          break;
        }         
        
        // auto increment?
         switch ($field_arr['Extra']) {
          case "auto_increment";
            $sql_field['Extra'] = " auto_increment";
          break;
          
          default:
            $sql_field['Extra'] = "";
          break;
        }  
        
        $sql_str .= "`" . $field_arr['Field'] . "` " . 
                          $field_arr['Type']  . 
                          $sql_field['Null']  . 
                          $sql_field['Key']   . 
                          $sql_field['Default'] . 
                          $sql_field['Extra'] . ", \n";
      }
      
      $sql_str = substr($sql_str, 0, strlen($sql_str)-3);
      
      $sql_str .= "\n) MYISAM DEFAULT CHARSET=utf8 
                  COLLATE=utf8_unicode_ci;\n\n";
      
      
      fputs($fp, $sql_str);               // 寫入到檔案
      if ($IS_DISPLAY) {
        echo $sql_str.$TRIPLE_NEW_LINE;   // 顯示在螢幕
      }
      //
      // End 建立資料表的SQL
      //
  
      // 以utf-8連線MySQL
      //mysql_query("SET NAMES 'utf8'");
      //mysql_query("SET CHARACTER_SET_CLIENT=utf8");
      //mysql_query("SET CHARACTER_SET_RESULTS=utf8");

      // 根據每個資料表將欄位讀出
      $result = mysql_query("SELECT * FROM ". $table[0]);
      
      while ($field_arr = mysql_fetch_row($result)) {
      
        $sql_str = "INSERT INTO `".$table[0]."` VALUES (";
        
        foreach ($field_arr as $field) {
          $sql_str .= "'".$field."', ";
        }
        
        $sql_str = substr($sql_str, 0, strlen($sql_str)-2);
        
        $sql_str .= ");\n";
        
        fputs($fp, $sql_str);             // 寫入到檔案
        if ($IS_DISPLAY) {
          echo $sql_str.$NEW_LINE;        // 顯示在螢幕
        }  
      }
      
      fputs($fp, "\n\n");                 // 寫入到檔案
      if ($IS_DISPLAY) {
        echo $TRIPLE_NEW_LINE;            // 顯示在螢幕
      }
    }
    // End while (fetch_row)
  }
  // End if (BACKUP_TYPE)
} 
// End while (obj)
//
// 結束備份
//


// 4.關檔
fclose($fp);  

echo '<h1>備份完成!!</h1>' . "\n";

沒有留言: