Лесен начин за автоматизиран и чест бекъп на база данни.

NullByte

Active Member
За какво е тази статия?

Много често най-важната информация на нашия сървър е базата данни. Останалото лесно можем да го възстановим или
да правим рядко копия, защото съдържанието и данните се променят рядко.

Нещата с базата данни обаче са по-различни. Има много начин да я загубим и колкото по-рядко правим бекъп, толкова
по-голям е шанса той да е стар. А за хора, които ползват блогове и форуми това би било огромен кошмар и главоболие.

Не само, че всеки ден е от значение, но и всеки час. Представете си само разочарованието на някой ваш потребител, когато разбере, че темата
или статията, която е писал/а толкова дълго и старателно е безвъзвратно изгубена? Или пък същото да сполети ваша хубава статия в блога ви? Ад.

Написах скриптове и тази статия, в която ще се спрем на един начин, до който аз достигнах, а вероятно и хиляди други, за автоматизацията на бекъп на базите данни.
Забранявам да се копира без мое разрешение, както и части от нея или кода - тя е само за моя блог и форума на предприемач.

Какво ни е нужно?

Всичко е много лесно и просто, за постигането на целите ни се нуждаем от:

- VPS сървър, на който е нашата база данни (сайтче, блогче или форум, каквото там имате)
- VPS или Shared хостинг за съхранение на бекъпите (плана трябва да е с пространство, съобразено с големината на вашата бд, най-често най-евтиния върши работа).
- Средни познания в областта на системната администрация. (най-вече познания в защитата на системата и данните в нея)
- Инсталиран expect (най-често всяка система го имат по подразбиране)
- nano или друг за вас удобен конзолен editor

Как става - Стъпка по стъпка

Ако системата ви или хостингът за бекъп са незащитени ще компроментирате вашата база данни.
Моля спрете с четенето до тук, ако не знаете как да защитите вашите данни.

В този урок се използва mysql бази данни. Всичко се прави под root, като ако желаете по ваша преценка може и с нормален user, но гледайте да защитите директорията с файлове.

1. Експортиране на базата данни.
За целта правим кратък bash скрипт:

mkdir /root/sqlbackup
nano /root/sqlexport.sh

Код:
#!/bin/bash

NOW=$(date +"%F-%H")

/usr/bin/mysqldump -u root -p'parola' --all-databases > /root/sqlbackup/db-$NOW.sql

На мястото на parola пишете вашата root парола. Ако желаете за допълнителна защита може да замените root с друг потребител (и съответно паролата за него),
но той трябва да има достъп до съответната дб, затова променете командата според вашите нужди, синтаксиса го има в гугъл.

ВНИМАНИЕ: Ако някой се добере до скрипта ще получи достъп до базата данни и тя ще се компроментира. Вземете мерки за защита.

Правим скрипта изпълним (executable):

Код:
chmod u+x /root/sqlexport.sh

2. Сега ни трябва и скрипт за ъплоудване на базата данни на отдалечено място. За целта ще използваме expect и ftp клиента в линукс.
Expect e вариант на TCL език, чрез който много удобно и лесно може да автоматизираме вход в различни системи, например към ftp сървър.
Създаваме ftp акаунт (напр. securebackup с парола strongpass) на отдалечения хостинг и слагаме следния скрипт на VPS сървъра (където е бд):

nano /root/sendsql.exp

Код:
#!/usr/bin/expect -f

set mydate [clock format [clock seconds] -format "%Y-%m-%d_%H"]

spawn ftp vpsbg.eu
expect "Name"
send -- "[email protected]\r"
expect "Password: "
send -- "strongpass\r"
expect "vpsbg.eu\r\r"
send -- "put /root/sqlbackup/db-$mydate.sql backup-$mydate.sql\r"
expect "File transfered"
send -- "exit\r"

Слагаме права за изпълнение:
Код:
chmod u+x /root/sendsql.exp

