xtrabackup - (2) 복구 : 기본편

2024. 11. 23. 01:34MySQL/Class

반응형

# 복구를 하기 전에 핫백업이라는 것을 확실히 확인하기 위해서 약간의 시나리오를 만들어 보았습니다.

(1) 데이터 100만건을 발생시켜 다량의 DML 이 발생되는 중에 백업을 완료하였습니다.

 - 100만건이 들어가기전에 백업은 완료되었습니다.

(2) slave DB를 replication을 중지시켜서 100만건의 데이터를 다 받지 못했다는 상황을 만들었습니다.

 

# 복구 후 확인 해야 할 사항

(1) 백업본으로 데이터를 복구 하였을 때 어디까지 데이터가 복구 되었는지 확인

(2) replication을 연결하였을 경우, 제대로 연동이 되었는지, 그리고 100만건의 데이터가 제대로 복구 되었는지 확인

 

1. 시나리오 셋팅

(1) master 작업

# temp_event 테이블에 인서트 하는 프로시져
mysql> call imp_tmp_event2(1000000);

 

- 데이터 insert 진행 중 백업을 하였습니다.

$ xtrabackup --defaults-file=/etc/my_8033.cnf --user=root --backup --target_dir=/data/backup --socket=/tmp/mysql_8033.sock
[root@centOS09-02 data]# xtrabackup --defaults-file=/etc/my_8033.cnf --user=root --password='1234' --backup --target_dir=/data/backup --socket=/tmp/mysql_8033.sock
2024-10-26T14:54:00.916501+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --server-id=200 --datadir=/data/mysql_data --innodb_file_per_table=1 --innodb_buffer_pool_size=500M 
2024-10-26T14:54:00.916553+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized client arguments: --port=3306 --socket=/tmp/mysql_8033.sock --target-dir=/data/backup --user=root --password=* --backup=1 --target-dir=/data/backup --socket=/tmp/mysql_8033.sock 
xtrabackup version 8.0.35-31 based on MySQL server 8.0.35 Linux (aarch64) (revision id: 55ec21d7)
241026 14:54:00  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/tmp/mysql_8033.sock' as 'root'  (using password: YES).
241026 14:54:00  version_check Connected to MySQL server
241026 14:54:00  version_check Executing a version check against the server...
241026 14:54:00  version_check Done.
2024-10-26T14:54:00.975589+09:00 0 [Note] [MY-011825] [Xtrabackup] Connecting to MySQL server host: localhost, user: root, password: set, port: 3306, socket: /tmp/mysql_8033.sock
.
.
.
2024-10-26T14:54:03.582738+09:00 0 [Note] [MY-011825] [Xtrabackup] Done: Writing file /data/backup/xtrabackup_info
2024-10-26T14:54:04.583167+09:00 0 [Note] [MY-011825] [Xtrabackup] Transaction log of lsn (326870821) to (343857152) was copied.
2024-10-26T14:54:04.788079+09:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

 

(2) slave 작업

- 장애가 났다는 것을 가정하기 위해서 대상 slave 서버를 replication 중단하였습니다.

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

mysql> select count(*) from test.temp_event;
+----------+
| count(*) |
+----------+
|     6416 |
+----------+
1 row in set (0.01 sec)

- 6416건만 insert 되었고, 이 데이터가 100만건이 되면 복구가 성공하는 것입니다.

 

(3) 시나리오 완성

- 백업이 끝난 이후에 insert 작업이 끝났습니다.

- 백업 데이터에는 백만건의 데이터는 없을 것입니다. 나머지는 binlog로 복구가 되겠지요.

mysql> call imp_tmp_event2(1000000);
Query OK, 1 row affected (5 min 24.41 sec)

mysql> select count(*) from temp_event;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.06 sec)

 

 

2. 복구

(1) prepare

