Arxiv

Posts Tagged ‘backup’

MySQL backup and recovery ümumi baxış

Backup-ın vacibliyindən danışmayacam. Təsadüfi deyil ki böyük proyektlərdə ayrıca backup\recovery team ayrılır. Və onların işi həqiqətən də recovery-yə yarayan backup-ları almaqdan ibarətdir. Yəni backup yalnızca mysqldump-la və yaxud da hər hansı php scritp-lə .sql və yaxud .txt faylı almaq deyildir.
Terminləri izah etməklə başlayaq.
1. Physical (Raw) backupPhysical backups consist of raw copies of the directories and files that store database contents. This type of backup is suitable for large, important databases that need to be recovered quickly when problems occur. A backup that copies the actual data files
MySQL data directory-də olan bütün fayllar,həmçinin binary log-u və.s backup etmək metodudur.
Yuxarıda da deyildiyi kimi böyük database-lər üçün əlverişlidir.
3 üsulla alınır:
Hot — MySQL işləyə-işləyə isti-isti backup almaq üsulu.MySQL Enterprise Backup bu üsuldan istifadə edir.
Cold — MySQL shut-down olunur daha sonra backup alınır
Warm — MySQL işlək vəziyyətdə saxlanılır,lakin table-lar lock olur, connection-lar bağlanır və.s

2. Logical backupA backup that reproduces table structure and data, without copying the actual data files.
Adətən mysqldump vasitəsilə alınır.

Bəs yaxşı restore nədir? recovery nədir?
Restore — sadəcə alınan backup-ı geri bərpa etməkdir.
Recovery — hər hansı crash, bədbəxt hadisə və.s-dan sonra backup-ı bərpa etməklə bərabər MySQL-in stabil işləməsini qarantiliyəcək əməliyyatlar toplusudur. Innodb crach recovery buna misal ola bilər.

Backup strategiyasını düşünərkən çox vacib suallara özünüzdə cavab tapın:
1. Siz recovery zamanı hansısa məlumatı itirməyi gözə alırsınız mı? Yəni Bazar günü saat 00:30-da backup aldıqdan sonra üstündən 20 saat keçdikdən sonra nəsə baş versə və siz bazar günkü backup-dan istifadə etsəniz son 20 saat ərzində baş vermiş dəyişiklikləri itirməyi gözə alırsınız mi?
Əgər alırsınızsa işiniz asanddır. Yox əgər deyirsinizsə ki,xeyr əsla heç bir əməliyyat itirilməməlidir o zaman sizə point-in-time recovery lazım olacaq. Yəni adicə mysqldump-la və yaxud php script-lə aldığınız full backup(logical backup) sizə yardım etməyəcək.

2. Sizin recovery zamanınız və sürətiniz nə qədər olmalıdır? Sizin üçün 3-4 saat və bəlkə də daha artıq davam edən recovery vaxtı qəbul ediləndir mi? bu 3-4-5 saat ərzində user-ləriniz dözə bilərlər mi? işləriniz yarımçıq qalar mı? və.s

3. Siz nələri recover etmək istəyirsiz? Bəlkə bütün server,bütün schema, bütün table və yaxud sadəcə 1 row, 1 statement?

Tələblərinizi gözdən keçirdin və onu bir kənara aydın şəkildə yazın.

MySQL backup və recovery teknikləri(daha advance),tool-lar və.s haqqında yazılar olacaq…
Təşəkkürlər 🙂

Advertisements

MySQL binary log-un aktiv edilməsi

MySQL Binary log-u enable etmək istəyərkən mysql start olmadı. Başıma gələn bədbəxt hadisə sizə də olmasın deyə yazıram…
İlk öncə binary log nədir? From Documentation:
The binary log contains “events” that describe database changes such as table creation operations or changes to table data. It also contains events for statements that potentially could have made changes (for example, a DELETE which matched no rows), unless row-based logging is used. The binary log also contains information about how long each statement took that updated data

Və binary log-un 2 əsas yerdə istifadə olunur. Yenə də from Documentation:
The binary log has two important purposes:

1. For replication, the binary log on a master replication server provides a record of the data changes to be sent to slave servers. The master server sends the events contained in its binary log to its slaves, which execute those events to make the same data changes that were made on the master.

2. Certain data recovery operations require use of the binary log. After a backup has been restored, the events in the binary log that were recorded after the backup was made are re-executed. These events bring databases up to date from the point of the backup.

Bizim üçün indiki halda 2-ci bənd maraqlıdır. Qısaca onu deyim ki binary log vasitəsilə Point-in-Time (Incremental) Recovery icra olunur. MySQL backup and recovery haqqında mövzunu genişləndirəcəm təbii ki indiki halda sadəcə binary log-u necə enable edirlər ona baxırıq.

