Menggunakan file .php untuk menghasilkan dump MySQL


118

Berikut informasi yang saya miliki:

Saya bekerja dengan sistem berbasis Linux menggunakan MySQL dan PHP5. Saya harus dapat menghasilkan mysqldumpdari dalam file .php, dan kemudian menyimpan dump itu dalam file di server di lokasi yang akan saya tentukan.

Karena saya adalah pemula PHP, saya ingin seseorang memberi saya bantuan, panduan, atau kode, yang akan melakukan apa yang saya butuhkan. Ini harus dijalankan dari jarak jauh dari Internet.


2
Periksa ini . Saya akan menggunakan mysqldumpoleh system().
Dave


Yang ini membantu membuat mysqldump dengan bantuan file php. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

Jangan mengandalkan exec () atau system (), karena sering kali mereka dinonaktifkan di host bersama. Jawaban harus menerapkan cara yang tepat untuk menghasilkan dump database tanpa menjalankan program eksternal.
diego

Jawaban:


159

Anda dapat menggunakan exec()fungsi tersebut untuk menjalankan perintah eksternal.

Catatan: antara shell_exec()dan exec(), saya akan memilih yang kedua, yang tidak mengembalikan output ke skrip PHP - tidak perlu skrip PHP untuk mendapatkan seluruh dump SQL sebagai string: Anda hanya perlu menulisnya ke file, dan ini bisa dilakukan dengan perintah itu sendiri.


Perintah eksternal itu akan:

  • menjadi panggilan mysqldump, dengan parameter yang tepat,
  • dan mengarahkan output ke file.

Sebagai contoh :

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


Artinya kode PHP Anda akan terlihat seperti ini:

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


Tentu saja, terserah Anda untuk menggunakan informasi koneksi yang benar, menggantinya ...dengan yang itu.


2
Saya akan membahas ini sebentar lagi. Apakah ada cara untuk menghasilkan keluaran pada halaman PHP setelah selesai mengatakan "Dump complete!" atau sesuatu?
Thomas Ward

6
exec()tidak akan kembali sampai perintah selesai; jadi, taruh saja beberapa echo "dump complete"setelah meneleponexec()
Pascal MARTIN

7
Ini membantu saya hari ini - dan catatan untuk pengguna osx lion: pintasan mysqldump tidak disiapkan untuk saya ketika saya menginstal mysql, jadi saya harus menemukannya - inilah jalannya:/usr/local/mysql/bin/mysqldump
completelyNotLizards

4
Komentar Anda, jammypeach, menyelamatkan hidup saya. Harap dicatat bahwa any1 mungkin memerlukan tambahan kecil ini: '/ usr / local / mysql / bin / mysqldump -u ...'
helpse

1
Catatan untuk pengguna Windows: Di Windows Anda harus menentukan jalur lengkap ke mysqldump.exe, misalnyaexec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama

83

Jika Anda ingin membuat cadangan untuk mengunduhnya melalui browser, Anda juga dapat melakukannya tanpa menggunakan file.

Fungsi php passthru () akan langsung mengarahkan output dari mysqldump ke browser. Dalam contoh ini, ini juga akan di-zip.

Pro: Anda tidak perlu berurusan dengan file temp.

Kontra: Tidak akan berfungsi di Windows. Mungkin memiliki batasan dengan kumpulan data yang besar.

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

Lihat di sini: https://github.com/ifsnop/mysqldump-php ! Ini adalah solusi asli yang ditulis dalam php.

Anda dapat menginstalnya menggunakan komposer, dan itu semudah melakukan:

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

?>

Ini mendukung pengguna tingkat lanjut, dengan banyak opsi yang disalin dari mysqldump asli.

Semua opsi dijelaskan di halaman github, tetapi kurang lebih bersifat auto-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
);

