보통 MariaDB / mysql 시점 복구할 때

풀백업본 을 부어주고 풀백업본 이후의 데이터들을 mysql -uroot -p < binlog.0001  이런 방법으로 복구해주는 방법을 많이 사용합니다. 

그러나 이 경우에는 서버의 cpu core가 많아도 1core 밖에 사용할 수 없어 시간이 오래 걸리는 문제가 있어서 

자기 자신에게 gtid+replication + slave parallel thread 로 시간을 훨씬 단축시킬 수 있는 방법을 공유드리겠습니다.

 

-1. DATA 유실 발생

 
mysql> insert into sbtest.restore_test select * from sbtest.sbtest1;
Query OK, 100000 rows affected (1.23 sec)
Records: 100000  Duplicates: 0  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.09 sec)


mysql> select @@gtid_current_pos;
+--------------------+
| @@gtid_current_pos |
+--------------------+
| 0-2-1834754        |
+--------------------+
1 row in set (0.00 sec)

mysql> select @@gtid_slave_pos;
+------------------+
| @@gtid_slave_pos |
+------------------+
| 0-2-1834753      |
+------------------+
1 row in set (0.00 sec)


mysql> truncate table sbtest.restore_test;
Query OK, 0 rows affected (0.02 sec)


mysql> select @@gtid_slave_pos;
+------------------+
| @@gtid_slave_pos |
+------------------+
| 0-2-1834753      |
+------------------+
1 row in set (0.01 sec)

mysql> select @@gtid_current_pos;
+--------------------+
| @@gtid_current_pos |
+--------------------+
| 0-2-1834755        |
+--------------------+
1 row in set (0.00 sec)

mysql> select count(*) from sbtest.restore_test;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)
 
=> 데이터 유실 전 gtid position인 0-2-1834754까지 복구필요
 
 

-2. 풀백업본 copyback 및 복구시점 GTID 확인  

( binlog가 모두 중복 적용 되어도 상관 없으면 copy back 생략가능)
 
[Fullbackup]  cat xtrabackup_binlog_info
mysql-bin.000478        363292021       0-2-1834722
 
=> 0-2-1834722 부터 복구 시작하면 됨
 

-3. --replicate-same-server-id 옵션으로 자기복제 가능하도록 재기동

 
mysql>  SHUTDOWN;

[masvc01] ./bin/mysqld_safe --defaults-file=/my.cnf --replicate-same-server-id
190130 14:36:39 mysqld_safe Logging to '/logs001/masvc01/TEST_10.2.12/error/TEST_10.2.12.err'.
190130 14:36:39 mysqld_safe Starting mysqld daemon with databases from /data001/masvc01/TEST_10.2.12
=> --replicate-same-server-id 옵션은 replication 시 같은 server id 간에도 replication 이 필요할 때 주는 옵션
 
mysql> set global gtid_slave_pos='0-2-1834722';
Query OK, 0 rows affected (0.01 sec)
 
=> 위에서 확인한 풀백업본의 시작 시점을 gtid_slave_pos에 설정해줌
 
 

-4. 자기자신에게 replication 적용

 

mysql> set global slave_parallel_threads=8;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%parallel%';
+-------------------------------+--------------+
| Variable_name                 | Value        |
+-------------------------------+--------------+
| skip_parallel_replication     | OFF          |
| slave_domain_parallel_threads | 0            |
| slave_parallel_max_queued     | 131072       |
| slave_parallel_mode           | conservative |
| slave_parallel_threads        | 8            |
| slave_parallel_workers        | 8            |
+-------------------------------+--------------+
6 rows in set (0.00 sec)
=> 서버 스펙에 맞게 slave_parallel_threads/worker 설정으로 병렬복제가 가능하게 설정함
 
 
MariaDB [(none)]> show processlist;
|  13 | system user |                       | NULL               | Slave_worker |    2 | Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  14 | system user |                       | NULL               | Slave_worker |     2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  12 | system user |                       | NULL               | Slave_worker |     2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  15 | system user |                       | NULL               | Slave_worker |    2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  17 | system user |                       | NULL               | Slave_worker |     2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  16 | system user |                       | NULL               | Slave_worker |    2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  19 | system user |                       | NULL               | Slave_worker |    2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
|  18 | system user |                       | NULL               | Slave_worker |    2| Waiting for work from SQL thread                                            | NULL             |    0.000 |
=> 병렬 복제 설정 및 확인

 

 
mysql> change master to master_host='11.11.111.11', master_user='root',master_password='qhdks123@',master_port=3311, master_use_gtid=slave_pos;
Query OK, 0 rows affected (0.02 sec)
 
=> master_use_gtid=slave_pos  (  0-2-1834722 ) 부터 replication 시작.
binlog , relay log 파일 및 포지션 지정 안해줘도 DB상의  master_use_gtid=slave_pos 시점 부터의 데이터를 binary log에서 찾아서 적용함
 
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 11.11.111.11
                  Master_User: root
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No
 
=> 자기 자신에게 replication 설정 확인
 
 
mysql> start slave until master_gtid_pos='0-2-1834754';
Query OK, 0 rows affected, 1 warning (0.01 sec)
=> until master_gtid_pos='0-2-1834754' data 유실되기전까지 복제하고 멈추라는 옵션
 
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 11.11.111.11
                  Master_User: root
                  Master_Port: 3311
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000166
          Read_Master_Log_Pos: 19077237
               Relay_Log_File: bin.000002
                Relay_Log_Pos: 19077579
        Relay_Master_Log_File: mysql-bin.000166

          Exec_Master_Log_Pos: 19077237
              Relay_Log_Space: 19077876
              Until_Condition: Gtid
               Until_Log_File:
                Until_Log_Pos: 0
    
                   Using_Gtid: Slave_Pos
                  Gtid_IO_Pos: 0-2-1834754
  
                Parallel_Mode: conservative
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:

1 row in set (0.00 sec)

ERROR:
No query specified
 
=> replication 을 위해 필요한 트랜잭션을 binary log 파일에서 찾아서 적용해줌.
 Using_Gtid: Slave_Pos
                  Gtid_IO_Pos: 0-2-1834754
=> 위에서 설정한 원하는 gtid 포지션 까지 복제 후 멈춘 상태
 

 

-5. 복구 완료

 
mysql> select count(*) from sbtest.restore_test;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.04 sec)

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave all;
Query OK, 0 rows affected (0.00 sec)

mysql> change master to master_use_gtid=current_pos;
Query OK, 0 rows affected (0.02 sec)