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

내 데이터베이스의 간단한 구조 만 덤프를 만들려고합니다. 사용 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)



답변

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

이 줄을보십시오 :

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

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

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

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


답변

나는 이것이 고대의 질문이라는 것을 알고 있지만 적어도 여기에 대답이 있습니다. 또한 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'


답변

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

감사

편집하다:

.. 이거 해봐

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

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

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


답변

바로 가기 옵션을 사용해 보셨습니까 --compact?

여기에 정보가 있습니다 .


답변

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

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


답변

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

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

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

…에

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

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

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


답변

조건부 실행 주석을 유지하는 것이 정말 중요합니다. 그러나 덤프를로드 할 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