database back-up optimaliseren.
Ik heb nu dagelijks een cronjob draaien die een back-up maakt van twee databases.
Het resultaat is een .sql bestandje met de code om je database te maken en alle rijen in te voegen.
Dit werkt prima.
Het enige probleem is dat er in de 2 databases weinig informatie staat (dit wordt nog veel meer).
En het kost me nu al 0.8 mb per dag.
Dit klinkt weinig maar aangezien ik een simpele webhosting bezit en de database nog veel groter gaat worden, gaat dit wel een probleem worden.
Hoe zou ik mijn probleem het beste aan kunnen pakken?
Waar ik zelf aan dacht was in plaats van dagelijks een .sql bestandje te maken, een .zip bestand te maken en hier het .sql bestand in te stoppen.
De code van mijn back-up script:
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
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
<?php
define('db_host','*****');
//database user
define('db_user','*****');
//database password
define('db_pass','*****');
// This function creates a SQL file with the code to create the database
function create_back_up($db_naam){
$sql_output = '#Created on '.date("d-m-Y H:i:s").' for database '.$db_naam.PHP_EOL.PHP_EOL;
$link = mysql_connect(db_host,db_user,db_pass) or die('No datbase conection.');
mysql_select_db($db_naam,$link) or die('No datbase selected');
$all_tables = mysql_query("SHOW TABLE STATUS")or die(mysql_error());
while($table = mysql_fetch_assoc($all_tables)){
$table_create_sql = mysql_query("SHOW CREATE TABLE `".$table['Name']."`");
$table_create = mysql_fetch_assoc($table_create_sql);
$sql_output .= $table_create['Create Table'].PHP_EOL.PHP_EOL;
$out = mysql_query("SELECT * FROM `".$table['Name']."`");
while($code = mysql_fetch_array($out,MYSQL_ASSOC)){
$sql_code = "INSERT INTO `".$table['Name']."` SET ";
foreach($code as $insert => $value){
$sql_code.='`'.$insert.'`'."='".addslashes($value)."',";
}
$sql_output .= substr($sql_code, 0, -1).PHP_EOL.PHP_EOL;
}
$sql_output .= PHP_EOL;
}
$file = '/.../'.$db_naam.' '.date("Y-m-d", time()).'.sql';
file_put_contents($file, $sql_output);
mysql_close($link);
return true;
}
create_back_up('database_1');
create_back_up('database_2');
?>
define('db_host','*****');
//database user
define('db_user','*****');
//database password
define('db_pass','*****');
// This function creates a SQL file with the code to create the database
function create_back_up($db_naam){
$sql_output = '#Created on '.date("d-m-Y H:i:s").' for database '.$db_naam.PHP_EOL.PHP_EOL;
$link = mysql_connect(db_host,db_user,db_pass) or die('No datbase conection.');
mysql_select_db($db_naam,$link) or die('No datbase selected');
$all_tables = mysql_query("SHOW TABLE STATUS")or die(mysql_error());
while($table = mysql_fetch_assoc($all_tables)){
$table_create_sql = mysql_query("SHOW CREATE TABLE `".$table['Name']."`");
$table_create = mysql_fetch_assoc($table_create_sql);
$sql_output .= $table_create['Create Table'].PHP_EOL.PHP_EOL;
$out = mysql_query("SELECT * FROM `".$table['Name']."`");
while($code = mysql_fetch_array($out,MYSQL_ASSOC)){
$sql_code = "INSERT INTO `".$table['Name']."` SET ";
foreach($code as $insert => $value){
$sql_code.='`'.$insert.'`'."='".addslashes($value)."',";
}
$sql_output .= substr($sql_code, 0, -1).PHP_EOL.PHP_EOL;
}
$sql_output .= PHP_EOL;
}
$file = '/.../'.$db_naam.' '.date("Y-m-d", time()).'.sql';
file_put_contents($file, $sql_output);
mysql_close($link);
return true;
}
create_back_up('database_1');
create_back_up('database_2');
?>
Doe dit wel op een externe server, want als je huidige server waar je site op draait ermee stopt door een falende schijf-probleem, en je backups staanverop, dan ben je zwaar de sjaak.
differentiële back-up: maak één keer per maand/week een volledige back-up en daarna elke dag alleen nog een back-up van de nieuwe of gewijzigde records.
Je kunt ook een andere “back-up strategie” volgen. Bijvoorbeeld een Belangrijkste voordeel is denk ik wel, dat die veel meer doet dat wat jouw script nu doet, en ook een aantal slimmigheden heeft.
Wat is er mis met jouw script?
- je geeft wel de create query's voor de tabellen, maar wat doe je met triggers en stored procedures?
- je geeft de insert query's (met SET?) in een random volgorde. Maar wat als je eerst de waarden insert voor de tabel Wanneer_ingelogd en pas daarna de tabel Users? De log tabel zal vast een Foreign Key hebben naar Users. En dan insert je data voor een nog niet ge-inserte user....
Mysqldump heeft wel een rijtje opties nodig, maar werkt als je dat goed instelt prima. Daar kan een eigen php script niet tegen op.
- wil je het per se met je eigen script doen. Test dat dan heeeel uitgebreid, en blijf dat testen. Want als je nu zonder FK-relaties test, of nog geen triggers gebruikt, dan wil dat niet zeggen dat je over 3 maanden dat niet alsnog gaat doen. En als dan een jaar later je de backup nodig hebt, is het wat jammer als die niet bruikbaar is.
Een beetje hoster maakt trouwens ook wel backups
Ik zal me php script iets aanpassen zodat het rekening houd met meer omstandigheden.
En ik ga elke dag een .sql bestand maken, en aan het eind van de week stuur ik het door middel van een dropbox api als zip bestand naar mijn dropbox.
Het dropbox gedeelte ga proberen, dus ik hoop dat dat lukt.
Daar kun je ook het path naar mysqldump neerzetten en de output naar een locatie binnen jouw directory's verwijzen.
Op mijn servers staat mysqldump op /usr/bin/mysqldump
Of vraag het aan je hoster.