程式碼如下:
$database = 'table_name'; //mysql的資料庫名稱
$options = array(
'hostname' => 'localhost', //mysql的hostname
'charset' => 'utf8', //編碼方式
'filename' => $database.'.sql', //儲存的檔名
'username' => 'root', //mysql的帳號
'password' => 'password' //mysql的密碼
);
mysql_connect($options['hostname'], $options['username'], $options['password']) or die("異常錯誤");
mysql_select_db($database) or die("異常錯誤");
mysql_query("SET NAMES '{$options['charset']}'");
$tables = list_tables($database);
$filename = sprintf($options['filename'],$database);
$fp = fopen($filename, 'w');
foreach ($tables as $table) {
dump_table($table, $fp);
}
fclose($fp);
$file_name = $options['filename'];
Header("Content-type:application/octet-stream");
Header("Content-Disposition:attachment; filename = ".$file_name);
readfile($file_name);
exit;
function list_tables($database) {
$rs = mysql_list_tables($database);
$tables = array();
while ($row = mysql_fetch_row($rs)) {
$tables[] = $row[0];
}
mysql_free_result($rs);
return $tables;
}
function dump_table($table, $fp = null) {
$need_close = false;
if (is_null($fp)) {
$fp = fopen($table . '.sql', 'w');
$need_close = true;
}
$a = mysql_query("show create table `{$table}`");
$row = mysql_fetch_assoc($a);
fwrite($fp,$row['Create Table'].';');
$rs = mysql_query("SELECT * FROM `{$table}`");
while ($row = mysql_fetch_row($rs)) {
fwrite($fp, get_insert_sql($table, $row));
}
mysql_free_result($rs);
if ($need_close) {
fclose($fp);
}
}
function get_insert_sql($table, $row) {
$sql = "INSERT INTO `{$table}` VALUES (";
$values = array();
foreach ($row as $value) {
$values[] = "'" . mysql_real_escape_string($value) . "'";
}
$sql .= implode(', ', $values) . ");";
return $sql;
}
只要把程式碼$options的部份修改一下,就可以直接拿來用啦。如果發現本機測試可以(localhost),但是丟到網站空間時卻無法使用,就是資料夾權限不足,導致備份程式無法進行資料夾寫入的動作,只要更改資料夾權限後,就可以使用了。
感謝Jesse提供的資料,說明如下:
1.使用下列程式可以在server上生成備份sql檔
system("C:\AppServ\MySQL\bin\mysqldump.exe -u $codeACC -p$codeWORD $DefaultDatadase --lock-all-tables > $backup_path$DefaultDatadase$today.sql");
2.然後做出讓使用者下載該份檔案的連結,就OK啦。
終於找到我要低了...感謝你的><分享....
ReplyDelete來去試試^^VERY 3Q!!
我的線上備份還原處理有些不同,是利用CLI方式處理
ReplyDelete備份:
system("C:\AppServ\MySQL\bin\mysqldump.exe -u $codeACC -p$codeWORD $DefaultDatadase --lock-all-tables > $backup_path$DefaultDatadase$today.sql");
還原:
system("C:\AppServ\MySQL\bin\mysql.exe -u $codeACC -p$codeWORD $DefaultDatadase < $backupfilename");
//我先前作法
ReplyDelete//線上備份
system("C:\AppServ\MySQL\bin\mysqldump.exe -u $codeACC -p$codeWORD $DefaultDatadase --lock-all-tables > $backup_path$DefaultDatadase$today.sql");
//線上還原
system("C:\AppServ\MySQL\bin\mysql.exe -u $codeACC -p$codeWORD $DefaultDatadase < $name");
謝謝Jesse 已增加到文章中了 ^^
Delete請問版主 為什麼我下載的結果是空的
ReplyDelete我想請問一下
Deletesystem("C:\AppServ\MySQL\bin\mysqldump.exe -u $codeACC -p$codeWORD $DefaultDatadase --lock-all-tables > $backup_path$DefaultDatadase$today.sql");
只要單獨這兩行就可以備份全部了嗎?