Database backup systeem
Wat vinden jullie van mijn database backup systeem? En is dit te plaatsen als script of niet?
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
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
<?php
// --- Begin config ---
$user_naam = ""; // Hier jouw naam invullen
$site_naam = ""; // Hier de naam van jouw site invullen
$show_at_end = 0; // Aangeven of je het bestand wilt echoën aan het einde van dit script; 0 voor Nee; 1 voor Ja
// Hier de gegevens invullen van de database die moet worden ge-backupt
$sql_u = ""; // Gebruikersnaam van MySql
$sql_p = ""; // Wachtwoord van MySql
$sql_h = "localhost"; // Host van MySql
$sql_d = ""; // Database van MySql
mysql_connect($sql_h,$sql_u,$sql_p); // Verbinding maken met MySql
mysql_select_db($sql_d);
// --- Einde config ---
if(!is_dir("backup/")) { // Nakijken of de map bestaat waar de backup in word gemaakt
mkdir("backup/"); // De map bestaat niet, de maken word aangemaakt!
}
function makeline($array) { // Functie om makkelijk een lijn van een kolom te maken vanuit een array
if($array['Null'] == "NO") { // Not Null opvragen
$null = "NOT NULL";
}else{
$null = "NULL";
}
$line = $array['Field']." ".$array['Type']." ".$null; // Basislijn met de tabelnaam enz. maken
if(!empty($array['Default'])) { // Kijken of er een Default is ingesteld voor die kolom
$line .= " DEFAULT '".$array['Default']."'";
}
if(!empty($array['Extra'])) { // Kijken of er een Extra waarde is ingesteld voor die kolom (bijv. auto_increment)
$line .= " ".$array['Extra'];
}
$line .= ",";
return $line; // Die lijn terugsturen
}
$tab = mysql_list_tables($sql_d); // Alle tabellen op en rijtje
$count = mysql_num_rows($tab); // Tellen hoeveel tabellen we hebben
for ($i = 0; $i < $count; $i++) { // Alle tabellen in een array met een for()
$tabellen[] = mysql_tablename($tab,$i);
}
$sqlcode = "-- Backup database ".$site_naam."\n"; // Het begin in de code; $sqlcode is het variabele waar de hele backup in word gezet
$sqlcode .= "-- COPYRIGHT ".$user_naam." ".date('Y')."\n\n\n";
foreach($tabellen as $tabel) { // Met een foreach() elke tabel afwerken
$rijen = "";
$sqlcode .= "-- Structuur voor tabel ".$tabel."\n\n";
$sqlcode .= "CREATE TABLE IF NOT EXISTS ".$tabel." (\n"; // Nieuwe tabel aanmaken
$sql = mysql_query("SHOW COLUMNS FROM ".$tabel); // Alle kolommen opvragen van de tabel
while($r = mysql_fetch_object($sql)) { // Elke kolom in een de array: $array
foreach($r as $n => $v) {
$array[$n] = $v;
}
$sqlcode .= " ".makeline($array)."\n"; // De functie makeline aanroepen, en de array: $array meesturen
}
$sqlcode .= " PRIMARY KEY (id)\n"; // Bij mij is Id altijd de primary, dit kun je zelf veranderen (Let op! Dit is voor alle tabellen!)
$sqlcode .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1"; // he.t einde met de engine enz,
// Waarden van deze tabel ophalen en in het bestand zetten
$query = mysql_query("SELECT * FROM ".$tabel); // Waarden ophalen
$rows = mysql_num_rows($query); // Waarden tellen
$inc = $rows + 1; // Auto increment tellen
$sqlcode .= " AUTO_INCREMENT=".$inc." ;\n\n\n"; // Auto increment instellen voor de tabel
if($rows !== 0) { // Als er waarden aanwezig zijn in de tabel, voor elke waarde een lijn schrijven in het bestand
$sqlcode .= "-- Gegevens voor tabel ".$tabel."\n\n"; // Kopje
$field = mysql_num_fields($query); // Alle velden op een rij zetten
for($i = 0;$i < $field;$i++) { // Met een for() alle rijen een mooi stukje tekst van maken voor de INSERT query
$rijen .= ",".mysql_field_name($query,$i); // Voor elke rij een ',' en de de rij
}
$rijen = substr($rijen,1); // De eerste komma eraf halen
while($loop = mysql_fetch_object($query)) { Voor elke waarde een rijtje maken
$waarden = ""; // Waarden dumpen
$sqlcode .= "INSERT INTO ".$tabel." ("; // INSERT query maken, in de actuele tabel
$sqlcode .= $rijen.") VALUES ("; // Verder met INSERT query, alle rijen maken
foreach($loop as $v) { // Met een foreach alle waarden voor die rij opvragen en in een mooie lijn zetten
$waarden .= ",'".$v."'";
}
$waarden = substr($waarden,1); // Weer de eerste komma eraf halen, want die hoort niet op het begin :P
$sqlcode .= $waarden."); \n\n"; // Alle waarden voor die rij in het bestand zetten
}
}
$sqlcode .= "\n\n"; // Even een stukje leeg maken tussen deze en de volgende tabel
}
$sqlcode .= "\n\n\n\n-- ".$site_naam." ".$user_naam." Mysql-backup bestand --"; // Eindtekstje
$handle = fopen("backup/backup_".date('d-m-Y').".txt",'w'); // Het bestand openen; Het bestand gaat heten: Backup_'datum van vandaag'
$file = fwrite($handle,$sqlcode); Het hele bestand $sqlcode opslaan in het tekst bestand
fclose($handle);
if($show_at_end == 1) { // Als je de code wilt zien op het einde; instellen bovenaan
$str = str_replace("\n","<br>",$sqlcode); // \n vervangen door <br>, zodat HTML het goed 'print'
echo $str; // Het bestand op de pagina 'printen'
}
?>
// --- Begin config ---
$user_naam = ""; // Hier jouw naam invullen
$site_naam = ""; // Hier de naam van jouw site invullen
$show_at_end = 0; // Aangeven of je het bestand wilt echoën aan het einde van dit script; 0 voor Nee; 1 voor Ja
// Hier de gegevens invullen van de database die moet worden ge-backupt
$sql_u = ""; // Gebruikersnaam van MySql
$sql_p = ""; // Wachtwoord van MySql
$sql_h = "localhost"; // Host van MySql
$sql_d = ""; // Database van MySql
mysql_connect($sql_h,$sql_u,$sql_p); // Verbinding maken met MySql
mysql_select_db($sql_d);
// --- Einde config ---
if(!is_dir("backup/")) { // Nakijken of de map bestaat waar de backup in word gemaakt
mkdir("backup/"); // De map bestaat niet, de maken word aangemaakt!
}
function makeline($array) { // Functie om makkelijk een lijn van een kolom te maken vanuit een array
if($array['Null'] == "NO") { // Not Null opvragen
$null = "NOT NULL";
}else{
$null = "NULL";
}
$line = $array['Field']." ".$array['Type']." ".$null; // Basislijn met de tabelnaam enz. maken
if(!empty($array['Default'])) { // Kijken of er een Default is ingesteld voor die kolom
$line .= " DEFAULT '".$array['Default']."'";
}
if(!empty($array['Extra'])) { // Kijken of er een Extra waarde is ingesteld voor die kolom (bijv. auto_increment)
$line .= " ".$array['Extra'];
}
$line .= ",";
return $line; // Die lijn terugsturen
}
$tab = mysql_list_tables($sql_d); // Alle tabellen op en rijtje
$count = mysql_num_rows($tab); // Tellen hoeveel tabellen we hebben
for ($i = 0; $i < $count; $i++) { // Alle tabellen in een array met een for()
$tabellen[] = mysql_tablename($tab,$i);
}
$sqlcode = "-- Backup database ".$site_naam."\n"; // Het begin in de code; $sqlcode is het variabele waar de hele backup in word gezet
$sqlcode .= "-- COPYRIGHT ".$user_naam." ".date('Y')."\n\n\n";
foreach($tabellen as $tabel) { // Met een foreach() elke tabel afwerken
$rijen = "";
$sqlcode .= "-- Structuur voor tabel ".$tabel."\n\n";
$sqlcode .= "CREATE TABLE IF NOT EXISTS ".$tabel." (\n"; // Nieuwe tabel aanmaken
$sql = mysql_query("SHOW COLUMNS FROM ".$tabel); // Alle kolommen opvragen van de tabel
while($r = mysql_fetch_object($sql)) { // Elke kolom in een de array: $array
foreach($r as $n => $v) {
$array[$n] = $v;
}
$sqlcode .= " ".makeline($array)."\n"; // De functie makeline aanroepen, en de array: $array meesturen
}
$sqlcode .= " PRIMARY KEY (id)\n"; // Bij mij is Id altijd de primary, dit kun je zelf veranderen (Let op! Dit is voor alle tabellen!)
$sqlcode .= ") ENGINE=MyISAM DEFAULT CHARSET=latin1"; // he.t einde met de engine enz,
// Waarden van deze tabel ophalen en in het bestand zetten
$query = mysql_query("SELECT * FROM ".$tabel); // Waarden ophalen
$rows = mysql_num_rows($query); // Waarden tellen
$inc = $rows + 1; // Auto increment tellen
$sqlcode .= " AUTO_INCREMENT=".$inc." ;\n\n\n"; // Auto increment instellen voor de tabel
if($rows !== 0) { // Als er waarden aanwezig zijn in de tabel, voor elke waarde een lijn schrijven in het bestand
$sqlcode .= "-- Gegevens voor tabel ".$tabel."\n\n"; // Kopje
$field = mysql_num_fields($query); // Alle velden op een rij zetten
for($i = 0;$i < $field;$i++) { // Met een for() alle rijen een mooi stukje tekst van maken voor de INSERT query
$rijen .= ",".mysql_field_name($query,$i); // Voor elke rij een ',' en de de rij
}
$rijen = substr($rijen,1); // De eerste komma eraf halen
while($loop = mysql_fetch_object($query)) { Voor elke waarde een rijtje maken
$waarden = ""; // Waarden dumpen
$sqlcode .= "INSERT INTO ".$tabel." ("; // INSERT query maken, in de actuele tabel
$sqlcode .= $rijen.") VALUES ("; // Verder met INSERT query, alle rijen maken
foreach($loop as $v) { // Met een foreach alle waarden voor die rij opvragen en in een mooie lijn zetten
$waarden .= ",'".$v."'";
}
$waarden = substr($waarden,1); // Weer de eerste komma eraf halen, want die hoort niet op het begin :P
$sqlcode .= $waarden."); \n\n"; // Alle waarden voor die rij in het bestand zetten
}
}
$sqlcode .= "\n\n"; // Even een stukje leeg maken tussen deze en de volgende tabel
}
$sqlcode .= "\n\n\n\n-- ".$site_naam." ".$user_naam." Mysql-backup bestand --"; // Eindtekstje
$handle = fopen("backup/backup_".date('d-m-Y').".txt",'w'); // Het bestand openen; Het bestand gaat heten: Backup_'datum van vandaag'
$file = fwrite($handle,$sqlcode); Het hele bestand $sqlcode opslaan in het tekst bestand
fclose($handle);
if($show_at_end == 1) { // Als je de code wilt zien op het einde; instellen bovenaan
$str = str_replace("\n","<br>",$sqlcode); // \n vervangen door <br>, zodat HTML het goed 'print'
echo $str; // Het bestand op de pagina 'printen'
}
?>
PHPgast
Gewijzigd op 01/01/1970 01:00:00 door Youri van Weegberg
Waarom niet gewoon mysql_dump gebruiken?
Verder mis ik hier in het geheel de relaties tussen de tabellen.
Waarom trouwens perse myisam? Die zou ik juist niet gebruiken (dan heb je geen relaties)
Gewijzigd op 01/01/1970 01:00:00 door TJVB tvb
Ik heb die bestandjes bij mij in een beveildigde map staan, .htaccess, MyISAM heb ik gebruikt omdat die gewoon standaard bij mij staat ingesteld, dus zo heb ik het overgenomen uit phpmyadmin. Ik heb zitten kijken naar mysql_dump, maar weet even niet wrm ik dat niet heb gedaan.
Dan gaat die mee in mijn volledige backup naar een externe locatie en kan ik het makkelijk terug zetten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
DIR=/root/cronscripts/mysqlbackups/
DATESTAMP=$(date +%Y%m%d)
DB_USER=backup_user
DB_PASS='wachtwoord'
# remove backups older than $DAYS_KEEP
DAYS_KEEP=14
find ${DIR}* -mtime +$DAYS_KEEP -exec rm -f {} \; 2> /dev/null
# create backups securely
umask 006
# list MySQL databases and dump each
DB_LIST=`mysql -u $DB_USER -p"$DB_PASS" -e'show databases;'`
DB_LIST=${DB_LIST##Database}
for DB in $DB_LIST;
do
FILENAME=${DIR}${DB}-${DATESTAMP}.sql.gz
mysqldump -u $DB_USER -p"$DB_PASS" --opt --flush-logs $DB | gzip > $FILENAME
done
DIR=/root/cronscripts/mysqlbackups/
DATESTAMP=$(date +%Y%m%d)
DB_USER=backup_user
DB_PASS='wachtwoord'
# remove backups older than $DAYS_KEEP
DAYS_KEEP=14
find ${DIR}* -mtime +$DAYS_KEEP -exec rm -f {} \; 2> /dev/null
# create backups securely
umask 006
# list MySQL databases and dump each
DB_LIST=`mysql -u $DB_USER -p"$DB_PASS" -e'show databases;'`
DB_LIST=${DB_LIST##Database}
for DB in $DB_LIST;
do
FILENAME=${DIR}${DB}-${DATESTAMP}.sql.gz
mysqldump -u $DB_USER -p"$DB_PASS" --opt --flush-logs $DB | gzip > $FILENAME
done
Ik heb een zelfde soort script voor mijn postgresql database
Maar denk je dat ik het kan plaatsen als script?
Het php script in de scriptlib? Zou het niet doen, het kan goed gaan maar kan ook fout gaan en mensen gaan er dan op vertrouwen.