Əsas səhifə > MySQL backup and recovery > Point-in-time recovery with MySQL row based binary log

Point-in-time recovery with MySQL row based binary log

/* Replication setup edənlər mütləq şəkildə binlog_format=row qeyd etməyi unutmasınlar */

Binary log-un nə olduğunu və hansı zamanlarda istifadə olunduğuna qısa olaraq toxunsaq əsasları:
1. Point-in-time recovery
2. Replication

Biz indi point-in-time recovery-yə baxacıq. Statement binary log formatında(default format)
hər şey çox sadədir yəni cədvələ edilən dəyişikliklər elə məhz statement şəklində bin log-a qeyd olunur. Statement bin log formatı üçün artıq bir yazım var : Statemen Binary log format

İndi isə row based binary log-la işləyək biraz.
Mövcud binary log-larımız tapaq:

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000031 |       120 |
+------------------+-----------+
1 row in set (0.13 sec)

Hansı hal hazırda istifadədir ona baxaq:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000031
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

mysql-bin.000031 hal hazırda istifadədir. Position-u 120.

Cədvəl yaradaq və məlumat daxil edək:

mysql> create schema backup_test character set=utf8;
Query OK, 1 row affected (0.26 sec)

mysql> use backup_test;
Database changed

mysql> create table test_table(
    -> id int not null auto_increment,
    -> name varchar(15),
    -> surname varchar(20),
    -> primary key(id)
    -> );
Query OK, 0 rows affected (0.74 sec)

mysql> insert into test_table(name,surname) values('Shahriyar','Rzayev'),('Khatai','Rzayev'),('Elvin','Binyatov');
Query OK, 3 rows affected (0.16 sec)
Records: 3  Duplicates: 0  Warnings: 0

Və hər hansı dəyişikliklərin qeyd olunduğuna baxaq:

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000031
         Position: 725
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

Position 120-dən 725-ə dəyişdiyi üçün deyə bilərik ki binary log-a qeyd olunub. Binary log-a nəzər yetirək. Binary log-larla işləmək üçün mysqlbinlog utility default olaraq installation zamanı gəlir. Məndə installation path fərqli olduğu üçün məcburi full path verəcəm:

root@sh-ubuntu:~# /opt/mysql/server-5.6/bin/mysqlbinlog /var/lib/mysql/data/mysql-bin.000031
.
.
/*!*/;
# at 252
#130628 11:21:59 server id 1  end_log_pos 453 CRC32 0x5de3dc2f 	Query	thread_id=1	exec_time=0	error_code=0
use `backup_test`/*!*/;
SET TIMESTAMP=1372400519/*!*/;
create table test_table(
id int not null auto_increment,
name varchar(15),
surname varchar(20),
primary key(id)
)
/*!*/;
# at 453
#130628 11:23:06 server id 1  end_log_pos 532 CRC32 0x1e299628 	Query	thread_id=1	exec_time=0	error_code=0
SET TIMESTAMP=1372400586/*!*/;
BEGIN
/*!*/;
# at 532
#130628 11:23:06 server id 1  end_log_pos 598 CRC32 0x02542031 	Table_map: `backup_test`.`test_table` mapped to number 70
# at 598
#130628 11:23:06 server id 1  end_log_pos 694 CRC32 0xb71ce174 	Write_rows: table id 70 flags: STMT_END_F

BINLOG '
yivNURMBAAAAQgAAAFYCAAAAAEYAAAAAAAEAC2JhY2t1cF90ZXN0AAp0ZXN0X3RhYmxlAAMDDw8E
LQA8AAYxIFQC
yivNUR4BAAAAYAAAALYCAAAAAEYAAAAAAAEAAgAD//gBAAAACVNoYWhyaXlhcgZSemF5ZXb4AgAA
AAZLaGF0YWkGUnpheWV2+AMAAAAFRWx2aW4IQmlueWF0b3Z04Ry3
'/*!*/;
# at 694
#130628 11:23:06 server id 1  end_log_pos 725 CRC32 0x5509e700 	Xid = 23
COMMIT/*!*/;
DELIMITER ;
# End of logfile

Burda diqqət yetirək:

BINLOG '
yivNURMBAAAAQgAAAFYCAAAAAEYAAAAAAAEAC2JhY2t1cF90ZXN0AAp0ZXN0X3RhYmxlAAMDDw8E
LQA8AAYxIFQC
yivNUR4BAAAAYAAAALYCAAAAAEYAAAAAAAEAAgAD//gBAAAACVNoYWhyaXlhcgZSemF5ZXb4AgAA
AAZLaGF0YWkGUnpheWV2+AMAAAAFRWx2aW4IQmlueWF0b3Z04Ry3

Bunun izahı:
By default, mysqlbinlog displays row events encoded as base-64 strings using BINLOG statements

Dolayısı ilə bas64 encoded string olduğu üçün biz görə bilmirik ki, konkret olaraq nə baş verib və nə düşüb bin log-a(bir daha qeyd edirəm ki bu row based binary log format-a aiddir).
Bizim anlaya biləcəyimiz bir dildə göstərilməsi üçün aşağıdakı qaydada decode edirik:

