ข้อผิดพลาด MySQL / Amazon RDS:“ คุณไม่มีสิทธิ์พิเศษ…”


104

ฉันพยายามคัดลอกฐานข้อมูล mysql จาก Amazon EC2 ไปยัง RDS:

ฉันทำmysqldumpฐานข้อมูลในโฟลเดอร์รูทสำเร็จโดยใช้สิ่งนี้:

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

จากนั้นฉันพยายามถ่ายโอนไฟล์. sql นี้ไปยังฐานข้อมูล RDS ใหม่ของฉัน:

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

ขออภัยฉันได้รับข้อความแสดงข้อผิดพลาดดังต่อไปนี้:

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)

ฉันพยายามGRANT SUPER..ทำหลายวิธี แต่ก็พบข้อผิดพลาดเมื่อพยายามทำเช่นนั้นเช่นกัน การพิมพ์mysql > FLUSH privileges;ก็ใช้ไม่ได้เช่นกัน

ฉันเป็นผู้เริ่มต้นใช้งาน mysql ดังนั้นขออภัยสำหรับคำถามที่ง่ายเช่นนี้ ความคิด?


9
คุณไม่สามารถGRANT SUPERใช้ RDS ได้ RDS ไม่มีวิธีรับสิทธิพิเศษ
ceejayoz

1
ใช้ชื่อผู้ใช้ MySQL เดียวกันในการสร้างดัมพ์และกู้คืน (สำหรับการเชื่อมต่อและคีย์เวิร์ด DEFINER ในดัมพ์) การเปลี่ยน log_bin_trust_function_creators ไม่ใช่วิธีแก้ปัญหาที่ต้องการ สิ่งที่แย่ที่สุดคือการใช้พารามิเตอร์ -f ในกรณีนี้
ad4s

1
ในกรณีของฉันsqlไฟล์ของฉันมีCREATE FUNCTIONคำสั่งที่ต้องการผู้ใช้ที่มีสิทธิพิเศษ ดูสิ่งนี้
นักบัญชี

คำตอบ:


65

ตามhttp://getasysadmin.com/2011/06/amazon-rds-super-privileges/คุณต้องตั้งค่าlog_bin_trust_function_creatorsเป็น 1 ในคอนโซล AWSเพื่อโหลดไฟล์ดัมพ์ของคุณโดยไม่มีข้อผิดพลาด

หากคุณต้องการละเว้นข้อผิดพลาดเหล่านี้และโหลดไฟล์ดัมพ์ที่เหลือคุณสามารถใช้-fตัวเลือก:

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

-fจะรายงานข้อผิดพลาด แต่จะยังคงการประมวลผลที่เหลือของไฟล์การถ่ายโอนข้อมูล


สวัสดี @Ross ขอบคุณสำหรับสิ่งนี้ น่าเสียดายที่การใช้-fไม่ได้ช่วย ฉันได้รับข้อผิดพลาดเดียวกัน เมื่อใช้ลิงก์ของคุณฉันมีปัญหากับไวยากรณ์ของเครื่องมือ RDS Cli ความหมายเมื่อฉันไปเปลี่ยนสิทธิพิเศษฉันได้รับข้อผิดพลาดดังต่อไปนี้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

นี่คือคำสั่งของฉันที่ทำให้ฉันมีข้อผิดพลาดข้างต้น: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"ฉันรู้ว่ามันต้องเป็นปัญหาใบเสนอราคาหรือสองขีด แต่ฉันยังไม่มีการเปลี่ยนแปลงประเภทใดที่ใช้งานได้เลยฮึ!
tim peterson

4
-fตัวเลือกที่จะไม่ทำผิดพลาดหายไปมันก็จะช่วยให้คำสั่ง SQL ที่ไม่ใช่การกระทำผิดกฎหมายในแฟ้มที่ต้องดำเนินการ จากสิ่งที่ฉันอ่าน RDS กำลังสำลักกระบวนงานที่เก็บไว้ในไฟล์ดัมพ์ ลองสร้างไฟล์ดัมพ์โดยไม่มีขั้นตอนการจัดเก็บและดูว่าโหลดได้หรือไม่:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II