Deməli bunun üçün my.cnf faylına [mysqld] kataloqunun altından bunları yazırıq:

log_bin=/var/lib/mysql/data/mysql-bin
expire_logs_days=14
sync_binlog=1
binlog_format=row
log_bin_index=/var/lib/mysql/data/mysql-bin

1. log_bin=/var/lib/mysql/data/mysql-bin onu göstərir ki, bizim yaradılacaq binary log fayllarımızın adları mysql-bin-le başlayacaq. Məsələn mysql-bin.000003
2. log_bin_index=/var/lib/mysql/data/mysql-bin onu göstərir ki, mysql-bin.index adlı bir faylımız yaranacaq…bu fayl məqsədi: To keep track of which binary log files have been used, mysqld also creates a binary log index file that contains the names of all used binary log files..
3. expire_logs_days=14 hər 14 gündən bir köhnə binary log-lar avtomatik silinəcək.
4. sync_binlog=1 If the value of this variable is greater than 0, the MySQL server synchronizes its binary log to disk. Default qiymət =0-dır bu isə crash zamanı itkilərə yol aça bilər,ona görə də =1 yazmışıq.
5. binlog_format=row In row-based logging, the master writes events to the binary log that indicate how individual table rows are affected

my.cnf faylını Save edirik və mysql-i start etməyə çalışırıq.

[root@sh ~]# systemctl start mysqld.service
Job failed. See system journal and 'systemctl status' for details.

oops və dərhal log-a baxırıq:

/usr/libexec/mysqld: File '/var/lib/mysql/data/mysql-bin.000001' not found (Errcode: 13)
121225 22:29:02 [ERROR] Could not use /var/lib/mysql/data/mysql-bin for logging (error 13). Turning logging off for the whole duration of the MySQL server process. To turn it on again: fix the cause, shutdown the MySQL server and restart it.
121225 22:29:02 [ERROR] Aborting

Errorcode: 13
Vaxt itirmədən perror utility vasitəsilə bunun nə olduğuna baxırıq:

[root@sh ~]# perror 13
OS error code  13:  Permission denied

Permission denied bu bizə ipucu verir ki, problem MySQL-də yox məhz Linux-dadır yani OS imkan vermir ki MySQL /var/lib/mysql/data/ direktoriyasına nəsə yazsın.
Həlli:

[root@sh ~]# chown mysql:mysql /var/lib/mysql/data -R

MySQL-i start edirik:

[root@sh ~]# systemctl start mysqld.service

Və həqiqətən də ilk mysql-bin.000001 binary log-umuz yaradıldı.. Təbriklər 🙂

[root@sh ~]# ls /var/lib/mysql/data
mysql-bin.000001  mysql-bin.index  sh-slow.log

mysqldump – A Database Backup Program

MySQL Documentation 5.5: The mysqldump client is a backup program originally written by Igor Romanenko. It can be used to dump a database or a collection of databases for backup or transfer to another SQL server (not necessarily a MySQL server). The dump typically contains SQL statements to create the table, populate it, or both.
mysqldump-ın nə olduğunu oxuduq qəşəng,sadə şəkildə yazılıb tərcüməyə də ehtiyac yoxdur…amma ancaq lakin burda bir neçə maraqlı hadisələr var…
İlk öncə onu deyim ki, mysqldump-ın 2 output növü var –tab option-lu və –tab-sız…–tab-lıdan başdıyaq
***
Deyək ki, bizdə language_aze cədvəli var…cədvəl strukturu və içindəkilər bunlardır:

mysql> desc language_aze\g
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   |     |         |       |
| Language    | char(30)      | NO   |     |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | float(4,1)    | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> select * from language_aze;
+-------------+-------------+------------+------------+
| CountryCode | Language    | IsOfficial | Percentage |
+-------------+-------------+------------+------------+
| AZE         | Armenian    | F          |        2.0 |
| AZE         | Azerbaijani | T          |       89.0 |
| AZE         | Lezgian     | F          |        2.3 |
| AZE         | Russian     | F          |        3.0 |
+-------------+-------------+------------+------------+
4 rows in set (0.00 sec)

İndi biz bu cədvəli dump etmək istəsək:

[root@sh ~]# mysqldump --tab='/var/lib/mysql' -u root -p my_new_db language_aze
Enter password: 

Və əgər /var/lib/mysql-ə getsək orada 2 faylın əmələ gəldiyini görərik…biri language_aze.sql digəri isə language_aze.txt

Maraqlıdır ki, bu zaman table create definition language_aze.sql faylında, cədvəlin içindəki məlumatlar isə language_aze.txt faylında yerləşəcək:


