2013-06-21 102 views
0

我需要一個腳本來備份沒有cpanel,shell或phpmyadmin訪問權限的MYSQL數據庫。這個備份腳本中的「drop table」和「create table」選項有什麼作用?

我只關心這個腳本的DROP TABLE部分以及爲什麼需要它。我根本不想修改數據庫,我只想要一個備份。

這裏是我的代碼:

backup_tables('localhost','username','password','blog'); 


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

    $return.= 'DROP TABLE '.$table.';'; 
    $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

只是使用[mysqldump](http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html),一行,全部完成 – 2013-06-21 03:09:36

+0

所以我將不得不使用exec()那?我如何讓它發送文件而不是將其存儲在服務器上?是否有任何問題,它是一個非常大的分貝? – ryanwinchester

+1

你可以通過管道將它發送到服務器端的郵件命令(如果有的話)或使用php。與任何其他方法相比,mysqldump將更有效地處理任何數據庫大小。 – 2013-06-21 03:24:31

回答

2

所以這個腳本生成所有的SQL文件中的命令來重新創建當前數據庫。

因此,一旦腳本執行完畢,您可以「導入」它在phpmyadmin中創建的文件,如果它們存在,它將刪除這些表,然後在備份時插入表中的所有數據。

它不會從當前數據庫

例如修改任何東西,這是在phpMyAdmin「導出」功能將一個測試表創建:

-- 
-- Database: `test` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `test_table` 
-- 

DROP TABLE IF EXISTS `test_table`; 
CREATE TABLE IF NOT EXISTS `test_table` (
    `id` int(11) NOT NULL, 
    `num` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `test_table` 
-- 

INSERT INTO `test_table` (`id`, `num`) VALUES 
(1, 23), 
(2, 45); 

只是一個嚴重的SQL語句重新創建一個數據庫。

+0

很好的答案! :) – ryanwinchester

相關問題