นี่คือโซลูชันการทำงานที่สมบูรณ์เพื่อลบข้อมูล DEFINER สำหรับMySQL 5.6.x
และ Linux (ทดสอบแล้วCentOS 6.5
)
โดยปกติเราต้องแทนที่รายการต่อไปนี้จากการถ่ายโอนข้อมูล Mysql (หากนำมาพร้อมกับข้อมูลและทริกเกอร์ / กิจวัตร / ฟังก์ชัน)
/*!50013 DEFINER=`MYSQLUSER`@`localhost` SQL SECURITY DEFINER */
/*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */
CREATE DEFINER=`MYSQLUSER`@`%` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`%` FUNCTION `FUNCTIONNAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` FUNCTION `FUNCTIONNAME`(
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`%`*/ /*!50003 TRIGGER `TRIGGERNAME`
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`localhost`*/ /*!50003 TRIGGER `TRIGGERNAME`
ถ่ายโอนข้อมูลด้วยคำสั่ง mysqldump ด้านล่าง
mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql
ไฟล์ดัมพ์ที่ต้องการโดยไม่มีข้อมูล DEFINER สามารถรับได้ด้วยคำสั่งด้านล่างสามคำสั่ง
Command-1
sed -i 's|DEFINER=[^*]*\*|\*|g' [PATH/]dbdump.sql
Command-2
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`localhost\`//"
Command-3
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`%\`//"
หากไฟล์ดัมพ์อยู่ในโฟลเดอร์ปัจจุบันของคุณให้ละเว้น [PATH /]
หากข้อมูลในตารางมีขนาดใหญ่มากให้ใช้การถ่ายโอนข้อมูลในสองไฟล์ในไฟล์ดัมพ์หนึ่งไฟล์จะทำการดัมพ์พร้อมกับข้อมูลและในไฟล์ดัมพ์อื่น ๆ ที่ใช้ดัมพ์ของสคริปต์เท่านั้น (ทริกเกอร์ / ฟังก์ชัน / โพรซีเดอร์) และรันสามไฟล์ข้างต้น คำสั่งบนไฟล์ดัมพ์ (สคริปต์) ที่ 2