ความพยายามครั้งแรกในการโยกย้าย EC2 MySQL ไปยัง Amazon RDS ไม่เป็นไปด้วยดี - สิทธิ์พิเศษ


11

ฉันพยายามย้ายฐานข้อมูลที่มีอยู่จาก MySQL ที่ทำงานบน EC2 ไปยังอินสแตนซ์ Amazon RDS ใหม่ (การทดลองเพื่อดูว่าเราสามารถย้ายข้าม) จนถึงตอนนี้มันยังไม่ดี ฉันติดอยู่ที่การนำเข้าเริ่มต้นก่อนที่จะตั้งค่าการจำลองแบบ (คำแนะนำที่นี่ )

ฉันได้เตรียมอินสแตนซ์ RDS ตามที่อธิบายไว้และสามารถเชื่อมต่อได้จากอินสแตนซ์ EC2 โดยใช้ mysql ฉันรันคำสั่ง mysqldump เป็น:

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

จากนั้นพยายามอัปโหลดไปยัง RDS ด้วย:

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

ปัญหาแรกอยู่ที่บรรทัดที่ 22 ของดัมพ์:

เปลี่ยน MASTER เป็น MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operationสายข้อผิดพลาดที่เกิดขึ้นนี้ ไม่มีปัญหาเพียงแค่แสดงความคิดเห็นในบรรทัดนั้นและหวังว่าจะแก้ไขในภายหลังผ่านทาง mysql.rds_set_external_master () ลองอัปโหลดอีกครั้งและได้รับข้อผิดพลาดที่คล้ายกันมาก: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. ส่วนรอบ ๆ บรรทัดที่ 7844 มีลักษณะเช่นนี้:

/*!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` */;

โดยการคอมเม้นท์ 2 บรรทัดแรกและเพิ่ม 'CREATE' ลงในบรรทัดที่สามทำให้ฉันสามารถผ่านด่านนี้ได้ แต่มีตันส่วนเช่นนี้ มีวิธีรอบนี้โดยไม่มีการแก้ไขทั้งหมดหรือไม่ ชอบตัวเลือกที่mysqldumpจะไม่สร้างอะไรที่ต้องการสิทธิ์พิเศษหรือไม่?

ดูเหมือนว่าผู้คนจำนวนมากมีปัญหาที่คล้ายกันเช่นต้องทำงานsedกับผลลัพธ์ของ mysqldump / mysqlbinlog! ฉันจะโพสต์บนฟอรัม AWS ด้วย - ฉันคิดว่า RDS ควรมีวิธีการนำเข้าที่เข้มงวดมากขึ้นจาก mysqldump หรือเครื่องมือเฉพาะที่สามารถทำงานกับฐานข้อมูลที่มีอยู่เพื่อสร้างการถ่ายโอนข้อมูลซึ่งเป็นการร้องเรียนเรื่องความปลอดภัยของ RDS แค่สงสัยว่ามีใครมีสูตรหรือลูกเล่นอื่นใดบ้างที่อาจช่วยได้ที่นี่

ขอบคุณ

เดฟ


ขออภัย - ลืมที่จะบอกว่าผมได้พยายามเปลี่ยนlog_bin_trust_function_creatorsพารามิเตอร์ 1 แต่ยังคงได้รับข้อผิดพลาดเดียวกันที่เส้น 7844.
dsl101

โพสต์เก่า --masterdata=2แต่ข้อผิดพลาดแรกคุณสามารถหลีกเลี่ยงด้วยการพูดว่า บรรทัดนั้นจะถูกใส่ความคิดเห็นในการถ่ายโอนข้อมูล
Halfgaar

คำตอบ:


26

คุณอาจต้องการlog_bin_trust_function_creators= 1 ใน RDS แต่นี่ไม่ใช่ปัญหาที่นี่

คุณสามารถระบุ  DEFINER ค่าอื่นนอกเหนือจากบัญชีของคุณเองเฉพาะในกรณีที่คุณมี  SUPER สิทธิ์

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

เมื่อโปรแกรมที่เก็บไว้ (proc, ฟังก์ชั่น, เหตุการณ์หรือทริกเกอร์) กำลังทำงานทุกอย่างที่มันมีสิทธิ์ของผู้ใช้ที่กำหนดไว้หรือของผู้ใช้ที่ระบุไว้อย่างชัดเจนด้วยการDEFINERประกาศ สิ่งนี้อนุญาตให้โปรแกรมที่จัดเก็บอนุญาตให้ผู้ใช้รายอื่นทำสิ่งต่าง ๆ กับข้อมูลที่พวกเขาไม่ได้รับอนุญาตโดยตรงในการจัดการตราบใดที่พวกเขามีสิทธิ์ใช้งานโปรแกรมที่เก็บไว้

มันจะเป็นช่องโหว่ที่ร้ายแรงหากSUPERผู้ใช้ที่ไม่ใช่ผู้ใช้สามารถสร้างโพรซีเดอร์ด้วยตัวกำหนดเองได้เนื่องจากผู้ใช้สามารถเพิ่มสิทธิ์ของเขาหรือเธอได้ตามต้องการ

