많은 뷰에서 DEFINER 수정


25

업데이트 후 데이터베이스를 백업하는 데 문제가 있습니다 . 나는 왜 그 이유를 알아 내려고 시스템에서 파고 들었다. 내가 실행 한 쿼리 가이 결과를 반환했습니다.

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

조사 후 이러한 뷰의 정의자는 시스템에서 제거 된 이전 개발자 계정 인 것으로 보입니다. 이 문제가있는 데이터베이스와 뷰는 매우 드물게 사용되며 대부분 보관 목적으로 유지됩니다.

더 이상 존재하지 않는 정의 자로 약 40 개의 뷰가 있습니다. 정의자를 한 번에 다른 계정으로 변경하는 쉬운 방법이 있습니까? mysqldump가 단순히 모든 뷰를 파일로 덤프하여 파일을 편집하고 뷰를 다시 만들 수있는 방법이 있습니까?


나를 위해 데이터베이스에 누락 된 계정을 추가했는데 오류가 사라졌습니다.
user1794918

답변:


13

모든 뷰 정의가있는 텍스트 파일을 작성하십시오.

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

거기에서 AllMyViews.sql을 편집하십시오. 그런 다음 뷰를 삭제하십시오.

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

AllMyViews.sql을 편집 한 후 다시로드하십시오.

mysql -uusername -ppassword -A < AllMyViews.sql

시도 해봐 !!!


information_schema의 view_definition이 표시되지 않지만 SHOW CREATE VIEW가 제대로 작동하면 훌륭한 대안으로 +1입니다.
데릭 다우니

이론적으로 DTest의 솔루션이 더 좋았지 만 시스템에 대한 문제로 인해 시스템이 작동하지 못했습니다. 기본적으로 위의 내용을 사용하여 show create 문을 파일로 덤프하고 수동으로 조금 편집 한 다음 실행해야했습니다.
Zoredache

정의 자 사용자가 존재하지 않으면 SHOW CREATE VIEW가 작동하지 않습니다. mysqldump와 동일한 오류가 발생합니다.The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 그런 다음 해당 사용자를 임시로 만들어야합니다. 을 실행하십시오 CREATE USER 'abc'@'1.2.3.4';. 그런 다음 다시 시도하십시오.
RolandoMySQLDBA

방금 View가 일부 스토어드 프로 시저를 사용하고 오류 메시지가 자체가 아니라 해당 프로 시저의 정의 자에게 구현되었음을
알았

25

ALTER VIEW정보 스키마 와 함께 사용할 수 있습니다 . 텍스트 파일로 덤프하는 것을 언급 했으므로 다음과 같이 입력하십시오.

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

이것을 mysql 명령 행과 혼합하십시오 (Windows에 익숙하지 않은 * nix 가정).

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

참고 : information_schema 항목을 직접 변경할 수 없습니다 . 참고 2 : 이것은 한 번에 하나의 데이터베이스에서만 작동합니다. table_schema를 생략하면 각 데이터베이스간에 USE 명령을 삽입해야합니다.


나는 그것이 내 것보다 약간 덜 관여하고 더 간결 해 보이기 때문에 이것을 좋아합니다. +1 !!! (나는 ALTER VIEW를 잊었다)
RolandoMySQLDBA

view_definition 필드가 왜 비어 있는지 아십니까? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; 반환| Staff | |
Zoredache

채팅 토론에서 슈퍼 권한과 관련된 권한 문제인 것 같습니다. bugs.mysql.com/bug.php?id=39733
데릭 다우니

완벽한 솔루션! +1
Pablo Martinez

적어도 RedHat에서 파일로 출력하는 경우 echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
백틱

3

Derek의 솔루션을 자동화하면 DEFINER가 모든 데이터베이스의 모든보기에서 DEFINER로 변경 root@localhost되고 설정됩니다 SQL SECURITY INVOKER(먼저 확인하십시오!).

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

경고 : 실행하기 전에 전체 mysql 백업을 작성했는지 확인하십시오 (예 : mysqld를 중지하고 / var / lib / mysql에있는 모든 파일을 백업). .

또한 모든 테이블 / 뷰를 확인해야합니다.

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

더 이상 뷰에서 유효하지 않은 정의 자에 대해 불평하지 않아야합니다.


이것을 내 발췌문에 뻔뻔스럽게 추가했습니다. 감사!
stefgosselin

3

데이터베이스의 모든 뷰를 내 보냅니다 <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전환하십시오.


VIEWS를 어떤 방식 views.sql으로 수정해야합니까? 또한, 그것들을 다시 만드는 방법?
SherylHohman

@SherylHohman 변경 DEFINER = olduser@oldhost하려면 DEFINER = newuser@newhost, cat views.sql | mysql <DB>뷰를 다시 만듭니다.
x-yuri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.