ใช้ไฟล์. php เพื่อสร้างดัมพ์ MySQL


119

นี่คือข้อมูลที่ฉันมี:

ฉันกำลังทำงานกับระบบที่ใช้ Linux โดยใช้ MySQL และ PHP5 ฉันต้องสามารถสร้างไฟล์mysqldumpจากภายในไฟล์. php จากนั้นให้ดัมพ์นั้นถูกเก็บไว้ในไฟล์บนเซิร์ฟเวอร์ในตำแหน่งที่ฉันจะระบุ

เนื่องจากฉันเป็น PHP nooblet ฉันจึงต้องการให้ใครสักคนให้ความช่วยเหลือคำแนะนำหรือรหัสแก่ฉันซึ่งจะทำในสิ่งที่ฉันต้องการ สิ่งนี้จะต้องถูกเรียกใช้จากระยะไกลจากอินเทอร์เน็ต


2
ตรวจสอบนี้ ฉันจะใช้mysqldumpโดยsystem().
dave


อันนี้ช่วยสร้าง mysqldump ด้วย help ไฟล์ php kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

อย่าพึ่งพา exec () หรือ system () เนื่องจากเวลาส่วนใหญ่จะปิดใช้งานบนโฮสติ้งที่แชร์ คำตอบควรใช้วิธีที่เหมาะสมในการสร้างการถ่ายโอนข้อมูลฐานข้อมูลโดยไม่ต้องเรียกใช้โปรแกรมภายนอก
ดิเอโก

คำตอบ:


160

คุณสามารถใช้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 เมื่อเสร็จสิ้นการพูดว่า "Dump complete!" หรือบางสิ่งบางอย่าง?
Thomas Ward

6
exec()จะไม่กลับมาจนกว่าคำสั่งจะเสร็จสิ้น ดังนั้นเพียงแค่echo "dump complete"โทรหาexec()
Pascal MARTIN

7
สิ่งนี้ช่วยฉันได้ในวันนี้ - และหมายเหตุสำหรับผู้ใช้ osx lion: ทางลัด mysqldump ไม่ได้ตั้งค่าให้ฉันเมื่อฉันติดตั้ง mysql ดังนั้นฉันจึงต้องหามัน - นี่คือเส้นทาง:/usr/local/mysql/bin/mysqldump
NotLizards

4
ความคิดเห็นของคุณ jammypeach ช่วยชีวิตฉันไว้ โปรดทราบว่า any1 อาจต้องการการเพิ่มเล็กน้อยนี้: '/ usr / local / mysql / bin / mysqldump -u ... '
helpse

1
หมายเหตุสำหรับผู้ใช้ Windows: ใน Windows คุณต้องระบุพา ธ ทั้งหมดไปยัง mysqldump.exe เช่นexec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama

83

หากคุณต้องการสร้างข้อมูลสำรองเพื่อดาวน์โหลดผ่านเบราว์เซอร์คุณสามารถทำได้โดยไม่ต้องใช้ไฟล์

ฟังก์ชัน php passthru ()จะเปลี่ยนทิศทางเอาต์พุตของ mysqldump ไปยังเบราว์เซอร์โดยตรง ในตัวอย่างนี้จะถูกบีบอัดด้วย

Pro: คุณไม่จำเป็นต้องจัดการกับไฟล์ชั่วคราว

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

25

ดูที่นี่: 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 แต่ส่วนมากหรือน้อยนั้นเป็นข้อมูลที่ชัดเจนโดยอัตโนมัติ:

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

2
แม้ในเซิร์ฟเวอร์ที่มีexecและ / หรือshell_execปิดใช้งานโดยความปลอดภัยmysqldump-php ก็ใช้งานได้ดี! เพิ่งลองใช้ตอนนี้บนเซิร์ฟเวอร์ของUmblerและได้รับการถ่ายโอนข้อมูลเรียบร้อยแล้ว ขอบคุณมากสำหรับเคล็ดลับ!
giovannipds

นี่เหมาะสำหรับเซิร์ฟเวอร์ที่ไม่มีคำสั่งเชลล์ mysql!
Andrej

9

โปรดตรวจสอบลิงค์ต่อไปนี้ซึ่งมี scriptlet ที่จะช่วยคุณ: http://davidwalsh.name/backup-mysql-database-php

หมายเหตุ:สคริปต์นี้อาจมีจุดบกพร่องที่มีชนิดข้อมูล NULL