2
- @ Ross ยอดเยี่ยมมากที่ใช้งานได้ฐานข้อมูลของฉันอยู่ที่นั่นว้าวเป็นปัญหาที่น่ารำคาญรู้สึกว่า AWS ควรทำอะไรสักอย่างเกี่ยวกับเรื่องนี้
tim peterson

อย่างน้อยฉันสามารถโหลดข้อมูลทั้งหมดด้วย-fตัวเลือก ขั้นตอนที่สองอาจเป็นการถ่ายโอนเฉพาะกิจวัตร / stred proc ฯลฯ แยกต่างหาก
Kaymaz

142
  1. เปิดเว็บคอนโซล RDS
  2. เปิดแท็บ "กลุ่มพารามิเตอร์"
  3. สร้างกลุ่มพารามิเตอร์ใหม่ ในกล่องโต้ตอบเลือกตระกูล MySQL ที่เข้ากันได้กับเวอร์ชันฐานข้อมูล MySQL ของคุณตั้งชื่อและยืนยัน เลือกกลุ่มพารามิเตอร์ที่เพิ่งสร้างขึ้นและออก“ แก้ไขพารามิเตอร์”
  4. มองหาพารามิเตอร์ "log_bin_trust_function_creators" และตั้งค่าเป็น "1 ′
  5. บันทึกการเปลี่ยนแปลง
  6. เปิดแท็บ "อินสแตนซ์" ขยายอินสแตนซ์ MySQL ของคุณและออก "Instance Action" ชื่อ "Modify"
  7. เลือกกลุ่มพารามิเตอร์ที่เพิ่งสร้างขึ้นและเปิดใช้งาน“ ใช้ทันที”
  8. คลิกที่ "ดำเนินการต่อ" และยืนยันการเปลี่ยนแปลง
  9. รอให้การดำเนินการ "แก้ไข" เสร็จสิ้น
  10. อีกครั้งเปิดแท็บ "อินสแตนซ์" ขยายอินสแตนซ์ MySQL ของคุณและขยายแท็บ "Instance Action" แล้วเลือก "Reboot"

แก้ไขธันวาคม 2020: ไม่จำเป็นต้องรีบูตเนื่องจาก log_bin_trust_function_creators ใช้ type = dynamic อย่างน้อยก็เป็นจริงหาก RDS ของคุณมีกลุ่มพารามิเตอร์ที่แนบมาแล้วและคุณแก้ไขซึ่งต่างจากการสร้างกลุ่มพารามิเตอร์ใหม่ บันทึกการแก้ไขพารามิเตอร์เพียงเท่านี้คุณก็พร้อมแล้ว


> จุดที่ 9 ทำอะไร ... คุณปรับอินสแตนซ์ของคุณให้ใช้กลุ่มพารามิเตอร์ที่กำหนดไว้ก่อนหน้านี้ ดูรายละเอียดเพิ่มเติมได้ที่บล็อกโพสต์ต้นฉบับโดย Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL

สิ่งนี้จะหยุดการจำลองแบบ RDS Mysql หรือไม่
Ramratan Gupta

สวัสดี @ arun-r ฉันทำตามขั้นตอนที่คุณอธิบายแล้ว แต่พารามิเตอร์ 'log_bin_trust_function_creators' ไม่สามารถใช้ได้ในกรณีนี้ ฉันคิดว่ามีการเปลี่ยนแปลงใน AWS RDS ล่าสุด คุณช่วยฉันได้ไหมฉันจะทำอย่างไรตอนนี้ ขอบคุณ
Pawan Developers

@RamratanGupta มันจะไม่หยุด
arun-r

1
@ arun-r ขอบคุณสำหรับการตอบกลับของคุณ ฉันแก้ไขปัญหาของฉันแล้ว อันที่จริงฉันพบ log_bin_trust_function_creators ในรายการ แต่ปัญหาของฉันได้รับการแก้ไขโดยติดต่อฝ่ายสนับสนุนของ AWS
Pawan Developers

33

