2008-09-30 7 views
19

특정 컴퓨터의 계정간에 데이터베이스를 복제하기 위해 mysqldump을 사용하고 있습니다. 우리가 정의한 견해를 가질 때를 제외하고는 모든 것이 훌륭하게 작동합니다.어떻게 계정간에 뷰를 복제하기 위해 mysqldump를 사용할 수 있습니까?

ERROR 1227 (42000) at line 657: Access denied; you need the SUPER privilege for this operation 

없이 내가하지, 말할 : 덤프가 다음과 같은 라인 ...

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

을 포함하기 때문에 user_b에서 MySQL로 덤프를로드 할 때 ... 우리는 오류가 발생 이 mysql 인스턴스에 대해 SUPER 권한을 갖는다. mysqldump에 사용자가 인식하지 못하는 방식으로보기를 덤프하도록 설득 할 수있는 방법이 있습니까? 나는이 시점에서 매뉴얼에서 아무것도 찾을 수 없다. 실제로 사용자 이름을 바꾸기 위해 덤프 파일을 구문 분석해야합니까? 또는 나는 무엇인가 놓치고 있냐?

답변

27

같은 문제. !

mysqldump -uuser1 -ppassword1 database1 > backup.sql 

sed '/^\/\*\!50013 DEFINER/d' backup.sql > backup_without_50013.sql 

mysql -u user2 -ppassword2 -D database2 < backup_without_50013.sql 

흥미로운 것은, 여기,/* 50013로 시작하는 모든 행을 제거 sed 명령은 : 나는 그런 식으로 해결했다.

Heidy

+2

고마워, 실제로 sed 대신에 grep -v를 사용하는 것을 제외하고는 똑같은 일을 끝냈다. 그러나 결과는 같았다. :) –

2

SQL SECURITY 절은보기에 대한 액세스 권한을 확인할 때 사용할 MySQL 계정을 결정합니다.

보기를 만들 때 해당보기의 보안을 위해 몇 가지 옵션을 정의 할 수 있습니다. here을 더 읽을 수는 있지만 기본적으로 기본적으로 액세스 권한은보기의 '정의 자'즉 사용자를 만든 사용자 만 볼 수 있습니다.

+0

감사합니다. 체크 아웃 한 결과,이 옵션을 변경하면 mysqldump가 출력을 생성하는 방식에 영향을 미치지 않는 것으로 보입니다. 단순히 DEFINER 행을 생략하면 황금색이됩니다. :) –

0

옵션과 함께 실행 mysqldump"--skip-triggers"

+0

흥미로운 아이디어이지만, 덤프 출력의 @DEFINER 행에 영향을 미치지 않습니다. 로그인 한 MySQL 사용자가 아닌 다른 정의자를 주장하는 한, 보안 오류가 발생합니다. 팁을 주신 덕분에 –

12

당신은 백업 파일을 처리하고 DEFINER 변경해야합니다 : 나는 그것을 변경하려면 localhost

@

DEFINER = user_a을 ~ :

DEFINER = CURRENT_USE R

그러면 자동으로로드 된 계정과 연결됩니다.

+3

! 나는 (')을 탈출 할 필요가있다 : sed -ri s/DEFINER = \'[^ \'] + \'@ \'% \'/ DEFINER = CURRENT_USER/g file.sql – brunoqc

+2

이것은! @brunoqc의 작은 'sed' 마법을 사용하면 완벽합니다. – Matthew