2024. 11. 23. 01:34ㆍMySQL/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 |