Където разбира се вместо vpsbg.eu слагате хоста на вашия сървър, както и заменете ftp акаунта securebackup и паролата strongpass.

ВНИМАНИЕ: Ако някой се добере до скрипта или ftp акаунта/бекъпа ще получи достъп до базата данни и тя ще се компроментира. Вземете мерки за защита.

3. Решаваме колко често желаем бекъп. Съобразяваме го с това колко често ни се променя базата данни и колко място имаме за бекъп.
Моята препоръка е диапазона от веднъж на всеки час до веднъж дневно. Нека се спрем на къстъм период:
Всеки ден в 1, 8, 12, 16, 20, 22 часа (6 пъти на ден), в 4-та и 10-тата минута съответно за първия и втория скрипт. Правим следните два cron-а:
Код:
1,8,12,16,20,22 4 * * * /root/./sqlexport.sh > /dev/null 2>&1
1,8,12,16,20,22 10 * * * /root/./sendsql.exp > /dev/null 2>&1

4. От време на време не забравайте да изтривате стари бекъпи, за да не ви се препълни диска
База данни от 10MB означава над 400МБ седмично - един път на основния сървър и един път на бекъп мястото.
Моя съвет е всяка седмица да изтривате всичко и да оставяте един бекъп за миналата седмица. Ако бд ви е малка може и месечно да го правите.
За още по-голямо улеснение може да си направите и простичък скрипт с крон, който да трие/архивира периодично.

Та ето още една причина да сте на VPS - на shared хостинг не можете да правите такива неща.. а вече VPS-ите са на достъпна цена.

Ако имате някакъв проблем или въпроси отностно скриптовете или темата, пишете тук. Надявам се да ви е било полезно :)
 

NullByte

Active Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

P.S. Да добавя малка оптимизация - ако не желаете локален бекъп на предишни периоди, можете за улеснение (и предпазване от препълване на диска на VPS-а ви) да промените така скриптовете:


/root/sqlexport.sh

Код:
#!/bin/bash

/usr/bin/mysqldump -u root -p'parola' --all-databases > /root/sqlbackup/backup.sql


/root/sendsql.exp

Код:
#!/usr/bin/expect -f

set mydate [clock format [clock seconds] -format "%Y-%m-%d_%H"]

spawn ftp vpsbg.eu
expect "Name"
send -- "[email protected]\r"
expect "Password: "
send -- "strongpass\r"
expect "vpsbg.eu\r\r"
send -- "put /root/sqlbackup/backup.sql backup-$mydate.sql\r"
expect "File transfered"
send -- "exit\r"


По този начин при всяко експортиране (тоест при всеки от периодите в крона), mysqldump ще експортира базата данни във файла /root/sqlbackup/backup.sql като новия експорт ще замести стария.
След това expect ще ъплоудне чрез ftp клиента базата данни, вече със суфикс на датата на качване, за да не се изтрият старите качвания.
 
Последно редактирано:

NullByte

Active Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

Понеже някои хора, видяли темата, ме питаха как после да възстановят базите данни, без phpmyadmin, само чрез SSH - лесно е, ето как:

mysql -u root -p < backup.sql

Също искам да допълня за хората, които имат пуснат mysql на бекъп машината - можете директно да импортвате бекъпа там, за целта е нужно да се разреши правенето на отдалечени заявки (remote sql queries) и да пренасочите направо потока от mysqldump към заявката, ето пример:

/usr/bin/mysqldump -u root -p'parola' --all-databases | mysql --host=ip -u root -p'parola2'

Където parola е вашата mysql root парола за основния акаунт, а parola2 е паролата за mysql root на бекъп сървъра.
 

mlazarov

Active Member
Здравейте!

Първо да ви поздравя за желанието да пишете толкова дълги статии!

Искам да ви обърна внимание на факта, че този и подобен начин за бекъп може да се ползва само ако:
- базата ви е малка
- базата ви не се променя често (особено по време на бекъпа).

Ако не отговаря на горните условия, то най-вероятно следвайки горните инструкции ще се остреляте в крака.


