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.