[PHP/SQL] Tips bij het maken van backup script?

Pagina: 1
Acties:
  • 214 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met het maken van een backup script, en dan bedoel ik niet door middel van exec/system :)

Ik wil namelijk de backup van mijn database direct downloaden vanaf m'n website, vandaar dat ik het via Query's doe. En aangezien het nogal wel eens fout wil(de) gaan met PhpMyAdmin's backup functie; Zijn er bepaalde punten waar ik nog op moet letten? Wat betreft er allemaal eventueel fout kan gaan, en meer van dat soort 'valkuilen'?

Momenteel ben ik zover dat m'n backup er ongeveer zo uit ziet;

In het begin:

code:
1
USE database;


Daarna per tabel:

code:
1
2
3
4
5
6
7
8
9
# STRUCTUUR VAN TABEL `admin`

DROP TABLE IF EXISTS admin;

CREATE TABLE `...` (
...
)

INSERT VALUES # enzovoorts...


Alvast bedankt

[ Voor 31% gewijzigd door Verwijderd op 09-07-2003 16:30 . Reden: Even wat duidelijker uitgewerkt ]


Acties:
  • 0 Henk 'm!

  • cybermans
  • Registratie: Maart 2001
  • Laatst online: 15:32
mysqldump optie bekijken in de mysql handleiding

Strava | Runkeeper | Endomondo (mijn leikr uploads)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nu zit ik een beetje te testen in PhpMyAdmin of mijn INSERT query's correct werken. En nu heb ik in één van die INSERT query's een aanhalingsteken (') staan met een slash. Zoals het hoort dus. Maar nu voer ik 'em in PhpMyAdmin in, en dan haalt ie die slash weg! Is dit een fout van mij (extra slashes, werkt niet, wat wel?) of is dit een fout van PhpMyAdmin (en dus één van de redenen waarom ik het niet graag gebruik als backup-er)?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Tip: ik heb een backup(terugzet)script gemaakt dat vastliep omdat het meer dan 8MB geheugen innam. Het sql-script dat uitgevoerd moest worden, was ongecomprimeerd namelijk groter dan 8MB. Misschien is dat bij jou niet relevant, maar als dat wel het geval is; ik heb het opgelost door het bestand niet in zijn geheel te laden, maar per regel, en die dus ook per regel op de database afgevuurd.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus je hebt een soort buffer gebruikt? Daar heb ik hier wel eens meer over gelezen, bedankt voor de tip :)

Want m'n database zou zeer zeker wel groter worden dan 8 mb en ik ben ook van plan om een scriptje te maken wat de betreffende dump weer in db zet.

Nu ik het er toch over hebt, hoe doe je zoiets? Aangezien je een dump niet volledig in een query kunt droppen (zeker niet die create table's en dergelijke)?

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Aangezien mysql_query maar één query per keer aan kan, zul je een loopje moeten maken dat de sql-statements één voor één op de database afschiet. In dat loopje zul je elke keer één regel uit je tekstbestand moeten halen (met gets) om de maximaal gebruikte hoeveelheid geheugen te beperken.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil het bestand liever niet op de server plaatsen, aangezien ik bij een hosting zit en een limiet van 40 mb heb, kan dit limiet overschreden worden als er én een tekstbestand van zoveel mb op staat en een database én de website zelf met zoveel mb.

Zou dit niet anders kunnen met dus een string met daarin de dump?

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 08:46

pietje63

RTFM

ik ben er zelf ook mee bezig geweest en heb alles als csv opgeslagen (laten slaan) kun je het nog in excel bekijken en restore script zoekt simpelweg naar punt-komma's maakt daar een array van en voegt dat toe

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 14:44
Je kunt mysqldump toch in ook in php aanroepen zodat de output naar je browser gaat (File / Save as..)? Is misschien eventjes een aanslag op je /tmp/ en/of memory maar je eigen hostingruimte blijft dan gespaard.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmmm, pietje63 geeft wel aan dat het op zijn manier erg gemakkelijk gefixt kan worden. Alleen wil ik het dus eigenlijk niet opslaan op de server en download ik dus de backup vanaf mijn server en is het idee dat wanneer ik de backup zou willen terug zetten, dat ik dat kan doen door middel van een formuliertje waar ik de file selecteer en dat deze dus automatisch verwerkt wordt (terug gezet wordt).

Maar nu snap ik niet echt de bedoeling van Nescafe? Tuurlijk doe ik het ook op de manier die jij hierboven noemt, maar het gaat me nu om de verwerking ervan om die backup terug te zetten :)

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 08:46

pietje63

RTFM

file op laten slaan -> is dat niet een kwestie van gewoon niet wegschrijven.

bestand = backup.csv.php -> dit geeft bij aanroepen alleen de csv file -> linken; rechtermuisknop sla op als en dan het php stuk weghalen -> dan staat de grootte van het bestand geen moment op je hosting

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Is 't dan niet echt overbodig om 'em op te slaan als csv? De content blijft iig hetzelfde. Of ik moet je punt niet snappen...

