MySQL 덤프에서 이러한 주석을 어떻게 제거 할 수 있습니까?


82

내 데이터베이스의 간단한 구조 만 덤프를 만들려고합니다. 사용 mysqldump하면 다음과 같은 결과가 나타납니다.

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

내가 무엇을 시도하든 그 댓글을 제거 할 수없는 것 같습니다.

나는 현재 사용하고 있습니다 : mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

편집 : 그러나 다음과 같은 다른 의견을 유지하고 싶습니다.-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)


직접적인 대답은 아니지만 mk-parallel-dump에 대해 완전히 mysqldump를 버렸 습니다. 더 빠르며 (여러 프로세스를 생성합니다) 덤프 출력으로 수행 할 작업에 따라 mysqldump 및 'select를 효과적으로 캡슐화하므로 더 유연합니다. outfile '구문으로 함께.
zznate 2009

2
Oracle이 mysqdump에 이러한 중요한 옵션을 추가하지 않은 이유가 궁금합니다.
PHPst

답변:


162

와! 그렇게 보이지만 실제로는 댓글이 아닙니다. 조건부 실행 토큰입니다.

이 줄을보십시오 :

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

mySQL 버전이 4.00.14 이상 이면 MySQL 서버가이 명령문을 실행합니다.

이 매직 주석 구문은 매뉴얼 의 주석 구문 섹션에 설명되어 있습니다.

이 물건을 제거하고 싶지 않을 것입니다.


2
실행 가능한 SQL로 취급되는 MySQL의 주석에 대해 구체적으로 묻는 또 다른 질문 (
저가

1
댓글을 제거하면 도움이되는 몇 가지 경우가 있습니다. ie bugs.mysql.com/bug.php?id=48972 --insert-ignore가 예상대로 작동하지 않는 경우
varela

+1 나는 그것을 몰랐다. 나는 그것이 내 보낸 것처럼 mysql 덤프가 실행되는 명령이라고 생각했습니다. 매우 깨달은 대답.
Captain Hypertext

1
즉, 이전 mysql 버전에서 SQL을 실행할지 여부를 지정하고 그렇지 않은 경우 조건부 주석으로 래핑해야하는 호환성 예상 옵션이 있어야 함을 의미해야합니다.
CMCDragonkai

40

나는 이것이 고대의 질문이라는 것을 알고 있지만 적어도 여기에 대답이 있습니다. 또한 mysqldump에서 조건부 주석을 제거하는 플래그를 찾을 수 없거나 실제로 이러한 주석이 표시되도록 최소 mysql 버전을 설정하는 더 나은 옵션을 찾을 수 없습니다. 모두 핵을 사용하려면 grep 또는 sed를 사용하여 수행 할 수 있습니다 (sed는 빈 줄을 남기고 grep은 그렇지 않음).

mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'

mysql 버전에 따라 조건부로 주석을 제거하려는 내 소망에 답하려면 다음 중 하나를 사용하십시오 (<mysql5에 대한 주석 제거).

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'

1
rsnapshot 백업의 경우 마지막 줄을 제거하는 것이 유용하므로 변경되지 않은 데이터베이스는 동일한 파일을 생성합니다.mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77

네,하지만 문제는 DROP DATABASE IF EXISTS 수술실을 잃을 수도 있다는 것 IGNORING YOUR CURRENT SESSION VARIABLES 입니다. 무엇을하는지 모르는 경우 : 특히 환경 / 호스트간에 마이그레이션 할 때 제거하지 마십시오. 여러 가지 이유로 결과 출력이 예상과 다를 수 있습니다. 그들은 당신의 보호를 위해 거기에 배치되었습니다. 하지만 안전 벨트를 착용하고 싶지 않다면 그것은 당신의 선택입니다.
JayRizzo

1
@ rubo77이 mysql 덤프 매개 변수도 사용할 수 있습니다.--skip-dump-date
dehart

33

시도 --skip-comments하시겠습니까?

감사

편집하다:

.. 이거 해봐

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

원하는 결과를 얻을 때까지 일부 옵션을 제거하기 위해 놀아보십시오. 기본적으로 이것은 --compact없는 것과 같습니다.--skip-comments

--skip-comments 버전 및 항목과 관련된 주석을 제거합니다.


5
불행히도 이것은 내가 원하는 모든 댓글을 제거하고 내가 그대로 두지 않은 모든 댓글을 남깁니다.
etheros 2009

@etheros 동의하지만 자세히 설명해야합니다. 내 사용 사례는 소스 제어 구조 데이터와 관련이 있습니다. 나는 모든 테이블에 대해 불필요한 수다를 원하지 않습니다. 나는 이 답변에서 제안한 것처럼 제거 하는 SET NAMES전화를 좋아 --skip-set-charset합니다. 덤프 파일의 시작 부분에서 한 번만 발생하며 데이터 복원에 실질적인 영향을 미칠 수 있습니다. --skip-add-locks --skip-disable-keys내 사용 사례를 좋아 합니다. 그러나 /*!40101 SET character_set_client = @saved_cs_client */;/*!40101 SET character_set_client = utf8 */... 와 같은 조건부 주석 중 일부는 유용합니까?
Ben Johnson

1
@BenJohnson 아니요. character_set_client버그 등으로 인해 5.6에서 설정할 수 없으므로 예제 utf8mb4데이터를 mysqldumping 할 때 원하지 않는 조건부 주석을 얻을 수 있습니다.
Slava


12

기술적으로 제거하려는 줄은 주석이 아닙니다. 처음에 일부 변수를 임시로 수정 한 다음 마지막에 이전 값으로 재설정합니다.

--no-data를 사용하고 있기 때문에 귀하의 경우에는 그다지 유용하지 않지만 (하지만 무해합니다) --no-data를 사용하고 있기 때문입니다.하지만 그 라인이 목적에 부합하고 단순한 주석이 아니라는 점을 언급 할 가치가 있다고 생각했습니다.


4

이것은 주석이 아니며 스크립트의 해당 부분 실행은 mysql 버전에 따라 다릅니다.

다음과 같이 "댓글 부분"을 삭제할 수 있습니다.

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

...에

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

스크립트를 읽기에 더 "편안하게"만듭니다.

"comment"에 지정된 것보다 최신 버전에서 "comfortable"스크립트를 실행하려고하면 오류가 발생합니다.


2
"코멘트 부분을 삭제"하려면 어떻게해야합니까? 이것에 대한 덤프 옵션이 있습니까? 손으로 몇 개의 공연 파일을 살펴보고 싶지 않습니다.
mpen 2015 년

실제로는 다음과 같아야합니다. "주석"에 지정된 것보다 오래된 버전에서 "편안한"스크립트를 실행하려고 하면 오류가 발생합니다.
다니엘

1

조건부 실행 주석을 유지하는 것이 정말 중요합니다. 그러나 덤프를로드 할 MySQL 버전이 덤프를 생성하는 버전보다 크거나 같다는 것을 확실히 알고 있다면 다음 과 같이 "주석"부분을 제거 할 수 있습니다.

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

다음과 같은 행을 변환합니다.

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

...에

SET SQL_MODE=@OLD_SQL_MODE ;

이 줄 모든 MySQL> = 4.1.1에서 실행 되어야 하기 때문입니다.

트리거를 덤프 할 때와 같이 여러 줄 조건부 실행 주석은 제거되지 않습니다.

미래를 예측할 수 없기 때문에 주석이 달린 덤프를 저장하고 시각화하고 싶을 때만 제거하는 것이 좋습니다.

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql

0

아마도 40014 또는 40111 등을 포함하는 줄을 제거하기 위해 정규식을 실행했을 것입니다.


0

Windows를 사용하고 있으므로 아무도 더 나은 솔루션을 찾지 못하면 Python 스크립트를 대신 사용할 수 있습니다.

import re, sys
sql = sys.stdin.read()
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M)
print regex.sub('', sql)

