MySQL backup s PHP?

Nikakor mi ne uspe narediti backup mysql baze z uporabo PHP.

Stran testiram na WAMP server, program mysqldump se nahaja v C:\wamp\bin\mysql\mysql5.1.33\bin

Poskusil sem z

$backupFile = DB_NAME . date("Y-m-d-H-i-s")  . '.sql';
    $command = "mysqldump -u" . DB_USER . " -p" . DB_PASSWORD . " " . DB_NAME . " > {$backupFile}";
system($command);

in

$backupFile = DB_NAME . date("Y-m-d-H-i-s")  . '.sql';
    $command = "C:\wamp\bin\mysql\mysql5.1.33\bin\mysqldump -u" . DB_USER . " -p" . DB_PASSWORD . " " . DB_NAME . " > {$backupFile}";
system($command);

system($command) sem poskusil zamenjati tudi z exec($command) vendar enostavno ne dela. Ko poženem stran mi stran nalaga in se nikoli ne ustavi. Ustvari se samo prazna .sql datoteka.

Če grem preko cmd.exe (run->cmd) najprej v direktori C:\wamp\bin\mysql\mysql5.1.33\bin\ in nato poženem mysqldump -uroot -p imebaze > rezerva.sql mi rezervo baze uspešno ustvari v direktoriju C:\wamp\bin\mysql\mysql5.1.33\bin\

(vrednosti konstant so ok, ker sem $command preveril z echo)

Kje je napaka? Kako bi lahko s PHP&mysldump ustvaril backup?

4 odgovori

$data = exec('mysqldump --opt -q -u root -h host -ppassword mojabaza, $databaseOuput);

if (!empty($databaseOuput)) {   
        // import query per query
        mysql_select_db($dbName);

        $query = '';
        foreach($databaseOuput as $row) {
            if (isset($row[strlen($row)-1]) && $row[strlen($row)-1] == ';') {
                $query .= "\n".$row;
                $result = mysql_query($query);

                if (!$result) {
                    $data = $query ."\n\n".mysql_error();
                    break;
                }

                $query = "";
            } else {
                $row = str_replace(' USING BTREE', '', $row);
                $query .= "\n".$row;
            }
        }
    }

Pri tej kodi mi naredi enako. Stran nalaga in jo nikoli ne naloži, ustvari se samo prazna .sql datoteka :/ (sicer je pa baza zelo majhna, preko cmd mi backup ustvari takoj...).

G-force, pri tej kodi manjka zgoraj še mysql_connect na bazo kamor hočeš kopirat. Če hočeš samo celotno bazo skopiran lahko uporabiš:

$dbName = 'mojabaza';
$dbFilename = $dbName.'.sql';

var_dump(exec('mysqldump --opt --skip-extended-insert --result-file='.$dbFilename.' -u root -h host -ppassword '.$dbName); // real import

Roky, hvala za pomoč vendar je bil problem drugje. Pa bom povedal rešitev, da se ne bo še kdo zajebaval tako dolgo kot sem se jaz :/

  1. Kar se exec() tiče mi ni delovalo, ker naj bi bil za to kriv bug. V sporočilu [15 Sep 2008 5:01pm UTC] je "vlabella" našel rešitev. Pred exec() je potrebno poklicati funkcijo sessionwriteclose(); (seveda v primeru, da ste predhodno na strani klicali session_start(), kar velja za moj primer, čeprav tega nisem omenil).

  2. Kljub sessionwriteclose(); pa mi spodnja koda še vedno ni delovala.

$backupFile = DBNAME . date("Y-m-d-H-i-s") . '.sql';
$command = "mysqldump -u" . DB
USER . " -p" . DBPASSWORD . " " . DBNAME . " > {$backupFile}";
sessionwriteclose();
exec($command);

Ker sem počasi imel vsega dovolj, sem program mysldump iz C:\wamp\bin\mysql\mysql5.1.33\bin prekopiral še v mapo, kjer imam stran C:\wamp\www\mojastra\

  1. Vendar koda še vedno ni delala. Po kombiniranju s cmd-jem pa sem ugotovil, da kljub temu, da za root nimam gesla mysqldump še vedno vpraša po njem in moraš pač klikniti na enter, seveda v php kodi to ni možno zato se je stran spet loadala v nedogled. Odstrani sem -p in spodnja koda (kooooooooooončno) deluje :D

$backupFile = DBNAME . date("Y-m-d-H-i-s") . '.sql';
$command = "mysqldump -u" . DB
USER . " " . DBNAME . " > {$backupFile}";
session
write_close();
exec($command);

1