Bon je tester vite fais ce script et ca ma l'air pas mal,mais il permet pas de selectioner diffrente tables a sauvegarder.Mais pour les autres il peut etre sympa.
Finalment en je vais utiliser mes veux script de backup et restauration.Avec l'aide de
visualcron et de
webcron pour tout automatiser.Je vais creer aussi un bloc perso sur l'intranet comme qui certaine choses marchent pas sur l'extranet
Visualcron est un logiciel sous windows qui permet de creer de cronjobs sous windows comme ce deja le cas sous linux.En plus il est gratuit et en francais.
Webcron permet de lancer des taches cron via le web,en cas si votre herbergeur ne le pas propose.
Donc voici ma procedure,quelle je suis en train de tester sur un semaine.Pour dire si ca marche.
1)Alors... dabord je met mon script de backup sur mon serveur en local.
<?
$dbhost = "localhost";
$dbuser = "********"; //utilisateur de la base
$dbpass = "********"; //mot de passe de la base
$dbname = "********"; // nom de la base
$use_gzip = "no";
$remove_file = "yes";
$use_email = "yes";
$send_to = "backupsql@tonsite.com";
$send_from = "backup@tonsite.com";
$subject = "Backup de la Base ($dbname) - " . date("j F Y");
$use_ftp = "yes"; //stocker sur le ftp oui ou non
$ftp_server = "*****"; //adresse dur serveur
$ftp_user_name = "*****"; //pseudo
$ftp_user_pass = "*****"; //mot de passe
$ftp_path = "*/*"; //endroit du stockage
$echo_status = "no"; //resumer oui ou non
$db = mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$dbname",$db);
$path = make_dir();
if ($echo_status == 'yes') {
print "Dumpfile will be written to $path<br>";
}
$result = mysql_query("show tables from $dbname");
while (list($table) = mysql_fetch_row($result)) {
$newfile .= get_def($table);
$newfile .= "nn";
$newfile .= get_content($table);
$newfile .= "nn";
$i++;
if ($echo_status == "yes") {
print "Dumped table $table<br>";
}
}
$file_name = $dbname . ".sql";
$file_path = $path . $file_name;
if ($use_gzip == "yes") {
$file_name .= ".gz";
$file_path .= ".gz";
$zp = gzopen($file_path, "wb9");
gzwrite($zp,$newfile);
gzclose($zp);
if ($echo_status == 'yes') {
print "<br>Gzip-file is created...<br>";
}
} else {
$fp = fopen($file_path, "w");
fwrite($fp, $newfile);
fclose($fp);
if ($echo_status == 'yes') {
print "<br>SQL-file is created...<br>";
}
}
if ($use_email == 'yes') {
$fileatt_type = filetype($file_path);
$headers = "From: $send_from";
// Read the file to be attached ('rb' = read binary)
$fp = fopen($file_path,'rb');
$data = fread($fp,filesize($file_path));
fclose($fp);
// Generate a boundary string
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
// Add the headers for a file attachment
$headers .= "nMIME-Version: 1.0n" ."Content-Type: multipart/mixed;n" ." boundary="{$mime_boundary}"";
// Add a multipart boundary above the plain message
$message = "This is a multi-part message in MIME format.nn" ."--{$mime_boundary}n" ."Content-Type: text/plain; charset="iso-8859-1"n" ."Content-Transfer-Encoding: 7bitnn" .
$message . "nn";
// Base64 encode the file data
$data = chunk_split(base64_encode($data));
// Add file attachment to the message
$message .= "--{$mime_boundary}n" ."Content-Type: {$fileatt_type};n" ." name="{$file_name}"n" ."Content-Disposition: attachment;n" ." filename="{$file_name}"n" ."Content-Transfer-Encoding: base64nn" .
$data . "nn" ."--{$mime_boundary}--n";
// Send the message
$ok = @mail($send_to, $subject, $message, $headers);
if ($echo_status == 'yes') {
print "<br>Mail is sent...<br>";
}
}
if ($use_ftp == 'yes') {
if ($use_gzip == 'yes') {
$mode = FTP_BINARY;
} else {
$mode = FTP_ASCII;
}
$ftp_id = ftp_connect($ftp_server);
$login_result = ftp_login($ftp_id, $ftp_user_name, $ftp_user_pass);
$upload = ftp_put($ftp_id, $ftp_path . $file_name, $file_path, $mode);
ftp_close($ftp_id);
if ($echo_status == 'yes') {
print "<br>Backup is uploaded to $ftp_user_name@$ftp_server...<br>";
}
}
if ($remove_file == "yes") {
unlink($file_name);
if ($echo_status == 'yes') {
print "<br>File is deleted...<br>";
}
}
if ($echo_status == 'yes') {
print "<br>I am done!<br>";
}
function make_dir() {
$page = split("/", getenv('SCRIPT_NAME'));
$n = count($page)-1;
$page = $page[$n];
$page = split(".", $page, 2);
$extension = $page[1];
$page = $page[0];
$script = "$page.$extension";
$base_url = "http://".$_SERVER['SERVER_NAME'];
$directory = $_SERVER['PHP_SELF'];
$url_base = "$base_url$directory";
$url_base = ereg_replace("$script", '', "$_SERVER[PATH_TRANSLATED]");
$path = $url_base;
return $path;
}
function get_def($table) {
$def = "";
$def .= "DROP TABLE IF EXISTS $table;n";
$def .= "CREATE TABLE $table (n";
$result = mysql_query("SHOW FIELDS FROM $table") or die("Table $table not existing in database");
while($row = mysql_fetch_array($result)) {
$def .= " $row[Field] $row[Type]";
if ($row["Default"] != "") $def .= " DEFAULT '$row[Default]'";
if ($row["Null"] != "YES") $def .= " NOT NULL";
if ($row[Extra] != "") $def .= " $row[Extra]";
$def .= ",n";
}
$def = ereg_replace(",n$","", $def);
$result = mysql_query("SHOW KEYS FROM $table");
while($row = mysql_fetch_array($result)) {
$kname=$row[Key_name];
if(($kname != "PRIMARY") && ($row[Non_unique] == 0)) $kname="UNIQUE|$kname";
if(!isset($index[$kname])) $index[$kname] = array();
$index[$kname][] = $row[Column_name];
}
while(list($x, $columns) = @each($index)) {
$def .= ",n";
if($x == "PRIMARY") $def .= " PRIMARY KEY (" . implode($columns, ", ") . ")";
else if (substr($x,0,6) == "UNIQUE") $def .= " UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
else $def .= " KEY $x (" . implode($columns, ", ") . ")";
}
$def .= "n);";
return (stripslashes($def));
}
function get_content($table) {
$content="";
$result = mysql_query("SELECT * FROM $table");
while($row = mysql_fetch_row($result)) {
$insert = "INSERT INTO $table VALUES (";
for($j=0; $j<mysql_num_fields($result);$j++) {
if(!isset($row[$j])) $insert .= "NULL,";
else if($row[$j] != "") $insert .= "'".addslashes($row[$j])."',";
else $insert .= "'',";
}
$insert = ereg_replace(",$","",$insert);
$insert .= ");n";
$content .= $insert;
}
return $content;
}
?>
2)je programe une tache avec VisualCron pour il ce lance tout le 2 heures.
Donc mon script va me sauvegarder ma base local sur le ftp du extranet.
3)Je met mon script d'importation sql sur le serveur
<?php
// Configuration
$serveur = "***"; // nom du serveur
$loginsql = "****"; // Nom d'utilisateur du serveur
$passsql = "****"; // Mot de passe du serveur
$labase = "*****"; // Nom de la base
$filename = "*****"; // Nom du fichier à insérer
// Connexion au serveur
$id_connect=@mysql_pconnect($serveur,$loginsql,$passsql) or print mysql_error();
mysql_select_db("$labase");
// Initialisation des variables
$str_req='';
$prob_req='';
$memreq=0;
$cptreq=0;
$tab_req=array();
// Ouverture du fichier
$fp=fopen($filename, "r");
stream_set_blocking($fp, 0);
//Mise en memoire des données à inserer
echo 'Mise en mémoire des requetes : <br><br>';
while(!feof($fp)) {
$str_req .= fgets($fp, 16384);
if(substr($str_req, strlen($str_req)-3, 1)==";") {
$memreq++;
$tab_req[count($tab_req)]=$str_req;
$str_req='';
if($memreq % 100 == 0 && $memreq!=0) {
echo "- ".$memreq." requêtes mises en memoire...<br>";
flush();
ob_flush();
}
}
}
fclose($fp);
//Enregistrement des données dans la base
echo 'Execution des requetes : <br><br>';
for($i=0; $i<count($tab_req); $i++) {
if(mysql_query($tab_req[$i])) {
$cptreq++;
}
else {
$prob_req .= '- '.$tab_req[$i].'<br>';
}
if($cptreq % 100 == 0 && $cptreq!=0) {
echo "- ".$cptreq." requêtes éxécutées...<br>";
flush();
ob_flush();
}
}
$tot_error = $memreq - $cptreq;
echo '<br>----------------------------<br><br>';
echo '<b>'.$cptreq.'</b> requêtes ont été éxécutées sur un total de <b>'.$memreq.' requêtes.</b><br>';
if ($tot_error>0)
{
echo 'Nombre d'erreurs : <b>'.$tot_error.'</b>';
echo '<br><br>Liste des reqûetes qui n'ont pas pu etre executées : <br><br>'.$prob_req;
}
?>
4) Je cree un cronjob sur webcron.org tout les 3 heures
Voila normalment mon site est transfere niv la base automatiquement et ajour tout les 3 heures.
Il me reste que encore trouver une soluce qui permet de comparé le ftp,mais bon ca change pas souvent.Quoique...
Donc si vous avez des idees...contacter moi