2012-06-16 201 views
1

我使用下面的代碼對mysql數據庫進行備份。但是當我將備份文件導入到新數據庫時,該文件會成功導入,但新數據庫爲空(無表格)。備份mysql數據庫使用php

這是我使用的代碼:

<?php 
    $dbhost = 'localhost:3036'; 
    $dbuser = 'root'; 
    $dbpass = 'rootpassword'; 

    $backup_file = $dbname . date("Y-m-d-H-i-s") . '.gz'; 
    $command = "mysqldump --opt -h $dbhost -u $dbuser -p $dbpass ". 
     "test_db | gzip > $backup_file"; 

    system($command); 
    ?> 
+0

下面的文章將有助於備份mysql數據庫的SQL文件或GZ format.Also可以備份整個數據庫或特定tables.You必須給主機,數據庫名稱,用戶名和密碼。 [http://faq.pctrickers.com/creating-mysql-database-backup-using-php/](http.pqtrickers.com/creating-mysql-database-backup-using-php/) –

回答

1

我覺得這個劇本將有助於您在百忙dabase備份

<?php 
backup_tables(‘hostaddress’,'dbusername’,'dbpassword’,'dbname’); 

/* backup the db OR just a table */ 
function backup_tables($host,$user,$pass,$name,$tables = ‘*’) 
{ 

$link = mysql_connect($host,$user,$pass); 
mysql_select_db($name,$link); 

//get all of the tables 
if($tables == ‘*’) 
{ 
$tables = array(); 
$result = mysql_query(‘SHOW TABLES’); 
while($row = mysql_fetch_row($result)) 
{ 
$tables[] = $row[0]; 
} 
} 
else 
{ 
$tables = is_array($tables) ? $tables : explode(‘,’,$tables); 
} 

//cycle through 
foreach($tables as $table) 
{ 
$result = mysql_query(‘SELECT * FROM ‘.$table); 
$num_fields = mysql_num_fields($result); 

$row2 = mysql_fetch_row(mysql_query(‘SHOW CREATE TABLE ‘.$table)); 
$return.= 「\n\n」.$row2[1].」;\n\n」; 

for ($i = 0; $i < $num_fields; $i++) 
{ 
while($row = mysql_fetch_row($result)) 
{ 
$return.= ‘INSERT INTO ‘.$table.’ VALUES(‘; 
for($j=0; $j<$num_fields; $j++) 
{ 
$row[$j] = addslashes($row[$j]); 
$row[$j] = ereg_replace(「\n」,」\\n」,$row[$j]); 
if (isset($row[$j])) { $return.= ‘」‘.$row[$j].’」‘ ; } else { $return.= ‘」"‘; } 
if ($j<($num_fields-1)) { $return.= ‘,’; } 
} 
$return.= 「);\n」; 
} 
} 
$return.=」\n\n\n」; 
} 

//save file 
$handle = fopen(‘db-backup-’.time().’-’.(md5(implode(‘,’,$tables))).’.sql’,'w+’); 
fwrite($handle,$return); 
fclose($handle); 
} 
?> 
+0

謝謝你,我會試試.. – user2012

+0

你好,如果它會對你有所幫助,那麼給它1 +,並使其正確,這將有助於他人 – Hardik

0

此代碼實際上並不存儲表的方案所以當你試圖導入它時,你只會導入數據。

您可以手動創建表或使用CLI工具mysqldump的,這將有助於。

有可能通過PHP轉儲數據和架構,但需要更多的工作。

1

首先,.sql擴展名不是很正確,你得到的SELECT ... INTO OUTFILE是逗號(或其他分隔符)分隔文本文件,而不是SQL語句文件。這更多的是代碼可讀性問題,但更好地命名您的文件廣告file.txtfile.csv(如果分隔符符合CSV)。

這就是說,如果導入回您的文件

LOAD DATA LOCAL INFILE '/path/to/file.txt' INTO TABLE your-table-name;` 

備份/導入應該工作,但只要你在第一次創建表與CREATE TABLE。 因此,這會給您帶來代碼式重構架構的負擔,非常痛苦。如果你已經有模式(例如導出/導入到同一個數據庫中),那就可以了。


另一種嘗試,如果你有 exec權限是使用 mysqldump。對於Linux系統,它應該是:

exec("/usr/bin/mysqldump -uusername-ppassword databasename | gzip -9 > /path/to/backupfile.gz"); 

備份整個數據庫,還有GZIP壓縮的額外好處。要備份特定的表,只需將其名稱添加到數據庫名旁即可。