명령 줄에서의 사용법 :

python program.py < your.sql > output.sql

다음과 같은 모든 줄을 제거합니다.

/*!....... */;

0

git / github에 structure.sql 파일을 포함하려고 시도하는이 답변을 우연히 발견 한 경우 db : structure : dump를 rake 직후 다음 코드로 자동 증가를 제거 할 수 있습니다.

# Remove beginning auto increments to prevent merge conflicts
filename = 'db/structure.sql'
File.atomic_write(filename) do |output|
  File.open(filename, 'rb').each do |input|
    output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' '))
  end
end

1
"정규식으로 줄을 제거"답변에 대한 모든 반대표는 무엇입니까? 이것들은 완전히 유효합니다. 특히 이것은 내 상황에 전적으로 적용됩니다. 모든 사람을위한 +1입니다.
plainjimbo

0

조건부 주석 제거를 포함하여 덤프를 정규화하기 위해이 스크립트를 만들었습니다. https://github.com/luissquall/dbdump .

다음을 수행하면됩니다.

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql

0

사용하다 --dump-date=FALSE

OP가 요구하는 것을 정확히 수행합니다. (정확히 아니에요)

출처 : mysqldump 옵션 요약

편집 : 무슨 그냥 내가 깨달은 분 후, 이것이 내가 아니라 영업 이익을 찾고, 그러나 여기에서 떠나 ... 희망 누군가를 사용할 수 있었다 : 그것 때문에 항상 변화를 소스 제어 유적이 날짜 라인을 ...


1
정확히 내가 찾던 것, 왜 사람들이 이걸 싫어하는 거지? 나로부터 큰 찬성.
kungfooman

-1

당신이 찾고있는 것이 무엇인지 모르겠습니다. 구문 하이 라이터를 사용할 수 있도록 mysql 주석을 모두 제거하고 싶었습니다. 간단한 정규식을 사용하고 모두 다음 "/ \ *! [ 0-9] {5} | \ * / "그리고 짜잔! 코드의 멋진 색상;)


-1

@Ollie와 몇몇 다른 사람들이 지적했듯이 이들은 주석 스타일로 작성된 조건부 실행 토큰이지만 목적을 달성했습니다. 그것들이 없으면 외래 키 제약 조건이 강하게 적용되는 테이블을 다시 만드는 문제가 발생할 수 있습니다. 예를 들어, 테이블 A에는 테이블 B에 대한 FK가 있으므로 테이블 B가 그렇게 할 때까지 테이블 A를 만들 수 없습니다. 키 검사를 비활성화하지 않으면 테이블 주문에 벌금이 부과되는 방식에 따라 키 검사를 다시 만들 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.