DBAtlas · 데이터베이스 운영 아틀라스

CLONE plugin으로 replica를 처음부터 재구축

MySQL복제

명령어

-- Donor (healthy replica or source)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CREATE USER 'clone_donor'@'%' IDENTIFIED BY 'Cl0ne#Donor';
GRANT BACKUP_ADMIN ON *.* TO 'clone_donor'@'%';

-- Recipient (replica to rebuild; its data is replaced)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SET GLOBAL clone_valid_donor_list = 'db1:3306';
CLONE INSTANCE FROM 'clone_donor'@'db1':3306 IDENTIFIED BY 'Cl0ne#Donor';

-- After the restart: verify and start replication
SELECT STATE, ERROR_NO, BINLOG_FILE, BINLOG_POSITION, GTID_EXECUTED FROM performance_schema.clone_status;
SELECT STAGE, STATE, ROUND(DATA / 1024 / 1024) AS data_mb FROM performance_schema.clone_progress;
CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'db1', SOURCE_PORT = 3306, SOURCE_USER = 'repl', SOURCE_PASSWORD = 'Repl#2024', SOURCE_AUTO_POSITION = 1, SOURCE_SSL = 1;
START REPLICA;

하는 일

donor의 InnoDB 데이터를 네트워크로 물리 복사하고, recipient를 재시작하며, GTID 상태를 이어받는다. 별도의 백업, 전송, 복원 단계 없이 일관된 replica를 만든다.

사용 시점

손상된 replica, errant GTID가 있는 replica, binlog가 purge될 만큼 크게 뒤처진 replica를 재구축하거나 새 replica를 추가하기 위해.

주의

recipient의 모든 데이터(사용자 포함)가 donor의 사본으로 교체되며 root 비밀번호도 donor의 것이 된다. donor와 recipient는 같은 릴리스 시리즈, 플랫폼, plugin 집합이 필요하다(8.0.37 이전에는 정확히 같은 point release가 필요했다). 명령을 실행하는 recipient 사용자에게 CLONE_ADMIN이 필요하다. clone이 끝나면 mysqld가 스스로 재시작한다. systemd / mysqld_safe 같은 supervisor가 없으면 3707 'Restart server failed (mysqld is not managed by supervisor process)'를 반환한다. 이는 실패가 아니며 clone은 완료된 것이므로 서버를 수동으로 시작한다. donor에는 IO / 네트워크 부하가 크므로 clone_max_concurrency와 clone_max_data_bandwidth로 제한한다. GTID가 꺼져 있으면 clone_status의 BINLOG_FILE / BINLOG_POSITION을 SOURCE_LOG_FILE / SOURCE_LOG_POS로 사용한다.

DBAtlas에서 열기 →

관련 항목