보통 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)