ขอบคุณนี่เป็นแผน B ที่มีประโยชน์หาก "shell_exec () ถูกปิดใช้งานด้วยเหตุผลด้านความปลอดภัย" (เอาล่ะ Google)
Deebster

1
โปรดทราบว่าสิ่งนี้ใช้คำสั่ง mysql ที่เลิกใช้แล้วแทนที่จะเป็น mysqli
Pascal Raszyk

"ข้อบกพร่องที่มีประเภทข้อมูล NULL" ดูเหมือนจะเป็นปัญหาสำหรับโซลูชันสำรอง
alexis

7

เพื่อเหตุผลด้านความปลอดภัยขอแนะนำให้ระบุรหัสผ่านในไฟล์กำหนดค่าไม่ใช่ในคำสั่ง (ผู้ใช้สามารถเรียกใช้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);

5

ที่นี่คุณจะพบวิธีแก้ปัญหาที่ครอบคลุมในการถ่ายโอนโครงสร้าง 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);

?>

ทำงานได้อย่างมีเสน่ห์ :-)


มันใช้งานได้ - แต่ให้ผลลัพธ์ที่แตกต่างจาก mysqldump PHPMYADMIN ทำไม? มีข้อมูลหายไปในขณะที่การสำรองข้อมูล PHPMYADMIN ของฉันเสร็จสมบูรณ์
ledawg

@ Ledew-de: ไม่ควรรวมข้อมูลไว้ในการถ่ายโอนข้อมูลก็ต่อเมื่อตัวเลือก skip_data => true ถูกส่งเป็นพารามิเตอร์
ANTARA

3

ตราบใดที่คุณได้รับอนุญาตให้ใช้exec ()คุณสามารถรันคำสั่งเชลล์ผ่านโค้ด PHP ของคุณได้

สมมติว่าคุณรู้วิธีเขียน mysqldump ในบรรทัดคำสั่งเช่น

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

จากนั้นคุณสามารถใช้สิ่งนี้เป็นพารามิเตอร์เพื่อ exec () ฟังก์ชัน

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

3

คำตอบของ 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}");

ฉันหวังว่ามันจะช่วยคนอื่น!


ขอแสดงความนับถือส่งคืนผลลัพธ์ให้กับผู้ใช้ปลายทางใช่หรือไม่ IE เมื่อเรียกใช้งานจะส่งออกในลักษณะที่คุณสามารถคัดลอก / วางได้? ถ้าเป็นเช่นนั้นสิ่งนี้จะไม่บรรลุสิ่งที่คำตอบที่ยอมรับ - เพียงแค่สร้างไฟล์บนเซิร์ฟเวอร์เพื่อให้ฉันสามารถคว้าโดย scp
Thomas Ward

@ThomasW รหัสนี้ทำสองสิ่ง: สร้างไฟล์ที่บันทึกไว้บนเซิร์ฟเวอร์และแจ้งให้กล่องโต้ตอบดาวน์โหลด หากคุณต้องการจัดเก็บไฟล์อย่าทำส่วนหัว () และ passthru () และหากคุณต้องการเพียงตำแหน่งไฟล์คุณสามารถสะท้อนตัวแปร $ dir & $ filename ได้ตลอดเวลา .... ไม่ว่าคุณจะเลือกอะไรคุณก็ยังสามารถเข้าถึงไฟล์ผ่าน SCP
MatíasCánepa


0

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

คุณสามารถขยายคำสั่งด้วยตัวเลือกใด ๆ mysqldump ใช้หลักสูตร ใช้man mysqldumpสำหรับตัวเลือกเพิ่มเติม (แต่ฉันเดาว่าคุณรู้แล้ว;))



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;


0

รหัสข้างต้นไม่ได้ผลสำหรับฉัน ฉันใช้ 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";
    }

สิ่งนี้จะบันทึกไฟล์ในโฟลเดอร์โครงการของคุณตามคำค้นหาของคุณข้อมูลที่คุณต้องการ


โซลูชันนี้มีข้อบกพร่องเป็นหลักเนื่องจากสร้างสตริง SQL ที่ไม่ถูกต้อง
สามัญสำนึกของคุณ

-1

ในการถ่ายโอนฐานข้อมูลโดยใช้ shell_exec () ด้านล่างคือวิธีการ:

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

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


?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.