Maar aangezien er geen ';' achter de CREATE TABLE's staat, zou ik deze tot alleen gewoon maar hoeven toe te voegen. Dan de gehele file in een array te stoppen door te splitsen op ';'. Dan een loop maken waarin ik er een trim() over heen gooi en het dan in mysql_query() laat uitvoeren?

Ik ga het iig eens proberen :)

Edit: Ik heb het nu zo opgelost, en het werkt prima. Ik plak de content van mijn (gedownloade) backup in een tekstvak. Deze submit ik, en de rest gaat van zelf. Zonder iets ook maar te hoeven uploaden!

[ Voor 23% gewijzigd door Verwijderd op 10-07-2003 12:09 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12-09 10:23

ripexx

bibs

Verwijderd schreef op 10 juli 2003 @ 11:02:
Is 't dan niet echt overbodig om 'em op te slaan als csv? De content blijft iig hetzelfde. Of ik moet je punt niet snappen...

Maar aangezien er geen ';' achter de CREATE TABLE's staat, zou ik deze tot alleen gewoon maar hoeven toe te voegen. Dan de gehele file in een array te stoppen door te splitsen op ';'. Dan een loop maken waarin ik er een trim() over heen gooi en het dan in mysql_query() laat uitvoeren?

Ik ga het iig eens proberen :)

Edit: Ik heb het nu zo opgelost, en het werkt prima. Ik plak de content van mijn (gedownloade) backup in een tekstvak. Deze submit ik, en de rest gaat van zelf. Zonder iets ook maar te hoeven uploaden!
Deze optie is leuk maar hou er wel rekening mee dat bij grotere db's dit niet gaat werken. Er staat in PHP een opties die je max post grote defineerd, dus er is wel om heen te werken maar echt netjes is het niet. :)

Oja dit is mijn backup scriptje wat ik nog steeds gebruik: [rml][ PHP] mysqldump[/rml]

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar ik blijf dan met het probleem zitten dat die backup op de server komt te staan en dat ie dus mogelijk veel ruimte is beslag neemt. Als het met deze methode niet meer lukt, zal ik wel een andere mogelijkheid bekijken.

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Verwijderd schreef op 10 July 2003 @ 11:02:
Edit: Ik heb het nu zo opgelost, en het werkt prima. Ik plak de content van mijn (gedownloade) backup in een tekstvak. Deze submit ik, en de rest gaat van zelf. Zonder iets ook maar te hoeven uploaden!
Ik hoop dat het niet al te gevoelige data is aangezien het erg secure klinkt. :/

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12-09 10:23

ripexx

bibs

Verwijderd schreef op 10 July 2003 @ 15:12:
Maar ik blijf dan met het probleem zitten dat die backup op de server komt te staan en dat ie dus mogelijk veel ruimte is beslag neemt. Als het met deze methode niet meer lukt, zal ik wel een andere mogelijkheid bekijken.
In mijn script wordt de data zowel lokaal als remote dmv ftp opgeslagen, je kan het eenvoudig aanpassen door na een succesvolle ftp de lokale file te wissen. :) Nadeel is dat je op een andere lokatie een ftpserver moet hebben draaien. Andere optie is het bestand te mailen, maar dan loop je weer tegen problemen aan met maximale bestandsgrote van attachments. Daarnaast wordt in mijn script de file gezipt zodat de bestandsgrote ongeveer 10% van het orgineel is. Kijk ook eens in de source van phpmyadmin, daar zit ook een db dump optie in. :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie in jouw script geen enkele vorm waarin je het bestand zipt, dus...? :)

En 10% van de werkelijke grootte, is dat niet een beetje overdreven? Vooral als het slechts 1 bestand is heeft zippen meestal weinig nut.

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12-09 10:23

ripexx

bibs

Damn, wacht ff...

Dit is een include een aantal functies worden dus ergens anders vandaan aangeroepen maar dat maakt voor de werking niet zoveel uit.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php

/*
   Inlude voor het regelmatig backuppen van de database
   
   Vergelijk de datum van laatset backup met huidige, als verschil
   te groot is dan backup naar server, plus eventuele email, 
   copy naar lokale server
   
   De volgende data komt uit andere bestanden:
   $database -> naam van de betreffende database
   database connectie
*/

// Vastgestelde variabelen

$backupdir = "/home/dereigers/backup/";
$when = "86400";   // Tijd in sec 24h = 60*60*24 = 86400s
$datum = date("Ymd");

// defineren van file names (format = dereigers-20021025.sql 
/ en dereigers-20021025.tar.gz
$backup_file = $backupdir;
$backup_file .= $database;
$backup_file .= "-";
$backup_file .= $datum;
$ext = ".sql";
$bf = $backup_file.$ext;
$extzip = ".tar.gz";
$bz = $backup_file.$extzip;