root@sh-ubuntu:~# /opt/mysql/server-5.6/bin/mysqlbinlog -vv --base64-output=DECODE-ROWS /var/lib/mysql/data/mysql-bin.000031
.
.
/*!*/;
# at 252
#130628 11:21:59 server id 1  end_log_pos 453 CRC32 0x5de3dc2f 	Query	thread_id=1	exec_time=0	error_code=0
use `backup_test`/*!*/;
SET TIMESTAMP=1372400519/*!*/;
create table test_table(
id int not null auto_increment,
name varchar(15),
surname varchar(20),
primary key(id)
)
/*!*/;
# at 453
#130628 11:23:06 server id 1  end_log_pos 532 CRC32 0x1e299628 	Query	thread_id=1	exec_time=0	error_code=0
SET TIMESTAMP=1372400586/*!*/;
BEGIN
/*!*/;
# at 532
#130628 11:23:06 server id 1  end_log_pos 598 CRC32 0x02542031 	Table_map: `backup_test`.`test_table` mapped to number 70
# at 598
#130628 11:23:06 server id 1  end_log_pos 694 CRC32 0xb71ce174 	Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Shahriyar' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Rzayev' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Khatai' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Rzayev' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Elvin' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Binyatov' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
# at 694
#130628 11:23:06 server id 1  end_log_pos 725 CRC32 0x5509e700 	Xid = 23
COMMIT/*!*/;
DELIMITER ;
# End of log file

İndi isə fərqə diqqət edirik:

### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Shahriyar' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Rzayev' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Khatai' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Rzayev' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=3 /* INT meta=0 nullable=0 is_null=0 */
###   @2='Elvin' /* VARSTRING(45) meta=45 nullable=1 is_null=0 */
###   @3='Binyatov' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

İnsert bizə aydın şəkildə göstərildi. İndi isə yuxarıdakıların nə anlama gəldiyini izah edək:
@1, @2, @3 column sırasıni göstərir. @N olaraq dava edir, harda ki N sütün sayıdır.

/* INT meta=0 nullable=0 is_null=0 */ İNT data tipini göstərir.
/* VARSTRING(45) meta=45 nullable=1 is_null=0 */ varstring=varchar.

İndi isə binary log-un nə dərəcədə əhəmiyyətli olduğunu nümayiş etdirək. Deyək ki, cədvəlimizi səhvən drop etmişik:

mysql> drop table test_table;
Query OK, 0 rows affected (0.24 sec)

mysql> select * from test_table;
ERROR 1146 (42S02): Table 'backup_test.test_table' doesn't exist

Və əlimizdə backup yoxdur. Lakin vaxtında binary log-umuzu aktiv etdiyimiz üçün bəxtimiz gətirib. Biz drop-a qədər olan bütün dəyişiklikləri replay edə bilərik. Bunun üçün binlog position-ları öyrənməliyik. Bir daha binary log-a nəzər yetirək:

/*!*/;
# at 252
#130628 11:21:59 server id 1  end_log_pos 453 CRC32 0x5de3dc2f 	Query	thread_id=1	exec_time=0	error_code=0
use `backup_test`/*!*/;
SET TIMESTAMP=1372400519/*!*/;
create table test_table(
id int not null auto_increment,
name varchar(15),
surname varchar(20),
primary key(id)
)
/*!*/;
# at 453
#130628 11:23:06 server id 1  end_log_pos 532 CRC32 0x1e299628 	Query	thread_id=1	exec_time=0	error_code=0
SET TIMESTAMP=1372400586/*!*/;
BEGIN
/*!*/;
# at 532
#130628 11:23:06 server id 1  end_log_pos 598 CRC32 0x02542031 	Table_map: `backup_test`.`test_table` mapped to number 70
# at 598
#130628 11:23:06 server id 1  end_log_pos 694 CRC32 0xb71ce174 	Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=1
###   @2='Shahriyar'
###   @3='Rzayev'
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=2
###   @2='Khatai'
###   @3='Rzayev'
### INSERT INTO `backup_test`.`test_table`
### SET
###   @1=3
###   @2='Elvin'
###   @3='Binyatov'
# at 694
#130628 11:23:06 server id 1  end_log_pos 725 CRC32 0x5509e700 	Xid = 23
COMMIT/*!*/;
# at 725
#130628 11:48:11 server id 1  end_log_pos 862 CRC32 0xb911519a 	Query	thread_id=2	exec_time=1	error_code=0
SET TIMESTAMP=1372402091/*!*/;
DROP TABLE `test_table` /* generated by server */
/*!*/;

# at 252 -də başlayacıq # at 725-ə qədər replay edəcik. Yəni drop-a qədər:

root@sh-ubuntu:~# /opt/mysql/server-5.6/bin/mysqlbinlog --start-position=252 --stop-position=725 /var/lib/mysql/data/mysql-bin.000031 | mysql -u root -p
Enter password:

Möcüzəli şəkildə cədvəlimiz və içindəki məlumatlar geri qayıtdı:

mysql> select * from test_table;
+----+-----------+----------+
| id | name      | surname  |
+----+-----------+----------+
|  1 | Shahriyar | Rzayev   |
|  2 | Khatai    | Rzayev   |
|  3 | Elvin     | Binyatov |
+----+-----------+----------+
3 rows in set (0.00 sec)

Bizim işlərimizi asanlaşdırmaq üçün və öz məlumat təhlükəsizliyinizi təmin etmək üçün mütləq binary log-u aktiv edin!
Təşəkkürlər😉

  1. İyun 28, 2013 tarixində, saat 07:50

    Gözəl məqalədir arxiv🙂

  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: