Lần đầu tiên di chuyển EC2 MySQL sang Amazon RDS không thành công - Đặc quyền SIÊU


11

Tôi đã cố gắng chuyển một db hiện có từ MySQL chạy trên EC2 sang một phiên bản Amazon RDS mới (một thử nghiệm để xem liệu chúng tôi có thể di chuyển qua không). Cho đến nay, nó sẽ không tốt. Tôi bị kẹt ở lần nhập đầu tiên trước khi thiết lập sao chép (hướng dẫn tại đây ).

Tôi đã chuẩn bị phiên bản RDS như được mô tả và có thể kết nối với nó từ phiên bản EC2 bằng mysql. Tôi đã chạy lệnh mysqldump như:

mysqldump --master-data --databases db1 db2 > dump.sql

Sau đó đã cố tải nó lên RDS với:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

Vấn đề đầu tiên là ở dòng 22 của bãi chứa:

THAY ĐỔI MASTER ĐẾN MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Dòng này gây ra lỗi ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Không có vấn đề gì, chỉ cần bình luận ra dòng đó và hy vọng sẽ sửa nó sau thông qua mysql.rds_set_external_master (). Đã thử lại quá trình tải lên và gặp một lỗi rất giống nhau : ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Phần xung quanh dòng 7844 trông như thế này:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

Bằng cách nhận xét 2 dòng đầu tiên và thêm 'TẠO' vào dòng thứ ba, tôi đã có thể vượt qua dòng này. Nhưng có hàng tấn các phần như thế này. Có cách nào đó mà không cần chỉnh sửa? Giống như một tùy chọn để mysqldumpkhông sản xuất bất cứ thứ gì cần đặc quyền SUPER?

Có vẻ như nhiều người đã gặp vấn đề tương tự, như phải chạy sedngược lại đầu ra của mysqldump / mysqlbinlog! Tôi cũng sẽ đăng bài trên diễn đàn AWS - thực sự tôi nghĩ rằng RDS nên có cách nhập khẩu khoan dung hơn từ mysqldump hoặc một công cụ cụ thể có thể chạy với db hiện có để tạo một bãi chứa khiếu nại với bảo mật RDS. Chỉ tự hỏi nếu có ai có bất kỳ công thức nấu ăn hoặc thủ thuật khác có thể giúp đỡ ở đây.

Cảm ơn,

Dave


Xin lỗi - quên nói rằng tôi đã thử thay đổi log_bin_trust_function_creatorstham số thành 1, nhưng vẫn gặp lỗi tương tự ở dòng 7844.
dsl101

Bài cũ, nhưng lỗi đầu tiên bạn có thể tránh bằng cách nói --masterdata=2. Dòng này sau đó sẽ được nhận xét trong bãi chứa.
Halfgaar

Câu trả lời:


26

Bạn có thể cần log_bin_trust_function_creators= 1 trên RDS nhưng đó không phải là vấn đề ở đây.

Bạn chỉ có thể chỉ định một  DEFINER giá trị ngoài tài khoản của mình nếu bạn có  SUPER đặc quyền.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Khi một chương trình được lưu trữ (Proc, chức năng, sự kiện hoặc trình kích hoạt) đang chạy, mọi thứ nó có đều có quyền của người dùng đã xác định chương trình đó hoặc của người dùng được tuyên bố rõ ràng bằng một DEFINERtuyên bố. Điều này cho phép, trong số những thứ khác, cho các chương trình được lưu trữ cho phép người dùng khác thực hiện mọi việc đối với dữ liệu mà họ không có quyền trực tiếp thao tác, miễn là họ có quyền sử dụng chính chương trình được lưu trữ.

Đó sẽ là một lỗ hổng nghiêm trọng, sau đó, nếu một SUPERngười không phải là người dùng có thể tạo ra một thủ tục với một bộ khử tùy ý, bởi vì người dùng có thể leo thang các đặc quyền của mình theo ý muốn.

Tất nhiên, điều này cũng đúng với các khung nhìn, khi bối cảnh bảo mật của definer được sử dụng, như trong ví dụ bạn đã đăng.

Một trong những phàn nàn lớn nhất của tôi với RDS là bạn không thể có SUPER... và bây giờ nó cũng có thể là một trong những vấn đề của bạn :) vì thực tế đó là nguyên nhân của vấn đề bạn đang gặp phải.

Tất nhiên, nếu tôi đang chạy một dịch vụ MySQL được quản lý, tôi cũng sẽ không cung cấp cho bất kỳ ai SUPER, vì vậy mô hình bảo mật của họ có ý nghĩa, ngay cả khi đôi khi nó không hiệu quả.

Nếu tất cả các đối tượng của bạn có cùng một bộ khử, một cách giải quyết sẽ là khôi phục bãi chứa bằng tài khoản đó thay vì tài khoản bạn đang sử dụng, nhưng điều đó dường như không thể.

Chỉ xóa dòng có DEFINERkhai báo sẽ khiến cho tệp dumpfile hoạt động trong trường hợp nó tự xuất hiện trên một dòng hoặc bạn có thể sử dụng sed hoặc perl để sửa đổi tệp ... một ý tưởng mà tôi đã biết bạn không thích, nhưng thực sự là một điều tốt đẹp về MySQL rằng việc hack như vậy là khá hợp pháp và không thực sự khác xa với những điều tôi phải làm với tư cách là một DBA ngay cả trong môi trường không phải RDS.

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

... có thể không phải là câu trả lời mà bạn hy vọng, nhưng bạn có thể chạy nó với tệp tin rác của bạn và sẽ kết thúc với một tệp có thể sử dụng hơn một chút.


Rất cám ơn đã trả lời toàn diện, và đã xác nhận những gì tôi nghĩ về sed / perl là giải pháp duy nhất. Ứng dụng tôi đang sử dụng là Joomla được tùy biến cao và trong khi nguồn mở tôi không có thời gian / kỹ năng để phân tích ứng dụng để tìm ra nếu nó sẽ chuyển sang RDS tốt. Suy nghĩ của tôi là 'thử và xem' - nhưng có vẻ như bước đầu tiên là khó nhất - một phần không nhỏ do các công cụ di chuyển không đầy đủ (theo quan điểm của tôi) của Amazon. Tôi đồng ý về mô hình bảo mật, nhưng nếu đầu ra mặc định của mysqldump tạo ra rất nhiều vấn đề, tại sao họ không có giải pháp tốt hơn? Tôi sẽ hỏi điều này của họ quá.
dsl101

1
TUYỆT VỜI. cảm ơn bạn rất nhiều cho kịch bản perl đó. sao lưu của tôi là hơn 4 GB và chỉ cần mở nó là một thách thức. Điều này đã cứu ngày của tôi.
Emile Baizel

1
Giải thích tuyệt vời, câu trả lời tuyệt vời, và giải pháp tuyệt vời! Kẻ lừa đảo ngu ngốc.
rkaregaran

4
Cảm ơn rất nhiều cho perl một lót của bạn. Đó là người duy nhất tôi có thể tìm thấy nó thực sự hoạt động. Nhiều người khác trong các bảng này chỉ đơn giản là không. Tôi sẽ upvote một lần nữa nếu tôi có thể.
lucian303

1

Trong trường hợp của tôi là dòng "THAY ĐỔI MASTER ĐẾN MASTER_LOG_FILE = ..." trong bãi chứa lỗi cho tôi. Dòng này đã được thêm vào bởi tùy chọn "--master-data" của mysqldump. Trong Amazon AWS, bạn cần bắt đầu sao chép bằng cách đặt chi tiết chính với quy trình "mysql.rds_set_external_master" thay vì đọc tại đây

Vì vậy, tôi chỉ ghi chú dòng đó "head 22 backup.dump" trong đó dòng 22 báo lỗi. Sau đó xóa nó trước khi nhập, đối với tệp lớn của tôi, tôi sử dụng: "sed '22d' backup.dump> backup_clean.dump"

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.