login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Opmaak mysql db backup

Offline shamrock - 14/01/2011 13:41
Avatar van shamrockLid Hallo,

Ik laat automatisch een database backup genereren. Wanneer er iets fout zou gaan met de server wordt een complete map geupload inclusief installatie bestand. In dat installatie bestand wordt connectie met SQL aangemaakt en de backup teruggezet.

het probleem is dat de backup van de backup een erg irritante opmaak heeft.

Voorbeeld van een deel van de backup:

  1. #
  2. # MySQL database dump
  3. # Created by MySQL_Backup class, ver. 1.0.0
  4. #
  5. # Host: localhost
  6. # Generated: Jan 13, 2011 at 14:32
  7. # MySQL version: 5.1.36-community-log
  8. # PHP version: 5.3.0
  9. #
  10. # Database: `db_gps`
  11. #
  12.  
  13.  
  14. #
  15. # Table structure for table `basis_instellingen`
  16. #
  17.  
  18. DROP TABLE IF EXISTS `basis_instellingen`;
  19. CREATE TABLE `basis_instellingen` (
  20. `aantal_gebruikers_per_pagina` int(11) NOT NULL,
  21. `automatisch_gesorteerd` varchar(255) NOT NULL,
  22. `automatisch_gesorteerd_richting` varchar(255) NOT NULL
  23. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  24.  
  25. #
  26. # Dumping data for table `basis_instellingen`
  27. #
  28.  
  29. INSERT INTO basis_instellingen VALUES ('100', 'voornaam', 'desc');
  30.  
  31.  
  32. #
  33. # Table structure for table `gebruikers`
  34. #
  35.  
  36. DROP TABLE IF EXISTS `gebruikers`;
  37. CREATE TABLE `gebruikers` (
  38. `id` int(11) NOT NULL AUTO_INCREMENT,
  39. `voornaam` varchar(255) NOT NULL,
  40. `achternaam` varchar(255) NOT NULL,
  41. `tussenvoegsel` varchar(255) NOT NULL,
  42. `adres` varchar(255) NOT NULL,
  43. `postcode` varchar(255) NOT NULL,
  44. `woonplaats` varchar(255) NOT NULL,
  45. `gps_id` int(11) NOT NULL,
  46. PRIMARY KEY (`id`)
  47. ) ENGINE=MyISAM AUTO_INCREMENT=809 DEFAULT CHARSET=latin1;
  48.  
  49. #
  50. # Dumping data for table `gebruikers`
  51. #


elk teken achter het teken # moet eigenlijk worden verwijderd, en ieder blok moet ik appart kunnen toevoegen.

Ook moet bij ieder blok dit worden verwijderd: DROP TABLE IF EXISTS `gebruikers`; (waarbij gebruikers iedere keer de naam van de tabel is.


Weet iemand heo ik dit kan doen?

Ik wil dus graag per blok dit automatisch krijgen:

mysql_query("CREATE TABLE `basis_instellingen` (
`aantal_gebruikers_per_pagina` int(11) NOT NULL,
`automatisch_gesorteerd` varchar(255) NOT NULL,
`automatisch_gesorteerd_richting` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;");

mysql_query("INSERT INTO basis_instellingen VALUES ('100', 'voornaam', 'desc');");

etc... voor de hele db backup?


Bedankt!

13 antwoorden

Gesponsorde links
Offline Sam - 14/01/2011 14:24
Avatar van Sam PHP expert Het #-teken is een comment in MySQL. Alles wat daarachter staat wordt dus automatisch genegeerd in een query.

Meestal kan je je backup zo instellen dat hij van elke tabel appart een backup maakt en kan je ook kiezen ofdat die DROP TABLE IF EXISTS moet worden toegevoegd of niet.
Offline Beirensg - 14/01/2011 15:21
Avatar van Beirensg HTML beginner waarom zou je geen droptable gebruiken. Indien je een backup moet terugplaatsen wil je toch de foute tabellen overschrijven of niet?
Offline shamrock - 14/01/2011 16:13
Avatar van shamrock Lid Ja, het liefste wel, alleen als ik rechtstreeks een create trable + droptable laat uitvoeren via php werkt het niet, laat ik dat droptable weg dan voegt hij de tabel wel in.

En @sam, een php script op de site maakt een backup van alle bestanden + db tabellen, dus hier kan ik verder neits aan veranderen (de opmaak).

Dit wordt zo gedaan:

  1. $sqldump = $backup->Execute(MSB_STRING,"",false);
Offline Beirensg - 14/01/2011 16:26
Avatar van Beirensg HTML beginner PHP is normaal in staat om alle queries door te zenden naar SQL (afhankelijk van u rechten, kan je dan de droptable uitvoeren of niet).

maar ik denk dat het probleem ligt in het php-scriptje. persoonlijk zou ik opteren voor mysqldump.
aanmaken van backup:
  1. $command = "mysqldump -u [username] -p [password] [databasename] > [backupfile.sql]";
  2. system($command);

terugplaatsen van backup
  1. $command = "mysql -u [username] -p [password] [databasename] < [backupfile.sql]";
  2. system($command);


Dit werkt goed.

Indien je echt jouw backup wilt gebruiken, zal je een scriptje moeten schrijven om alle regels met een # te verwijderen. En ook alle regels met drop table tot en met de eerste ";" verwijderen.

Openen van een bestand in php:

  1. $handle = fopen ("/tmp/inputfile.txt", "r");
  2. while (!feof ($handle)) {
  3. $buffer = fgets($handle);
  4. echo $buffer;
  5. }
  6. fclose ($handle);


nu kan je per regel scannen (bvb met regular exprassions) of deze regel begint met # of met drop table. Indien niet schrijf je deze weg.
Offline shamrock - 14/01/2011 16:31 (laatste wijziging 20/01/2011 13:59)
Avatar van shamrock Lid Ok bedankt, ga eerst eens naar jouw eerste optie kijken, lukt dat niet dan probeer ik de laatste optie

Heb de eerste opties geprobeerd, maar krijg geen output?
Ik lees dit vaker maar zie geen oplossing?
Offline Beirensg - 20/01/2011 17:24
Avatar van Beirensg HTML beginner Er kunnen redelijk wat problemen optreden met system en mysqldump, maar in principe werkt het (lees als alles goed is ingesteld). volgende elementen kunnen misschien helpen:

Wordt er een lege dump gemaakt of helemaal niets?
Heb je geprobeerd echo system(...) uit te voeren om te zien welke error hij geeft?
Kan je de volledig mysqldump-commando eens posten (laat username en password maar blank, ik veronderstel dat deze juist zijn )
Offline shamrock - 21/01/2011 11:12 (laatste wijziging 21/01/2011 11:33)
Avatar van shamrock Lid echo system(); blijft leeg

Dit is mijn code:

  1. $sqldump = 'mmysql -u ' . $db['username'] . ' -p ' . $db['password'] . ' ' . $db['database'] . '';


Ik heb > name.sql weggelaten omdat het later ingepakt wordt in een rar bestand.

Wanneer ik dit erbij zet werkt het ook niet (zelfde als zonder >naam.sql)
Hier zal het dus niet aan liggen (neem ik aan)

$db['waardes'] kloppen... deze heb ik geëchood en zijn correct


Als ik echo $sqldump doe krijg ik deze te zien met waarden.

doe ik echo system($sqldump); blijft de output leeg
Offline Beirensg - 21/01/2011 11:33
Avatar van Beirensg HTML beginner is de system-command wel geenabled op de server? hiervoor kijk je best in php.ini naar de lijn met "disable_functions", kijk of system hierin staat.
Offline shamrock - 21/01/2011 11:41
Avatar van shamrock Lid http://gps.kk-sound.nl/phpinfo.php

Zie hier... zie dit nergens staan (system disables of enabled ofzo)...
Offline Beirensg - 21/01/2011 11:58
Avatar van Beirensg HTML beginner Ik zie dat safe_mode on staat, dit betekent dat system sowieso niet toegelaten is (hij zou wel een error moeten teruggeven). indien je geen toegang hebt tot php.ini, zal je een andere oplossing voor backups moeten vinden.

Dit helpt misschien: http://www.noup...abase.html

Deze url geeft enkele andere mogelijkheden; bvb de SELECT... INTO OUTFILE kan handig zijn, maar heeft minder mogelijkheden als sqldump 
Offline shamrock - 21/01/2011 12:48 (laatste wijziging 21/01/2011 12:50)
Avatar van shamrock Lid Ik heb een ander script gevonden, werkt goed en kan via mijn eigen script deze ook automatisch laten terugzetten.

Dit is de code:

  1. <?PHP
  2. header('Content-type: text/plain');
  3. header('Content-Disposition: attachment; filename="'.$mysql_host."_".$mysql_database."_".date('YmdHis').'.sql"');
  4. echo "<?PHP\n";
  5. _mysqldump($mysql_database);
  6. echo "?>";
  7. ?>


Als ik de pagina open wordt een bestand gedownload met de totale backup.

Het probleem is dat ik niet wil dat hij gedownload wordt maar in een rar gezet wordt (samen met alle andere bestanden).
Als ik headers weg doe en ipv echo de code een variabele geef, dan blifjt _mysqldump($mysql_database); leeg...


<?PHP?> wordt dan de output (zonder de middelste functie...

hoe kan ik dit oplossen?
Bedankt
Offline Beirensg - 25/01/2011 11:26
Avatar van Beirensg HTML beginner volgens mij maak je best eerst de file aan (mbv msqldump). Als je deze wil rarren met php, ga je moeilijkheden krijgen (hiervoor zijn zware omwegen nodig, rechtstreeks gaat niet omwille van licenties); daarom kies je beter voor zip (op de website van php vind je meer uitleg).

na het aanmaken van de file + eventuele compressie + saven op de server kan je volgende headers doorgeven aan de client:
  1. <?php
  2. header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
  3. header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
  4. header('Content-disposition: attachment; filename='.$_GET["filename"].'.zip');
  5. readfile($_GET["filename"].'.zip');
  6. ?>

hier geef ik de filename door via de url naar het php-bestand.
Offline shamrock - 25/01/2011 13:35
Avatar van shamrock Lid bedankt, bedoelde idd zip

maar heb het al!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.224s