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.