Настоящата технологична еволюция на всеки аспект от живота направи данните по-ценни от златото и среброто. Ако можете да придобивате, разраствате и защитавате данни, вие сте на една крачка от това да бъдете бог на данните. И все пак големите компании, които контролират аспекти на живота като електронна търговия, горива, транспорт и храни, разчитат на защита на данните, за да се предпазят от неизбежен колапс.
В момента загубата на данни е като загуба на застраховка живот. Така че системата за управление на базата данни, която използвате, трябва да има резервна ориентация. Ако сте администратор на MySQL или потребител, който се занимава с нарастващи данни, трябва да обмислите прилагането на план за автоматизиране на архивиране, който е по-често срещан. Причина? Може да станете жертва на хакване на данни или дори да промените данните си случайно.
Такива обстоятелства могат да доведат до неумолими пробиви на данни, особено когато нямате план за архивиране на база данни. Ако сте инвестиран потребител или администратор на MySQL, тази статия е тук, за да коригира притесненията за архивиране на вашата база данни. Ще постигнем две цели. Първо, ще разберете реализацията на експортиране на бази данни чрез “mysqldump”. След това, накрая, ще засегнем как използването на „crontab“ може да направи целия този процес по-лесен чрез автоматизация.
Подгответе директория за архивиране на данни
Тъй като Linux не прави потребителска препоръка за дестинация за архивиране на MySQL данни, от вас зависи да изберете подходящо място за архивиране. Например, в това ръководство за урок ще работим под директория за архивиране в „/var/www_my_backups/“. Обмисляме този подход само за разбиране на механизмите за архивиране на MySQL данни. В идеалния случай се препоръчва архивирането на всички важни данни да се извършва на офсайд сървър.
Можете да създадете предпочитаната от вас директория за архивиране на вашата локална машина чрез терминална команда, подобна на следната:
$ sudo mkdir /var/www_my_backups/
Уверете се, че управляваната от Linux машина за архивиране, която използвате, ви е предоставила привилегии с root достъп или sudo привилегии. Ако нямате достъп на собственик до създадената резервна директория, ще се сблъскате с грешки в разрешенията, докато изпълнявате тестове на mysqldump. Следната команда трябва да изброява активния в момента потребител на системата и подробности дали имате привилегии на собственост върху създадената папка за архивиране.
$ sudo chown $(whoami):$(whoami) /var/www_my_backups/
Потребителската програма mysqldump
Този инструмент MySQL извършва логически архиви. Това води до няколко набора SQL изрази, които пресъздават оригиналните данни на таблицата на базата данни и дефинициите на обекти, когато се изпълняват. В допълнение, едно или няколко дъмпа на база данни на MySQL се архивират или прехвърлят към вторичен SQL сървър на база данни.
Стандартна команда mysqldump е представена от следния команден синтаксис.
$ mysqldump -u [mysql_username] -p[mysql_password] [mysql_database_name]> /път/до/[mysql_dump_file_name].sql
- -u [mysql_username]: представлява привилегирован потребител на базата данни MySQL. Този потребител трябва да може да изпълнява операции за изхвърляне на база данни.
- -p[mysql_password]: представлява потребителската парола на MySQL базата данни. Не добавяйте интервал между „-p“ и „[mysql_password]“.
- [mysql_dump_file_name]: представлява името на вашата MySQL база данни.
- >: сочи към местоназначението на изходния дъмп
- /пътя/до/[mysql_dump_file_name].sql: сочи към местоположението на пътя на свързания дъмп файл. Можете да дадете на този дъмп файл [mysql_dump_file_name] персонализирано име, ако желаете.
Преди да продължим с това ръководство за урок, има нещо, което си струва да се спомене за „-p[mysql_password]“. Въпреки че това ръководство за статия ще се съсредоточи върху свързването на използването му с няколко примера за дъмп на MySQL, трябва да избягвате да го използвате директно, когато обработвате вашите реални архиви на MySQL, особено в споделена мрежа.
Изпълняващ се дъмп може да бъде привлечен с двуизмерна команда като „ps axe“, разкриваща свързаното потребителско име и парола на базата данни. Въпреки това, използването на местоположението “~/.my.cnf” за съхраняване на паролата на вашата MySQL база данни прави използването на “-p[mysql_password]” в посочената команда dump ненужно. Ако тази команда dump се изпълнява чрез cron задание, командата опция “–defaults-extra-file=/path/to/.my.cnf” трябва да насочи командата mysqldump към местоположението на паролата на базата данни.
Някои примери за архивиране на MySQL база данни
Нека разгледаме няколко потребителски сценария, при които можем да използваме командата mysqldump за архивиране на данни от базата данни на MySQL.
Архивиране на всички бази данни
Използването на командната опция „–all-databases“ във вашата команда mysqldump ще се погрижи за всички изхвърляния на MySQL база данни във вашата Linux система. Например, следната команда демонстрира как да изхвърлите всичките си MySQL бази данни във вече съществуващия файл „/var/www_my_backups/“. Потребителят на тази Linux система трябва да е root или да има sudo привилегии.
В нашия случай и за ваше разбиране ние нарекохме нашия дъмп файл „all-databases.sql“, но можете да използвате всяко друго име по ваше предпочитание. Тъй като имаме работа с всички бази данни, е необходимо да сте потребител на root MySQL акаунт.
$ mysqldump -u root -p[mysql_password] --all-databases> /var/www_my_backups/all-databases.sql
Архивиране на една база данни
Ако само една база данни MySQL е важна за вас, създаването на нейно архивиране с командата mysqldump изисква замяна на командната опция „[mysql_database]“ с действителното име. Името на дъмп файла може да приеме името на тази база данни „[mysql_database].sql“, така че да стане лесно за проследяване и възстановяване по-късно. Можете също да използвате друго персонализирано име на дъмп файл, ако желаете.
Тази примерна команда се изпълнява с помощта на root потребител, но всеки друг потребител с достъп до целевата база данни е жизнеспособна опция.
$ mysqldump -u root -p[mysql_password] [mysql_database_name]> /var/www_my_backups/[mysql_database_name].sql
Архивиране на множество бази данни
Може би имате специфичен избор на MySQL бази данни, които искате да архивирате. В този случай командната опция „[mysql_database_name]“ ще се появи повече от веднъж и всеки случай е свързан с името на базата данни, която искате да архивирате. Не забравяйте да разпределите имената на тези бази данни в командата mysqldump. Dump файлът „[mysql_database_name].sql“ също трябва да бъде свързан с уникално име, което ще запомните.
$ mysqldump -u root -p[mysql_password] [mysql_database_1_name] [mysql_database_2_name]> /var/www_my_backups/[mysql_databases_1_2_names].sql
Архивиране на една таблица
Когато вашата процедура за архивиране е само след конкретна таблица на база данни, създаването на нейното архивиране трябва да има както името на базата данни, така и името на таблицата на базата данни като командни опции на командата mysqldump. Можете да дадете на своя дъмп файл същото име като целевата таблица на базата данни, напр. [име_на_таблица_на_база_от_моята_база].sql.
$ mysqldump -u root -p[mysql_password] [mysql_database_name] [mysql_database_table_name]> /var/www_my_backups/[mysql_databases_table_name].sql
Архивиране на множество таблици
Когато искате да архивирате много специфични таблици на база данни на MySQL, споменаването на всички избрани от вас имена на таблици на база данни трябва да идва след името на базата данни, която хоства тези таблици. Целевият дъмп файл може да приеме име като [mysql_database_tables_1_2_names].sql
$ mysqldump -u root -p[mysql_password] [mysql_database_name] [mysql_database_table_1_name] [mysql_database_table_2_name]> /var/www_my_backups/[mysql_databases_tableАрхивиране на отдалечена(и) база(и)Тази примерна реализация също е лесна. Командата за изхвърляне на база данни на MySQL ще трябва да включва командата опция „-h“, последвана от името на хоста на отдалечената машина или асоциирания IP адрес. След това трябва да последват всички други обичайни команди за архивиране на база данни.
$ mysqldump -h [remote_computer_ip_or_hostname] -u root -p[mysql_password] [mysql_database_name]> /var/www_my_backups/[remote_mysql_database_name].sqlМожете да настроите тази команда mysqldump, за да се справите с другите вече обсъдени случаи на архивиране на база данни, например MySQL архивиране с множество бази данни или таблици.
Архивиране на база данни, свързана с компресии
Ако искате да свържете вашите архивни копия на данни с компресии, „| gzip -c>” командната опция mysqldump може да се използва за извеждане на gzip изход.
$ mysqldump -u корен -p[mysql_password] [mysql_database_name] | gzip -c> /var/www_my_backups/[mysql_database_name].sql.gzАко вашата база данни MySQL е огромна и искате да следите напредъка на компресията, винаги обмисляйте прилагането на опцията за подробна информация, както е показано в следващия пример.
$ mysqldump -u корен -p[mysql_password] [mysql_database_name] | gzip -c --verbose> /var/www_my_backups/[mysql_database_name].sql.gzВъзстановяване на MySQL база данни
След като приключите с архивирането на вашата MySQL база данни, какво следва? Как получавате достъп до данните, които сте осигурили толкова внимателно? Възстановяването на вашите данни изисква спазване на следния синтаксис за възстановяване на MySQL.
$ mysql -u [mysql_username] -p[mysql_password] [mysql_database_name] път/до/[mysql_database_name].sqlКакто може би не сте забелязали, единствената разлика между тази команда за възстановяване на база данни и командата за архивиране на базата данни е, че използваме опцията „mysql“ вместо опцията „mysqldump“ и опцията „<“ вместо опцията „>“.
Автоматизиране на архивиране на MySQL
Операционната система Linux е оборудвана с няколко полезни услуги, които са безценни за администратор на база данни като тази под MySQL RDBMS. Една от тези услуги е услугата cron. Той е ефективен при планиране на автоматизирани команди. Тези команди, веднъж създадени, се разпределят към таблицата cron crontab. Можете да получите достъп до crontab чрез следната команда.
$ sudo crontab -eАко бъдете подканени, тази команда може да иска да свърже изпълнението си с текстов редактор, за да избере нано текстов редактор.
Ще се отвори файл с име като “/tmp/crontab.LVY6A9/crontab”. В долната част на този файл crontab въведете жизнеспособен график на cron заедно с приложима команда за изхвърляне на MySQL. Примерът, илюстриран по-долу, прилага използването на gzip компресия за ежедневно архивиране на база данни. Понякога може да имате големи .sql файлове, планирани за архивиране. Използването на gzip намалява такива файлове до разумни размери преди архивиране на съхранение. Помага при управлението на паметта за архивиране.
00 03 * * * mysqldump -u корен -p[mysql_password] [mysql_database_name] | gzip -c> /var/www_my_backups/[mysql_database_name].sql.gzКомандната опция “00 03 ***” може да се интерпретира по следния начин. На всеки 24 часа след 3 часа сутринта командата mysqldump след нея се изпълнява за архивиране на база данни. Архивният файл на базата данни, който в момента е съществувал преди инициирането на този процес на архивиране, се презаписва. Във вашия случай не е нужно да чакате след 24 часа, за да станете свидетели на автоматизацията на архивирането на вашата база данни в действие чрез crontab.
Можете да редактирате опцията „00 03 ***“ във файла crontab на нещо като „02 00 ***“ и само за две минути процесът на архивиране трябва да се самоинициализира. Като алтернатива, ако вашето време е 22:30, редактирането на файла с “34 22 ***” ще инициализира процеса на архивиране на базата данни в 22:34. Не забравяйте да запазите (Ctrl+X) този crontab файл, преди да го затворите, за да стане тази команда изпълнима.
След изтичане на минутите, които сте задали, задачата cron трябва да бъде изпълнена. След това избройте създадената папка за архивиране на вашия терминал и създаденият архивен файл .sql.gz трябва да присъства.
$ ls -l /var/www_my_backups/Резултатът трябва да бъде подобен на следния:
-rw-r--r-- 1 корен корен 36M 29 юли 22:24 [mysql_database_name].sql.gzАко имате проблеми с откриването на .sql.gz MySQL архивния файл, коригирайте времето на crontab или цялата команда. Може да има синтактична грешка или нещо да липсва. Като алтернатива, системният cron дневник може да сочи къде има проблем.
$ sudo grep CRON /var/log/syslogНе забравяйте да нулирате записа на crontab към предпочитания от вас график на базата данни, след като потвърдите, че всичко работи правилно.
Използване на my.cnf за съхраняване на пароли за MySQL база данни
Вече споменахме недостатъците на опцията "-p[mysql_password]" на команда mysqldump, особено в споделена мрежа. Трябва да обсъдим как да приложим съхранение на пароли във файла “~/.my.cnf”. Потребителите, които използват cron за автоматизиране на архивирането на своите бази данни, ще трябва да разберат изпълнението на командната опция „–defaults-extra-file=/path/to/.my.cnf“.
Редактиране на my.cnf файл
Домашната директория на вашата Linux система съдържа този скрит файл. Директният системен път към него е „/home/your_username/.my.cnf“. Използвайте нано текстовия редактор, за да отворите този файл. Опцията “~” сочи към началната директория.
$ sudo nano ~/.my.cnfРедактирайте този отворен файл според следния синтаксис, за да съхраните успешно паролата на вашата MySQL база данни. Частта „YOUR_DB_PASS“ е единственият запис, който трябва да промените с действителната си парола за база данни. Въведете тази информация в долната част на файла и ги запазете.
[mysqldump]
password=ВАШИЯТ_DB_PASSИзползвайте Ctrl+X, за да запишете този файл. Този файл „my.cnf“ също се нуждае от някои настройки за разрешения. Изпълнете следната команда:
$ sudo chmod 600 ~/.my.cnfСега е време да видим пресъздаването на новата ни команда mysqldump с елиминирана команда „-p[mysql_password]“.
$ mysqldump -u корен [mysql_database_name] | gzip -c> /var/www_my_backups/[mysql_database_name].sql.gzКакто можете да видите, ние не добавихме нищо. Изглежда, че единственото нещо, което премахнахме, е командната опция „-p[mysql_password]“.
Crontab и –defaults-extrs-file
За потребители, които предпочитат автоматизиране на архивиране на база данни, ще трябва да извлечете паролата на базата данни във файла „~/.my.cnf“ чрез командната опция „–defaults-extra-file“. Този подход улеснява работата на командата mysqldump, когато трябва да се позовава на автентичността на потребителя и паролата на базата данни. Трябва да сте конкретни относно пътя към файла my.cnf, а не просто да използвате символа „~“. Помислете за следната реализация във файла crontab:
30 22 * * * mysqldump --defaults-extra-file=/home/system_username/.my.cnf -u root [mysql_database_name] | gzip -c> /var/www_my_backups/[mysql_database_name].sql.gzВ този пример crontab се изпълнява всеки ден в 22:30 часа, за да създаде архивирана gzip компресия на MySQL базата данни.
Последна бележка
Тази статия разгледа механизмите за архивиране на локална база данни относно директорията за архивиране „/var/www_my_backups“. Тъй като вече разбирате как протича процесът на архивиране, трябва да увеличите мащаба си и да започнете да мислите за резервни копия извън сайта. По-практичен подход обаче е чрез конфигурация за SFTP достъп, която сочи към тази резервна директория „/var/www_my_backups“.
С такава конфигурация е възможно да се създаде SFTP cron задание през отдалечен сървър, за да се извлече копие на тези локално съхранени файлове на база данни за застрахователно съхранение през нощта и ежедневно.
Докато завършваме това страхотно ръководство за статии, вие вече сте горд майстор на сценариите за архивиране на база данни на MySQL, възстановяване на резервни копия на база данни и автоматизация на архивиране на база данни. Сега трябва да се доверите и да сте уверени в използването на cron работни места, за да планирате и обработвате автоматизацията на архивирането на вашата MySQL база данни. Графиците за автоматизация не трябва да са ежедневни, тъй като могат да бъдат и седмични и месечни.