Autor Zpráva
grimword
Profil
Ahoj,
nedaří se mi najít návod jak udělat následující.

Chci, aby PHP skript zálohoval celou MySQL do souboru zaloha.sql (pokud existuje, tak jej aktualizovat) (jednoduše provedl dump MySQL). A následně se mi nabídl odkaz na stažení tohoto souboru.

Je to úplně stejná funkce, jakou nabízí PHPmyAdmin. Ono to musí být strašně jednoduché, ale nevím jak na to.
Jan Tvrdík
Profil
github.com/Clevis/DatabaseBackup resp. github.com/Clevis/MySQL-dump
grimword
Profil
Jan Tvrdík:
Ano, ale tyto library mají tisíce řádků kódu. A přitom to musí být velice snadné. Kód na pár řádků.

Například jsem našel toto, co vypadá, že by mohlo dělat přesně co chci:

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

Problém je, že ten kód je nejspíš psaný pro localhost. Protože se tam nikde nespecifikuje cesta k databázi (k serveru). A nevím jak to upravit, takže to nemůžu ani vyzkoušet.
juriad
Profil
grimword:
Žádný rozumný hosting ti nedovolí spustit náhodný program. Vše musíš provést v PHP, proto jsou to tisíce řádků kódu. Navíc je tam spousta případů, které bys ty vůbec neuvažoval.
grimword
Profil
juriad:
Tady není řeč o žádném programu? A proč na obyčejné vypsání MySQL potřebuji tisíce řádků kódu?
Keeehi
Profil
grimword:
Tady není řeč o žádném programu?
Ale je, jen to nevíš, protože memáš dostatek znalostí. Jde o program mysqldup a snaží se ho spouštět řádek 15. Ta funkce passthru spouští právě další programy a s exec(), system() a dalšími příbuznými jsou na hostincích zakázané.

A v případě knihovny MySQL-dump je tvůj kód taky jen na pár řádků.
<?php
set_time_limit(0);
ignore_user_abort(TRUE);
require __DIR__ . '/src/MySQLDump.php';
$dump = new MySQLDump(new mysqli('localhost', 'root', 'password', 'database'));
ini_set('zlib.output_compression', TRUE);
header('Content-Type: application/x-gzip');
header('Content-Disposition: attachment; filename="dump ' . date('Y-m-d H-i') . '.sql.gz"');
header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache');
header('Connection: close');
$dump->write();

Šlo by to i zkrátit a ve většině případů by to i fungovalo, jen by to nebylo tak profesionální.
juriad
Profil
grimword:
Je. passthru zhruba spustí zadaný příkaz v přikazovém řadku a jeho výstup pošle webovému serveru. V tomto případě spouštíš program mysqldump a jeho výstup předáváš programu gzip.

Jenomže ty se to nesnažíš pouze nějak vypsat, ale vypsat do podoby takové, že z ní potom celá databáze půjde obnovit. Jedna věc jsou data, další jsou definice jednotlivých struktur, kódování dumpu, optimalizace následného importu. Jen se podívej kolik nejrůznějších přepínačů má program mysqldump a ten je rozhodně ještě mnohem rozsáhlejší.

To, co odkázal Jan Tvrdík je ve skutečnosti opravdu jednoduché a má to 211 řádek, tak jaképak tisíce. Šlo by sprasit, aby to mělo kolem stovky, ale za cenu přehlednosti.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: