Avatar billede Team4s Nybegynder
26. februar 2010 - 11:45 Der er 7 kommentarer

Mysql dump

Hej,

Håber at I kan hjælpe mig med mit problem.

Jeg ønsker at få mit system til at backe min database op og jeg ligger hos Servage, hvor de under deres WIKI, har denne tråd:
https://www.servage.net/wiki/Create_MySQL_dumps_with_PHP det virker så bare slet ikke, eller jo den laver en fil til mig i min mappe, men skriver ingen mysql dump ud.

Jeg udfylder og skriver jo selvfølgelig de rigtige login oplysninger i filen, men lige fedt hjælper det!

Jeg har gjort mappen chmod til 777 og sat safe_mode til off, men ingen ting hjælper.

Så har jeg selvfølgelig været i gang med at søge Google og Eksperten tynd, men har ikke kunne finde noget brugbart, eller jo fandt denne her:

http://www.eksperten.dk/spm/319984

Og det virker også rigtig godt og den smider den korrekte mysql dump ud, men men men...nu er det sådan at jeg har en kunde database, hvor jeg har login oplysninger til mysql, hosten osv. gemt deri - så vil jeg jo gerne at det script kan koble på min kundedatabase og hente de forskellige brugerlogin oplysninger og derefter koble sig på den enkeles kunders database, men det kan jeg ikke få til at virke, den udskriver kun én fil.

Kan I evt. hjælpe mig der? Eller har i noget kode som går ind og gør det stunt for mig?

Har siddet med det i de sidste par dage, og puha...det virker lidt uoverskueligt når det ikke sådan vil virke :).

På forhånd tak!
Avatar billede repox Seniormester
26. februar 2010 - 11:49 #1
Umiddelbart vil jeg anbefale dig først at tage kontakt til Servage og høre ad, hvorfor fremgangsmåden i deres Wiki ikke fungerer for dig - jeg antager naturligvis at du har gjort præcist som Wiki'en har bedt dig om.
Det kunne jo nemt være at Servage har lavet fejl og det ikke nødvendigvis er dig der er problemet (det kan jeg så nemt forestille mig med tidligere erfaring fra Servage).
Avatar billede Team4s Nybegynder
26. februar 2010 - 11:51 #2
Hej repox,

Yepsen, har også skrevet til dem i dag, men det var mere hvis der var nogen herinde der havde en evt. løsning på det, sådan en "nu og her"- løsning. :)
Avatar billede repox Seniormester
26. februar 2010 - 12:22 #3
Så må du jo vise noget kode på det eksisterende forsøg du har...
Avatar billede Team4s Nybegynder
26. februar 2010 - 12:44 #4
Okay, hvis vi tager udgangspunkt i dette script: http://www.eksperten.dk/spm/319984

Har så et cronjob der skal køre denne fil, som henter informationerne ind fra en database:



include '_db/config.php';
    include '_db/db.php';
   
    $sql = "SELECT * FROM cmsuser ORDER BY user_cusid";
    $result = mysql_query($sql);
   
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
    {   
        $hostName = $row['user_cusmysqlhost'];
        $userName = $row['user_cusmysqluser'];
        $userPass = $row['user_cusmysqlpass'];
        $userDb = $row['user_cusmysqluser'];
       
        $dbhost = $hostName;
        $dbuname = $userName;
        $dbpass = $userPass;
        $dbname = $userDb;
       
        include_once('mysqldump.php');
    };



Derefter køre jeg så denne fil:



<?php
   
          @set_time_limit(600);
          $crlf="\n";
       
          // Danish Text   
          $strNoTablesFound = "Ingen databasetabeller fundet";
          $strHost = "Host";
          $strDatabase = "Database ";
          $strTableStructure = "Struktur for tabel";
          $strDumpingData = "Indhold af tabel";
          $strError = "Fejl";
          $strSQLQuery = "SQL-query";
          $strMySQLSaid = "MySQL: ";
          $strBack = "Tilbage";
          $strFileName = "DB-dump";
          $strName = "Backup af database";
          $strDone = "Downloadet d.";
          $strat = "kl.";
          date_default_timezone_set('Europe/Copenhagen');
          $date_jour = date ("d-m-Y-H-i-s");       
         
          // Log name:
          $logName = "$dbname-$date_jour.sql";
         
          header("Content-Disposition: filename=$logName");
          header("Content-Type: text/html");
          header("Pragma: no-cache");
          header("Expires: 0");
               
          // doing some DOS-CRLF magic...
          $client = getenv("HTTP_USER_AGENT");
          if(ereg('[^(]*\((.*)\)[^)]*',$client,$regs))
          {
            $os = $regs[1];
            // this looks better under WinX
            if (eregi("Win",$os))
              $crlf="\r\n";
          }
               
          // Get the content of $table as a series of INSERT statements.
          // After every row, a custom callback function $handler gets called.
          // $handler must accept one parameter ($sql_insert);
          function get_table_content($db, $table, $handler)
          {
            global $crlf;
            $result = mysql_db_query($db, "SELECT * FROM $table") or mysql_die();
            $i = 0;
            $sLocBuffer = "";
            while($row = mysql_fetch_row($result))
            {
              $table_list = "(";
               
              for($j=0; $j<mysql_num_fields($result);$j++)
                            $table_list .= mysql_field_name($result,$j).", ";
               
              $table_list = substr($table_list,0,-2);
              $table_list .= ")";
               
              if(isset($GLOBALS["showcolumns"]))
                $schema_insert = "INSERT INTO $table $table_list VALUES (";
              else
                $schema_insert = "INSERT INTO $table VALUES (";
               
              for($j=0; $j<mysql_num_fields($result);$j++)
              {
                if(!isset($row[$j]))
                  $schema_insert .= " NULL,";
                elseif($row[$j] != "")
                  $schema_insert .= " '".addslashes($row[$j])."',";
                else
                  $schema_insert .= " '',";
              }
              $schema_insert = ereg_replace(",$", "", $schema_insert);
              $schema_insert .= ");";
              $sLocBuffer .= trim($schema_insert).$crlf;
              $i++;
            }
            return $sLocBuffer;
          }
               
          // Return $table's CREATE definition
          // Returns a string containing the CREATE statement on success
          function get_table_def($db, $table, $crlf)
          {
            $schema_create = "";
            $schema_create .= "DROP TABLE IF EXISTS $table; CREATE TABLE $table ($crlf";
               
            $result = mysql_db_query($db, "SHOW FIELDS FROM $table") or mysql_die();
            while($row = mysql_fetch_array($result))
            {
              $schema_create .= "  $row[Field] $row[Type]";
               
              if(isset($row["Default"]) && (!empty($row["Default"]) || $row["Default"] == "0"))
                $schema_create .= " DEFAULT '$row[Default]'";
              if($row["Null"] != "YES")
                $schema_create .= " NOT NULL";
              if($row["Extra"] != "")
                $schema_create .= " $row[Extra]";
              $schema_create .= ",$crlf";
            }
            $schema_create = ereg_replace(",".$crlf."$", "", $schema_create);
            $result = mysql_db_query($db, "SHOW KEYS FROM $table") or mysql_die();
            while($row = mysql_fetch_array($result))
            {
              $kname=$row['Key_name'];
              if(($kname != "PRIMARY") && ($row['Non_unique'] == 0))
                $kname="UNIQUE|$kname";
              if(!isset($index[$kname]))
                $index[$kname] = array();
              $index[$kname][] = $row['Column_name'];
            }
               
            while(list($x, $columns) = @each($index))
            {
              $schema_create .= ",$crlf";
              if($x == "PRIMARY")
                $schema_create .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
              elseif (substr($x,0,6) == "UNIQUE")
                $schema_create .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
              else
                $schema_create .= "  KEY $x (" . implode($columns, ", ") . ")";
            }
               
            $schema_create .= "$crlf)";
            return (stripslashes($schema_create));
          }
               
          function mysql_die($error = "")
          {
            echo "<b> $strError </b><p>";
            if(isset($sql_query) && !empty($sql_query))
            {
              echo "$strSQLQuery: <pre>$sql_query</pre><p>";
            }
            if(empty($error))
              echo $strMySQLSaid.mysql_error();
            else
              echo $strMySQLSaid.$error;
            echo "<br><a href=\"java script:history.go(-1)\">$strBack</a>";
            exit;
          }
               
          global $bruger, $dbhost, $dbuname, $dbpass, $dbname;
          mysql_connect($dbhost, $dbuname, $dbpass);
          @mysql_select_db("$dbname") or die ("Kunne ikke forbinde til databasen");
               
          $tables = mysql_list_tables($dbname);
               
          $num_tables = @mysql_numrows($tables);
          if($num_tables == 0)
          {
            echo $strNoTablesFound;
          }
          else
          {
            $i = 0;
            $heure_jour = date ("H:i");
            $sBuffer = "# ========================================================$crlf";
            $sBuffer .= "#$crlf";
            $sBuffer .= "# $strName : $dbname$crlf";
            $sBuffer .= "# $strDone $date_jour $strat $heure_jour $crlf";
            $sBuffer .= "#$crlf";
            $sBuffer .= "# ========================================================$crlf";
            $sBuffer .= "$crlf";
                   
            while($i < $num_tables)
            {
              $table = mysql_tablename($tables, $i);
               
              $sBuffer .= "$crlf# --------------------------------------------------------$crlf";
              $sBuffer .= "#$crlf";
              $sBuffer .= "# $strTableStructure '$table'$crlf";
              $sBuffer .= "#$crlf$crlf";
               
              $sBuffer .= get_table_def($dbname, $table, $crlf).";$crlf$crlf";
                       
              $sBuffer .= "#$crlf";
              $sBuffer .= "# $strDumpingData '$table'$crlf";
              $sBuffer .= "#$crlf$crlf";
                   
              $sBuffer .= get_table_content($dbname, $table, "my_handler");
               
              $i++;
            }
           
            // Write log:
            $fp = fopen($logName, "w");
            fwrite($fp, $sBuffer);
            fclose($fp);
          }
