[mysql] MySQL 덤프에서 DEFINER 절 제거

내 데이터베이스 중 하나의 MySQL 덤프가 있습니다. 그 안에는 다음과 같은 DEFINER 절이 있습니다.

"DEFINER=`root`@`localhost`" 

즉, 이러한 DEFINER 절은 내 CREATE VIEW 및 CREATE PROCEDURE 문에 있습니다. 내 덤프 파일에서 이러한 DEFINER 절을 제거하는 방법이 있습니까?



답변

나는 DEFINER덤프에 s를 추가하는 것을 무시하는 방법이 없다고 생각 합니다. 그러나 덤프 파일이 생성 된 후 제거하는 방법이 있습니다.

  1. 텍스트 편집기에서 덤프 파일을 열고의 모든 항목을 DEFINER=root@localhost빈 문자열 “”로 바꿉니다.

  2. 다음을 사용하여 덤프 (또는 출력 파이프)를 편집합니다 perl.

    perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
  3. 다음을 통해 출력을 파이프합니다 sed.

    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-definermysqlpump와 함께 옵션을 사용할 수 있습니다. 예 :

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

그러면 !#### DEFINERDEFINER가 제거 되고 대체됩니다. 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