database back-up optimaliseren.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom aan t Goor

Tom aan t Goor

13/01/2014 10:00:17
Quote Anchor link
Hoi hoi,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
?>
 
PHP hulp

PHP hulp

23/11/2020 22:37:17
 
- Ariën -
Beheerder

- Ariën -

13/01/2014 10:10:20
Quote Anchor link
Dat zou je kunnen doen. En deze wegschrijven met het dagnummer, zodat je een hele week aan backups hebt.

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.
 
Ward van der Put
Moderator

Ward van der Put

13/01/2014 10:20:05
Quote Anchor link
Je kunt ook een andere “back-up strategie” volgen. Bijvoorbeeld een 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.
 
Ivo P

Ivo P

13/01/2014 10:45:20
Quote Anchor link
en gebruik gewoon de tool van Mysql zelf om een backup te maken: mysqldump.

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
 
Tom aan t Goor

Tom aan t Goor

13/01/2014 11:11:31
Quote Anchor link
Ik heb even snel gekeken naar mysqldump, maar volgens mij kan je dat alleen gebruiken als server beheerder. En aangezien ik een simpele webhosting bezit, denk ik niet dat ik dat kan.

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.
 
Ivo P

Ivo P

13/01/2014 11:20:40
Quote Anchor link
hoe roep je nu in de crontab jouw eigen script aan? Daar staat naast een tijdstip/interval een commando (met path)

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.