$ xtrabackup --prepare --target-dir=/data/backup
[root@centOS09-01 backup]# xtrabackup --prepare --target-dir=/data/backup
2024-11-04T22:18:32.936610+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1 --innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_file_size=50331648 --innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2 --server-id=200 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0 --innodb_undo_log_encrypt=0 
2024-11-04T22:18:32.936802+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized client arguments: --prepare=1 --target-dir=/data/backup 
xtrabackup version 8.0.35-31 based on MySQL server 8.0.35 Linux (aarch64) (revision id: 55ec21d7)
.
.
.
2024-11-04T22:18:34.047722+09:00 0 [Note] [MY-013084] [InnoDB] Log background threads are being closed...
2024-11-04T22:18:34.065664+09:00 0 [Note] [MY-012980] [InnoDB] Shutdown completed; log sequence number 343598102
2024-11-04T22:18:34.067464+09:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

 

 

(2) copy-back

$ xtrabackup --defaults-file=/etc/my_8033.cnf --user=root --copy-back --target-dir /data/backup --socket=/tmp/mysql_8033.sock
[root@centOS09-01 backup]# xtrabackup --defaults-file=/etc/my_8033.cnf --user=root --password=1234 --copy-back --target-dir /data/backup --socket=/tmp/mysql_8033.sock
2024-11-04T22:18:40.620237+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --server-id=100 --datadir=/data/mysql_data --innodb_file_per_table=1 --innodb_buffer_pool_size=500M 
2024-11-04T22:18:40.620377+09:00 0 [Note] [MY-011825] [Xtrabackup] recognized client arguments: --port=3306 --socket=/tmp/mysql_8033.sock --target-dir=/data/backup --user=root --password=* --copy-back=1 --target-dir=/data/backup --socket=/tmp/mysql_8033.sock 
xtrabackup version 8.0.35-31 based on MySQL server 8.0.35 Linux (aarch64) (revision id: 55ec21d7)
2024-11-04T22:18:40.620409+09:00 0 [Note] [MY-011825] [Xtrabackup] cd to /data/backup/
.
.
.
2024-11-04T22:18:40.786912+09:00 1 [Note] [MY-011825] [Xtrabackup] Done: creating directory ./#innodb_redo
2024-11-04T22:18:40.786970+09:00 1 [Note] [MY-011825] [Xtrabackup] Copying ./ibtmp1 to /data/mysql_data/ibtmp1
2024-11-04T22:18:40.794771+09:00 1 [Note] [MY-011825] [Xtrabackup] Done: Copying ./ibtmp1 to /data/mysql_data/ibtmp1
2024-11-04T22:18:40.897774+09:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!

 

(3) 소유자 변경

$ chown -R mysql:mysql /data/mysql_data

 

(4) 인스턴스 시작 및 데이터 확인

# 인스턴스 시작

[root@centOS09-01 mysql_data]# mysql.server start
Starting MySQL... SUCCESS!

 

# 데이터 확인

mysql> select count(*) from test.temp_event;
+----------+
| count(*) |
+----------+
|    53539 |
+----------+
1 row in set (0.04 sec)

 - 백업이 완료되는 시점에 백만건의 인서트가 다 끝나지 않아 53539건까지 복구가 된 것을 볼 수가 있습니다.

 - 나머지 데이터에 대해서는 replication 을 연결해 주면서 binlog를 통하여 복구가 가능합니다.

 

(5) replicaltion 확인

mysql> show replica status;
Empty set (0.00 sec)

 - master 를 복제한 파일로 복구를 하였기 때문에 replication 정보가 아직 설정되지 않은 것입니다.

 - replication을 연결해 주기위해서는 logfile과 position 값을 알아야 합니다.

 

# xtrabackup_info 파일 정보 확인

[root@centOS09-01 backup]# cat xtrabackup_info 
uuid = 8a0f742a-9295-11ef-81de-000c299c2482
name = 
tool_name = xtrabackup
tool_command = --defaults-file=/etc/my_8033.cnf --user=root --password=... --backup --target_dir=/data/backup --socket=/tmp/mysql_8033.sock
tool_version = 8.0.35-31
ibbackup_version = 8.0.35-31
server_version = 8.0.33
start_time = 2024-10-25 14:54:00
end_time = 2024-10-25 14:54:03
lock_time = 1
binlog_pos = filename 'binlog.000010', position '455'
innodb_from_lsn = 0
innodb_to_lsn = 326870821
partial = N
incremental = N
format = file
compressed = N
encrypted = N

 - binlog_pos 의 filename과 postion 값을 확인해주세요.

 