?>




Er i stadigvæk med? :) - men den går så ind og smider min mysql dump afsted, men! Den tager kun den første database og smider ud, den smider ikke alle ud, som den kobler sig op på..

Håber det hjalp lidt at få syn på sagen?
Avatar billede repox Seniormester
26. februar 2010 - 12:51 #5
Er du sikker på du må forbinde til en mysql-server fra din host?
Så vidt jeg husker, tillader Servage MySQL servere ikke forbindelser fra andre eksterne kilder end den host som en database oprettes fra. Så hvis du tilfældigvis ikke har den rette host, så må du ikke forbinde til den.
Avatar billede Team4s Nybegynder
26. februar 2010 - 12:59 #6
Det er også korrekt - men når du opretter en database inde fra systemet, kan du oprette en remote database, dvs. at du fra hvilken som helst side, kan koble dig på databasen. Og denne fil, som skulle tage backup af min database, lægger også i en helt anden mappe, som ikke har noget med databasen at gøre.

Den kan også fint nok udskrive den første database, men får bare denne fejl, når den skal hente den anden:

<pre>Fatal error: Cannot redeclare get_table_content() (previously declared in [MIN STI] on line 80</pre>

Selvom at den udskriver den fejl, udskriver den godt nok min første database og laver en backup af den, men stopper så derefter.
Avatar billede Team4s Nybegynder
26. februar 2010 - 14:31 #7
Nåh, har så fundet en løsning - tog udgangspunkt i det fra Servage wiki og fandt så, endelig, en der havde samme problem som mig:

http://www.webmasterworld.com/php/3060831.htm

Tror det er fordi at mysqldump ikke kan køres direkte i exec() funktionen - det virker i hvert fald fint nu :) og den tager backup af alle databaserne, så det cool:

Koden blev så som følgenden (hvis det skulle have nogen interesse for nogen):



<?php

    include '_db/config.php';
    include '_db/db.php';
   
    $sql = "SELECT * FROM cmsuser ORDER BY user_cusid";
    $result = mysql_query($sql);
   
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
    {   
        $dbhost = $row['user_cusmysqlhost'];
        $dbuser = $row['user_cusmysqluser'];
        $dbpwd = $row['user_cusmysqlpass'];
        $dbname = $row['user_cusmysqluser'];
       
        $command = "/usr/bin/mysqldump --opt --host=$dbhost --user=$dbuser --password=$dbpwd $dbname > " . $dbname ."-". date("Y-m-d_H-i-s") . ".sql";
   
        exec($command);
       
    };
?>



Og så har jeg et cronjob som køre en gang om dagen og tager backup, så det er rigtig lækkert nu!

Men anyways, tak for hjælpen og inputet @repox, vil du have pointene eller hvordan? :)

God weekend,
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester