본문 바로가기

진리는어디에

MySQL rename error (errno 121)

DB A에 있는 테이블들을 DB B로, rename을 사용하여 옮기는 코드가 오류를 내고 있다는 연락을 받았다. 다른 모든 테이블들은 아무런 군소리 없이 옮겨 지는데 딱 한 테이블만 121 에러 코드를 내면서 옮겨 지지 않았다.

무슨 소린가 해서 구글 박사님게 물어 보니 외부 참조 키가 중복이 되면 121 에러 코드가 리턴 된단다. 그래서 테이블 스키마를 살펴 보니...아무런 constraint가 없었다. 이 테이블은 그냥 컬럼들의 나열일 뿐이었다.

/**
1) MySQL rename menual page : http://dev.mysql.com/doc/refman/4.1/en/rename-table.html
2) 121 error : http://forums.mysql.com/read.php?22,33999,76181#msg-76181

1)은 rename을 하기 위해서는 lock이 걸려 있지 않아야 한다는 것을 길게 이야기 하고 있고, 2)는 외부키 참조 중복과 더 불어, DB파일 자체가 잘 못 될 수도 있음을 이야기 한다.
*/

한창 이 문서 저 문서를 뒤지고 살펴 보던 중 /usr/local/var 밑에 MySQL의 에러 로그가 남는다는 사실을 알았다.(뭐...설정마다 다를 수 있지만..)

그래서 로그를 살펴 보니..이 일이 이번에 발생한 것이 아니고 아주 오래전...2005년 12월 부터 발생하고 있었던 사실을 알아 냈다.

결론은 환경이나 코드상의 버그가 아니라, MySQL자체의 버그이거나, 파일이 깨진 것으로 판단. table을 drop하고 재생성했다. 결과는 당연히 정상 동작하고 있다. 하지만 이거 하나 하려고, 고생했던 수 많은 시간들을 생각하면 눈물이 난다..ㅠㅠ

---------------------------------------------------------------------------------------------------

위의 내용은 사실이 아니었습니다. 속지 마시기를...-_-;;
제가 올린 글을 제가 속지 말라고 하다니 웃기긴 하군요..아무래도 이 문제는 DB의 타입에 문제가 있었던듯 합니다.

InnoDB에서 ISAM으로 변경을 하니 에러가 나지 않는군요.

이게 정확한 해결 방법인지는 저도 잘 모르겠습니다만..아뭏튼 이렇게 하고 난 후에는 에러가 발생하지 않고 있습니다. 혹시 정확한 원인을 아시는 분은 가르쳐 주시면 감사하겠습니다.(-_-)(_ _)

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!