전원이 꺼졌습니다-쿼리가 완료 되었습니까?


9

쿼리가 완료되었는지 확인하고 확인하는 방법이 있습니까? 지난 주 휴가를 위해 문을 나갔을 때 3 개의 매우 오래 실행되는 업데이트 쿼리 (각 +/- 25 시간)를 실행했습니다. 불행히도 일주일 동안 전원이 꺼지고 MYSQL을 실행하는 머신이 종료되었습니다. 3 개 (또는 3 개 모두) 쿼리 중 완료된 쿼리를 확인하고 확인하는 방법이 있습니까?

데이터가 업데이트되었는지 확인할 수 있지만 올 바르고 완전한 실행으로 NULL이 예상되며 4 천만 행의 데이터를 숙지해야합니다. 이견있는 사람?

mysql 

6
로그 ... 당신이 물건을 기록하는 경우. 당신이하지 않으면 시작하는 것이 좋습니다.
Ben

1
@Ben-UPS 및 트랜잭션 처리를 권장하기에는 너무 늦습니다.

1
InnoDB를 사용하는 경우 트랜잭션에서 코드를 수행 할 수 있습니다. dev.mysql.com/doc/refman/5.0/en/commit.html

1
느린 쿼리 로깅을 설정 한 경우 느린 쿼리가 느린 쿼리 로그에서 종료되었을 수 있습니다.

3
그리고 제대로 완료되지 않은 경우 백업이 있습니까?

답변:


9

이진 로그를 사용하여 실행중인 경우 비교적 높은 신뢰성으로 확인할 수 있습니다.

먼저 바이너리 로그가 실제로 활성화되어 있는지 확인하려면 다음을 실행하십시오.

SHOW BINARY LOGS;

활성화되어 있으면 다음과 같은 출력이 표시됩니다.

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

그렇지 않으면 오류 메시지가 나타납니다.

이제 이진 로그가 활성화되면 성공적인 커밋도 이진 로그에 기록됩니다. 나는 "커밋"이라고 말하지만 사실은 MyISAM과 같은 트랜잭션이 아닌 테이블에서도 작성된 성공적인 작업입니다. 그러나 솔직히 말하면 쿼리 결과에 대해 확실하게하기 위해 InnoDB와 같은 트랜잭션 엔진을 사용하고 있거나 다른 것을 확신 할 수 없기를 바랍니다.

이제 바이너리 로그가 켜져 있고 테이블이 트랜잭션 적 (InnoDB)이라고 가정하면 쿼리가 성공적으로 완료되면 바이너리 로그에 기록됩니다.

이제 관련 바이너리 로그를 찾아서 쿼리를 찾아야합니다. 검색어를 찾으면 좋습니다! 그렇지 않은 경우- 아마도 없을 것입니다. 곧 설명하겠습니다.

어떤 바이너리 로그에 쿼리가 포함되어 있습니까? 일반적으로 데이터 디렉토리에서 이진 로그 파일 자체를 확인하십시오. 타임 스탬프를 찾으십시오. 전원이 켜지면 새로운 이진 로그가 만들어졌습니다. 그것을 찾아라. 쿼리는 아마도이전 의 이진 로그에 있을 것 입니다 . 이것은 추측이다. 그것은 또한 그 전에 하나 일 수도 있습니다. 그러나 그것은 좋은 추측입니다.

이제 mysqlbinlog유틸리티를 사용하여 다음과 같이 명령 행에서 실행하십시오.

mysqlbinlog mysql-bin.000245

파일 이름을 쿼리를 포함 할 것으로 의심되는 이름으로 바꾸십시오.

이 바이너리 로그 파일의 모든 쿼리를 표준 출력으로 출력합니다. 유닉스에서 grep쿼리를 찾는 데 사용 하십시오.

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

Windows에서는 행운을 빕니다. 메모장 ++ 또는 다른 것으로 열어 수동으로 검색하십시오.

쿼리가 있습니까? 훌륭합니다 . 커밋되었음을 알고 있습니다.

쿼리가 없습니까? sync_binlogparam 을 확인해야합니다 . 그것은인가 1 ? 그런 다음 이진 로그에없는 쿼리 ==> 쿼리가 커밋되지 않았습니다. 그러나 1sync_binlog 이 아닌 경우 바이너리 로그가 디스크로 플러시되기 직전과 직후에 충돌이 발생할 수 있으므로 쿼리가 아직 바이너리 로그에 커밋되지 않았을 가능성이 있습니다 . 그런 다음 다른 방법으로 되돌려 야합니다.commit

다음과 같은 사람들이 있습니다 (그리고 다시 InnoDB를 사용하고 있습니다) : 쿼리 결과를 식별 할 수있는 단일 행을 찾으십시오. InnoDB를 사용하면 "모두 또는 아무것도"얻습니다. 쿼리의 영향을받는 단일 행을 확신 할 수있는 경우 쿼리가 완료되었는지 확인할 수 있습니다.

편집 : 물론 느린 로그가 활성화되면 완료 후에도 긴 쿼리가 기록 될 것으로 예상 할 수 있습니다 ...

행운을 빕니다!


2
나는 당신이 붙어 있기를 바랍니다.
jcolebrand

2
@jcolebrand Rolando는 여기서 경쟁을 할 수 있습니다 :)
Philᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.