ปัญหาเกี่ยวกับทริกเกอร์และโพรซีเดอร์ที่เก็บไว้ในไฟล์ดัมพ์คือคำจำกัดความเหล่านี้รวมถึงผู้ใช้ที่ควรสร้างโพรซีเดอร์ที่จัดเก็บโดย DEFINER ผู้ใช้ส่วนใหญ่ไม่มีอยู่ใน RDS ดังนั้นจึงเกิดข้อผิดพลาดขึ้น เพื่อให้สามารถโหลดไฟล์ดัมพ์คุณสามารถลบ DEFINER โดยใช้ sed หรือ Perl และสร้างโพรซีเดอร์ / ทริกเกอร์ที่จัดเก็บไว้กับผู้ใช้ที่กำลังดำเนินการนำเข้า

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

ตอนนี้คุณควรจะโหลดไฟล์ดัมพ์แบบถาวรได้แล้ว

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

ตามที่กล่าวไว้ในคำตอบก่อนหน้านี้คุณควรตั้งค่าพารามิเตอร์ DB:

log_bin_trust_function_creators = 1

1
การล้างค่ากำหนดสามารถทำได้ด้วย sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar

16

สำหรับฉันมีเพียง 2 คำสั่งในไฟล์ดัมพ์ของฉันซึ่งต้องใช้สิทธิ์ SUPER:

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

ตามเอกสาร mysqldumpคุณสามารถปิดใช้งานสิ่งเหล่านี้ด้วย--set-gtid-purged=OFF.

จากนั้นมองไปที่man mysqldump :

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

ดังนั้นฉันจึงตัดสินใจเพิ่มคำสั่ง--set-gtid-purged=OFFของฉันmysqldumpจากนั้นฉันก็สามารถนำเข้าไฟล์ดัมพ์ที่เป็นผลลัพธ์ได้สำเร็จ


1
ใช่นี่มัน ไฟล์ดัมพ์ของฉันมีขนาดค่อนข้างเล็กดังนั้นฉันจึงลบเหตุการณ์ 2 คำสั่งนี้ออกทั้งหมด
Zolbayar

6

ตามที่กำหนดไว้ในเอกสาร AWS ทริกเกอร์ขั้นตอนและฟังก์ชันจะถูกปิดใช้งานโดยค่าเริ่มต้นเนื่องจากการบันทึกไบนารีถูกเปิดใช้งานโดยค่าเริ่มต้น การปิดใช้งานโดยทั่วไปจะทำให้ฐานข้อมูลของคุณปลอดภัยมากขึ้น แต่ถ้าคุณได้รับการรักษาความปลอดภัยผ่านเครือข่ายอย่างเหมาะสมก็ไม่สำคัญ

ทำตามขั้นตอนเหล่านี้และปัญหาของคุณจะได้รับการแก้ไข https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

นอกจากนี้คุณไม่ควรใช้ตัวกำหนดเมื่อสร้างโพรซีเดอร์ คำสั่ง sed ง่ายๆสามารถลบออกได้


5

นอกเหนือจากการแก้ไข

log_bin_trust_function_creators = 1

คุณต้องลบDEFINERทั้งหมดออกจากไฟล์ดัมพ์ของคุณตรวจสอบลิงก์ต่อไปนี้สำหรับคำสั่งSEDที่สามารถช่วยล้างไฟล์ดัมพ์ sql ของคุณ

https://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/#comment-10968243


1

หลังจากใช้คำตอบ arun-r แล้วหากปัญหาไม่ได้รับการแก้ไขคุณต้องแก้ไขไฟล์ดัมพ์ของคุณ มันเป็นเรื่องง่าย

ในไฟล์ดัมพ์คุณจะพบบรรทัดต่างๆเช่น:

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

คุณต้องแทนที่:

  • username_from_dumped_database ตามชื่อผู้ใช้ของคุณบนฐานข้อมูล rds
  • host_from_dumped_databse โดย %

ฉันไม่รู้ว่าทำไม แต่เคล็ดลับนี้ใช้ได้ผลกับฉัน โปรแกรมแก้ไขข้อความธรรมดาก็เพียงพอแล้วที่จะทำสิ่งนี้

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