🙂 yaxşı dedim deməyinə… 😀
Bu mysqldump-ın birinci –tab-lı output-u idi…İndi isə –tab-sıza baxaq. İlk öncə fayllarımızı silək:

[root@sh ~]# cd /var/lib/mysql
[root@sh mysql]# rm language_aze.sql
rm: remove regular file `language_aze.sql'? y
[root@sh mysql]# rm language_aze.txt
rm: remove regular file `language_aze.txt'? y

Və dump edək:

[root@sh ~]# mysqldump -u root -p my_new_db language_aze > /var/lib/mysql/dump.sql
Enter password: 

Və həqiqətən də dump.sql adlı faylımız yarandı:

İndi isə bu faylın içini açıb orda nələr olduğuna bir baxaq…

Deməli şəkilə diqqət yetirsək görərik ki,faylımızda birinci olaraq:

DROP TABLE IF EXISTS `language_aze`; -- əgər belə bir table varsa onu sil!

Daha sonra :

CREATE TABLE `language_aze` (
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `Language` char(30) NOT NULL DEFAULT '',
  `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F',
  `Percentage` float(4,1) NOT NULL DEFAULT '0.0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Cədvəli yaratmaq üçün komanda!

Daha sonra bu 2 yazı:

LOCK TABLES `language_aze` WRITE;
.
.
UNLOCK TABLES;

Deməli bu 2 yazı bizə qaranti verir ki, gələcəkdə biz bu dump faylından restore edəndə, language_aze cədvəli hər hansı digər insert (WRITE) üçün bağlı olacaq…Yəni yalnız dump faylındakı insert-lər daxil olunacaq…Daha sonra unlock olunacaq və əlavə hər hansı digər user tərəfindən olunacaq insert-ləri qəbul edəcək…

Və İnsert hissə

INSERT INTO `language_aze` VALUES ('AZE','Armenian','F',2.0),('AZE','Azerbaijani','T',89.0),
('AZE','Lezgian','F',2.3),('AZE','Russian','F',3.0);

Gördüyümüz kimi mysqldump default olaraq multiple insert-dən istifadə edir…Bu çox faydalıdır…çünki multiple insert adi insert-dən daha sürətlidir və gələcəkdə restore vaxtı daha sürətli insert əldə edə biləcik…
Bəs yaxşı bu yazılar hardan gəlir düşür bura? 😛 Yəni, əslində biz heçnə qeyd etməmişik…
Bunun səbəbi odur ki, mysqldump default\implicit olaraq –opt opsiyası ilə gəlir…default olaraq bu belə olduğu üçün mən yuxarıda –opt qeyd etməmişdim.
–opt opsiyasını yazmaq aşağıdakıları yazmaq kimi bir şeydir. Yəni aşağıdakılar –opt -nin içində var (əgər belə demək mümkündürsə):
1. –add-drop-table -> Add a DROP TABLE statement before each CREATE TABLE statement.
2. –add-locks -> Surround each table dump with LOCK TABLES and UNLOCK TABLES statements. This results in faster inserts when the dump file is reloaded.
3. –create-options -> Include all MySQL-specific table options in the CREATE TABLE statements.
4. –disable-keys -> For each table, surround the INSERT statements with /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; and /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; statements. This makes loading the dump file faster because the indexes are created after all rows are inserted. This option is effective only for nonunique indexes of MyISAM tables. It has no effect for other tables.
5. –extended-insert -> Use multiple-row INSERT syntax that include several VALUES lists. This results in a smaller dump file and speeds up inserts when the file is reloaded.
6. –lock-tables -> For each dumped database, lock all tables to be dumped before dumping them. The tables are locked with READ LOCAL to permit concurrent inserts in the case of MyISAM tables. For transactional tables such as InnoDB, –single-transaction is a much better option than –lock-tables because it does not need to lock the tables at all.
7. –quick -> This option is useful for dumping large tables. It forces mysqldump to retrieve rows for a table from the server a row at a time rather than retrieving the entire row set and buffering it in memory before writing it out.
8. –set-charset -> Add SET NAMES default_character_set to the output. This option is enabled by default. To suppress the SET NAMES statement, use –skip-set-charset.

Bəli məncə indi aydın oldu ki, niyə bizim dump faylımızda o yazılar peyda olmuşdu…
–opt-nin nə qədər faydalı olduğunu nümayiş etdirmək üçün –skip-opt (yəni opt-dən istifadə etmə,onu skip elə)

[root@sh ~]# mysqldump --skip-opt -u root -p my_new_db language_aze > /var/lib/mysql/dump2.sql
Enter password: 

Özünüz müqayisə edin 🙂

mysqldump haqqında daha ətraflı documentation-da:
mysqldump
Using mysqldump for Backups

Kateqoriyalar: MySQL Etiketlər: , , ,