Какво имам предвид?

С горните параметри за бекъп базите няма да бъдат заключени, което означава, че докато една таблица се бекъпва, а в друга може да се пише. Следователно базата ви вече няма да е консистентна и при връщане на бекъпа може да имате налични определени данни, а други, свързани с първите да ги няма. Колкото по-голяма е една база и колкото повече записи и ъпдейти има за единица време, толкова по-голям е шанса да загуби консистентност.

При малки бази може да се използва заключване им преди дъмпване, но при големи бази това ще доведе до блокиране работата на всички приложения, които я използват.

Тоест при големи бази или такива с много високо натоварване трябва да се използват други методи за бекъп, които ще гарантират целостта и консистентността на данните.
 

NullByte

Active Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

Добро включване!

Разбира се, 'урокът' е за малки бази данни, не големи корпоративни, които могат да си позволят собствена задълбочена и квалифицирана поддръжка по администрацията и няма да прибягват до уроци за масовите малки до средно малки бази данни (до 500мб).

Иначе един вариант е да се използва опцията --lock-all-tables и после да се ънлокват или --single-transaction за снапшот, така че да няма непоследователност. (попринцип опцията за заключване не ли активирана по подразбиране? не съм сигурен, може да греша)
 

r.stefanov

New Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

Малки/големи? :) 'Де забравихте percona и техните инструменти? Поддържат всички популярни сървъри, бази и има почти всяка функция, която човек може да се сети. Не заключва таблиците и размера на базите е без значение. При myisam се lock-ва съвсем за кратко в края на backup-a.
 

NullByte

Active Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

За големи бази най-добре репликация, но обикновено хората, които ще плащат отделен сървър за репликация, имат и ресурса/възможностите да се справят сами с бекъпа (или с малко помощ от чичко гугъл).
Туториала си е лесно и икономично средство за сайтове с не особено голяма б.д. и трафик, предназначено за ентисуасти, които обичат да човъркат линукса и най-вероятно могат да си нагодят нещата далеч по-добре от дадените указания, които са по-скоро за основа/насока.
 

N1ck

Active Member
От: Лесен начин за автоматизиран и чест бекъп на база данни.

Нека кажа и аз нещо. Статията е добра, но предполагам 99% от хората тук няма да се възползват от написаното, защото изглежда сложно.

По-лесен начин да се справите с backup-а e следният:

1. Внимателно си избирате хостинг доставчик, това е критично важно.
2. Инсталирате през Softaculous - което предлага WP + още 14 платформи, включително Drupal, Joomla....
3. С 3-4 кликания на мишката пускате атоматичен бекъп всеки ден с опция да се пазят последните 10, примерно. Така правите бекъп на база + файлове сайт по сайт (по лесно се ресторва ако се сгъби нещо за разлика от Mysql dump, където всичко е в един файл и майка плаче ако трябва да се ресторне една таблица)

Ако имате R1Soft Restore Backups той допълнително ще бекъпва, като втори вариянт.

Ако се понапънете малко да прочетете какво е написал колегата горе можете да добавите към това някои cron job които да бекъпват на седмица или месец, ако ви трябват по стари архиви.

Всичко това се предлага абсолютно безплатно от повечето доставчици на хостинг. Но не от всички.

Възможн Проблеми:

1. Място. Бекъпите искат място.
2. При кофти конфигурация на сървъра един mysql dump го товари 100% което може да е причина да ви спре сайта за малко, или да ви блокират акаунта за много.
3. По някога R1Soft и/или Softaculous не работят и трябва да гъчкате съпорта, а те не винаги могат да ги оправят (говорят глупости и ви губят времето)

Основен недостатък - бекъпа е на същият сървър което не е мн голям проблем, защото по правило всеки сървър е защитен в някаква степен и му се прави бекъп всеки ден. Все пак освен вас на него са още 1000 потребителя и доставчика в повечето случаи полага усилия да защити данните. (ето защо избора на доставчик е критично важно)
 

Горе