Database te groot
Ik wil graag mij MySQL database elke dag automatisch laten updaten, en de backup gemailed hebben. Nu heb ik een PHP script gevonden wat ik kan instellen als Cronjob, en eigenlijk wekt het perfect.
Ineens is het script gaan klagen met:
Fatal error: Maximum execution time of 30 seconds exceeded in /home/theschoo/public_html/cronjobs/db-backups.php on line 81
Naar mijn idee komt dit omdat het langer dan 30 seconden duurt voor het script om de database te backuppen. Mijn totale database is 11.3 Mb en bestaat uit 40 tabellen.
Weet iemand een manier om dit evengoed te kunnen backuppen, het maakt me niet uit hoe lang het duurt, als het maar gebeurt.
Het script is als volgt:
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
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
<?php
############### OPMERKING !! #############
## ##
## Na het aanpassen van de gegevens ##
## moet je deze php file op de server ##
## plaatsen waar je databases draaien. ##
## ##
## Je maakt dan eenvoudig een backup ##
## van je database door te surfen naar ##
## http://internetadres/db-backups.php ##
## ##
###########################################
#####################
## Eertse database ##
#####################
$dbnaam="blabla"; //naam eerste database
$dbuser="blabla"; //database gebruikersnaams
$dbpass="ojee"; //gebruikers paswoord van de database
$email="mail"; // naar wie moet de email gestuurd worden
##################################
## einde config eerste database ##
##################################
#####################
## Tweede database ##
#####################
$dbnaam1=""; //naam tweede database
$dbuser1=""; //database gebruikersnaam
$dbpass1=""; //gebruikers paswoord van de database
$email1=""; //naar wie moet de email gestuurd worden
##################################
## einde config tweede database ##
##################################
### Om nog meerdere databases toe te voegen, gebruik dan $dbnaam2 .... enz ...
if(empty($dbnaam)) {
echo "<b>Je moet de juiste gegevens verstrekken vooraleer een backup van je database te kunnen maken !</b><br>";
echo "<b>Gelieve de juiste gegevens in te vullen in db-backups.php</b><br>";
exit;
}
$site = array();
## Dit is onze eerste database
$site[0] = array("dbhost" => "localhost", "dbnaam" => "$dbnaam" , "dbuser" => "$dbuser", "dbpass" => "$dbpass", "domein" => "$dbnaam", "email" => "$email");
## Dit is onze tweede database
//$site[1] = array("dbhost" => "localhost", "dbnaam" => "$dbnaam1" , "dbuser" => "$dbuser1", "dbpass" => "$dbpass1", "domein" => "$dbnaam1", "email" => "$email1");
## Om nu verdere databases tot te voegen kopieer je gewoon de regel hierboven opnieuw, en verander
## de cijfers 1 door 2
### Vanaf hier moet je niets meer wijzigen, tenzij je weet waarmee je bezig bent :)
###
### Hier begint de backuproutine met de gegevens uit site[x]
###
for ($a = 0; $a < sizeof($site); $a++) {
$link = mysql_connect($site[$a]["dbhost"],$site[$a]["dbuser"],$site[$a]["dbpass"]) or die('No datbase conection could be establised');
mysql_select_db($site[$a]["dbnaam"],$link) or die('No datbase selected');
$query = mysql_query('SHOW TABLE STATUS') or die(mysql_error());
$sql_backup = '';
while($row = mysql_fetch_assoc($query)) {
$sql = 'SHOW CREATE TABLE '.$row['Name'].'';
$query2 = mysql_query($sql) or die(mysql_error());
$sql_backup.="\r\n#Drop table ".$row['Name']."\r\n\r\n";
$sql_backup.="\r\nDrop table if exists `".$row['Name']."`;\r\n\r\n";
$sql_backup.="\r\n#Create table ".$row['Name']."\r\n\r\n";
$out = mysql_fetch_assoc($query2);
$sql_backup.=$out['Drop Table if EXISTS'].";\r\n\r\n";
$sql_backup.=$out['Create Table'].";\r\n\r\n";
$sql_backup.="#Dump data\r\n\r\n";
$sql = 'SELECT * FROM '.$row['Name'];
$out = mysql_query($sql);
$sql_code = '';
while($code = mysql_fetch_array($out,MYSQL_ASSOC)) {
$sql_code .= "INSERT INTO ".$row['Name']." SET ";
foreach($code as $insert => $value) {
$sql_code.=$insert ."='".addslashes($value)."',";
}
$sql_code = substr($sql_code, 0, -1);
$sql_code.= ";\r\n";
}
$sql_backup.= $sql_code;
}
$unique = md5(uniqid(time()));
$message = "Backup procedure van database: ". $site[$a]["dbnaam"] ." is met succes verlopen. U vind in de bijlage een backup van de inhoud gemaakt op. ".date('d-m-Y H:i:s')."\r\n Autobot\n\n";
$headers = "From: database-backup <$email>\r\n";
$headers .= "Reply-To: Autobot <noreply@". $site[$a]["domein"] .">\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$unique."\"\r\n";
$headers .= "Content-Disposition: attachment\r\n";
$body.= "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
$body.= "--".$unique."\r\n";
$body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$body.= "Content-Transfer-Encoding: 7bit\r\n";
$body.= "\r\n";
$body.= $message ."\r\n";
$body.= "--".$unique."\r\n";
$datum=date("d-m-Y");
$body .= "Content-Type: application/octet-stream; name=" . $site[$a]["domein"] . "-$datum" . ".sql\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body.= "Content-disposition: attachment\r\n";
$body .= "\n";
$body .= chunk_split(base64_encode($sql_backup)) . "\r\n";
mail($site[$a]["email"],'Mysql backup '.date('d-m-Y H:i:s'),$body,$headers);
echo "Backup van " . $site[$a]["dbnaam"] . " is verstuurd naar " . $site[$a]["email"] . "<br/>";
flush();
}
?>
############### OPMERKING !! #############
## ##
## Na het aanpassen van de gegevens ##
## moet je deze php file op de server ##
## plaatsen waar je databases draaien. ##
## ##
## Je maakt dan eenvoudig een backup ##
## van je database door te surfen naar ##
## http://internetadres/db-backups.php ##
## ##
###########################################
#####################
## Eertse database ##
#####################
$dbnaam="blabla"; //naam eerste database
$dbuser="blabla"; //database gebruikersnaams
$dbpass="ojee"; //gebruikers paswoord van de database
$email="mail"; // naar wie moet de email gestuurd worden
##################################
## einde config eerste database ##
##################################
#####################
## Tweede database ##
#####################
$dbnaam1=""; //naam tweede database
$dbuser1=""; //database gebruikersnaam
$dbpass1=""; //gebruikers paswoord van de database
$email1=""; //naar wie moet de email gestuurd worden
##################################
## einde config tweede database ##
##################################
### Om nog meerdere databases toe te voegen, gebruik dan $dbnaam2 .... enz ...
if(empty($dbnaam)) {
echo "<b>Je moet de juiste gegevens verstrekken vooraleer een backup van je database te kunnen maken !</b><br>";
echo "<b>Gelieve de juiste gegevens in te vullen in db-backups.php</b><br>";
exit;
}
$site = array();
## Dit is onze eerste database
$site[0] = array("dbhost" => "localhost", "dbnaam" => "$dbnaam" , "dbuser" => "$dbuser", "dbpass" => "$dbpass", "domein" => "$dbnaam", "email" => "$email");
## Dit is onze tweede database
//$site[1] = array("dbhost" => "localhost", "dbnaam" => "$dbnaam1" , "dbuser" => "$dbuser1", "dbpass" => "$dbpass1", "domein" => "$dbnaam1", "email" => "$email1");
## Om nu verdere databases tot te voegen kopieer je gewoon de regel hierboven opnieuw, en verander
## de cijfers 1 door 2
### Vanaf hier moet je niets meer wijzigen, tenzij je weet waarmee je bezig bent :)
###
### Hier begint de backuproutine met de gegevens uit site[x]
###
for ($a = 0; $a < sizeof($site); $a++) {
$link = mysql_connect($site[$a]["dbhost"],$site[$a]["dbuser"],$site[$a]["dbpass"]) or die('No datbase conection could be establised');
mysql_select_db($site[$a]["dbnaam"],$link) or die('No datbase selected');
$query = mysql_query('SHOW TABLE STATUS') or die(mysql_error());
$sql_backup = '';
while($row = mysql_fetch_assoc($query)) {
$sql = 'SHOW CREATE TABLE '.$row['Name'].'';
$query2 = mysql_query($sql) or die(mysql_error());
$sql_backup.="\r\n#Drop table ".$row['Name']."\r\n\r\n";
$sql_backup.="\r\nDrop table if exists `".$row['Name']."`;\r\n\r\n";
$sql_backup.="\r\n#Create table ".$row['Name']."\r\n\r\n";
$out = mysql_fetch_assoc($query2);
$sql_backup.=$out['Drop Table if EXISTS'].";\r\n\r\n";
$sql_backup.=$out['Create Table'].";\r\n\r\n";
$sql_backup.="#Dump data\r\n\r\n";
$sql = 'SELECT * FROM '.$row['Name'];
$out = mysql_query($sql);
$sql_code = '';
while($code = mysql_fetch_array($out,MYSQL_ASSOC)) {
$sql_code .= "INSERT INTO ".$row['Name']." SET ";
foreach($code as $insert => $value) {
$sql_code.=$insert ."='".addslashes($value)."',";
}
$sql_code = substr($sql_code, 0, -1);
$sql_code.= ";\r\n";
}
$sql_backup.= $sql_code;
}
$unique = md5(uniqid(time()));
$message = "Backup procedure van database: ". $site[$a]["dbnaam"] ." is met succes verlopen. U vind in de bijlage een backup van de inhoud gemaakt op. ".date('d-m-Y H:i:s')."\r\n Autobot\n\n";
$headers = "From: database-backup <$email>\r\n";
$headers .= "Reply-To: Autobot <noreply@". $site[$a]["domein"] .">\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"".$unique."\"\r\n";
$headers .= "Content-Disposition: attachment\r\n";
$body.= "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
$body.= "--".$unique."\r\n";
$body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$body.= "Content-Transfer-Encoding: 7bit\r\n";
$body.= "\r\n";
$body.= $message ."\r\n";
$body.= "--".$unique."\r\n";
$datum=date("d-m-Y");
$body .= "Content-Type: application/octet-stream; name=" . $site[$a]["domein"] . "-$datum" . ".sql\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body.= "Content-disposition: attachment\r\n";
$body .= "\n";
$body .= chunk_split(base64_encode($sql_backup)) . "\r\n";
mail($site[$a]["email"],'Mysql backup '.date('d-m-Y H:i:s'),$body,$headers);
echo "Backup van " . $site[$a]["dbnaam"] . " is verstuurd naar " . $site[$a]["email"] . "<br/>";
flush();
}
?>
Bedankt alvast, SAplayer
Gewijzigd op 01/01/1970 01:00:00 door Sam
Werkt alleen als save mode off is. Dit kun je zien in info.php
Quote:
database is 11.3 Mb en bestaat uit 40 tabellen.
Dat is dus een microscopisch klein databeestje... Stelt echt niets voor en mag dus geen enkel probleem zijn. In MySQL kan 1 enkele tabel al vele TB's (!!!) groot zijn. Met 40 tabellen kun je dan dus een redelijk omvangrijke database krijgen...
Het probleem is alleen dat jij de database via email wilt gaan versturen. En dat is geen goed plan. Gebruik bv. ftp om de files van de ene server naar de andere server weg te schrijven. Er zijn vele mogelijkheden, kijk eens of er op www.sourceforge.net wat te vinden is.
Ik had het bewust tussen de code tags gezet zodat het klikbaar is
Klaasjan:
@Newbie
Ik had het bewust tussen de code tags gezet zodat het klikbaar is
Ik had het bewust tussen de code tags gezet zodat het klikbaar is
mijn links zijn ook klikbaar :-p
OW sorry ik dacht dat je ze er later bij gezet had maar wel waren tegelijk
Frank:
Dat is dus een microscopisch klein databeestje... Stelt echt niets voor en mag dus geen enkel probleem zijn. In MySQL kan 1 enkele tabel al vele TB's (!!!) groot zijn. Met 40 tabellen kun je dan dus een redelijk omvangrijke database krijgen...
Maar dat wil niet zeggen dat het exporteren/backuppen van de database geen problemen hoeft op te leveren. Op mijn werk hebben we een (MySQL) database met een aantal miljoen records. Als ik die wil backuppen via phpMyAdmin krijg ik problemen. Dat werkt gewoon niet.Quote:
database is 11.3 Mb en bestaat uit 40 tabellen.
Dat is dus een microscopisch klein databeestje... Stelt echt niets voor en mag dus geen enkel probleem zijn. In MySQL kan 1 enkele tabel al vele TB's (!!!) groot zijn. Met 40 tabellen kun je dan dus een redelijk omvangrijke database krijgen...
Bij het exporteren naar die file timed php volgens mij out. (tijdje geleden dat ik het geprobeert heb.)
@Pim: PMA is niet geschikt om een database te backuppen. Daarvoor kun je beter de commandline gebruiken of een speciaal programma. PMA blijft gewoon een webinterface met alle bijbehorende beperkingen.
Voor de 'echte' backups gebruiken we uiteraard de commandline, volgens mij regelt Denit (onze hoster) dagelijks onze backups. Als je bijvoorbeeld een wijziging in de database doet en snel een backup achter de hand wilt hebben, is PMA erg handig om te backuppen... Alleen niet bij zulke 'grote' databases.
http://sourceforge.net/search/?type_of_search=soft&words=mysql+backup voor opensource backup-oplossingen. En zoek dan naar mysqldump oplossingen, die maken gebruik van de backupmogelijkheden van MySQL zelf.
Zie @de rest: bedankt voor de reacties, en ik ga het ff testen!
Ik kan misschien wel een script maken wat de backup op FTP zet. maar als de webserver dan ontploft, ben ik het nog kwijt, dus moet het op een andere server, en die heb ik niet tot mijn beschikking. Dus ik denk dat ik ze maar op mijn huide server zet, en dan elke dag handmatig download :(