MySQL dökümü oluşturmak için bir .php dosyası kullanma


119

İşte sahip olduğum bilgiler:

MySQL ve PHP5 kullanan Linux tabanlı bir sistemle çalışıyorum. mysqldump.Php dosyasından bir .php dosyası oluşturabilmem ve ardından bu dökümün sunucudaki bir dosyada belirteceğim bir konumda depolanmasını sağlamalıyım .

Bir PHP nooblet olduğum için, ihtiyacım olanı yapacak birinin bana yardım, rehberlik veya kod vermesini istiyorum. Bunun internetten uzaktan çalıştırılması gerekir.


2
Bunu kontrol edin . mysqldumpTarafından kullanırdım system().
— dave


Bu, bir php dosyası yardımıyla mysqldump oluşturmaya yardımcı olur. kvcodes.com/2017/10/php-create-mysql-backup
— Kvvaradha

Exec () veya system () 'e güvenmeyin çünkü çoğu zaman paylaşılan barındırmalarda devre dışı bırakılırlar. Yanıt, harici programları çalıştırmadan bir veritabanı dökümü oluşturmanın uygun bir yolunu uygulamalıdır.
— diego

Yanıtlar:


160

exec()Harici bir komutu yürütmek için işlevi kullanabilirsiniz .

Not: shell_exec()ve arasında exec(), çıktıyı PHP betiğine döndürmeyen ikincisini seçerdim - PHP betiğinin tüm SQL dökümünü bir dize olarak almasına gerek yoktur: yalnızca bir dosyaya yazılması gerekir, ve bu komutun kendisi tarafından yapılabilir.


Bu harici komut:

  • yapılan bir çağrı mysqldumpdoğru parametrelerle birlikte,
  • ve çıktıyı bir dosyaya yönlendirin.

Örneğin :

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


Bu, PHP kodunuzun şöyle görüneceği anlamına gelir:

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


Tabii ki, doğru bağlantı bilgilerini kullanmak, ...bunlarla değiştirmek size kalmış .


2
Kısa süre içinde buna bir bıçak atacağım. PHP sayfasında "Döküm tamamlandı!" Diyerek çıktı oluşturmanın herhangi bir yolu var mı? ya da başka birşey?
— Thomas Ward

6
exec()komut bitene kadar geri dönmeyecek; yani, echo "dump complete"aradıktan sonra birkaç tane koyunexec()
— Pascal MARTIN

7
Bu bana bugün yardımcı oldu - ve osx lion kullanıcıları için bir not: mysqldump kısayolu, /usr/local/mysql/bin/mysqldump
— mysql'yi kurduğumda

4
Yorumunuz, jammypeach, hayatımı kurtardı. Lütfen herhangi 1'in bu küçük
— ilaveye

1
Windows kullanıcıları için not: Windows'ta, mysqldump.exe exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
— dosyasının

83

Tarayıcı aracılığıyla indirmek için bir yedek oluşturmak istiyorsanız, bunu bir dosya kullanmadan da yapabilirsiniz.

Php işlevi passthru () mysqldump çıktısını doğrudan tarayıcıya yönlendirecektir. Bu örnekte de sıkıştırılacaktır.

Pro: Geçici dosyalar ile uğraşmanıza gerek yok.

Eksileri: Windows'ta çalışmayacak. Büyük veri kümeleriyle sınırları olabilir.

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

Buraya bir göz atın: https://github.com/ifsnop/mysqldump-php ! Php ile yazılmış yerel bir çözümdür.

Composer kullanarak kurabilirsiniz ve yapmak kadar kolaydır:

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

?>

Orijinal mysqldump'tan kopyalanan birçok seçenekle gelişmiş kullanıcıları destekler.

Tüm seçenekler github sayfasında açıklanmıştır, ancak aşağı yukarı otomatik olarak açıklanmaktadır:

$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
Mysqldump-php , güvenlik tarafından etkinleştirilenexec ve / veya shell_execdevre dışı bırakılan sunucularda bile harika çalışıyor! Şu anda Umbler'in sunucularında denedim ve dökümü başarıyla aldım. Bahşiş için çok teşekkür ederim!
— giovannipds

