2010-11-28 3 views
2

나는 오래된 머신의 drupal 사이트를위한 큰 MySQL 5 데이터베이스를 가지고있다. 백업 및 신선한 데이터베이스를 복원 한 후, 나는 가지고 :MySQL 무결성을 확인하는 방법은 무엇입니까?

라인에서 ERROR 1064 (42000)

* * : 당신은 당신의 SQL 구문에 오류가 있습니다 ; 오른쪽에있는 'captcha_success_form_ids | a : 1 : {s : 13 : \ "user_register \"; s : 13 : \ "user_register \"; 근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. } SP '(user_register'라인 1

에서 는이 오류가 난라는 어떤 테이블이 없음)의 origion 인 테이블 확실하지 않다 '. 그래서 나는 다른 실패한 백업/복구 노력을하기 전에 어떻게 무결성을위한 원래의 데이터베이스에 대한 빠른 점검을 할 수 있을지 궁금합니다. (커맨드 라인 액세스 권한이 있습니다). 원래 데이터베이스에 손상이 의심되는 경우 덕분에

+0

테이블 user_register가 아니고, 삽입하려는 데이터가 직렬화 된 것 같습니다. 이것을 삽입 해보십시오. –

+0

어떻게 백업을 생성합니까? 예를 들어, mysqldump, MySQL 관리자 등을 사용하고 있습니까? mysqldump를 사용하여 동일한 오류가 발생하는지 확인하십시오. – cbranch

+0

@Haim : 어떻게 오류를 없앨 수 있습니까? – qliq

답변

2

오류 메시지에 인용 된 단편은 MySQL을 같이 아무것도 보지 않는다 - 그것은 나를 당신이 당신의 자료를 제대로 탈출하지 않을 생각하게 직렬화 된 PHP 데이터처럼 보인다 코드. PHP 설치가 변경 되었습니까? 특히 smartquotes? (이제 smartquotes는 더 이상 사용되지 않습니다).

+0

+1 내 답변보다 나은 답변입니다. 나는 그것이 도망가는 이슈처럼 보인 것에 동의한다. 문제는 DB를 가져올 때 (즉, mysqldump로 인한 버그/문제) 또는 애플리케이션이 실행 중일 때 (PHP 코드 또는 설정과 관련된 버그/문제) 오류가 발생하는지 여부입니다. – cbranch

3

, 다음을 수행 할 수 있습니다 InnoDB 테이블의 경우

CHECK TABLE <table_name>; 
REPAIR TABLE <table_name>; 

:

http://www.mysqlperformanceblog.com/2008/07/04/recovering-innodb-table-corruption/

나 'MyISAM 테이블의 경우

CHECK와 REPAIR이 감지하고 수정할 수있는 몇 가지 드문 경우에 MyISAM 테이블을 개인적으로 손상된 것으로 보았습니다. 필자는 InnoDB 테이블에 대한 손상을 경험 한 적이 없으므로 링크에 제공된 정보와 관련하여 개인적인 경험을 말할 수는 없습니다.

내가 신발에 앉아 있다면 mysqldump가 출력 파일을 자세히 살펴 봄으로써 오류의 출처를 정확히 찾아 낼 수 있는지 알아 보겠다. mysqldump는 보통 한 줄에 모든 데이터가있는 테이블 당 하나의 INSERT 문을 출력하므로 오류 메시지에 포함 된 줄 번호가별로 도움이되지 않기 때문에 오류를 진단하는 것은 다소 까다 롭습니다. 그래서, 나는 mysqldump 출력 파일을 편집하고 각 행 사이에 개행 문자를 삽입한다.

원본 : :

INSERT INTO table VALUES (a,b,c),(d,e,f),(g,h,i), ... 

변경하려면 : 예를 들어 명령 행에 익숙해있어 이후

INSERT INTO table VALUES (a,b,c), 
(d,e,f), 
(g,h,i), 
... 

, 당신은 아마 등, SED와이를 자동화 할 수

그런 다음 수정 된 파일을 가져 오십시오. 동일한 오류가 발생하지만 이번에는 문제의 원인이되는 행을 정확히 찾아내는 데 도움이됩니다. 그 시점에서 문제를 진단 할 수 있어야합니다 (또는 mysqldump 출력 부분을 게시하면 도움을 얻을 수 있습니다).

편집 :

당신이 인용 오류 메시지가 일어나는 때 수입 데이터베이스? 또는 데이터베이스를 성공적으로 가져올 수 있지만 데이터베이스에 액세스 할 때 응용 프로그램에서 오류 메시지를 생성합니까? 나는 이전을 추측하고 있었지만 이제는 질문을 다시 읽은 후 후자가 될 것이라고 생각합니다.

또 하나의 아이디어 : 데이터베이스에 저장된 procs가 포함되어 있습니까? 그렇다면, mysqldump는 기본적으로 mysqldump를 포함하지 않을 것이다. 당신은 --routines에게 옵션을 사용해야합니다

mysqldump --routines -u <user> -p<password> <database> > output