backup database
Ik heb de volgende code van deze website gehaald.
Met deze code maak ik een backup van mijn database, werkt perfect!
Code (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?PHP
/* Mysql Backupper
* Backup your MySql Without PhpMyAdmin.
*/
// config hier mag je dingen veranderen
$cfg['naam'] = ''; // inlognaam mysql
$cfg['ww'] = ''; // wachtwoord mysql
$cfg['host'] = 'localhost'; // host, meestal localhost
$cfg['db'] = ''; // database
$cfg['bes'] = 1; // schrijven in bestand, 1=ja,0=nee
$cfg['view'] = 2; // 0=query's weergeven+error's, 1= alleen querys,2= alleen errors,3=niks
$cfg['str'] = 1; // structuur, 1=ja,2=nee
$cfg['data'] = 1; // data, 1=ja,0=nee
$cfg['dbs'] = 1; // met create db?, 1=ja,0=nee
// een data array
$key = array("PRI"=>"PRIMARY KEY","UNI"=>"UNIQUE KEY","MUL"=>"KEY",""=>"");
// connect to database
$err = array(); // error array
$arr = array(); // stuctuur array
// connect to host
if(mysql_connect($cfg['host'],$cfg['naam'],$cfg['ww'])) {
// select db
if(!mysql_select_db($cfg['db'])) {
$err[] = 'Verbinding DB mislukt';
}
} else {
// host mislukt
$err[] = 'Verbinding host mislukt';
}
/*
* Backupper
*/
// DIT NIET VERWIJDEREN
$querys[] = "-- Generate By CMS-Backuppern";
$querys[] = "-- MySql Dumpn";
$querys[] = "-- n";
$querys[] = "-- Database: ".$cfg['db']."n";
$querys[] = "-- ";
if($cfg['view'] <= 1) {
echo "<pre>";
for($i=0;$i<count($querys);$i++) {
echo $querys[$i];
}
echo "</pre>";
}
if($cfg['dbs'] == 1) {
if($cfg['bes'] == 1) {
$querys[] = "-- n";
$querys[] = "-- Create Database n";
$querys[] = "CREATE DATABASE ".$cfg['db'].";n";
$querys[] = "USE ".$cfg['db'].";n";
$querys[] = "-- Rest nn";
}
echo "-- n";
echo "-- create Database";
echo "CREATE DATABASE ".$cfg['db'].";n";
echo "USE ".$cfg['db'].";n";
echo "-- rest nn";
}
// verkrijg tables
$get_tab = mysql_query("SHOW TABLES FROM ".$cfg['db']);
// while tab
while($x = mysql_fetch_array($get_tab)) {
// structuur vars
$s = "-- n";
$s .= "-- Structuur van tabel: ".$x[0]."n";
$s .= "-- nn";
$s .= "CREATE TABLE ".$x[0]." ( n";
$k = ''; // keys
// get tabelen
$get_v = mysql_query("SHOW COLUMNS FROM ".$x[0]." FROM ".$cfg['db']);
// EIGENWIJS DING
while($iks = mysql_fetch_assoc($get_v)) {
$temp = $iks['Field'];
// zet in array voor de data
if(!isset($velden[$x[0]][$temp])) {
$velden[$x[0]][$temp] = $temp;
}
// table maken, stuctuur
if($cfg['str'] == 1) {
if(!isset($arr[$x[0]][$ike['Field']])) {
// in array proppen
$arr[$x[0]][$iks['Field']] = $iks['Field'];
// null berekenen
$null = (!empty($iks['Null']) && $iks['Null'] == "YES") ? "NULL" : "NOT NULL";
// bij de string proppen
$s .= $iks['Field']." ".$iks['Type']." ".$null." ".$iks['Extra'].",n";
// als key niet leeg is
if(!empty($iks['Key'])) {
$k .= $key[$iks['Key']]." (".$iks['Field']."),n";
}
}
}
}
// structuur weergeven
$var = $s.substr($k,0,-2)."n);";
if($cfg['view'] <= 1 && $cfg['str'] == 1) {
echo '<pre>'.$var.'</pre>';
}
// structuur in bestand
if($cfg['str'] == 1) {
$querys[] = "n";
$querys[] = $var;
$querys[] = "n";
}
// data
$data = mysql_query("SELECT * FROM ".$x[0]);
// zet alla data in array's
while($z = mysql_fetch_array($data)) {
// velden en data
$imkeys = ""; // keys str
$imdata = ""; // data str
foreach($velden[$x[0]] as $val) {
// zet data in een str
$imkeys .= $val.",";
$imdata .= "'".$z[$val]."',";
}
// query maken
$q = "INSERT INTO ".$x[0]." (".substr($imkeys,0,-1).") VALUES (".substr($imdata,0,-1).");n";
// weergeven
if($cfg['view'] <= 1 && $cfg['data'] == 1) {
echo $q.'<br>';
}
// query in bestand
if($cfg['data'] == 1) {
$querys[] = $q;
}
// dellen
unset($q);
} // data
} // grote while, tables
// bestand afhandeling
if($cfg['bes']==1) {
$dat = '';
// openen
$fp = fopen($cfg['db'].'.sql','w');
// geen bestand aanmaken
if(!$fp) {
$err[] = 'Kan bestand niet openen';
}
// inladen in var
foreach($querys as $content) {
$dat .= $content;
}
// schrijven
$write = fwrite($fp,$dat);
// als schrijven is mislukt
if(!$write) {
$err[] = 'Kan niet in bestand schrijven';
}
// sluiten
fclose($fp);
}
// error afhandeling
if(count($err) == 0) {
echo '<br><b>Exporteren is Gelukt</b><br>';
} else {
if($cfg['view'] == 0 || $cfg['view'] == 2) {
echo 'Deze errors zijn opgetreden<br>';
foreach($err as $val) {
echo $val .'<br/>';
}
}
}
/*
* Einde backupper
*/
?>
/* Mysql Backupper
* Backup your MySql Without PhpMyAdmin.
*/
// config hier mag je dingen veranderen
$cfg['naam'] = ''; // inlognaam mysql
$cfg['ww'] = ''; // wachtwoord mysql
$cfg['host'] = 'localhost'; // host, meestal localhost
$cfg['db'] = ''; // database
$cfg['bes'] = 1; // schrijven in bestand, 1=ja,0=nee
$cfg['view'] = 2; // 0=query's weergeven+error's, 1= alleen querys,2= alleen errors,3=niks
$cfg['str'] = 1; // structuur, 1=ja,2=nee
$cfg['data'] = 1; // data, 1=ja,0=nee
$cfg['dbs'] = 1; // met create db?, 1=ja,0=nee
// een data array
$key = array("PRI"=>"PRIMARY KEY","UNI"=>"UNIQUE KEY","MUL"=>"KEY",""=>"");
// connect to database
$err = array(); // error array
$arr = array(); // stuctuur array
// connect to host
if(mysql_connect($cfg['host'],$cfg['naam'],$cfg['ww'])) {
// select db
if(!mysql_select_db($cfg['db'])) {
$err[] = 'Verbinding DB mislukt';
}
} else {
// host mislukt
$err[] = 'Verbinding host mislukt';
}
/*
* Backupper
*/
// DIT NIET VERWIJDEREN
$querys[] = "-- Generate By CMS-Backuppern";
$querys[] = "-- MySql Dumpn";
$querys[] = "-- n";
$querys[] = "-- Database: ".$cfg['db']."n";
$querys[] = "-- ";
if($cfg['view'] <= 1) {
echo "<pre>";
for($i=0;$i<count($querys);$i++) {
echo $querys[$i];
}
echo "</pre>";
}
if($cfg['dbs'] == 1) {
if($cfg['bes'] == 1) {
$querys[] = "-- n";
$querys[] = "-- Create Database n";
$querys[] = "CREATE DATABASE ".$cfg['db'].";n";
$querys[] = "USE ".$cfg['db'].";n";
$querys[] = "-- Rest nn";
}
echo "-- n";
echo "-- create Database";
echo "CREATE DATABASE ".$cfg['db'].";n";
echo "USE ".$cfg['db'].";n";
echo "-- rest nn";
}
// verkrijg tables
$get_tab = mysql_query("SHOW TABLES FROM ".$cfg['db']);
// while tab
while($x = mysql_fetch_array($get_tab)) {
// structuur vars
$s = "-- n";
$s .= "-- Structuur van tabel: ".$x[0]."n";
$s .= "-- nn";
$s .= "CREATE TABLE ".$x[0]." ( n";
$k = ''; // keys
// get tabelen
$get_v = mysql_query("SHOW COLUMNS FROM ".$x[0]." FROM ".$cfg['db']);
// EIGENWIJS DING
while($iks = mysql_fetch_assoc($get_v)) {
$temp = $iks['Field'];
// zet in array voor de data
if(!isset($velden[$x[0]][$temp])) {
$velden[$x[0]][$temp] = $temp;
}
// table maken, stuctuur
if($cfg['str'] == 1) {
if(!isset($arr[$x[0]][$ike['Field']])) {
// in array proppen
$arr[$x[0]][$iks['Field']] = $iks['Field'];
// null berekenen
$null = (!empty($iks['Null']) && $iks['Null'] == "YES") ? "NULL" : "NOT NULL";
// bij de string proppen
$s .= $iks['Field']." ".$iks['Type']." ".$null." ".$iks['Extra'].",n";
// als key niet leeg is
if(!empty($iks['Key'])) {
$k .= $key[$iks['Key']]." (".$iks['Field']."),n";
}
}
}
}
// structuur weergeven
$var = $s.substr($k,0,-2)."n);";
if($cfg['view'] <= 1 && $cfg['str'] == 1) {
echo '<pre>'.$var.'</pre>';
}
// structuur in bestand
if($cfg['str'] == 1) {
$querys[] = "n";
$querys[] = $var;
$querys[] = "n";
}
// data
$data = mysql_query("SELECT * FROM ".$x[0]);
// zet alla data in array's
while($z = mysql_fetch_array($data)) {
// velden en data
$imkeys = ""; // keys str
$imdata = ""; // data str
foreach($velden[$x[0]] as $val) {
// zet data in een str
$imkeys .= $val.",";
$imdata .= "'".$z[$val]."',";
}
// query maken
$q = "INSERT INTO ".$x[0]." (".substr($imkeys,0,-1).") VALUES (".substr($imdata,0,-1).");n";
// weergeven
if($cfg['view'] <= 1 && $cfg['data'] == 1) {
echo $q.'<br>';
}
// query in bestand
if($cfg['data'] == 1) {
$querys[] = $q;
}
// dellen
unset($q);
} // data
} // grote while, tables
// bestand afhandeling
if($cfg['bes']==1) {
$dat = '';
// openen
$fp = fopen($cfg['db'].'.sql','w');
// geen bestand aanmaken
if(!$fp) {
$err[] = 'Kan bestand niet openen';
}
// inladen in var
foreach($querys as $content) {
$dat .= $content;
}
// schrijven
$write = fwrite($fp,$dat);
// als schrijven is mislukt
if(!$write) {
$err[] = 'Kan niet in bestand schrijven';
}
// sluiten
fclose($fp);
}
// error afhandeling
if(count($err) == 0) {
echo '<br><b>Exporteren is Gelukt</b><br>';
} else {
if($cfg['view'] == 0 || $cfg['view'] == 2) {
echo 'Deze errors zijn opgetreden<br>';
foreach($err as $val) {
echo $val .'<br/>';
}
}
}
/*
* Einde backupper
*/
?>
Maar nu wil ik er enkele wijzigingen in maken en dit lukt me helaas niet...
1. Ik zou graag aan willen geven in welke map het opgeslagen moet worden
2. Graag zou ik achter de bestandsnaam (nu de naam van de database) een toevoeging van datum en tijd willen
3. (minder belangrijk, maar zou leuk zijn) na het backuppen een knop met "backup downloaden" en dat je de backup dan naar een lokale schijf kunt downloaden (mag als .txt maar ook als .zip)
Kan iemand me hiermee helpen / de weg wijzen...?
Alvast bedankt voor jullie hulp!
Groeten Albert
Gewijzigd op 01/01/1970 01:00:00 door Albert Dijkstra
Quote:
Laat ik je uit de droom halen, het is technisch niet mogelijk om met een php-script een backup van een database te maken. Daar kan zoveel mis gaan dat er nooit een garantie is dat de backup is gelukt.Met deze code maak ik een backup van mijn database, werkt perfect!
Databases hebben daarvoor aparte programma's die je via de commandline kunt uitvoeren. In het geval van MySQL is dat mysqldump.
Je zou ook eens in de code van bijv. een MySQL manager (online) kunnen kijken hoe die dat aanpakt?
Bovenstaande code loopt in elk geval in het honderd op het moment dat er users data toevoegen, bijwerken of updaten. Dat kan (afhankelijk van de actie en het datamodel) zorgen voor een corrupte backup. En daar kom jij pas achter op het moment dat je met de handen in het haar zit en je de backup nodig hebt...
Er is maar 1 manier om in MySQL een backup te maken: mysqldump.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Zie de url voor het script: www.dancesign.nl/backup.txt
Ronald schreef op 10.01.2008 13:28:
Nee, dat doet het niet, zie mijn vorige reacties.en dat maakt perfect een back-up.
Tip: Zet eens een load- & stresstesttool aan het werk met flink wat gelijktijdige users die gegevens invoeren en verwijderen. Probeer dan gelijktijdig eens een backup te maken en ga vervolgens deze backup terugzetten.
Veel succes, maar dit gaat vroeg of laat altijd fout. Oorzaak: De database wordt niet gelockt en/of de database is te groot voor het php-script.
pgFrank schreef op 10.01.2008 13:35:
Tip: Zet eens een load- & stresstesttool aan het werk met flink wat gelijktijdige users die gegevens invoeren en verwijderen. Probeer dan gelijktijdig eens een backup te maken en ga vervolgens deze backup terugzetten.
Veel succes, maar dit gaat vroeg of laat altijd fout. Oorzaak: De database wordt niet gelockt en/of de database is te groot voor het php-script.
Ronald schreef op 10.01.2008 13:28:
Nee, dat doet het niet, zie mijn vorige reacties.en dat maakt perfect een back-up.
Tip: Zet eens een load- & stresstesttool aan het werk met flink wat gelijktijdige users die gegevens invoeren en verwijderen. Probeer dan gelijktijdig eens een backup te maken en ga vervolgens deze backup terugzetten.
Veel succes, maar dit gaat vroeg of laat altijd fout. Oorzaak: De database wordt niet gelockt en/of de database is te groot voor het php-script.
Kan je niet dan doormiddel van een cronjob die database backup maken om 3 uur s'nachts en dan zorgen dat er bijv. tussen 2:55 en 3:05 geen database verkeer mogenlijk is?
Als jij een script maakt die het commando mysqldump aanroept en deze dmv een cron laat aanroepen wel. Een database wordt volgens mij vanzelf gelockt als die functie wordt aangeroepen.
1) de cronjob heeft gedraaid
2) er geen users meer op de database zitten
3) de backup is gelukt
4) de backup tijdig klaar is
5) de cronjob heeft gedraaid
6) de database weer is vrijgegeven
En ik vrees dat het rijtje niet compleet is, er kan vast nog veel meer misgaan.
PHP is niet geschikt om backups te maken, doe dat dan ook niet. mysqldump is niet voor niks gebouwd. Wanneer je dit gebruikt, kan er eigenlijk alleen nog maar wat misgaan met de cronjob, maar dat kun je binnen een paar uur constateren (altijd controleren of de backup is gelukt!) en dan evt. alsnog met het handje de procedure opstarten.
Dat er een kleine kans is dat de backup mislukt neem ik voor mijn rekening.
Aangezien:
1. Ik ook backups maak van de complete server
2. Af en toe backups maak via PHPMyAdmin
3. Ik vaak deze backups maak als er geen klanten ingelogd zijn in het systeem (en er dus op dat moment weinig kans is op bewerkingen/toevoegingen in de database)
-=
@Ronald, jij gebruikt dat system waar jij een link van gaf toch? dit werkt goed? wat wordt de bestandsnaam van de backups? (ps. geweldige toevoeging die e-mail!)
Ga hem in het weekend even proberen!
=-
Mochten jullie nog meer tips heben, welkom!
Code (php)
1
2
3
4
5
2
3
4
5
<?php
// openen
$fp = fopen('backup/'.$cfg['db'].'.sql','w');
// geen bestand aanmaken
?>
// openen
$fp = fopen('backup/'.$cfg['db'].'.sql','w');
// geen bestand aanmaken
?>
'backup' is dat de map waar je backup bestand in geplaats wordt. Mocht je dit nog willen, dit staat in je eigen script [regel 146].
ps. in het script wat ik je gaf, staat de volgende regel
hiermee wordt de bestandsnaam opgebouwd. Eerst de naam dbase.db[23012008] en daarna de tijd.
Gewijzigd op 01/01/1970 01:00:00 door Ronald Vesterink
Ik heb het scriptje dat je hebt is voorgesteld (www.dancesign.nl/backup.txt), maar ik krijg onderstaande foutmelding:
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
Notice: Undefined variable: mpintable in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 94
De back-up is succesvol gemaakt.
Notice: Undefined variable: type in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 127
Notice: Undefined variable: encoding in C:\server\Apache2\htdocs\test\1backup\backup_2.php on line 128
Heb jjij dezelfde ervaring gehad? Heb ik iets niet goed aangevuld in het scriptje?