Sửa đổi DEFINER trên nhiều lượt xem


25

Tôi gặp sự cố khi sao lưu cơ sở dữ liệu của mình sau khi cập nhật. Tôi đã chọc vào hệ thống của tôi để cố gắng tìm hiểu tại sao. Một truy vấn tôi chạy đã trả về kết quả này.

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

Sau một số điều tra, có vẻ như bộ lọc cho các chế độ xem này là một tài khoản nhà phát triển cũ đã bị thanh trừng khỏi hệ thống. Các cơ sở dữ liệu và quan điểm với vấn đề này được sử dụng rất ít khi và hầu hết được lưu giữ cho mục đích lưu trữ.

Có khoảng 40 lượt xem với một definer không còn tồn tại. Có cách nào dễ dàng để thay đổi definer thành một tài khoản khác trên mọi thứ cùng một lúc không? Có cách nào để mysqldump đơn giản chuyển tất cả các khung nhìn ra một tệp để tôi có thể chỉnh sửa tệp đó và tạo lại các khung nhìn không?


Đối với tôi, tôi vừa thêm tài khoản bị thiếu vào cơ sở dữ liệu và lỗi đã biến mất.
dùng1794918

Câu trả lời:


13

Tạo một tệp văn bản với tất cả các định nghĩa xem:

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

Bạn chỉnh sửa AllMyViews.sql từ đó. Sau đó, thả lượt xem

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

Sau khi chỉnh sửa AllMyViews.sql tải lại chúng

mysql -uusername -ppassword -A < AllMyViews.sql

Hãy thử một lần !!!


+1 là một thay thế tuyệt vời nếu chế độ xem định nghĩa của information_schema không hiển thị nhưng SHOW CREATE VIEW hoạt động tốt.
Derek Downey

Mặc dù tôi thích giải pháp của DTest hơn về mặt lý thuyết, một cái gì đó về hệ thống của tôi đã ngăn không cho nó hoạt động. Về cơ bản, tôi đã sử dụng ở trên để kết xuất các câu lệnh tạo chương trình vào một tệp và tôi phải tự chỉnh sửa chúng một chút và sau đó chạy chúng.
Zoredache

HIỂN THỊ TẠO XEM không hoạt động khi người dùng definer không tồn tại - nó gây ra lỗi tương tự như mysqldump:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 Sau đó, bạn phải tạo người dùng đó tạm thời. chạy CREATE USER 'abc'@'1.2.3.4';. Sau đó, thử lại.
RolandoMySQLDBA

Tôi chỉ nhận thấy rằng Chế độ xem sử dụng một số quy trình được lưu trữ và thông báo lỗi đó được thực hiện với trình gỡ lỗi của quy trình đó, chứ không phải xem chính nó
Marki555

25

Bạn có thể sử dụng ALTER VIEW kết hợp với lược đồ thông tin . Bạn đã đề cập việc bán nó ra một tệp văn bản, vì vậy có lẽ một cái gì đó như thế này:

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

Trộn cái này với dòng lệnh mysql (giả sử * nix, không quen thuộc với windows):

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

Sidenote: Bạn không thể thay đổi trực tiếp các mục information_schema . Lưu ý2: Điều này chỉ hoạt động cho một cơ sở dữ liệu tại một thời điểm, nếu bạn rời khỏi WHERE table_schema, bạn cần chèn các lệnh USE giữa mỗi cơ sở.


Tôi thích điều này bởi vì nó trông hơi ít tham gia và ngắn gọn hơn của tôi. +1 !!! (Tôi quên mất ALTER VIEW)
RolandoMySQLDBA

Bất cứ ý tưởng tại sao trường view_def định sẽ trống? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; trở về| Staff | |
Zoredache

Từ thảo luận trong trò chuyện, có vẻ như đó là vấn đề cấp phép với siêu đặc quyền. bug.mysql.com/orms.php?id=39733
Derek Downey

Giải pháp hoàn hảo! +1
Pablo Martinez

Ít nhất trên RedHat, nếu bạn đang outputting vào một tập tin, bạn phải thoát khỏi lưng bọ ve, ví dụ:echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
clav

3

Tự động hóa trên giải pháp của Derek, điều này sẽ thay đổi DEFINER thành root@localhostvà đặt SQL SECURITY INVOKER(đảm bảo bạn muốn điều đó trước tiên!) Trong tất cả các chế độ xem trong tất cả các cơ sở dữ liệu:

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

CẢNH BÁO: đảm bảo bạn đã tạo bản sao lưu mysql đầy đủ (ví dụ: bằng cách dừng mysqld và sao lưu tất cả các tệp trong / var / lib / mysql) trước khi bạn chạy nó - chỉ trong trường hợp ... Nó hoạt động với tôi, nhưng YMMV .

bạn cũng nên kiểm tra tất cả các bảng / lượt xem của mình với:

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'

không nên phàn nàn về các định nghĩa không hợp lệ trong các khung nhìn.


Không biết xấu hổ thêm điều này vào đoạn trích của tôi. Cảm ơn!
stefgosselin

3

Xuất tất cả các khung nhìn của cơ sở dữ liệu <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

hoặc là:

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

Chỉnh sửa views.sql(thay đổi definer) và tạo lại chúng:

cat views.sql | mysql <DB>

Chỉ định -u-pchuyển đổi nếu cần thiết.


Những cách nào để XEM views.sql, được chỉnh sửa? Ngoài ra, làm thế nào để tái tạo chúng?
SherylHohman

@SherylHohman Thay đổi DEFINER = olduser@oldhostthành DEFINER = newuser@newhost, cat views.sql | mysql <DB>tạo lại các khung nhìn.
x-yuri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.