17.4.1.11 호출되는 기능의 복제
사용자 정의 함수 (UDF) 및 저장 프로그램 (저장 프로 시저 및 함수, 트리거 및 이벤트) 등의 호출 기능의 복제에는 다음과 같은 특징이 있습니다.
기능의 영향은 항상 복제됩니다.
다음 문은 문 기반 복제를 사용하여 복제됩니다.
CREATE EVENTALTER EVENTDROP EVENTCREATE PROCEDUREDROP PROCEDURECREATE FUNCTIONDROP FUNCTIONCREATE TRIGGERDROP TRIGGER
그러나 이러한 문을 사용하여 작성, 수정 또는 삭제하는 기능의 영향은 열 기반 리플리케이션을 사용하여 복제됩니다.
참고호출하는 기능을 문 기반 복제를 사용하여 복제하려고하면 경고가 생성됩니다 : Statement is not safe to log in statement format. 예를 들어, 명령문 기반 응용 프로그램에서 UDF를 복제하려고하면 MySQL 서버는 현재 UDF가 결정적 여부를 확인할 수 없기 때문에이 경고가 생성됩니다. 호출되는 기능의 영향이 결정적임을 확실히 알고있는 경우는 이러한 경고를 무시해도 안전합니다.
CREATE EVENT및ALTER EVENT의 경우 :이벤트의 상태는 지정된 상태에 관계없이 슬레이브에서
SLAVESIDE_DISABLED로 설정됩니다 (이것은DROP EVENT에는 적용되지 않습니다).이벤트가 생성 된 마스터는 슬레이브에서 서버 ID에 의해 식별됩니다.
INFORMATION_SCHEMA.EVENTS의ORIGINATOR컬럼 및mysql.event의originator열이 정보가 저장됩니다. 자세한 내용은 섹션 21.7 "INFORMATION_SCHEMA EVENTS 테이블 ' 및 섹션 13.7.5.19 "SHOW EVENTS 구문" 을 참조하십시오.
기능 구현은 마스터가 실패해도 이벤트 처리를 잃지 않고 슬레이브를 마스터로 사용할 수 있도록 재생 가능한 상태에서 슬레이브에 존재합니다.
다른 서버 (복제 마스터로 동작하고있었습니다)에서 생성 된 예약 된 이벤트가 MySQL 서버에 있는지 여부를 확인하려면 여기에 나타낸 바와 같은 방법으로 INFORMATION_SCHEMA.EVENTS 테이블을 조회 하십시오.
SELECT EVENT_SCHEMA, EVENT_NAME
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED';
또한 SHOW EVENTS 문을 다음과 같이 사용할 수 있습니다.
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED';
이러한 이벤트를 가진 복제 노예를 복제 마스터로 승격 할 때는 ALTER EVENT 를 사용하여 각 이벤트를 활성화해야합니다. 여기에서 event_name ENABLEDevent_name 은 이벤트의 이름입니다.
여러 마스터가 슬레이브에서 이벤트를 만드는 데 사용 된 서버 ID master_id 를 가진 마스터에서 생성 된 이벤트 만 확인하고 싶다면, 여기에서 같이 EVENTS 테이블에 대한 앞서의 쿼리를 수정 하고 ORIGINATOR 컬럼을 추가하십시오.
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'master_id'
같은 방법으로 SHOW EVENTS 문 ORIGINATOR 를 사용할 수 있습니다.
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'master_id'
마스터에서 복제 된 이벤트를 활성화하기 전에 슬레이브에서 MySQL 이벤트 스케줄러를 사용하지 않도록 설정 ( SET GLOBAL event_scheduler = OFF; 같은 문을 사용하여) 필요한 ALTER EVENT 문을 실행하고 서버를 다시 시작한 다음 슬레이브에서 이벤트 스케줄러를 다시 활성화하십시오 ( SET GLOBAL event_scheduler = ON; 같은 문을 사용).
나중에 새로운 마스터 리플리케이션 슬레이브로 강등하려면 ALTER EVENT 문에서 사용 된 모든 이벤트를 수동으로 해제해야합니다. 이것은 앞에서 언급 한 SELECT 문에서 이벤트의 이름을 별도의 테이블에 저장하거나 ALTER EVENT 문을 사용하여 이벤트를 식별하는 공통 프리픽스 ( replicated_ 등)에서 그 이름을 변경하는 것으로, 할 수 있습니다.
이벤트의 이름을 변경 한 경우이 서버를 리플리케이션 슬레이브로 강등 할 때 여기서 같이 EVENTS 테이블을 조회하여 이벤트를 확인할 수 있습니다.
SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
FROM INFORMATION_SCHEMA.EVENTS
WHERE INSTR(EVENT_NAME, 'replicated_') = 1;