/**
* 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)

沒有留言:
張貼留言