Backup databases
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
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
<?php
// Database configuration
$host = "localhost";
$username = "..............";
$password = "............";
$database_name = "..............";
// Get connection object and set the charset
$conn = mysqli_connect($host, $username, $password, $database_name);
$conn->set_charset("utf8mb4");
// Get All Table Names From the Database
$tables = array();
$sql = "SHOW TABLES";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_row($result)) {
$tables[] = $row[0];
}
$sqlScript = "";
foreach ($tables as $table) {
// Prepare SQLscript for creating table structure
$query = "SHOW CREATE TABLE $table";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_row($result);
$sqlScript .= "\n\n" . $row[1] . ";\n\n";
$query = "SELECT * FROM $table";
$result = mysqli_query($conn, $query);
$columnCount = mysqli_num_fields($result);
// Prepare SQLscript for dumping data for each table
for ($i = 0; $i < $columnCount; $i ++) {
while ($row = mysqli_fetch_row($result)) {
$sqlScript .= "INSERT INTO $table VALUES(";
for ($j = 0; $j < $columnCount; $j ++) {
$row[$j] = $row[$j];
if (isset($row[$j])) {
$sqlScript .= '"' . $row[$j] . '"';
} else {
$sqlScript .= '""';
}
if ($j < ($columnCount - 1)) {
$sqlScript .= ',';
}
}
$sqlScript .= ");\n";
}
}
$sqlScript .= "\n";
}
if(!empty($sqlScript))
{
// Save the SQL script to a backup file
$backup_file_name = $database_name . '_backup_' . date("GisdnY") . '.sql';
$fileHandler = fopen($backup_file_name, 'w+');
$number_of_lines = fwrite($fileHandler, $sqlScript);
// Download the SQL backup file to the browser
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($backup_file_name));
ob_clean();
flush();
readfile($backup_file_name);
exec(' rm ' . $backup_file_name);
}
?>
// Database configuration
$host = "localhost";
$username = "..............";
$password = "............";
$database_name = "..............";
// Get connection object and set the charset
$conn = mysqli_connect($host, $username, $password, $database_name);
$conn->set_charset("utf8mb4");
// Get All Table Names From the Database
$tables = array();
$sql = "SHOW TABLES";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_row($result)) {
$tables[] = $row[0];
}
$sqlScript = "";
foreach ($tables as $table) {
// Prepare SQLscript for creating table structure
$query = "SHOW CREATE TABLE $table";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_row($result);
$sqlScript .= "\n\n" . $row[1] . ";\n\n";
$query = "SELECT * FROM $table";
$result = mysqli_query($conn, $query);
$columnCount = mysqli_num_fields($result);
// Prepare SQLscript for dumping data for each table
for ($i = 0; $i < $columnCount; $i ++) {
while ($row = mysqli_fetch_row($result)) {
$sqlScript .= "INSERT INTO $table VALUES(";
for ($j = 0; $j < $columnCount; $j ++) {
$row[$j] = $row[$j];
if (isset($row[$j])) {
$sqlScript .= '"' . $row[$j] . '"';
} else {
$sqlScript .= '""';
}
if ($j < ($columnCount - 1)) {
$sqlScript .= ',';
}
}
$sqlScript .= ");\n";
}
}
$sqlScript .= "\n";
}
if(!empty($sqlScript))
{
// Save the SQL script to a backup file
$backup_file_name = $database_name . '_backup_' . date("GisdnY") . '.sql';
$fileHandler = fopen($backup_file_name, 'w+');
$number_of_lines = fwrite($fileHandler, $sqlScript);
// Download the SQL backup file to the browser
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($backup_file_name));
ob_clean();
flush();
readfile($backup_file_name);
exec(' rm ' . $backup_file_name);
}
?>
op lijn 61 het pad toevoegen
Als je toegang tot de shell/command line hebt is mysqldump nog makkelijker.
Jan R op 23/11/2023 21:14:44:
op lijn 61 het pad toevoegen
Bedoelt u zo? Ik ben nog een beginner, dus het is voor mij vaak lezen, kopieeren en plakken.
Dit maakt een dump van de tabellen in de database.
Al je views, triggers, procedures, events worden niet meegenomen.
Daarnaast: als je je database fatsoenlijk opzet, heb je ook foreign keys gedefineerd:
- Een order bevat een klant_id en een product_id.
Daarmee kun je dus niet de order aanmaken voordat je de klanten en de producten hebt aangemaakt.
Daar is wel een truukje voor met SET FOREIGN_KEY_CHECKS = 0 / 1;
maar wat ik probeer te zeggen: het is meer dan je in eerste instantie zou zeggen.
En daar is door de makers van mysqldump al veel langer over na gedacht.
Probeer dit dus niet zelf, maar gebruik de tools die er voor bedoeld zijn.
--
je houdt trouwens ook geen rekening met tabelnamen die "illegale" tekens bevatten. Bijvoorbeeld "gebruikers tabel" is door de spatie niet toegestaan. Maar wel als je er `` omheen zet.
Voor de kolomnamen omzeil je dat door de korte versie van een insert-query te gebruiken. Er vanuitgaande dat de kolomvolgorde inderdaad gelijk is aan de volgorde die zojuist met CREATE is gemaakt.
Maar nergens DROP je de tabel, dus als die al bestaat, maar verschilt qua opbouw, heb je en probleem bij de insert query.
Toevoeging op 24/11/2023 12:16:21:
Waarom trouwens de moeite om rond regel 60 dit als file weg te schrijven?
Nadat je op regel 75 de inhoud daarvan hebt uitgespuugd, verwijder je de file weer...
(wat trouwens ook met de php-functie unlink() kan.)
Je had op regel 75 ook kunnen doen.
De filename in de headers kun je laten staan.
Maar dit is geen binary, maar een text / ascii file.
Toevoeging op 24/11/2023 12:17:14:
oh en ook nog bij het opbouwen van je insert-query: vergeet niet je values te escapen, anders gaat je query fout als er een ' in de tekst staat ergens.
allemaal bedankt voor de reacties. Ik ga mij toch maar eens inlezen hoe ik mysqldump moet gebruiken. Uit jullie reacties te lezen gaat dit het makkelijkst.
Dan moet je wel SSH-toegang hebben, via bijvoorbeeld PuTTY. Je hebt dan in ieder geval geen time-outs vanuit de webserver.
- Ariën - op 24/11/2023 12:47:21:
Dan moet je wel SSH-toegang hebben, via bijvoorbeeld PuTTY. Je hebt dan in ieder geval geen time-outs vanuit de webserver.
TS lijkt in elk geval exec( ) te kunnen uitvoeren, dus dat zou al een route kunnen zijn.
Maar mysqldump uitvoeren via ssh of een cronjob als dat kan, is een betere oplossing.
Als die echt je backup wordt, dan doe je dit alleen maar 100% goed.
Een halve backup heb je niets aan.
(en test het ook af en toe. Ik herinner me nog een hosting partij die ooit de backups terug moest zetten omdat alles op de server weg was. Alleen was de laatste bruikbare backup een half jaar oud en na een kleine aanpassing had niemand opgelet of de backups ook werkelijk nog steeds gemaakt werden)
ik heb net de geproduceerde backupfile .sql uit geprobeerd in phpmyadmin op mijn computer en het is de complete database. Het enige wat ik als foutmelding krijg is:INSERT INTO pma__designer_settings VALUES("dbu5387138","{"relation_lines":"true","snap_to_grid":"off","angular_direct":"direct"}");
"MySQL meldt: #1064 - Er is iets fout in de gebruikte syntax bij 'relation_lines":"true","snap_to_grid":"off","angular_direct":"direct"}")' in regel 1
Als ik de backup maakt via de webpage dan komt er een backupfile in de directory Downloads op mijn computer te staan en eentje op de server in de directory waar het programma in draait, en die wil ik in de directory /backup/ op de server plaatsen.
Gewijzigd op 25/11/2023 12:11:49 door Peter Kuipers
Of misschien is er wel een goed onderhouden class. Kijk eens op Packagist.
Gewijzigd op 25/11/2023 12:59:47 door - Ariën -
jouw json bevat een hele hoop "
maar jij zet jouw values tussen diezelfde "
dus hoe moet mysql nu weten welke " in jouw value hoort en wat een einde-string is?
oplossing: gebruik ' ( single quote) en pas even goed nog mysqli escape strng toe
Toevoeging op 25/11/2023 13:07:12:
maar dat lost 1 probleem op en tackelt direct een ' in de tekst. maar mysqldump is beter
Iedereen bedankt voor jullie reacties.
Nu heb ik nog een vraag: hoe sluit ik deze topic?
misschien heeft iemand morgen nog een briljante toevoeging
Komt tie.
https://www.adminer.org/
1 bestand dat je overal kan neerplempen.
Gewijzigd op 25/11/2023 15:34:04 door Adoptive Solution