Tuesday, June 1, 2010

[PHP] 如何自己在自己的網頁上,增加可下載MySql備份檔(.sql檔)的功能

如果要下載網站MySql的備份檔(.sql),通常我們都會使用phpmyadmin的下載功能,但是,如果希望在自己網站上就可以有下載備份檔的功能的話,就必須自己寫程式...

程式碼如下:
$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啦。

6 comments:

  1. 終於找到我要低了...感謝你的><分享....
    來去試試^^VERY 3Q!!

    ReplyDelete
  2. 我的線上備份還原處理有些不同,是利用CLI方式處理
    備份:
    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
  3. //我先前作法
    //線上備份
    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");

    ReplyDelete
  4. 請問版主 為什麼我下載的結果是空的

    ReplyDelete
    Replies
    1. 我想請問一下
      system("C:\AppServ\MySQL\bin\mysqldump.exe -u $codeACC -p$codeWORD $DefaultDatadase --lock-all-tables > $backup_path$DefaultDatadase$today.sql");
      只要單獨這兩行就可以備份全部了嗎?

      Delete