Come si fa il Dump di Mysql o MariaDB con php

Vorrei eseguire il Dump del mio database senza dover accedere al mio server.

Come si fa?

-

 

L'utility mysqldump di Mysql e MariaDB, è uno strumento molto utile che semplifica il processo di backup di un database, ovviamente questo può essere eseguito solamente se il database in questione è accessibile e quindi in esecuzione.

Per eseguire tale procedura è necessario accedere al proprio server ad esempio tramite il pannello di controllo Plesk o altro ed individuare il database relativo al vostro sito e utilizzare l'utility direttamente dal database mysql, vedi come eseguire il dump da Plesk

Utilizzare Php per eseguire il dump del database

Ma se noi non volessimo utilizzare l'utility presente nel mysql e utilizzare uno script in php per fare tutto questo, come si fa?

Tramite la funzione exec() di php è possibile connettersi al nostro database ed eseguire il dump cliccando semplicemente su pulsante di invio ogni qualvolta decidiamo di eseguire un backup.

Sintassi:

 exec($comando, $output, $var_ritorno)

Nel nostro caso è possibile utilizzare la funzione ad esempio costruendo un nostro personale pannello di controllo dove potremo integrare il programma per eseguire il backup e salvarlo in un file di testo, dentro una cartella del nostro sito, per prima cosa utilizziamo jquery per richiamare il nostro file dumpDatabase.php

Apriamo il nostro file index.php  e inseriamo il seguente codice:

Crea pulsante richiesta Dump database

Creiamo un pulsante di invio con id dumpDb che verrà intercettato dalla nostra funzione jquery.

<div class="row">
<div class="col-sm-12">
<div class="form-group">
<label for="fullName">DUMPA</label>
<a id="dumpDb" class="btn btn-success dumpBtn" href="javascript:void(0)">DUMPA IL DB</a>
</div>
<p id="responds"> </p>
</div>
</div>

 

 

Funzione ElencoDump

function elencoDump(){													
$dir = 'RootCartellaDumpDb/';
$files = scandir($dir, 0);
 
for($i = 2; $i < count($files); $i++)
   
	echo '<option>'.$files[$i].'</option>';
}	

La funzione elencoDump() non farà altro che recuperare i file di testo dove verranno memorizzati i dump del nostro database, in particolare eseguirà la scansione della cartella RootCartellaDumpDb mostrandoci l'elenco ordinato per data dei file di backup:

Crea una select 

