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