2014-09-23 2 views
-1

XAMPP 로컬 시스템의 셸에서 PHP 스크립트를 실행하면서 매 10 ~ 20 초마다 TRUNCATE 테이블을 비울 수있는 테이블이 12 개 있습니다.다중 TRUNCATE 쿼리 후 무작위로 MySql 테이블이 사라집니다.

알 수없는 이유로 몇 시간마다 임의의 테이블이 사라지고 결과적으로 스크립트가 중단됩니다. 스크립트에서 테이블을 삭제/삭제하는 쿼리가 없습니다.

흥미로운 점은 테이블이 기본 뷰에서 삭제되지만 왼쪽의 사이드 바에서 여전히 볼 수 있다는 것입니다.

삭제 된 테이블을 다시 만들려고하면 "해당 테이블이 없습니다."라는 오류가 발생합니다. 필자가 다시 작성한 방법은 동일한 테이블의 ".frm"테이블을 복사하여 SQL을 통해 이전 파일을 삭제하고 다시 만들 수 있습니다.

아무도 이런 행동을했거나 설명을 알고 있습니까? 지난 며칠 동안 이것은 나를 괴롭혔습니다 ...

+1

"무작위 표가 사라집니다"- 무작위로 아무 일도 일어나지 않습니다. 항상 근본 원인이 있습니다. –

+0

@MitchWheat "임의의 테이블이 사라지는"의미는 모든 테이블이 동일한 정확한 함수를 사용하여 쿼리를 수행 함에도 불구하고 사라지는 테이블이 다를 때마다 있다는 것입니다. 나는 번호가 매겨지며 매번 난수가 생기므로 "근본적인 경우"를 찾아내는 쉬운 패턴이 없다. – Acidon

답변

4

아마도 이런 종류의 작업에는 truncate을 사용하지 않는 것이 좋습니다. the reference manual에서 인용하는 것은 :

논리적으로, TRUNCATE TABLE 모든 행, 또는 DROP TABLECREATE TABLE 문장의 순서를 삭제하는 DELETE 문 비슷합니다. 고성능을 달성하기 위해 데이터를 삭제하는 DML 방법을 건너 뜁니다. [...] TRUNCATE TABLEDELETE과 유사하지만 DML 문 대신 인 DDL 문 으로 분류됩니다. 드롭

  • 자르기 작업을 특히 큰 테이블에 대해 하나의 행 하나를 삭제하는 것보다 훨씬 빠른 테이블을 다시 만들 : MySQL의 5.5에서 다음과 같은 방법으로 삭제에서이 다릅니다.

자주 사용하지 않는 것이 좋습니다. 그러나 테이블 을 10-20 초 간격으로 자르고 있습니다.! 스크립트가 계속 실행되는지는 모르겠지만, 그렇다면 프로그램의 일부가 잘린 테이블 (완전히 다시 작성되지 않았을 수 있음)에 행을 삽입하려고 할 가능성이 항상 있습니다. 내 머리 속에 (그리고 내 직감에) 테이블을 너무 자주 잘라내는 것이 좋지 않다는 것을 알려주는 많은 것들이 있습니다.

다른 한편으로는 ... 왜 20 초마다 테이블을자를 필요가 있습니까? 나는 그 일을 피하는 것만 권장합니다 ... 파티션을 생성하고, 테이블을 색인하고, 다른 프로세스가 사용하려고하지 않을 때 테이블을 자릅니다 ... TRUNCATE ... TRUNCATE 대신 DELETE을 사용하십시오. 유지 보수 작업, 일상적인 작업을위한 것이 아닙니다 (저의 견해입니다).

+1

그런 훌륭한 답변을 주셔서 감사합니다. 그 드롭과 잘라내 기가 같은 기법을 공유하고 있다는 것을 알지 못했습니다. 이것이 문제의 원인이라고 생각하십시오.몇 초마다 테이블을 비우는 이유는 다른 모든 PHP 스크립트에서 모든 행의 전체 웹 페이지를 저장하기 때문에 그 테이블의 크기가 기가 바이트 단위로 빠르게 이동하여 데이터 양을 처리 할 수 ​​없기 때문입니다. 가능한 빨리 데이터를 비우고 파싱하십시오. 하나의 질문, 만약 내가 대신 삭제 및 다른 스크립트를 사용하여 같은 테이블에 동시에 씁니다 - 그 시나리오에서 어떻게됩니까? – Acidon

+0

@Acidon 일반적인 팁 : 참조 설명서 사본을 준비하십시오 (이 답변이 유용하다고 생각하면 투표를하고 /하거나 원하는 경우 수락하십시오). 귀하의 두 번째 질문에 관해서는, 귀하의 특정 구현에 달려 있습니다 (즉, 그것은 세부 사항을 파고 없이는 unswwable입니다). 시험 해보고 시험 해보세요 ... 미리 말할 방법이 없습니다. – Barranka

+0

알았어, 나도 그렇게 생각했다. 고마워. – Acidon