2
Bahkan pada server yang telah execdan / atau shell_execdinonaktifkan oleh keamanan, mysqldump-php berfungsi dengan baik! Baru saja mencobanya sekarang di server Umbler dan berhasil mendapatkan dumpnya . Terima kasih banyak atas tipnya!
giovannipds

ini sempurna untuk server yang tidak memiliki perintah shell mysql juga!
Andrej

9

Silakan merujuk ke tautan berikut yang berisi scriptlet yang akan membantu Anda: http://davidwalsh.name/backup-mysql-database-php

Catatan: Skrip ini mungkin berisi bug dengan tipe data NULL


Terima kasih, ini adalah paket B yang berguna jika "shell_exec () telah dinonaktifkan karena alasan keamanan" (
begitulah

1
Perhatikan bahwa ini menggunakan perintah mysql yang sudah usang, bukan mysqli.
Pascal Raszyk

"Bug dengan tipe data NULL" terdengar seperti masalah untuk solusi cadangan.
alexis

7

Untuk alasan keamanan, disarankan untuk menentukan kata sandi dalam file konfigurasi dan bukan dalam perintah (pengguna dapat menjalankan ps aux | grep mysqldumpdan melihat kata sandi).

//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

Di sini Anda dapat menemukan solusi komprehensif untuk membuang struktur dan data mysql seperti di PMA (dan tanpa menggunakan exec, passthru, dll.):

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

Ini adalah proyek percabangan dszymczuk dengan perangkat tambahan saya.

Penggunaannya sederhana

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

?>

bekerja seperti pesona :-)


Itu berhasil - tetapi menghasilkan output yang berbeda dari mysqldump PHPMYADMIN. Kenapa? Ada data yang hilang, sementara pencadangan PHPMYADMIN saya selesai.
ledawg

@ Ledew-de: Data tidak boleh dimasukkan dalam dump hanya jika opsi skip_data => true diteruskan sebagai parameter
ANTARA

3

Selama Anda diizinkan menggunakan exec () , Anda dapat menjalankan perintah shell melalui kode PHP Anda.

Jadi dengan asumsi Anda tahu cara menulis mysqldump di baris perintah, yaitu

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

maka Anda dapat menggunakan ini sebagai parameter untuk fungsi exec ().

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

3

Jawaban MajorLeo menunjukkan saya ke arah yang benar tetapi tidak berhasil untuk saya. Saya telah menemukan situs ini yang mengikuti pendekatan yang sama dan berhasil.

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

Saya harap ini membantu orang lain!


Anda di sini mengembalikan output ke pengguna akhir bukan? IE setelah dieksekusi, ia mengeluarkannya dengan cara yang dapat Anda salin / tempel? Jika demikian, maka ini tidak akan mencapai apa yang dilakukan jawaban yang diterima - cukup buat file di server sehingga saya bisa mengambilnya dengan scp.
Thomas Ward

@Tokopedia Kode ini melakukan dua hal: menghasilkan file yang disimpan di server dan meminta dialog unduhan. Jika Anda hanya ingin menyimpan file, jangan lakukan bagian header () dan passthru (). Dan jika Anda hanya membutuhkan lokasi file, Anda selalu dapat menggemakan variabel $ dir & $ nama file .... Apa pun yang Anda pilih, Anda masih dapat mengakses file melalui SCP
Matías Cánepa


0

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

Anda dapat memperluas perintah dengan opsi apa pun yang diambil mysqldump. Gunakan man mysqldumpuntuk lebih banyak opsi (tapi saya rasa Anda tahu itu;))



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

Tidak ada kode di atas yang berhasil untuk saya. Saya menggunakan windows. Di bawah Kode bekerja untuk saya ...

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

Ini akan menyimpan file di folder proyek Anda sesuai dengan permintaan Anda, data apa pun yang Anda inginkan.


Solusi ini pada dasarnya cacat, karena menghasilkan string SQL yang salah
Akal Sehat Anda

-1

Untuk membuang database menggunakan shell_exec (), di bawah ini adalah metodenya:

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


?>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.