台灣最大程式設計社群網站
線上人數
1460
 
會員總數:241121
討論主題:186795
歡迎您免費加入會員
討論區列表 >> PHP >> 備份資料庫設計
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
備份資料庫設計
價值 : 20 QP  點閱數:214 回應數:6

樓主

Sanji
門外漢
0 23
335 62
發送站內信

小弟在做一個備份資料庫的設計
我已經各個檢查每個語法指令
明明都是可以顯示在頁面上
但為什麼跑出來的檔案卻抓不到任何資料

以下是我的code($database那些已省略):

$options=array(
'hostname' => $dbserver, //mysql的hostname
'filename' => $database.'.sql', //儲存的檔名
'username' => $dbuser, //mysql的帳號
'password' => $dbpasswd //mysql的密碼
);
mysql_connect($options['hostname'],$options['username'],$options['password'])or die("異常錯誤");
mysql_select_db($database) or die("異常錯誤");

$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;
}






搜尋相關Tags的文章: [ PHP ] , [ 資料庫 ] , [ 備份 ] ,
本篇文章發表於2017-08-22 23:08
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
作者回應

Sanji
檢舉此回應
目前好像是

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);
}
}

這一段的問題
我發現我好像沒有寫入
原本的fp(也就是我要載下來的檔案)
我是寫了很多個資料表的sql
如果是這個問題
我想問各位大大
是不是有方法可以把很多檔案的內容寫入一個檔中
本篇文章回覆於2017-08-23 01:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

可樂快跑
檢舉此回應
我覺得………如果你是要手動備份sql
有phpmyadmin就足夠用了。
如果你是要自動備份sql
那你應該在你的作業系統直接操作mysql,寫好自動備份程序…
本篇文章回覆於2017-08-23 09:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Sanji
檢舉此回應
可樂大大抱歉
我並不是要自己備份也不是要自動備份
我是要讓別人可以下載備份檔
也就是讓別人可以點一個button就下載整個備份檔
本篇文章回覆於2017-08-23 14:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

Sanji
檢舉此回應
補充一下:
資料庫是存在主機
不是我這邊
所以我才想說用讀寫檔方式
然後資料再從資料庫中抓
本篇文章回覆於2017-08-23 15:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
這邊可能還是需要給你一下觀念。

1.一般來說,目前可以說很少人會再用程式來做備份資料庫的動作。因為耗時且也耗效能。

2.如真有備份的需要,且又需要提供給其它人員備份相關的資料,大多數我會建議採用背京式的備份處理。
也就是說,會員操作備份,只是先做一個等待備份的動作記錄。再交由後台(如排程)固定時間去跑備份並產生檔案。
這樣的做法一方面可以比較容易控制運行的時間。另一方面也不至於發生同時量大操主機的問題。

3.讀寫檔的方式雖然可行。但這有安全上的問題。畢竟網頁運行有所謂的最大運時時間的問題存在。(瀏覽器本身也可以設定安全機制)
這也是我為何會建議你用第2點的方式來做處理。

最後~~~~如果下次可以的話,麻煩將程式碼用程式標簽包起來並排版處理。
本篇文章回覆於2017-08-24 15:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
「背京式」打錯字了,是「背景式」
本篇文章回覆於2017-08-24 15:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.