# replication 연결

mysql> reset replica;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_host='172.16.173.132', master_user='replicator', master_password='1234', master_log_file='binlog.000010', master_log_pos=455;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

mysql> start replica;
Query OK, 0 rows affected (0.02 sec)

mysql> show replica status\G;
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 172.16.173.132
                  Source_User: replicator
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: binlog.000010
          Read_Source_Log_Pos: 282945835
               Relay_Log_File: relay.000002
                Relay_Log_Pos: 10507505
        Relay_Source_Log_File: binlog.000010
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
.
.
.
        Seconds_Behind_Source: 892448
.
.
.

         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Source_TLS_Version: 
       Source_public_key_path: 
        Get_Source_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql>

 - replication은 정상적으로 연결된 것을 볼 수 있고, Seconds_Behind_Source 수치 값도 높다는 것을 확인 할 수 있습니다.

 - Seconds_Behind_Source 값이 서서히 줄어드는 것으로 보아 데이터를 동기화 중이란 것을 짐작할 수 있으며, 0이 될때까지 기다린 후 데이터를 확인 해 보는게 좋을 것 같습니다.

mysql> show replica status\G;
*************************** 1. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 172.16.173.132
                  Source_User: replicator
                  Source_Port: 3306
                Connect_Retry: 60
              Source_Log_File: binlog.000010
          Read_Source_Log_Pos: 282945835
               Relay_Log_File: relay.000002
                Relay_Log_Pos: 282945703
        Relay_Source_Log_File: binlog.000010
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 282945835
              Relay_Log_Space: 282945903
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File: 
           Source_SSL_CA_Path: 
              Source_SSL_Cert: 
            Source_SSL_Cipher: 
               Source_SSL_Key: 
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Source_Server_Id: 200
                  Source_UUID: 04ecebd8-84a1-11ee-989f-000c299c2482
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 86400
                  Source_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Source_SSL_Crl: 
           Source_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Source_TLS_Version: 
       Source_public_key_path: 
        Get_Source_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql> select count(*) from test.temp_event;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.04 sec)

mysql>

 - Seconds_Behind_Source 값이 0인 것을 확인하고, 데이터 백만건이 제대로 복구가 된  것을 확인 할 수 가 있었습니다.

 

3. 주의해야 할 점

(1) xtrabackup 후 백업파일이 생성 된 것을 확인 한 후, 복구시 그대로 파일을 복사를 해보려고 하였으나 복구가 되지 않았습니다.

반드시 백업과 마찬가지로 xtrabackup 으로 복구를 진행해야만 합니다.

 

(2) 만약 마스터를 백업하지 않고 slave를 백업을 하였다면 백업파일로 복구시에 백업 기준이 된 slave 가 마스터가 되기 때문에 slave 밑으로 또다른 slave가 생길수 밖에 없는 구조이다. 이것은 logfile과 position 값이 실제 master와 다르기 때문에 어쩔수없이 복제 기준이 된 slave 의 slave 로 될 수밖에 없으니 이점을 유념해두는 것이 좋을 것 같습니다. ( 설명이 다소 어려운가요?^^; )

 

(3) 복구시에는 반드시 prepare 명령어를 먼저 진행 해야 합니다. 그러지 않으면 복원 명령어(--copy-back)를 실행했다면 에러를 만나실 수가 있습니다.

 

xtrabackup에 대해서 알아보았습니다. 다음에는 xtrabackup의 increment 와 compress에 대해 알아보도록 하겠습니다.

반응형

'MySQL > Class' 카테고리의 다른 글

xtrabackup - (4) 백업 : incremental  (2) 2024.11.25
xtrabackup - (3) qpress 설치  (0) 2024.11.24
xtrabackup - (1) 백업 : 기본편  (0) 2024.11.22
Load Data : 파일 내용 넣기  (0) 2024.11.20
log-slave-updates  (0) 2024.11.18