내 데이터베이스 중 하나의 MySQL 덤프가 있습니다. 그 안에는 다음과 같은 DEFINER 절이 있습니다.
"DEFINER=`root`@`localhost`"
즉, 이러한 DEFINER 절은 내 CREATE VIEW 및 CREATE PROCEDURE 문에 있습니다. 내 덤프 파일에서 이러한 DEFINER 절을 제거하는 방법이 있습니까?
답변
나는 DEFINER
덤프에 s를 추가하는 것을 무시하는 방법이 없다고 생각 합니다. 그러나 덤프 파일이 생성 된 후 제거하는 방법이 있습니다.
-
텍스트 편집기에서 덤프 파일을 열고의 모든 항목을
DEFINER=root@localhost
빈 문자열 “”로 바꿉니다. -
다음을 사용하여 덤프 (또는 출력 파이프)를 편집합니다
perl
.perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
-
mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql
답변
SED를 사용하여 제거 할 수 있습니다.
sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql
MacOS에서 :
sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql
답변
mysql 버전 5.7.8부터 --skip-definer
mysqlpump와 함께 옵션을 사용할 수 있습니다. 예 :
mysqlpump --skip-definer -h localhost -u user -p yourdatabase
http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer 에서 업데이트 된 mysql 설명서를 참조하십시오.
답변
이 아이디어를 사용하여 mysqldump 출력에서 DEFINER 절을 제거했지만 더 간단한 방법을 사용했습니다.
!
코드와 DEFINER 앞의를 제거하면 나머지 주석은 일반 주석이됩니다.
예:
/*!50017 DEFINER=`user`@`111.22.33.44`*/
이 ..
/* 50017 DEFINER=`user`@`111.22.33.44`*/
하지만 가장 쉬운 정규 표현식은! 그리고 숫자
mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql
그러면 !#### DEFINER
DEFINER가 제거 되고 대체됩니다. DEFINER도 제거 할 수 있습니다. “!” 사라
답변
다른 사람의 권장 사항에 따라 다음은 덤프가 완료된 후 덤프에서 DEFINER를 제거하는 방법의 예입니다.
mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql
답변
다른 사람들이 언급했듯이 모든 종류의 정규 표현식으로 정의자를 제거하는 것은 너무 복잡하지 않습니다. 그러나 다른 예제는 나를 위해 뷰 정의를 제거했습니다.
이것은 나를 위해 일한 정규식입니다.
sed -e 's/DEFINER=[^ ]* / /'
답변
자동화 된 솔루션의 경우 mysqlmigrate
. mysqldump
데이터베이스를 마이그레이션하고 DEFINER 문을 무시할 수 있는 Bash 래퍼 입니다. 예:
$ mysqlmigrate -u root -p pass --ignore-definer from_db to_db
http://thesimplesynthesis.com/post/mysqlmigrate (또는 GitHub )
그렇지 않으면 예, Abhay가 지적한 것과 같은 명령이 필요합니다.
$ mysqldump -u root -ppass the_db | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > the_db.sql