/** * 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";
2010年2月20日 星期六
用PHP備份MySQL
很久以前寫的, 筆記一下...
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言