สิ่งนี้ก็เป็นจริงเช่นกันเมื่อมีการใช้บริบทด้านความปลอดภัยที่ชัดเจนเช่นในตัวอย่างที่คุณโพสต์

หนึ่งในข้อร้องเรียนที่ใหญ่ที่สุดที่ฉันมีกับ RDS ก็คือคุณไม่สามารถSUPER... และตอนนี้ก็สามารถเป็นหนึ่งในของคุณได้เช่นกัน :) เพราะความจริงนั้นเป็นสาเหตุของปัญหาที่คุณมีอยู่

แน่นอนถ้าฉันใช้บริการ MySQL ที่มีการจัดการฉันจะไม่ให้ใครSUPERเลยดังนั้นรูปแบบความปลอดภัยของพวกเขาจึงสมเหตุสมผลแม้ว่าบางครั้งมันจะไม่สะดวก

หากวัตถุทั้งหมดของคุณมีนิยามที่เหมือนกันวิธีแก้ปัญหาคือการคืนค่าการถ่ายโอนข้อมูลโดยใช้บัญชีนั้นแทนที่จะเป็นสิ่งที่คุณใช้อยู่ตอนนี้ แต่ดูเหมือนจะไม่น่าเป็นไปได้

การลบเฉพาะบรรทัดที่มีการDEFINERประกาศควรทำให้ dumpfile ทำงานในกรณีที่ปรากฏบนบรรทัดด้วยตัวเองหรือคุณสามารถใช้ sed หรือ perl เพื่อแก้ไขไฟล์ ... ความคิดที่ฉันรู้แล้วว่าคุณไม่ชอบ แต่มันเป็นเรื่องดีเกี่ยวกับ MySQL ที่แฮกเกอร์ดังกล่าวนั้นค่อนข้างถูกต้องและไม่ใช่ทุกสิ่งที่ไกลจากสิ่งต่าง ๆ ที่ฉันต้องทำในฐานะ DBA แม้ในสภาพแวดล้อมที่ไม่ใช่ RDS

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

... อาจไม่ใช่คำตอบที่คุณคาดหวัง แต่คุณสามารถเรียกใช้ไฟล์นั้นจากไฟล์ dumpfile ของคุณและควรลงท้ายด้วยไฟล์ที่ใช้งานได้มากกว่า


ขอบคุณมากสำหรับคำตอบที่ครอบคลุมและเพื่อยืนยันสิ่งที่ฉันคิดเกี่ยวกับ sed / perl เป็นทางออกเดียว แอพที่ฉันใช้นั้นมีการปรับแต่ง Joomla สูงและในขณะที่โอเพ่นซอร์สฉันไม่มีเวลา / ทักษะในการวิเคราะห์ว่ามันจะออกมาดีหรือไม่ ความคิดของฉันคือ 'ลองและดู' - แต่ดูเหมือนว่าขั้นตอนแรกนั้นยากที่สุด - ในส่วนเล็ก ๆ เนื่องจากเครื่องมือการย้ายถิ่นของ Amazon ไม่เพียงพอ (ในมุมมองของฉัน) ฉันเห็นด้วยกับรูปแบบการรักษาความปลอดภัย แต่ถ้าผลลัพธ์เริ่มต้นของ mysqldump สร้างปัญหามากมายทำไมพวกเขาไม่มีทางออกที่ดีกว่า? ฉันจะถามสิ่งนี้กับพวกเขาด้วย
dsl101

1
น่ากลัว ขอบคุณมากสำหรับสคริปต์ Perl ที่ สำรองของฉันคือ 4+ GB และเพิ่งเปิดมันเป็นเรื่องที่ท้าทาย สิ่งนี้ช่วยชีวิตฉันไว้
Emile Baizel

1
คำอธิบายที่ดีคำตอบที่ยอดเยี่ยมและทางออกที่ยอดเยี่ยม! นิยามที่โง่เขลา
rkaregaran

4
ขอบคุณมากสำหรับ perl หนึ่งซับของคุณ มันเป็นสิ่งเดียวที่ฉันค้นพบว่าใช้งานได้จริง คนอื่น ๆ ในบอร์ดเหล่านี้ก็ทำไม่ได้ ฉันจะโหวตอีกครั้งถ้าทำได้
lucian303

1

ในกรณีของฉันคือบรรทัด "CHANGE MASTER TO MASTER_LOG_FILE = ... " ในการถ่ายโอนข้อมูลที่ทำให้ฉันมีข้อผิดพลาด บรรทัดนี้ถูกเพิ่มโดยตัวเลือก "--master-data" ของ mysqldump ใน Amazon AWS คุณต้องเริ่มการจำลองแบบโดยการตั้งค่ารายละเอียดหลักด้วยขั้นตอน "mysql.rds_set_external_master" แทนอ่านที่นี่

ดังนั้นฉันแค่ toke บันทึกของบรรทัดที่ "หัว 22 backup.dump" ที่บรรทัดที่ 22 รายงานข้อผิดพลาด จากนั้นลบออกก่อนนำเข้าสำหรับไฟล์ขนาดใหญ่ของฉันฉันใช้: "sed '22d' backup.dump> backup_clean.dump"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.