Автоматизирано архивиране на MySQL бази данни

alabalist

New Member
Реших да споделя с всички как архивирам базите си данни за сайтовете. Омръзна ми да търся подходящи и недописани Plugins и готови скриптове и затова създадох мой вариант.

Какво върши:

Архивира база данни като първо я сваля и ZIP-ва и я изпраща на определени адреси като прикачен файл, като след това изтрива файла. Разбира се може и да не изпраща, а може и да не трие локалните копия. В името на файла е домейна, базата данни и дата и час на архивирането.

Имайте предвид, че скрипта е подходящ само за малки бази данни от порядъка на 8 MB.

Какво е необходимо:

1. Последна версия на https://github.com/PHPMailer/PHPMailer
2. Скрипта
3. Папка извън public_html
4. Настройка на Cron job с параметър:
Код:
php -q /home/MY_HOME_DIR/sqlbackup/backup-db.php >/dev/null 2>&1

Тестван е на superhosting.bg и host.bg, но при host.bg трябва за $dbhost да се ползва 'localhost', а при superhosting.bg трябва да е '127.0.0.1'.

PHP:
<?php
// Create and mail the MySQL backup file
// Nikolay Unguzov - v1.3

// Settings -------------------------------------------------------------------------
$domainname 	= "mysite.com";
$dbuser 		= 'dbuser'; // Database username 
$dbpass 		= 'dbPa$$0rd!@'; // Database password
$dbname 		= 'dbname'; // Database name
$dbhost 		= 'localhost'; // Usually localhost or 127.0.0.1

$sendto[] 		= "[email protected]";
$sendto[] 		= "[email protected]";
$sendfromName 	= "DB Backup {$domainname}";
$sendfrom 		= "cms@{$domainname}";
$sendsubject 	= "{$domainname} - Database Backup";
$bodyofemail 	= "Attached backup of database for {$domainname}.";
//-----------------------------------------------------------------------------------

// Backup database
$backupfile = "{$domainname}-{$dbname}--" . date("Y-m-d_H-i") . '.sql.gz';
$systemCommand = 'mysqldump -h' . $dbhost . " --user='" . $dbuser . "' --password='". $dbpass . "' '" . $dbname . "' | gzip -9 > " . $backupfile;

system($systemCommand);

// Mail the file
require_once('phpmailer/class.phpmailer.php');

$email = new PHPMailer();
$email->From      = $sendfrom;
$email->FromName  = $sendfromName;
$email->Subject   = $sendsubject;
$email->Body      = $bodyofemail;
$email->AddAttachment($backupfile, $backupfile);

foreach ($sendto as $recepient) 
{ 
	$email->AddAddress($recepient);
}

$email->Send();

// Delete the file from server
unlink($backupfile);
?>
 
Последно редактирано:
От: Автоматизирано архивиране на MySQL бази данни

Абе то хубаво ама когато имам база с няколко десетки милиона записи как си го представяш да ми бъде изпратено по email?Изпращането по mail е излишно.
 
От: Автоматизирано архивиране на MySQL бази данни

по-трудно ми е да си представя как се справя с дефолтната стойност на php, за max_execution_time която е 30 секунди :D Да ползваш php за системни задачи е малко като да ползваш DOS за 3D анимация
 
От: Автоматизирано архивиране на MySQL бази данни

Абе то хубаво ама когато имам база с няколко десетки милиона записи как си го представяш да ми бъде изпратено по email?Изпращането по mail е излишно.

Изпращането не е задължително - коментират се или се изтриват редовете от "// Mail the file" надолу и само ще архивира. Аз ползвам този вариант защото имам множество сайтове с малки бази данни, които е удобно да получавам по пощата.
 
От: Автоматизирано архивиране на MySQL бази данни

по-трудно ми е да си представя как се справя с дефолтната стойност на php, за max_execution_time която е 30 секунди :D Да ползваш php за системни задачи е малко като да ползваш DOS за 3D анимация

Работи идеално с бази данни до 7-8 MB. За по-големи със сигурност има по-добро решение, което надявам се някой може да предложи тук. И разбира се може да се увеличи max_execution_time.

Скрипта е много подходящ за ползване на сравнително малки бази данни на споделен хостинг, за сериозни проекти това не е решение :)
 
От: Автоматизирано архивиране на MySQL бази данни

Толкова писане за един ред :D
Код:
mysqldump --default-character-set=utf8 $DB -u $UID -p$PWD | bzip2 > $BACKUP.bz
А на клиента си слагаш един крон да тегли от фтп с парола.
 
От: Автоматизирано архивиране на MySQL бази данни

След толкова време още не мога да свикна с българските форуми :rolleyes:

Казваш например "Заповядайте да си вземете един шоколадов бонбон!":
- В наш форум: "Нямаше ли с бял шоколад? И защо е без ядки?"
- В чужд форум: "Благодаря за бонбона, колко жалко, че съм алергичен, но въпреки това изглежда вкусен."
 
От: От: Автоматизирано архивиране на MySQL бази данни

Толкова писане за един ред :D
Код:
mysqldump --default-character-set=utf8 $DB -u $UID -p$PWD | bzip2 > $BACKUP.bz
А на клиента си слагаш един крон да тегли от фтп с парола.

Този код работи идеално и не се ползва PHP. Но аз искам всеки архив да бъде с уникално име и дата в името за да не се презаписват и да се архивират лесно на външен носител, както правя за всички мои клиенти.
 
От: От: Автоматизирано архивиране на MySQL бази данни

То се подразбира от това, че съм дал нещата с променливи.
Този код работи идеално и не се ползва PHP. Но аз искам всеки архив да бъде с уникално име и дата в името за да не се презаписват и да се архивират лесно на външен носител, както правя за всички мои клиенти.
Код:
# !/bin/bash
BACKUP="$1-`date +%Y-%m-%d`"
mysqldump --default-character-set=utf8 $DB -u $UID -p$PWD | bzip2 > $BACKUP.bz
 
От: Автоматизирано архивиране на MySQL бази данни

@alabalist не са ти виновни българските форуми просто това, което си пуснал не е ползваемо.
Като искаш уникално име добавяш примерно датата към името на файла $(date -u +\%Y\%m\%dt)

system() по дефаулт е забранена поне на нормалните хостинги, ако пък имаш VPS най-вероятно базата няма да ти е пет записа :).
 
От: От: Автоматизирано архивиране на MySQL бази данни

То се подразбира от това, че съм дал нещата с променливи.
Подразбира се, но кой да гледа :) Напълно си прав.
 
От: Автоматизирано архивиране на MySQL бази данни

@alabalist не са ти виновни българските форуми просто това, което си пуснал не е ползваемо.
Като искаш уникално име добавяш примерно датата към името на файла $(date -u +\%Y\%m\%dt)

system() по дефаулт е забранена поне на нормалните хостинги, ако пък имаш VPS най-вероятно базата няма да ти е пет записа :).

Пуснал съм нещо, което ползвам от месеци безпроблемно на superhosting.bg и host.bg за малки бази данни. "Неизползваемо" е малко пресилена дума. Едва ли ще работи навсякъде, точно затова всеки може да го променя, допълва или предлага по-добро решение. Но съм сигурен, че ще свърши работа на някой :)

Ако прочетеш скрипта ще видиш, че се добавя дата към името на файла. Резултата е нещо подобно на "mysite.com-mydatabase--2014-08-16_22-00.sql.gz".
 

Горе