Bekijk Volledige Versie : Automatische Mysql Backups
Weet iemand een goed Gartis software waarmee ik doormiddel van een Script elke dag op een bepaalde tijdstip een Backup van het desbetreffende Mysql database kan laten maken?
phpMyBackup is mij al bekend, graag wat andere tips.
Ramon Fincken
12/12/07, 18:23
waarvoor? een server en welk OS ?
mysqldump en dat naar een file.
Dit te samen met de scheduler welke elke OS wel heeft.
waarvoor? een server en welk OS ?
Voor mijn server Os is CentOs 5.0
iets als:
mysqldump -uroot --opt name> site/backups/day-backup.sql
(zelf checken op fouten oid)
zelf gebruik ik een php scriptje met mail funtie, niet zelf gemaakt maar ergens opgedoken... wel wat aangepast: (tuurlijk dan ff crontabje maken en tags met hoofdletters veranderen (behalve de DEFINE zelf natuurlijk)
<?
set_time_limit(600);
#create a sql backup and send it to your e-mail address
//define settings
//database host
DEFINE('dbhost','DBHOST');
//database name
DEFINE('dbnaam','DBNAAM');
//database user
DEFINE('dbuser','DBUSER');
//database passwordt
DEFINE('dbpass','DBPASS');
//domeinnaam
DEFINE('domein','DOMEIN');
//doel
DEFINE('email','EMAILADRES');
//connect with database
$link = mysql_connect(dbhost,dbuser,dbpass) or die('No database conection could be establised');
mysql_select_db(dbnaam,$link) or die('No datbase selected');
//query to recive table names
$query = mysql_query('SHOW TABLE STATUS') or die(mysql_error());
$sql_backup = '';
//whileloop to loop trough every table
while($row = mysql_fetch_assoc($query))
{
//show sql query to rebuild the query
$sql = 'SHOW CREATE TABLE '.$row['Name'].'';
//exucte error or give a error
$query2 = mysql_query($sql) or die(mysql_error());
//create sql
$sql_backup.="\r\n#Create table ".$row['Name']."\r\n\r\n";
$out = mysql_fetch_assoc($query2);
$sql_backup.=$out['Create Table'].";\r\n\r\n";
$sql_backup.="#Dump data\r\n\r\n";
//SQL code to select everything for table
$sql = 'SELECT * FROM '.$row['Name'];
$out = mysql_query($sql);
$sql_code = '';
//loop trough the colloms
while($code = mysql_fetch_array($out,MYSQL_ASSOC))
{
$sql_code .= "INSERT INTO ".$row['Name']." SET ";
foreach($code as $insert => $value)
{
$sql_code.=$insert ."='".addslashes($value)."',";
}
$sql_code = substr($sql_code, 0, -1);
$sql_code.= ";\r\n";
}
$sql_backup.= $sql_code;
}
//generade a unique id
$unique = md5(uniqid(time()));
//message
$message = "Backup procedure van database: ".dbnaam." is met succes verlopen. U vind in de bijlage een backup van de inhoud gemaakt op. ".date('d-m-Y H:i:s')."\r\n NAAM";
//maak headers aan
//form header
$headers = "From: NAAM <noreply@".domein.">\r\n";
//terug sturen naar een niet bestaand mail adress (noreply@domein.nl)
$headers .= "Reply-To: NAAM <noreply@".domein.">\r\n";
//vertel dat het een mine versie is
$headers .= "MIME-Version: 1.0\r\n";
//email bestaat uit meerdere bestanden dus vertel wat de scheidings teken is en dat het een multipart is
$headers .= "Content-Type: multipart/mixed; boundary=\"".$unique."\"\r\n";
//we zenden een attachment mee
$headers .= "Content-Disposition: attachment\r\n";
//generenen een body. Dit is een multi part gezeik
$body.= "This is a multi-part message in MIME format.\r\n";
$body.= "\r\n";
//boundary
$body.= "--".$unique."\r\n";
//content type + charater set (iso in dit geval)
$body.= "Content-Type: text/plain; charset=iso-8859-1\r\n";
//codering (7 bit)
$body.= "Content-Transfer-Encoding: 7bit\r\n";
$body.= "\r\n";
//het bericht
$body.= $message ."\r\n";
//boundaty
$body.= "--".$unique."\r\n";
//content type + naam bestand (database.sql)
$body .= "Content-Type: application/octet-stream; name=database.sql\r\n";
//codering
$body .= "Content-Transfer-Encoding: base64\r\n";
//als bijlage toegevoegd
$body.= "Content-disposition: attachment\r\n";
$body .= "\n";
//de inhoud van het bestand
$body .= chunk_split(base64_encode($sql_backup)) . "\r\n";
//zet alles op email!
//hier kan wat tijdsverschil in zitten!
mail(email,'Mysql backup '.date('d-m-Y H:i:s'),$body,$headers);
//naar NAAM mailen
mail("EMAILADRES",'Mysql backup '.date('d-m-Y H:i:s'),$body,$headers);
echo "Backup done...";
?>
iets als:
mysqldump -uroot --opt name> site/backups/day-backup.sql
(zelf checken op fouten oid)
:)
mysqldump -u user -p password database > backup.sql
Deze gebruik ik altijd, maar dit moet je in SSH zelf invoeren, ik vraag iets wat automatisch doet.
Ramon Fincken
13/12/07, 20:49
een cron ligt dan voor de hand, maar dat zoek je dus ook niet?
Dit code kan ik niet in Cron voeren, want als ik die code in SSH invoer vraagt ie het Wachtwoord van het database.
Dus dat werkt met Cron niet.
Ramon Fincken
13/12/07, 21:13
hmm als je hier kijkt kom je dan ook niet verder?
Want ik heb zelf een cron op een plesk bak op FC4 gehad:
http://support.creativepulses.nl/viewtopic.php?t=32
PHPMyBack is een leuk tooltje, maar helaas moet je dat inbouwen in de site, en heeft het geen crom ondersteuning.
Is er niet iets van een MySQL DB backupper naar FTP via Cronjob?
Dan kan ik het naar een externe server schrijven :).
hmm als je hier kijkt kom je dan ook niet verder?
Want ik heb zelf een cron op een plesk bak op FC4 gehad:
http://support.creativepulses.nl/viewtopic.php?t=32
k ga het tegelijk ff testen.
Maar ff..
0 12 * * * mysqldump -u [USERNAME] --password=[PASSWORD] --opt [DATABASE] -K > "/[LOCATIE]/[DATABASE]12uurbackup.sql"; gzip "/[LOCATIE]/[DATABASE]12uurbackup" -f
Bij deze cron doet ie elke dag om 12:00 uur backupen ofzo?
Hoe kan ik ervoor zorgen dat ie elke dag snacht's om 00:00 het db backupt?
Ik ben niet zo sterk met cron, in Direct Admin waar ik nu mee werk staat het heel onhandig uitgelegt vind ik.
Ramon Fincken
13/12/07, 21:19
jep, in dat geval de 12 naar een 0 veranderen.
Ik heb deze cron op mijn phpbbinstallers forum laten draaien toen die nog op een VPS liep.
0 12 * * *
is in dit geval op minuut 0 van uur 12 iedere dag, iedere week
12uurbackup.sql
>>
12uurbackup.zip
pas ook hier de 12 aan voor je eigen gemak als je het om 0 uur wil laten uitvoeren en/of meerdere crons wil laten lopen
Dit code kan ik niet in Cron voeren, want als ik die code in SSH invoer vraagt ie het Wachtwoord van het database.
Dus dat werkt met Cron niet.
Zet de code in een .sh bestand, laat dit bestand uitvoeren in je cron.
Kijk ook eens op http://sourceforge.net/projects/automysqlbackup/
A script to take daily, weekly and monthly backups of your MySQL databases using mysqldump. Features - Backup mutiple databases - Single backup file or to a seperate file for each DB - Compress backup files - Backup remote servers - E-mail logs - More..
Dit script wordt hier al zo'n anderhalf jaar gebruikt en werkt fantastisch.
Kijk ook eens op http://sourceforge.net/projects/automysqlbackup/
Dit script wordt hier al zo'n anderhalf jaar gebruikt en werkt fantastisch.
Ziet er netjes uit, deze bestand editen en dan op server zetten en dan een cron naar dit bestand ofzo?
Zo ja, welke tijden dan in die cron, wan de tijden bepaald dit scriptje toch zelf?
Ziet er netjes uit, deze bestand editen en dan op server zetten en dan een cron naar dit bestand ofzo?
Zo ja, welke tijden dan in die cron, wan de tijden bepaald dit scriptje toch zelf?
Je zou het gewoon zelf kunnen lezen:
# Finally copy automysqlbackup.sh to anywhere on your server and make sure
# to set executable permission. You can also copy the script to
# /etc/cron.daily to have it execute automatically every night or simply
# place a symlink in /etc/cron.daily to the file if you wish to keep it
# somwhere else.
CharlieRoot
14/12/07, 08:56
/usr/local/bin/mysqldump -lv -uroot -p***** -A > /backup/file.sql
vervang de sterretjes net als 'root' voor de user/pass. Geen spasies tussen -u<username> en -p<pass>
Hij vraagt nergens om als je het zo intypt. Wij draaien het in Crontab ook zo
/usr/bin/mysqldump -lv -uusername -ppassword -A > /Mysql_Backups/dbackup.sql
Zo werkt ie bij mij, nu ff nog een crontab aanmaken.
Omdat het bestandsnaam het zelfde is wordt ie bestand telkens ververst toch?
Ramon Fincken
16/12/07, 15:36
Jep, dus maak er een paar aan met verschillende filenames bv ?
Jep, dus maak er een paar aan met verschillende filenames bv ?
Nou ik heb net in Direct Admin een cron aangemaakt.
Zoals je dit kunt zien op het fototje.
Maar ik bekijk het map op het server, dus die path die ik in het cron heb ingevoerd maar ik zie helemaas geen sql bestand.
Ondaks dat de tijd in het Cron is verlopen.
Enige idee waarom?
http://img114.imageshack.us/img114/3029/cronfl6.jpg
Maar ik bekijk het map op het server, dus die path die ik in het cron heb ingevoerd maar ik zie helemaas geen sql bestand.
Voldoende schrijfrechten op de directory waarin je het .sql bestand plaatst?
Normaal worden cron error logs naar de mailbox van de user die de cron uitvoert gestuurd, of zichtbaar vanuit een optie in je controlpanel.
Je kan de cron output ook naar een logbestand sturen door bv. volgende achteraan je lijn toe te voegen: >> /home/admin/cronerror.log
Voldoende schrijfrechten op de directory waarin je het .sql bestand plaatst?
Normaal worden cron error logs naar de mailbox van de user die de cron uitvoert gestuurd, of zichtbaar vanuit een optie in je controlpanel.
Je kan de cron output ook naar een logbestand sturen door bv. volgende achteraan je lijn toe te voegen: >> /home/admin/cronerror.log
Ja die map heeft gewoon zoals elke map het recht 0755
Ik voer het als root dus moet geen probleem zijn.
Nu heb ik dit cron geplaats na jou text :
/usr/bin/mysqldump -lv -u**** -p******* -A > /Mysql_Backups/diyar.sql>> /home/admin/cronerror.log
Nu komt er in map /Mysql_Backups een bestand van diyar.sql met 0 MB
En in map /home/admin het bestand cronerror.log met 93 MB
En 93 MB is mijn Database :)
Dus er is iets fouts.
Nu heb ik dit cron geplaats na jou text :
/usr/bin/mysqldump -lv -u**** -p******* -A > /Mysql_Backups/diyar.sql>> /home/admin/cronerror.log
Nu komt er in map /Mysql_Backups een bestand van diyar.sql met 0 MB
En in map /home/admin het bestand cronerror.log met 93 MB
En 93 MB is mijn Database :)
Dus er is iets fouts.
Foutje van mijn kant: moest natuurlijk achteraan 2>/home/admin/cronerror.log zijn (dus 2> en niet >>). Zo zouden errors in die logfile moeten komen.
Nu, met >>, heb je gewoon alle output doorgestuurd naar cronerror.log, vandaar dat de database daarin terecht kwam.
Is me echter nog niet duidelijk waarom /usr/bin/mysqldump -lv -u**** -p******* -A > /Mysql_Backups/diyar.sql niet lukt.