bu, mysql kabuk komutlarına da sahip olmayan sunucular için mükemmeldir!
— Andrej

9

Lütfen size yardımcı olacak bir betik içeren aşağıdaki bağlantıya bakın: http://davidwalsh.name/backup-mysql-database-php

Not: Bu komut dosyası, NULL veri türlerine sahip hatalar içerebilir


Teşekkürler, bu kullanışlı bir B planı, eğer "shell_exec () güvenlik nedeniyle devre dışı bırakıldıysa" (işte
— buyrun

1
Bunun mysqli yerine kullanımdan kaldırılmış mysql komutlarını kullandığını unutmayın.
— Pascal Raszyk

"NULL veri türlerine sahip hatalar", yedekleme çözümü için bir sorun gibi görünüyor.
— alexis

7

Güvenlik nedenleriyle, parolanın komutta değil bir yapılandırma dosyasında belirtilmesi önerilir (bir kullanıcı a çalıştırabilir ps aux | grep mysqldumpve parolayı görebilir).

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

Burada, mysql yapısını ve verilerini PMA'daki gibi (ve exec, passthru vb. Kullanmadan) dökmek için kapsamlı bir çözüm bulabilirsiniz:

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

Geliştirmelerimle dszymczuk projesinin çatalı.

Kullanımı basit

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

?>

tıkır tıkır çalışıyor :-)


Çalışır - ancak PHPMYADMIN mysqldump'tan farklı bir çıktı üretir. Neden ? PHPMYADMIN yedeklemem tamamlanırken veri eksik.
— ledawg

@ Ledew-de: Veriler, yalnızca skip_data => true seçeneği parametre olarak geçirilirse döküme dahil edilmemelidir
— ANTARA

3

Exec () kullanma izniniz olduğu sürece , PHP kodunuz aracılığıyla kabuk komutlarını çalıştırabilirsiniz.

Yani mysqldump'ın komut satırına nasıl yazılacağını bildiğinizi varsayarsak, yani

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

o zaman bunu exec () işlevi için parametre olarak kullanabilirsiniz.

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

3

MajorLeo'nun cevabı beni doğru yönü gösteriyor ama benim için işe yaramadı. Aynı yaklaşımı izleyen ve işe yarayan bu siteyi buldum .

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

Umarım başka birine yardımcı olur!


Buradaki sizin çıktıyı son kullanıcıya döndürmüyor mu? IE çalıştırıldığında, kopyalayıp / yapıştırabileceğiniz bir şekilde çıktı verir? Eğer öyleyse, o zaman bu kabul edilen cevabın yaptığı şeyi başaramazdı - sadece dosyayı sunucuda oluşturur, böylece scp ile kapabilirim.
— Thomas Ward

@ThomasW. Bu kod iki şey yapar: sunucuya kaydedilmiş bir dosya oluşturur ve indirme iletişim kutusunu açar. Dosyayı sadece depolamak istiyorsanız, header () ve passthru () kısmını yapmayın. Ve sadece dosya konumuna ihtiyacınız varsa, her zaman $ dir ve $ dosya adı değişkenlerini yankılayabilirsiniz .... Ne seçerseniz seçin, dosyaya hala SCP
— Matías Cánepa


0

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

Komutu, mysqldump'ın elinden aldığı herhangi bir seçenekle genişletebilirsiniz. man mysqldumpDaha fazla seçenek için kullanın (ama bunu biliyordunuz sanırım;))



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

Yukarıdaki kodların hiçbiri benim için işe yaramadı. Windows kullanıyorum. Aşağıdaki Kod benim için çalıştı ...

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

Bu, istediğiniz veri ne olursa olsun sorgunuza göre dosyayı proje klasörünüze kaydedecektir.


Yanlış SQL dizeleri oluşturduğu için bu çözüm esasen kusurludur
— Ortak

-1

Veritabanını shell_exec () kullanarak dökmek için aşağıdaki yöntem şöyledir:

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


?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.