2011-12-08 2 views
8

환경 : Ubuntu 11.10, MySQL 5.1.58MySQL은 뷰를 포함하는 백업을 안정적으로 복원 할 수 있습니까?

보기가있는 작은 데이터베이스가 있습니다. 나는 덤프 및 복원 할 때, 나는

ERROR 1356 (HY000) at line 1693: View 'curation2.condition_reference_qrm_v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 

는 그러나, 나는 나 자신을 부분적으로 복원 된 데이터베이스에 연결하고보기를 만들 수 있습니다 얻을. 따라서 오류 메시지는보기 자체와 관련이없는 문제에서 비롯된 것으로 판단됩니다 (오히려 어떻게 복원 되었는가). 다른 많은 보고서를 온라인으로 유사한 문제가 있습니다

MYSQL_PWD='xxx' mysqldump -u root --routines -B curation \ 
| perl -pe 's/`curation`/`curation2`/' \ 
| MYSQL_PWD='xxx' mysql -u root 

:

는 여기에 내가 문제를 설명하는 데 사용하는 간단한 방법입니다. mysqldump man 페이지는 뷰를 백업 할 때 버그에 대한 설명이 있지만 현재의 문제가 아니라 역사적인 문제로 작성되었습니다.

그래서 질문입니다 : MySQL은보기가 포함 된 백업을 안정적으로 복원 할 수 있습니까? 가능한 경우 어떻게? 그렇지 않은 경우 사람들이 해결 방법으로 무엇을합니까?

감사합니다, 리스 물건의

답변

3

제 경우에 문제가 발견되었습니다. 웹에서 유사한 보고서를 해결하는 것이 확실하지 않습니다.

기본적으로이 데이터베이스를 새 이름으로 복사하려고 시도했을 때 사용 권한 문제였습니다. 이 사용자 및 스키마 (curation2의 locus)에 대한 사용 권한이 없습니다. 수동으로 'curant2. * TO locus'에 대한 GRANT ALL ON (궤적은 오류로보고 된 사용자 임)을 수동으로 추가했습니다. 이렇게하면 위 명령 줄이 정상적으로 작동합니다.

새 데이터베이스를 만들 때 대상 데이터베이스와 테이블에 필요한 권한을 수동으로 부여해야한다는 교훈이 있습니다.

0

커플 :

1) 예, 일부 클라이언트하지만 아마도 테이블의 소유자가있는 리드 뷰의 소유자가 아닌를 사용하여 뷰를 만들 수 있습니다

2) 일반적으로, MySQL은 뷰의 백업을 수행하는 것은

create algorithm xxx definer=<USER> sql security view <view_name> as .... 

해당 사용자가 자주 포함 같은 일부 "쓸모없는 쓰레기"를 포함 보기를 만들 때 사용자가 로그온 한 IP 또는 시스템 이름 ... 그래서보기가 제대로 작성되지 않습니다. 그것을 확인해보십시오, 당신을 도울 수 있습니다.

+0

나는이 모든 것을 루트로 실행하고있다. 그건 내 표준 연습 아니지만 권한이 문제가 될 가능성이 높습니다 (나는 생각) 내가 루트로 이렇게. 뷰 정의에 대해 당신이 무엇을 말하려고하는지 이해하지 못합니다.하지만 덤프에서 나에게 합리적인 것처럼 보입니다. – Reece

+0

여기에 뷰 정의를 가져 와서 질문에 추가하십시오. 그냥 확인하십시오 – Alfabravo

10

...

이 질문은 조금 오래된,하지만 난 그냥 정확히 같은 문제를 해결하려고 몇 시간을 낭비했습니다, 그래서 명확한 설명이 미래의 누군가에게 유용하게 사용할 수있는 것 같아요

문제를 해결하려면 : 문제는 MySQL 덤프의 DEFINER 필드에 있습니다. 이 같은 모습이 * some_user의 @ localhost를의 *는 항상 원래의 DB에서 뷰를 생성하는 데 사용 하지하여 사용자에게 사용자 계정에 하드 코딩 될 것을

/*!50013 DEFINER=`some_user`@`localhost` SQL SECURITY DEFINER */ 

문제를 당신 ' 예상대로 데이터베이스를 내보내거나 가져 오는 데 사용되었습니다 (또는 적어도 내가 한 것). 나중에 가져 오는 동안이 사용자는보기를 다시 만드는 데 사용됩니다.

그래서 루트로 내보내거나 가져올 수 있지만 원래 데이터베이스가 다른 사용자로 실행 중이며 새 데이터베이스에서 CREATE VIEW 권한이없는 경우 가져 오기가 실패합니다.

당신은 두 가지 간단한 해결책이 있습니다

  1. 검색을하고 새로운 사용자 (덤프를 가져 오는 데 사용하는 일, 예를 들어 루트 @ localhost를) 사용하여 덤프 파일에서 localhost @some_user에 대한 모든 참조를 대체
  2. 또는 당신은 * some_user * 새 데이터베이스에 적절한 권한이 뷰는 자신의 계정에서 생성 할 수 있도록 허용 할 수 있습니다
Y로, 문제를 해결하지만, 내가 첫 번째 방법은 더 나은 방법 및 청소기라고 생각합니다

어느 쪽이든 앞으로 여러 사용자에 대해 걱정할 필요가 없습니다.

7

처음에는보기를 만들 때 'SQL 보안 호출자'를 사용하여 문제를 해결했습니다.

create or replace sql security invoker view <VIEW_NAME> as select ... 

정의자는 호출자가보기에 대한 액세스 권한을 정의합니다.

그런 다음 덤프 파일을로드하면보기가 올바르게 작성됩니다. 아마존 RDS와

:

# Remove DEFINER statement from VIEWS in Dump file 
sed -i 's/\sDEFINER=`[^`]*`@`[^`]*`//' $DUMPFILE_NAME 
:

하나는 덤프 파일에이 명령을 실행할 수 있습니다 (위의 작업을 수행하는 데 필요한) 슈퍼 PRIV 허용하지 않습니다 아마존 RDS,이 작업을하려면

그런 다음 덤프 파일을 RDS에로드하면보기가 올바르게 작성됩니다.

+0

이것은 아마존에 의해 엄청나게 불명확 한 요구 사항 인 것 같습니다. 왜 단순히보기가 기본적으로 포함되지 않는지 궁금합니다. –