2017-05-17 12 views
14

Vì vậy, tôi cố gắng nhập tệp sql vào rds (1G MEM, 1 CPU). Các tập tin sql là như 1.4GTruy cập bị từ chối; bạn cần (ít nhất một trong số) đặc quyền SUPER cho hoạt động này

mysql -h xxxx.rds.amazonaws.com -u dùng -ppass max-phép-gói = 33.554.432 db < db.sql

Nó đã bị mắc kẹt tại địa chỉ:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 

Nội dung sql thực tế là:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW 
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN 
     SET NEW.created_at = NOW(); 
END IF */;; 

another_user không được tồn tại trong rds, vì vậy tôi làm:

GRANT ALL PRIVILEGES ON db.* TO [email protected]'localhost'; 

Vẫn không có may mắn.

Trả lời

23

Hoặc xóa câu lệnh DEFINER=.. khỏi tệp sqldump của bạn hoặc thay thế giá trị người dùng bằng CURRENT_USER.

Máy chủ MySQL do RDS cung cấp không cho phép cú pháp DEFINER cho người dùng khác (theo kinh nghiệm của tôi).

Bạn có thể sử dụng một kịch bản sed để loại bỏ chúng khỏi file:

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql 
+0

Bạn đúng. Lý do nó không hoạt động là chỉ định một người dùng khác là 'DEFINER' khi người dùng đã đăng nhập không có đặc quyền' SUPER' (mà chính nó không được cho phép trong RDS) sẽ cho phép leo thang đặc quyền tùy ý - các chương trình được lưu trữ chạy với các thông tin và đặc quyền của 'DEFINER' của họ (trái ngược với thông tin của người dùng đang gọi - mặc định là 'INVOKER'). Ngoài ra [tại Server Fault] (https://serverfault.com/a/555983/153161). –

+0

Bạn là người bảo vệ cuộc sống. Đã có công ty lưu trữ của tôi cho tôi biết cơ sở dữ liệu bị hỏng khi xuất khẩu và không có gì có thể được thực hiện để khôi phục. Giải pháp hoàn hảo. – Woody

+3

Vì lý do nào đó, tôi phải sử dụng * thay vì +: '' '' sed 's/\ sDEFINER = '[^'] * '@' [^ '] *' //' -i oldfile.sql''' ' –

Các vấn đề liên quan