2012-04-03 1 views
1

바이너리 로그에 데이터를 쓰지 않고 트리거 나 저장 프로 시저를 통해 테이블에 행을 삽입하려고합니다. 이것이 가능한가? 나는 정상적인 연결을 위해서 당신은 SQL_LOG_BIN=0을 설정하여 연결에 대한 바이너리 로깅을 비활성화 할 수 있음을 알았지 만, 트리거를 위해 작동하도록 할 수 없었다. 페더레이션 엔진 테이블에서이 작업을 수행 할 수있는 방법이있는 경우에도 괜찮습니다.바이너리 로그에 쓰지 않고 트리거를 실행하십시오.

편집 : 나는 거의 저장 프로 시저를 통해이 작업을 수행 할 수

:

call nolog_insert(50, 'notlogged'); 

로 : MySQL의 프롬프트에서 프로 시저를 호출하여

CREATE PROCEDURE nolog_insert(`id` INT, `data` blob) 
BEGIN 
    SET SESSION SQL_LOG_BIN = 0; 
    INSERT INTO `table` (`id`, `data`) VALUES (id, data); 
    SET SESSION SQL_LOG_BIN = 1; 
END 

내가 레코드를 삽입 예상되는 레코드 (50, 'notlogged')table에 삽입되지만 바이너리에는 기록되지 않습니다. 로그.

그러나 트리거에서이 절차를 실행하고 싶습니다. 트리거를 이용하면 다음과 같이

create trigger my_trigger before insert on blackhole_table for each row call nolog_insert(new.id, new.data); 

데이터는 모두 table 삽입 바이너리 로그에 기록된다.

+0

대부분의 DBMS는 트랜잭션이 롤백되는 경우 변경 사항을 추적하기 위해 로그를 사용하며 로그에 쓰지 않고 실패한 경우 롤백 기능이 손상된 것입니다. 이것이 MySQL에 적용되는지 모르겠지만 IMO에 대해 우려할만한 것입니다. –

+0

그래, 나는 그 의미를 알고있다. MyISAM에 의해 뒷받침되고 트랜잭션은 어쨌든 사용되지 않습니다. 삽입물이 실패하지 않아야합니다. (스토어드 프로시져는 MySQL 복제의 한계를 극복하기 위해 시스템의 일부로 사용됩니다.) – alberge

+0

그것은 삽입에 실패했을뿐만 아니라 그것이 문제입니다. 트랜잭션 (IOW, 트랜잭션의 무결성이 손상 되었기 때문에 트랜잭션의 시작과 실패한 시점 사이의 어떤 것도 되돌릴 수 없음) 중에 삽입 주위의 모든 작업입니다. 트랜잭션을 지금 사용하고 있지 않을 수도 있습니다. 그러나 트랜잭션이 변경되어 트리거가 변경되지 않으면 어떻게됩니까? –

답변

1

문 기반 복제 트리거는 마스터와 슬레이브에서 모두 실행되지만 복제되지는 않습니다. 아마도 그것은 당신의 문제를 해결할 수 있습니다. 그 외에는

, 내가 행 기반 복제를 사용하는 경우 복제 트리거 하지의 효과를 가지고 더 좋은 방법이 없다고 말할 수 있도록 트랜잭션 내부 sql_log_bin을 변경할 수 아니에요.

관련 문제