Arxiv

Posts Tagged ‘recovery’

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