ฉันจะเปลี่ยน DEFINER ของ VIEW ใน Mysql ได้อย่างไร


35

เมื่อฉันเรียกใช้ mysqldump ฉันได้รับข้อผิดพลาด:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

เรื่องนี้สมเหตุสมผลเพราะfoobarเป็นเครื่องจักรที่ไม่มีอยู่จริง

ฉันจะเปลี่ยนนิยามของตารางทั้งหมดเป็น 'root' @ 'localhost' ได้อย่างไร


4
คุณมี Views ไหม โต๊ะไม่มีคำจำกัดความฉันแน่ใจว่า ... เห็นด้วยdba.stackexchange.com/q/4129/630
gbn

1
@gbn +1 คุณถูกต้อง - เป็นวิว - ขอบคุณสำหรับลิงก์ แต่ฉันทำงานไม่ถูกต้อง อย่างไรก็ตามฉันสามารถปรับเปลี่ยนมุมมองใน SQLyog เพื่อให้สามารถถ่ายโอนข้อมูลได้
kfmfe04

มันใช้งานได้สำหรับฉัน {{ให้ทั้งหมดใน ถึง 'root' @ '%' ที่ระบุด้วย 'รหัสผ่าน' พร้อมตัวเลือกการให้สิทธิ์ }}
Muhammad Azeem

คำตอบ:


33

สิ่งที่ฉันคิดว่าเป็นฐานข้อมูลที่คุณพยายามที่จะถ่ายโอนข้อมูลที่มีขั้นตอน / วิธีการที่ผู้ใช้กำหนดในขณะที่เข้าสู่ระบบในฐานะ root @ 'foobar'

ทีนี้วิธีแก้ปัญหาคือคุณต้องแทนที่ definer สำหรับโพรซีเดอร์ / เมธอดนั้น

จากนั้นคุณสามารถสร้างดัมพ์โดยไม่มีข้อผิดพลาด

คุณสามารถทำเช่นนี้ ..

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

ระวังเพราะจะเปลี่ยนการกำหนดทั้งหมดสำหรับฐานข้อมูลทั้งหมด

ลองมัน....!

อัพเดทเมื่อวันที่ 9 กุมภาพันธ์ 2555

อย่างที่ฉันเห็นลิงก์ที่ได้รับจาก @gbn ซึ่งเป็นคำตอบที่ได้รับจาก @Rolando ที่สามารถเป็น Case ได้ กรุณาเยี่ยมชมลิงค์

แก้ไขโดย @RolandoMySQLDBA 2011-12-16 11:20 EDT

ในขณะที่มีความเสี่ยงคำตอบนี้ดี เพียงชี้แจง: คุณสามารถระบุฐานข้อมูลในแบบสอบถามของคุณดังนี้:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
ลิงค์ด้านบนแสดงวิธีการแก้ไขด้วยคำสั่ง ALTER ซึ่งอาจมีความเสี่ยงน้อยกว่า ... นอกจากนี้โปรดตรวจสอบการอัปเดตของฉันสำหรับคำจำกัดความในการอัพเดทของคุณ
gbn

UPDATEการเปลี่ยนแปลงตาราง แต่ไม่เห็นมันmysqldump แม้หลังจากที่เริ่มต้นใหม่mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES ฉันทำงานmysql mysql-5.5.31
x-yuri

ความผิดฉันเอง. ฉันมีมุมมองที่แตกต่างอย่างชัดเจน update mysql.procวิธีการใช้งานได้ผลแน่นอน
x-yuri

ไม่ทำงาน ....
オナシ

3
คำตอบนี้ทำงานสำหรับการเปลี่ยน definers ของวิธีการและฟังก์ชั่น แต่ไม่ได้เปลี่ยน definer ของที่ดู
Anthony G - ความยุติธรรมสำหรับ Monica

35

ใช้--single-transactionสวิตช์ง่ายกว่า:

mysqldump --single-transaction -u username -p db > db.sql

1
ขออภัยวิธีการแก้ไขปัญหาที่ desribed ในคำถามเดิม? ดูเหมือนว่าคุณตอบคำถามผิด ...
Dezso

6
โครงสร้างของคำตอบนั้นไม่ถูกต้องเนื่องจาก --single-transaction ต้องอยู่ก่อนชื่อฐานข้อมูล แต่คำตอบนั้นถูกต้องจริง การระบุตัวเลือกนี้สามารถแก้ไขปัญหาได้โดยการเปลี่ยนพฤติกรรมการล็อคของ mysqldump ดังนั้นข้อผิดพลาดในคำถามเดิมจะไม่เกิดขึ้นอีก
Michael - sqlbot

ฉันประสบปัญหาเดียวกัน ทำงาน - ทำธุรกรรมเดี่ยว

ไม่แน่ใจว่ามันทำอะไร แต่ทำงานได้! ขอบคุณ
Sri Harsha Kappala

17

วิธีแก้ปัญหาที่เร็วที่สุดคือการสร้างนิยามขึ้นใหม่อีกครั้งเพื่อให้มีอยู่ตราบใดที่มันไม่ได้สร้างความขัดแย้งกับผู้ใช้ที่มีอยู่

CREATE USER 'root'@'foobar';


ถ้าผู้ใช้เป็น 'รูท' @ '%' ฉันเพียงแค่ปฏิเสธสิ่งต่าง ๆ บนเซิร์ฟเวอร์ที่เรารับผิดชอบ
Attila Fulop

@AtilaFulop ใช่ความปลอดภัยแน่นอนควรพิจารณา แต่ฉันบอกว่านี่เป็นทางออกที่ "เร็วที่สุด" ไม่ใช่ที่สมบูรณ์แบบ เมื่อการนำเข้าเสร็จสมบูรณ์ผู้ใช้อาจถูกลบเพื่อลดความเสี่ยงในการมีผู้ใช้เพิ่มเติม
ColinM

คุณพูดถูก ฉันแค่ต้องการดึงความสนใจไปที่แง่มุมนี้โดยเฉพาะเช่นกัน เพื่อนร่วมงานของฉันจะเพิ่ม 'root' @ '%' แล้วปล่อยไว้ที่นั่นตราบใดที่ Chuck Norris ยังมีชีวิตอยู่ ตลอดกาล;)
Attila Fulop

6

ส่งออกมุมมองทั้งหมดของฐานข้อมูล<DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

หรือ:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

แก้ไขviews.sqlและสร้างใหม่:

cat views.sql | mysql <DB>

ระบุ-uและ-pสวิตช์หากจำเป็น


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