Đây là một giải pháp hoạt động hoàn chỉnh để xóa thông tin DEFINER cho MySQL 5.6.x
và Linux. (Đã thử nghiệm trên CentOS 6.5
).
Thông thường, chúng tôi phải thay thế các mục sau từ kết xuất Mysql (nếu được sử dụng cùng với dữ liệu và trình kích hoạt / thói quen / chức năng).
/*!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`
Kết xuất được thực hiện bằng lệnh mysqldump bên dưới.
mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql
Tệp kết xuất bắt buộc không có thông tin DEFINER có thể được lấy bằng ba lệnh dưới đây.
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\`@\`%\`//"
Nếu tệp kết xuất nằm trong thư mục hiện tại của bạn thì hãy bỏ qua [PATH /].
Nếu dữ liệu trong các bảng rất lớn thì lấy kết xuất trong hai tệp, trong một tệp kết xuất lấy dữ liệu và trong tệp kết xuất khác chỉ lấy kết xuất các tập lệnh (Trình kích hoạt / Hàm / Thủ tục.) Và chạy ba tệp trên lệnh trên tệp kết xuất (script) thứ 2.