$send_mail = "0"; // Als 0 dan geen mail, als 1 wel mail
$mail_adres = "email";
$mail_subject = "Backup status/log database backup";

$do_ftp = "0"; // Als 0 dan geen ftp, als 1 dan wel ftp
$ftp_server = "*";
$ftp_user = "*";
$ftp_pass = "*";


// Get latest backup date

$backup_query = mysql_query("SELECT * FROM backup ORDER BY backup.bid DESC;")
            or die ("Invalid Backup query");
$backup_row = mysql_fetch_array($backup_query);
$calctime = $when + $backup_row["tijd"];
$tijd = time();
$dif = $tijd - $calctime; 
if($dif > "0")
{
    // do dump van database naar file
    system("mysqldump -u xx -pxx $database > $bf");
        
    // do compress(tar/gz) van dump
    exec("tar -cvzf $bz $bf");
    
    // note: alleen check op bestaan van file, niet op inhoud
    if(file_exists($bz)){
    
    // if tarring is succesfull, delete old sql file
    exec("rm $bf");
    
    // insert log into db   
    mysql_query(" INSERT INTO `backup` (`tijd`, `datum`, `bid`) 
                         VALUES ('$tijd', NOW('0000-00-00'), '');")
            or die ("Invalid insert backup query");
    
    };
    
    
    if($do_ftp == "1")
    {
        
        $conn = ftp_connect($ftp_server); 
        $login_result = ftp_login($conn, $ftp_user, $ftp_pass); 

        // check connection
        if ((!$conn) || (!$login_result)) 
        { 
                $ftp_log = "Failed to connect to ftp server or bad login";
            }else{
            
                    
                // upload backup
                $upload = ftp_put($conn, "backup.tar.gz", $bz, FTP_ASCII); 

            if (!$upload) 
            { 
                    $ftp_log = "Upload failed";
                } else {
                $ftp_log = "Bestand is verstuurd";
                };
            };

        ftp_quit($conn); 

    };
    
    
    if($send_mail == "1")
    {
    
    // Verzend email dat backup is gedaan
    $mess = "Op ";
    $mess .= geef_dag_van_week();
    $mess .= date(" j ");
    $mess .= geef_maand_van_jaar();
    $mess .= date(" Y, H:i");
    $mess .= " is de volgende database: $database";
    $mess .= "gebackupped en heeft de volgende naam gekregen: $bz ";
    $mess .= "\r\n\nFTP log: $ftp_log";
    
    Mail($mail_adres, $mail_subject, $mess, "From: $mail_adres\r\n");
        
    };

    
};

// Doe niets :)

?>

Oja passes en servernames etc zijn allemaal verwijderd. :)

Het script is ondertussen hier en daar iets aangepast maar verder is de werking nog redelijk hetzelfde. O.a. dus de tar.gz compressie toegevoegd. DB is op het moment ongeveer 9 MB en deze groeit gestaagd, dus echt veel noodzaak is er voor mij niet om het zaakje aan te passen. Daarnaast komt er dit jaar een nieuwe db waardoor de grote niet zo snel meer zal groeien. :)

[ Voor 23% gewijzigd door ripexx op 10-07-2003 16:19 . Reden: minder layout verprutsend :) ]

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar nu heb je nog geen antwoord gegeven op mijn vragen...

Maar ik wil liever van je weten hoe jij het denkt voor elkaar te krijgen dat 1 enkel bestand dat gezipt wordt tot 10% van de werkelijke grootte kan worden gecomprimeerd...

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 12-09 10:23

ripexx

bibs

Met behulp van mysqldump maak ik een plaintext bestand met daarin alle tabel definities en rijen welke in de tabel voor komen. Dit bestand wordt door middel van tar.gz verkeint tot ongeveer 10 van de orginele grote.

Voorbeelden:
Dump filetar.gzcompressie
902 KB7914KB11,4%
1811 KB14352 KB12,6%


De inhoud van de dumpfile ziet er zo ongeveer uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE backup (
  tijd int(14) NOT NULL default '0',
  datum date NOT NULL default '0000-00-00',
  bid int(13) NOT NULL auto_increment,
  PRIMARY KEY  (bid)
) TYPE=MyISAM;

--
-- Dumping data for table 'backup'
--


INSERT INTO backup VALUES (1031030997,'2002-09-06',14);
INSERT INTO backup VALUES (1031030221,'2002-09-06',13);
INSERT INTO backup VALUES (1031528208,'2002-09-09',18);
INSERT INTO backup VALUES (1031699388,'2002-09-11',19);

Dit is direct weer in te lezen via elk programma, en kan dus via de commandline, phpmyadmin, php enz. Ik hoop dat het nu een beetje duidelijk is. Je ziet dat er veel repeterende stukken tekxt in het bestand staan en daardoor is dit soort bestanden redelijk goed te zippen naar een kleiner formaat.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar t'is geen 10% van de werkelijke grootte :P

Iig bedankt voor de moeite en het beantwoorden van m'n vraag :)
Pagina: 1