Nella select faremo passare la funzione elencoDump() che mostrerà i valori option con un ciclo di for come nella figura qui sopra, mentre la funzione jquery $("#listaDump").change(function()  ci permetterà di cliccarci sopra per aprire il file txt in lettura

	<div class="form-group">
		<label for="fullName">Elenco Dump</label>
		<select class="form-control" id="listaDump" name="listaDump">
			<option selected>Elenco dump</option> 
		 <?php elencoDump() ?>														
		</select>
	</div>

<script type="text/javascript">
	$("#listaDump").change(function(){							
		var dump = $(this).val();							
		window.open('RootCartellaDumpDb/'+dump);	
	});	
</script>

 

Jquery per creare il Dump del database

Per poter inviare il comando al nostro file dumpDatabase.php utiliziamo quindi la funzione Jquery per creare il dump e memorizzare il file dump.txt nella relativa cartella RootCartellaDumpDb

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

////html

<script type="text/javascript">

$( document ).ready( function () {

////////////////APRE FILE TXT CON IL DUMP NELLA OPTION SELECT//////

	$("#listaDump").change(function(){							
		var dump = $(this).val();							
		window.open('RootCartellaDumpDb/'+dump);	
	});	
///////////////////////////////////////////////////////////////////				

	$("#dumpBtn").click(function (event) {
		event.preventDefault();
		var myData = null; 
		jQuery.ajax({
		type: "POST",   
		url: "dumpDatabase.php", 
		dataType:"text", 
		data:myData, 
		success:function(response){
			$("#responds").append(response);
			 //setTimeout(function(){ window.location.assign("index.php"); }, 200);
	},
		error:function (xhr, ajaxOptions, thrownError){
			$("#dumpBtn").show(); 
			alert(thrownError);
		}
		});
   });



});
</script> 

Sicuramente il codice deve essere migliorato, in questa rappresentazione non di invia alcun valore var myData = null;  allla url dumpDatabase.php perchè l'unica cosa che ci preme visualizzare è il risultato mostrato tramite id $("#responds").append(response);
 

<p id="responds"></p>

e li ci verrà mostrato l'esito del dump come in figura:

Creare il Dump del database

File dumpDatabase.php

In ultima dobbiamo creare il file dumpDatabase.php con il quale si darà eseguzione al backup del database:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$dataDump = time();
$database = 'tuoDatabase';
$user     = 'Username';
$pass     = 'tuaPAss';
$host     = 'localhost';

$dir = dirname(__FILE__) . '/RootCartellaDumpDb/'.$dataDump.'-dump.sql.txt';

echo "<h3>Backing up database to `<code>{$dir}</code>`</h3>";

exec("mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$dir} 2>&1", $output);

var_dump($output);

Questo file verrà richiamato dal nostro jquery ogni volta che agiremo sul pulsante con id: dumpDb che abbiamo creato prima e il suo funzionamento è molto semplice (+o-).

Per prima cosa abilitiamo le notifiche di errore tramite ini_set e error_reporting (potreste volerlo abilitare direttamente sul vostro php.ini) vedi anche Come attivare i messaggi di errore in PHP,
per dare un nome univoco associamo la funzione time() alla variabile $dataDump  (es di output: 163450972-dump.sql.txt ) dopodiché assegniamo alla variabile $dir  la directory con il nome del file Dump  dove verrà appunto memorizzato sul nostro server.

Tramite la funzione exec() faremo poi passare i dati relativi alla connessione del database, della directory dove verranno memorizzati i nostri file dump e la  variabile $output che tramite var_dump($output ) conterrà tutte le informazioni relative al dump del nostro database.

Lo script finale

Questo piccolo script può essere usato come base di partenza per creare situazioni più complesse in base alle proprie esigenze, sicuramente migliorabile ma ottimo per meglio comprendere come eseguire il dump di un database con php.

Index.php

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mio Dump</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>

<body>
<?php 
	function elencoDump(){	

	$dir = 'RootCartellaDumpDb/';

	$files = scandir($dir, 0);

	for($i = 2; $i < count($files); $i++)

		echo '<option>'.$files[$i].'</option>';
	}
 ?>
 
<div class="row">
 <div class="col-sm-12">
   <div class="form-group">

	<label for="fullName">DUMPA</label>
	<a id="dumpDb" class="btn btn-success dumpBtn" href="javascript:void(0)">DUMPA IL DB</a>
	</div>

	<p id="responds"></p>

   <div class="form-group">
	<label for="fullName">Elenco Dump</label>
	<select class="form-control" id="listaDump" name="listaDump">
		<option selected>Elenco dump</option>
		<?php elencoDump() ?>
	</select>
    </div> 
   </div> 
</div>

<script type="text/javascript">

$( document ).ready( function () {

////////////////APRE FILE TXT CON IL DUMP NELLA OPTION SELECT//////

	$("#listaDump").change(function(){							
		var dump = $(this).val();							
		window.open('RootCartellaDumpDb/'+dump);	
	});	
///////////////////////////////////////////////////////////////////				

	$("#dumpBtn").click(function (event) {
		event.preventDefault();
		var myData = null; 
		jQuery.ajax({
		type: "POST",   
		url: "dumpDatabase.php", 
		dataType:"text", 
		data:myData, 
		success:function(response){
			$("#responds").append(response);
			 //setTimeout(function(){ window.location.assign("index.php"); }, 200);
	},
		error:function (xhr, ajaxOptions, thrownError){
			$("#dumpBtn").show(); 
			alert(thrownError);
		}
		});
   });



});
</script> 

</body>
</html>

 

dumpDatabase.php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$dataDump = time();
$database = 'tuoDatabase';
$user     = 'Username';
$pass     = 'tuaPAss';
$host     = 'localhost';

$dir = dirname(__FILE__) . '/RootCartellaDumpDb/'.$dataDump.'-dump.sql.txt';

echo "<h3>Backing up database to `<code>{$dir}</code>`</h3>";

exec("mysqldump --user={$user} --password={$pass} --host={$host} {$database} --result-file={$dir} 2>&1", $output);

var_dump($output);

 


 
Php
     


Lascia un commento