Làm cách nào để thay đổi DEFINER của XEM trong Mysql?


35

Khi tôi chạy mysqldump, tôi gặp lỗi:

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

Điều này có ý nghĩa bởi vì foobarlà một máy kế thừa không còn tồn tại.

Làm cách nào để thay đổi bộ khử của tất cả các bảng của tôi thành 'root' @ 'localhost'?


4
Bạn có Lượt xem không? Các bảng không có định nghĩa Tôi chắc chắn ... Cũng xem dba.stackexchange.com/q/4129/630
gbn

1
@gbn +1 bạn đã đúng - họ đã xem - thx cho liên kết, nhưng tôi không thể làm cho nó hoạt động hoàn toàn đúng. Tuy nhiên, tôi đã có thể sửa đổi các khung nhìn trong SQLyog để tôi có thể thực hiện kết xuất.
kfmfe04

Nó làm việc cho tôi. {{cấp tất cả vào . đến 'root' @ '%' được xác định bởi 'mật khẩu' với tùy chọn cấp; }}
Muhammad Azeem

Câu trả lời:


33

Những gì tôi nghĩ là cơ sở dữ liệu mà bạn đang cố gắng chứa các thủ tục / phương thức được xác định bởi người dùng trong khi đăng nhập với tên root @ 'foobar'.

Bây giờ giải pháp là bạn phải thay thế trình xác định cho các thủ tục / phương thức đó

sau đó bạn có thể tạo kết xuất mà không có lỗi.

bạn có thể làm điều này như ..

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

Hãy cẩn thận, bởi vì điều này sẽ thay đổi tất cả các định nghĩa cho tất cả các cơ sở dữ liệu.

Thử nó....!

CẬP NHẬT vào ngày 9 tháng 2 năm 2012

Như tôi đã thấy liên kết được cung cấp bởi @gbn, đó là câu trả lời được đưa ra bởi @Rolando cũng có thể là Trường hợp. Vui lòng truy cập liên kết

EDIT bởi @RolandoMySQLDBA 2011-12-16 11:20 EDT

Trong khi rủi ro, câu trả lời này là tốt. Chỉ cần làm rõ: Bạn có thể chỉ định cơ sở dữ liệu trong truy vấn của mình như thế này:

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

1
Liên kết ở trên cho thấy cách thực hiện với các câu lệnh ALTER có thể ít rủi ro hơn ... Ngoài ra, vui lòng kiểm tra cập nhật của tôi cho các phần tử trong CẬP NHẬT của bạn
gbn

UPDATEđã thay đổi bảng, nhưng mysqldumpkhông thấy nó : mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Ngay cả sau khi khởi động lại mysql. Tôi đang chạy mysql-5.5.31.
x-yuri

Lỗi của tôi. Tôi đã có quan điểm với một definer sai. update mysql.procCách tiếp cận thực sự hoạt động.
x-yuri

Không hoạt động ....
オ ナ

3
Câu trả lời này hoạt động để thay đổi các bộ định nghĩa của các thủ tục và chức năng nhưng không thay đổi bộ khử của Chế độ xem .
Anthony G - công lý cho Monica

35

Sử dụng công --single-transactiontắc dễ dàng hơn :

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

1
Xin lỗi, làm thế nào điều này giải quyết vấn đề được giải thích trong câu hỏi ban đầu? Có vẻ như bạn đã trả lời sai câu hỏi ...
dezso

6
Cấu trúc của câu trả lời là sai, bởi vì - giao dịch đơn lẻ cần phải được đặt trước tên cơ sở dữ liệu, nhưng câu trả lời thực sự đúng. Việc chỉ định tùy chọn này hoạt động xung quanh vấn đề bằng cách thay đổi hành vi khóa của mysqldump, do đó lỗi trong câu hỏi ban đầu không còn xảy ra nữa.
Michael - sqlbot

tôi đã đối mặt với cùng một vấn đề làm việc - giao dịch đơn lẻ.

Không chắc chắn những gì nó làm, nhưng làm việc mặc dù! Cảm ơn
Sri Harsha Kappala

17

Giải pháp nhanh nhất sẽ chỉ là tạo lại definer để nó tồn tại, miễn là nó không tạo ra bất kỳ xung đột nào với người dùng hiện tại.

CREATE USER 'root'@'foobar';


Điều gì xảy ra nếu người dùng là 'root' @ '%'? Tôi chỉ đơn giản là từ chối những thứ như vậy trên một máy chủ mà chúng tôi chịu trách nhiệm.
Attila Fulop

@AttilaFulop Vâng, bảo mật chắc chắn nên được xem xét, nhưng tôi đã nói đây là giải pháp "nhanh nhất", không phải là giải pháp hoàn hảo. Khi quá trình nhập hoàn tất, người dùng có thể bị xóa để giảm thiểu rủi ro khi có thêm người dùng.
ColinM

Bạn đúng trong đó. Tôi chỉ muốn thu hút sự chú ý đến khía cạnh đặc biệt này là tốt. Các đồng nghiệp của tôi đã thêm 'root' @ '%' và để nó ở đó miễn là Chuck Norris còn sống tức là. mãi mãi;)
Attila Fulop

6

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.sqlvà tạo lại chúng:

cat views.sql | mysql <DB>

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


Đây là câu trả lời rõ ràng nhất
Wolfe
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.