MySQL에서 VIEW DEFINER를 어떻게 변경합니까?


35

mysqldump를 실행하면 오류가 발생합니다.

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

foobar더 이상 존재하지 않는 레거시 머신 이기 때문에 이치에 맞습니다.

모든 테이블의 정의자를 'root'@ 'localhost'로 변경하려면 어떻게합니까?


4
뷰가 있습니까? 표가 확실 해요 정의 자이 없습니다 ... 또한 참조 dba.stackexchange.com/q/4129/630
GBN

1
@gbn +1 당신이 옳았습니다.-보기였습니다. 링크에 대한 thx이지만, 제대로 작동하지 못했습니다. 그러나 덤프를 수행 할 수 있도록 SQLyog에서 뷰를 수정할 수있었습니다.
kfmfe04

그것은 나를 위해 작동합니다. {{에 모두 부여하십시오 . 부여 옵션이있는 'password'로 식별 된 'root'@ '%'에; }}
Muhammad Azeem

답변:


33

내가 생각하는 것은 덤프하려는 데이터베이스에 root @ 'foobar'로 로그인 한 상태에서 사용자가 정의한 프로 시저 / 방법이 포함되어 있다는 것입니다.

이제 해결책은 해당 절차 / 방법에 대한 정의자를 교체해야한다는 것입니다

그런 다음 오류없이 덤프를 생성 할 수 있습니다.

당신은 이렇게 할 수 있습니다 ..

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

모든 데이터베이스의 모든 정의자가 변경되므로주의하십시오.

시도 해봐....!

2012 년 2 월 9 일 업데이트

내가 @Rolando가 제공 한 답변 인 @gbn이 제공 한 링크를 보았을 때도 사례가 될 수 있습니다. 링크를 방문하십시오

@RolandoMySQLDBA에 의해 편집 2011-12-16 11:20 EDT

위험하지만이 답변은 좋습니다. 명확히하기 위해 : 다음과 같이 쿼리에서 데이터베이스를 지정할 수 있습니다.

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
위의 링크는 덜 위험 할 수있는 ALTER 문으로이를 수행하는 방법을 보여줍니다. 또한 업데이트에서 정의 자에 대한 내 업데이트를 확인하십시오
gbn

UPDATE테이블을 변경했지만 표시 mysqldump되지 않습니다 mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES.. 다시 시작한 후에도 mysql. 나는 달리고있다 mysql-5.5.31.
x-yuri

내 잘못이야. 나는 정의가 틀린 견해를 가지고 있었다. update mysql.proc실제로 작동합니다.
x-yuri

작동하지 않았다 ....
カ オ ナ シ

3
이 답변은 프로 시저 및 함수의 정의자를 변경하는 데 효과적이지만 View 의 정의자는 변경하지 않습니다 .
Anthony G-Monica에 대한 정의

35

--single-transaction스위치를 더 쉽게 사용할 수 있습니다.

mysqldump --single-transaction -u username -p db > db.sql

1
죄송합니다. 원래 질문에 설명 된 문제를 어떻게 해결합니까? 당신이 잘못된 질문에 대답 한 것 같습니다 ...
dezso

6
--single-transaction은 데이터베이스 이름보다 앞에 있어야하지만 응답은 실제로 정확하기 때문에 응답의 구조가 잘못되었습니다. 이 옵션을 지정하면 mysqldump의 잠금 동작을 변경하여 문제를 해결할 수 있으므로 원래 질문의 오류가 더 이상 발생하지 않습니다.
Michael-sqlbot

나는 같은 문제에 직면했다. 일한 거래.

그것이 무엇인지 확실하지 않지만 작동했습니다! 감사합니다
스리 Harsha Kappala

17

가장 빠른 해결책은 기존 사용자와 충돌을 일으키지 않는 한 정의자를 다시 작성하는 것입니다.

CREATE USER 'root'@'foobar';


사용자가 'root'@ '%'인 경우 어떻게합니까? 나는 우리가 담당하는 서버에서 그러한 것을 거부합니다.
Attila Fulop

@AttilaFulop 예, 보안은 반드시 고려해야 할 사항이지만 이것이 완벽한 솔루션이 아니라 "빠른"솔루션이라고 말했습니다. 가져 오기가 완료되면 추가 사용자가있을 위험을 줄이기 위해 사용자를 삭제할 수 있습니다.
ColinM

당신 말이 맞아요 나는 단지이 특정한 측면에 주목하고 싶었다. 내 직장 동료는 'root'@ '%'를 추가하고 척 노리스가 살아있는 한 그대로 둡니다. forever;)
Attila Fulop

6

데이터베이스의 모든 뷰를 내 보냅니다 <DB>.

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

또는:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

views.sql그것들을 편집 하고 다시 만드 십시오 :

cat views.sql | mysql <DB>

필요한 경우 지정 -u하고 -p전환하십시오.


이것은 가장 깨끗한 답변입니다
Wolfe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.