簡體   English   中英

使用 a.php 文件生成 MySQL 轉儲

[英]Using a .php file to generate a MySQL dump

這是我掌握的信息:

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

由於我是 PHP nooblet,我希望有人給我一些幫助、指導或代碼,這將滿足我的要求。 這必須從 Internet 遠程運行。

您可以使用exec() function 執行外部命令。

Note: between shell_exec() and exec() , I would choose the second one, which doesn't return the output to the PHP script -- no need for the PHP script to get the whole SQL dump as a string: you only need它寫入一個文件,這可以通過命令本身來完成。


該外部命令將:

  • 使用正確的參數調用mysqldump
  • 並將 output 重定向到文件。

例如:

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


這意味着您的 PHP 代碼將如下所示:

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


當然,由您決定使用正確的連接信息,將...替換為那些。

如果您想創建備份以通過瀏覽器下載它,您也可以在不使用文件的情況下執行此操作。

php function passthru()會將 mysqldump 的 output 直接重定向到瀏覽器。 在此示例中,它也將被壓縮。

優點:您不必處理臨時文件。

缺點:不適用於 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);
?>

看看這里: https://github.com/ifsnop/mysqldump-php 它是用 php 編寫的本機解決方案。

您可以使用 composer 安裝它,它就像這樣做一樣簡單:

<?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 頁面上進行了解釋,但或多或少是自動解釋的:

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

請參考以下鏈接,其中包含對您有幫助的腳本: http://davidwalsh.name/backup-mysql-database-php

注意:此腳本可能包含 NULL 數據類型的錯誤

出於安全原因,建議在配置文件中而不是在命令中指定密碼(用戶可以執行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);

在這里,您可以找到一個全面的解決方案來轉儲 mysql 結構和 PMA 中的數據(並且不使用 exec、passthru 等):

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

?>

奇跡般有效:-)

MajorLeo 的回答為我指明了正確的方向,但對我沒有用。 我發現這個網站遵循相同的方法並且確實有效。

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

我希望它可以幫助別人!

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

所以假設你知道如何在命令行中編寫mysqldump,即

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

那么您可以將其用作 exec() function 的參數。

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");

這是另一個基於 PHP 的原生選項: https://github.com/2createStudio/shuttle-export

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;

好吧,你總是可以使用 PHP 的系統 function 調用。

http://php.net/manual/en/function.system.php

http://www.php.net/manual/en/function.exec.php

從 PHP 運行任何命令行程序。

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

當然,您可以使用 mysqldump 采用的任何選項擴展命令。 使用man mysqldump獲得更多選項(但我猜你知道;))

要使用 shell_exec() 轉儲數據庫,方法如下:

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

以上代碼都不適合我。 我正在使用 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";
    }

這將根據您的查詢將文件保存在您的項目文件夾中您想要的任何數據。

在此處輸入圖像描述

<?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");


?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM