Lỗi MySQL / Amazon RDS: “bạn không có SUPER đặc quyền…”


97

Tôi đang cố sao chép cơ sở dữ liệu mysql của mình từ Amazon EC2 sang RDS:

Tôi đã thực hiện thành công một mysqldumpcơ sở dữ liệu của mình vào thư mục gốc bằng cách sử dụng:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Sau đó, tôi đã cố gắng chuyển tệp .sql này sang cơ sở dữ liệu RDS mới của mình:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Rất tiếc, tôi nhận được thông báo lỗi sau:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Tôi đã cố gắng GRANT SUPER..theo nhiều cách khác nhau nhưng tôi cũng gặp lỗi khi cố gắng làm điều đó. Đánh máy mysql > FLUSH privileges;cũng không hoạt động.

Tôi là một người mới bắt đầu mysql nên xin lỗi vì một câu hỏi dễ như vậy. Suy nghĩ?


9
Bạn không thể GRANT SUPERtrên RDS. RDS không cung cấp cách nào để nhận được SIÊU đặc quyền.
ceejayoz

Sử dụng cùng tên người dùng MySQL để tạo kết xuất và khôi phục nó (Đối với kết nối và từ khóa DEFINER trong kết xuất). Thay đổi log_bin_trust_osystem_creators không phải là giải pháp mong muốn. Điều tồi tệ nhất là sử dụng tham số -f trong trường hợp này
ad4s

trong trường hợp của tôi, sqltệp của tôi có CREATE FUNCTIONcâu lệnh cần một người dùng đặc quyền. xem cái này
Kế toán م

Câu trả lời:


63

Theo http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , bạn cần đặt log_bin_trust_function_creatorsthành 1 trong bảng điều khiển AWS , để tải tệp kết xuất của bạn mà không bị lỗi.

Nếu bạn muốn bỏ qua những lỗi này và tải phần còn lại của tệp kết xuất, bạn có thể sử dụng -ftùy chọn:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

-fsẽ báo lỗi, nhưng sẽ tiếp tục xử lý phần còn lại của tệp kết xuất.


chào @Ross, cảm ơn vì điều này. Thật không may, việc sử dụng -fkhông giúp được gì. Tôi cũng gặp lỗi tương tự. Sử dụng liên kết của bạn, tôi đang gặp sự cố với cú pháp công cụ Cli RDS. Có nghĩa là, khi tôi đi đến thay đổi các đặc quyền tôi nhận được lỗi sau:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim Peterson

đây là lệnh của tôi, nó cung cấp cho tôi lỗi ở trên: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"Tôi biết đó phải là vấn đề về dấu ngoặc kép hoặc dấu gạch ngang nhưng không có loại thay đổi nào hoạt động cho đến nay, ugh!
tim peterson

4
Các -ftùy chọn sẽ không làm cho các lỗi đi, nó sẽ chỉ cho phép những điều khoản không xúc phạm SQL trong tập tin để được xử lý. Từ những gì tôi đã đọc, RDS đang mắc kẹt với các thủ tục được lưu trữ trong tệp kết xuất. Hãy thử tạo một tập tin dump mà không cần thủ tục lưu trữ và xem nếu mà tải OK:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II

2
- @ Ross, thật tuyệt vời, cơ sở dữ liệu của tôi ở đó, wow đó là một vấn đề khó chịu, cảm thấy như AWS nên làm điều gì đó về điều đó.
tim peterson

Ít nhất tôi có thể tải tất cả dữ liệu với -ftùy chọn. Giai đoạn thứ hai có thể là để đổ chỉ thói quen / stred proc, vv riêng
Kaymaz

134
  1. Mở bảng điều khiển web RDS.
  2. Mở tab "Nhóm tham số".
  3. Tạo một Nhóm tham số mới. Trên hộp thoại, chọn họ MySQL tương thích với phiên bản cơ sở dữ liệu MySQL của bạn, đặt tên cho nó và xác nhận. Chọn Nhóm tham số vừa tạo và phát hành “Chỉnh sửa tham số”.
  4. Tìm tham số 'log_bin_trust_ Chức năng_creators' và đặt giá trị của nó thành '1 ′.
  5. Lưu các thay đổi.
  6. Mở tab "Phiên bản". Mở rộng phiên bản MySQL của bạn và đưa ra “Hành động phiên bản” có tên “Sửa đổi”.
  7. Chọn Nhóm tham số vừa tạo và bật “Áp dụng ngay lập tức”.
  8. Nhấp vào “Tiếp tục” và xác nhận các thay đổi.
  9. Chờ cho hoạt động "Sửa đổi" được hoàn thành.
  10. Một lần nữa, hãy mở tab “Phiên bản”. Mở rộng phiên bản MySQL của bạn và mở rộng tab “Hành động phiên bản” và chọn "Khởi động lại".

> điểm 9 làm gì ... bạn điều chỉnh thể hiện của mình để sử dụng nhóm tham số đã xác định trước đó. Để biết thêm chi tiết, hãy xem bài đăng trên blog gốc này của Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL

Điều này sẽ ngăn chặn sao chép RDS Mysql?
Ramratan Gupta

xin chào @ arun-r, tôi thực hiện từng bước mà bạn đã giải thích, nhưng tham số 'log_bin_trust_ Chức năng_creators' không khả dụng trong trường hợp. Tôi nghĩ có điều gì đó đã được thay đổi trong AWS RDS mới nhất. Bạn có thể vui lòng giúp tôi làm thế nào tôi có thể làm điều này bây giờ? cảm ơn,
Pawan Developers

@RamratanGupta Nó sẽ không dừng lại
arun-r

1
@ arun-r cảm ơn phản hồi của bạn. Tôi đã giải quyết được vấn đề của mình. Trên thực tế, tôi đã tìm thấy log_bin_trust_ Chức năng_creators trong danh sách. nhưng vấn đề của tôi đã được giải quyết bằng cách liên hệ với bộ phận hỗ trợ AWS
Pawan Developers

33

Vấn đề với các trình kích hoạt và thủ tục được lưu trữ trong tệp kết xuất là những định nghĩa này bao gồm người dùng mà thủ tục được lưu trữ sẽ được tạo bởi DEFINER. Người dùng rất có thể không tồn tại trong RDS vì vậy lỗi sau đó được phát sinh. Để có thể tải tệp kết xuất, bạn có thể xóa DEFINER bằng cách sử dụng sed hoặc Perl và tạo thủ tục / trình kích hoạt được lưu trữ với người dùng đang thực hiện nhập.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Bây giờ bạn sẽ có thể tải tệp kết xuất cố định

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Như đã nói trong câu trả lời trước đó, bạn nên đặt Tham số DB:

log_bin_trust_function_creators = 1

1
Dọn dẹp definers cũng có thể được thực hiện với sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar

14

Đối với tôi, chỉ có 2 lệnh trong tệp kết xuất của tôi yêu cầu SUPER đặc quyền:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Theo tài liệu mysqldump, bạn có thể vô hiệu hóa chúng bằng --set-gtid-purged=OFF.

Sau đó, nhìn vào người đàn ông mysqldump :

Sử dụng ON nếu mục đích là triển khai một nô lệ nhân bản mới chỉ sử dụng một số dữ liệu từ máy chủ được kết xuất. Sử dụng TẮT nếu mục đích là sửa chữa một bảng bằng cách sao chép nó trong một cấu trúc liên kết. Sử dụng TẮT nếu mục đích là sao chép một bảng giữa các cấu trúc liên kết sao chép rời rạc và sẽ vẫn như vậy.

Vì vậy, tôi quyết định thêm --set-gtid-purged=OFFvào mysqldumplệnh của mình và sau đó tôi có thể nhập thành công tệp kết xuất kết quả.


1
Vâng, đây là nó. Tệp kết xuất của tôi tương đối nhỏ, vì vậy tôi đã xóa tất cả các lần xuất hiện của 2 lệnh này khỏi nó.
Zolbayar

6

Như đã định nghĩa trong trình kích hoạt tài liệu AWS, thủ tục và chức năng bị tắt theo mặc định vì ghi nhật ký nhị phân được bật theo mặc định. Vô hiệu hóa về cơ bản sẽ làm cho db của bạn an toàn hơn, nhưng nếu bạn đã bảo mật đúng cách qua mạng thì điều đó sẽ không thành vấn đề.

Hãy làm theo các bước sau và sự cố của bạn sẽ được khắc phục https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Ngoài ra, bạn không nên sử dụng các bộ định nghĩa khi tạo các thủ tục. Một lệnh sed đơn giản có thể loại bỏ nó.



1

Sau khi sử dụng câu trả lời arun-r, nếu sự cố không được giải quyết, bạn cần sửa đổi tệp kết xuất của mình. Nó đơn giản.

Trong tệp kết xuất, bạn sẽ tìm thấy các dòng như:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Bạn phải thay thế:

  • username_from_dumped_database bằng tên người dùng của bạn trên cơ sở dữ liệu rds.
  • host_from_dumped_databse bởi %

Tôi không biết tại sao nhưng thủ thuật này đã hiệu quả với tôi. Một trình soạn thảo văn bản đơn giản là đủ để làm điều này.

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.