2011-07-19 48 views
98

下面是我的信息:使用.php文件生成MySQL轉儲

我正在使用基於Linux的系統使用MySQL和PHP5。我需要能夠從.php文件中生成mysqldump,然後將該轉儲存儲在服務器上我將指定的位置中的文件中。

因爲我是一個PHP nooblet,我希望有人給我一些幫助,指導或代碼,這將做我所需要的。這將不得不從互聯網遠程運行。

+2

http://php.net/shell_exec –

+2

檢查[this](http://www.php-mysql-tutorial.com/wikis /mysql-tutorials/using-php-to-backup-mysql-databases.aspx)。我將通過'system()'使用'mysqldump'。 – dave

+0

可能的重複[簡單的方法來導出SQL表,而無需訪問服務器或phpMyADMIN](http://stackoverflow.com/questions/81934/easy-way-to-export-a-sql-table-without-access -to-the-server-or-phpmyadmin) –

回答

134

您可以使用exec()函數來執行外部命令。

注:shell_exec()exec()之間,我會選擇第二個,不輸出返回到PHP腳本 - 無需爲PHP腳本得到整個SQL轉儲爲一個字符串:你只需要它寫入文件,這可以通過命令本身來完成。


即外部命令:

  • mysqldump一個呼叫時,與所述正確的參數,
  • 並將輸出重定向到文件。

例如:

mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql 


這意味着你的PHP代碼應該是這樣的:

exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql'); 


當然,取決於你使用正確的連接信息,用這些替換...

+2

我會在短時間內刺穿它。有什麼辦法可以在PHP頁面上完成「轉儲完成!」的輸出後生成輸出。或者其他的東西? –

+4

'exec()'將不會返回,直到命令完成;所以,只需在調用'exec()'後調用'echo'dump complete''' –

+0

@The Evil Phoenix:從php.net,'exec()'函數引用:「要獲得執行的命令的輸出,設置和使用輸出參數「。 – dave

10

請reffer以下鏈接包含一個小腳本,這將有助於你: http://davidwalsh.name/backup-mysql-database-php

注:該腳本可能包含NULL數據類型

+0

謝謝,這是一個方便的計劃B如果「shell_exec()已被禁用的安全原因」(你去,谷歌) – Deebster

+1

請注意,這使用不推薦的mysql命令而不是mysqli。 –

+0

「有NULL數據類型的錯誤」聽起來像是備份解決方案的問題。 – alexis

0

<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>

您可以使用mysqldump需要ofcourse任何選項擴展命令。使用man mysqldump獲取更多選項(但我想你知道這一點;))

5

只要允許您使用exec(),就可以通過您的PHP代碼執行shell命令。

因此,假設您知道如何在命令行中編寫mysqldump,即

mysqldump -u [username] -p [database] > [database].sql 

然後你可以使用這個作爲exec()函數的參數。

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql"); 
-1
<?php 
    $toDay = date('d-m-Y'); 

    $dbhost = "localhost"; 
    $dbuser = "YOUR DB USER"; 
    $dbpass = "USER PASSWORD"; 
    $dbname = "DB NAME"; 

    exec("mysqldump --user=$dbuser --password='$dbpass' --host=$dbhost $dbname > /home/....../public_html/".$toDay."_DB.sql"); 


?> 
64

如果你想創建一個備份通過瀏覽器下載它,你也可以做到這一點,而無需使用一個文件。

php函數passthru()將直接將mysqldump的輸出重定向到瀏覽器。在這個例子中,它也會被壓縮。

臨:你不必處理臨時文件。

Con:無法在Windows上運行。大數據集可能有限制。

<?php 

$DBUSER="user"; 
$DBPASSWD="password"; 
$DATABASE="user_db"; 

$filename = "backup-" . date("d-m-Y") . ".sql.gz"; 
$mime = "application/x-gzip"; 

header("Content-Type: " . $mime); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 

$cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best"; 

passthru($cmd); 

exit(0); 
?> 
+1

偉大的腳本,謝謝! – CapelliC

+1

這是一個很好的答案。 –

+1

有沒有辦法讓這個工作在Windows上? –

5

在這裏你可以找到一個全面的解決方案來轉儲mysql的結構和數據就像在PMA(和不使用EXEC,中繼等):

https://github.com/antarasi/MySQL-Dump-with-Foreign-keys

這是dszymczuk項目的叉子我的增強。

的用法很簡單

<?php 
//MySQL connection parameters 
$dbhost = 'localhost'; 
$dbuser = 'dbuser'; 
$dbpsw = 'pass'; 
$dbname = 'dbname'; 

//Connects to mysql server 
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw); 

//Set encoding 
mysql_query("SET CHARSET utf8"); 
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); 

//Includes class 
require_once('FKMySQLDump.php'); 


//Creates a new instance of FKMySQLDump: it exports without compress and base-16 file 
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false); 

$params = array(
    //'skip_structure' => TRUE, 
    //'skip_data' => TRUE, 
); 

//Make dump 
$dumper->doFKDump($params); 

?> 

的作品就像一個魅力:-)

+0

它可以工作 - 但它會產生與PHPMYADMIN mysqldump不同的輸出。爲什麼?數據丟失,而我的PHPMYADMIN備份已完成。 –

+0

@ Ledew-de:僅當選項skip_data => true作爲參數傳遞時,數據不應包含在轉儲中 – ANTARA

17

到這裏看看:https://github.com/ifsnop/mysqldump-php!這是一個用php編寫的本地解決方案。

您可以使用安裝作曲家它,它是那麼容易,因爲這樣做的:

<?php 

use Ifsnop\Mysqldump as IMysqldump; 

try { 
    $dump = new IMysqldump\Mysqldump('database', 'username', 'password'); 
    $dump->start('storage/work/dump.sql'); 
} catch (\Exception $e) { 
    echo 'mysqldump-php error: ' . $e->getMessage(); 
} 

?> 

它支持先進的用戶,有很多從原來的mysqldump的複製選項。

所有的選項都在github上頁解釋,但或多或​​少都自動explicative:

$dumpSettingsDefault = array(
    'include-tables' => array(), 
    'exclude-tables' => array(), 
    'compress' => 'None', 
    'no-data' => false, 
    'add-drop-database' => false, 
    'add-drop-table' => false, 
    'single-transaction' => true, 
    'lock-tables' => false, 
    'add-locks' => true, 
    'extended-insert' => true, 
    'disable-foreign-keys-check' => false, 
    'where' => '', 
    'no-create-info' => false 
); 
+0

即使在安全性已禁用'exec'和/或'shell_exec'的服務器上,[mysqldump-php]( https://github.com/ifsnop/mysqldump-php)很棒!剛剛在[Umbler](https://www.umbler.com)的服務器上嘗試過,併成功獲得了轉儲。非常感謝您的提示! – giovannipds

0

要使用了shell_exec轉儲數據庫()下面是方法:

shell_exec('mysqldump -h localhost -u username -ppassword databasename | gzip > dbname.sql.gz'); 
1

MajorLeo的回答指向我在正確的方向,但它並沒有爲我工作。我發現this site遵循相同的方法,並沒有工作。

$dir = "path/to/file/"; 
$filename = "backup" . date("YmdHis") . ".sql.gz"; 

$db_host = "host"; 
$db_username = "username"; 
$db_password = "password"; 
$db_database = "database"; 

$cmd = "mysqldump -h {$db_host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}"; 
exec($cmd); 

header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$filename\""); 

passthru("cat {$dir}{$filename}"); 

我希望它可以幫助別人!

+0

您在這裏將輸出返回給最終用戶不? I.E.在執行後它會以複製/粘貼的方式輸出它?如果是這樣,那麼這將不會達到接受的答案 - 只是在服務器上創建文件,所以我可以通過scp抓住它。 –

+0

@ThomasW。此代碼執行兩件事:它生成一個保存在服務器上的文件並提示下載對話框。如果你只是想存儲文件,那麼不要做header()和passthru()部分。如果你只需要文件位置,你總是可以回顯$ dir&$ filename變量....不管你選擇什麼,你仍然可以通過SCP訪問文件 –

0

global $wpdb; 
 
$export_posts = $wpdb->prefix . 'export_posts'; 
 
$backupFile = $_GET['targetDir'].'export-gallery.sql'; 
 
$dbhost=DB_HOST; 
 
$dbuser=DB_USER; 
 
$dbpass=DB_PASSWORD; 
 
$db=DB_NAME; 
 
$path_to_mysqldump = "D:\xampp_5.6\mysql\bin"; 
 
$query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile"; 
 
exec($query); 
 
echo $query;

5

出於安全原因,建議到指定的命令在配置文件中的密碼,而不是(用戶可以執行ps aux | grep mysqldump,看到了密碼)。

//create a temporary file 
$file = tempnam(sys_get_temp_dir(), 'mysqldump'); 

//store the configuration options 
file_put_contents($file, "[mysqldump] 
user={$user} 
password=\"{$password}\""); 

//execute the command and output the result 
passthru("mysqldump --defaults-file=$file {$dbname}"); 

//delete the temporary file 
unlink($file); 
-1

我也有一種情況,我找不到工具爲我工作。因此,爲了從PHP備份和恢復MYSQL數據,我製作了一個程序,可以將數據壓縮成一個可以下載的zip文件。稍後您可以上傳和恢復完整的數據庫。你可以在我的Github頁面上找到它

1

沒有上述代碼爲我工作。我正在使用Windows。 下面的代碼爲我工作...

$sql = "SELECT * FROM $tableName WHERE yourclause"; 
$result = $conn->query($sql); 


if($result){ 

     if ($result->num_rows > 0) { 

      $myfile = fopen("daily_events_$district.sql", "w") or die("Unable to open file!"); 

      while($row = $result->fetch_assoc()) { 

       $rowToString = implode("','",$row); 
       $writeToFile = "INSERT INTO $tableName VALUES('$rowToString');". PHP_EOL; 
       fwrite($myfile,$writeToFile); 
      } 
      echo "File saved successfully"; 
     } 
    } else { 
     echo "No result found"; 
    } 

這將根據您的查詢你想要的任何數據文件保存在您的項目文件夾。如果你想轉儲整個數據庫或表,那麼你可以使用 這個鏈接http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/using-php-to-backup-mysql-databases.aspx