2012-05-22 2 views
7

설명서를 읽었으며 모든 트랜잭션이 덤프를 시작하기 전에 BEGIN 문을 추가한다고 언급했습니다. 누군가 더 이해하기 쉬운 방법으로 이것을 정교하게 만들 수 있습니까?단일 트랜잭션이있는 mysqldump가없는 트랜잭션보다 일관성이있는 이유는 무엇입니까?

이 옵션은 서버에서 데이터를 덤프하기 전에 SQL 문을 BEGIN 발행 : 여기

는 내가 읽은 것입니다. 다음은 응용 프로그램을 차단하지 않고 실행 된 BEGIN시 데이터베이스의 일관된 상태를 덤프 있기 때문에, 그러한 이노와 BDB 같은 트랜잭션 테이블에 유용합니다. "

수있는이에 대한 몇 가지 정교한?

+1

아마도 도움이 필요한 설명서의 특정 부분에 대한 링크 나 따옴표를 추가하십시오. 그렇지 않으면 우리가 알고 자하는 것에 대해 약간 추측 할 것입니다. – Cylindric

+0

게시물을 업데이트했습니다. 보세요. – Uday

답변

23

덤프가 하나의 트랜잭션에 있기 때문에 데이터베이스의 모든 테이블을 일관되게 볼 수 있습니다. 이것은 아마도 반례에 의해 가장 잘 설명 될 수 있습니다. 두 테이블, Orders

  1. OrderLines 당신은 단일 트랜잭션없이 덤프를 시작으로 데이터베이스를 덤프 말.
  2. 다른 프로세스는 행을 Orders 테이블에 삽입합니다.
  3. 다른 프로세스가 행을 OrderLines 테이블에 삽입합니다.
  4. 덤프는 OrderLines 테이블을 처리합니다.
  5. 다른 프로세스는 OrdersOrderLines 레코드를 삭제합니다.
  6. 덤프는 Orders 테이블을 처리합니다.

이 예에서 덤프의 행은 이 아닌 OrderLines입니다. 데이터가 일치하지 않는 상태가되고 OrdersOrderLines 사이에 외래 키가 있으면 복원에 실패합니다.

단일 트랜잭션에서 수행 한 경우, 덤프는 트랜잭션이 시작된 후 삽입되고 삭제 된 이후에 순서 또는 행을 갖지 않습니다 (그러나 일관성이 있습니다).

+0

당신은 내가 한 것보다 더 나은/명확한 예를 생각해 냈습니다. :) – Cylindric

+1

정말 더 나은 설명 .. 감사합니다 에릭 .. 나는 의심이있다. 내 덤프 시간이 몇 시간이면, 그 1 시간 동안의 거래는 어때? 덤프가 완료되면 버퍼에 저장되고 디스크로 플러시됩니다 ....? 또는 어떻게 일어나는 ...? – Uday

5

--single-transaction 매개 변수가없는 mysqldump가 덤프 중에 데이터가 변경되어 지속적으로 실패하는 문제가 발생했습니다. 한 가지 트랜잭션 내에서 실행하면 문제가 발생하지 않습니다. 덤프 중 발생하는 모든 변경 사항으로 인해 문제가 발생합니다. 기본적으로 --single-transaction을 실행하면 해당 시점의 데이터베이스 스냅 샷을 가져 와서 dumping하지 않고 덤프합니다 유틸리티가 실행되는 동안 변경 될 수있는 데이터

+0

덤프 중에 모든 트랜잭션은 buufers에서만 발생하며 덤프가 완료 될 때까지 디스크에 반영되거나 플러시되지 않습니다. – Uday

+0

스냅 샷을 메모리 또는 임시 테이블에 복사 한 다음 그 스냅 샷을 덤프한다고 생각합니다. –

+1

@Uday 모든 요인에 따라 다르므로 * 어떻게 * 수행하는지 너무 많이 걱정하지 마십시오. 이 개념은 MySQL, MSSQL, Oracle 등 어떤 종류의 다른 엔진에서도 동일하게 유지됩니다. – Cylindric

5

백업 할 때 중요 할 수 있습니다. 이는 한 시점에서와 마찬가지로 모든 데이터를 가져 오는 것을 의미하기 때문입니다.

그래서 예를 들어, 간단한 블로그 데이터베이스를 상상하고, 활동의 전형적인 비트

  1. 이 삭제 사용자를 삭제
  2. 는 사용자
  3. 하여 새 게시물을 작성 새 사용자를 만듭니다 수 있습니다 포스트

이제 때 데이터베이스를 백업, 백업을 백업 할 수의 순서로 테이블

  1. 게시물
  2. 사용자
  3. 누군가가 게시물에 필요한 사용자를 삭제하면 어떻게, 단지 후 백업이 # 1에 도달 무엇

?

데이터를 복원하면 게시물이 있지만 해당 사용자가 백업에없는 것을 알게됩니다.

트랜잭션을 전체적으로 처리한다는 것은 백업 중에 데이터베이스에서 발생하는 모든 업데이트, 삽입 및 삭제가 백업에 의해 인식되지 않는다는 것을 의미합니다.

관련 문제