web-dev-qa-db-ja.com

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)など、他のコメントを保持したい

75
etheros

わあ!これらはそのように見えても、実際にはコメントではありません。これらは条件付き実行トークンです。

この行を取る:

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

MySQLのバージョンが4.00.14以上の場合、MySQLサーバーはこのステートメントを実行します。

この魔法のコメント構文は、マニュアルの Comment Syntax セクションに記載されています。

おそらく、このようなものを取り除きたくないでしょう。

144
O. Jones

私はこれが古代の質問であることを知っていますが、少なくとも答えはここにあります。また、条件付きコメントを削除するための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'
37
Tom Hennigan

--skip-commentsをお試しください

ありがとう

編集:

なるほど。

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

目的の結果が得られるまで、いくつかのオプションを削除してみてください。基本的に、これは--compactなしの--skip-commentsと同じです。

--skip-commentsは、バージョンとスタッフに関するコメントを削除します。

31
Mahesh Velaga

ショートカットオプション--compact

情報はこちら

15
Corey Ballou

技術的には、削除しようとしている行はコメントではありません。最初にいくつかの変数を一時的に変更し、最後に前の値にリセットします。

--no-dataを使用しているので、あなたのケースではあまり有用ではありません(しかし、無害です)。

11
Ike Walker

これらはコメントではなく、スクリプトのその部分の実行はmysqlのバージョンに依存します。

次のように「コメント部分」を削除できます

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

読みやすいようにスクリプトを「快適」にします。

「コメント」で指定されたものより新しいバージョンで「快適な」スクリプトを実行しようとすると、エラーが発生します。

3
Gustavo

--dump-date = FALSEを使用します

OPが求めるものを正確に実行します。 (正確には、わかりません)

ソース: mysqldumpオプションの概要

編集:ちょっと待って、これがmeがOPではなく、ここを離れるのを探しているものだ...誰かがそれを使えるように:これは常に変更であるため、ソース管理を台無しにするこの日付変更線...

1
g.pickardou

条件付きコメントを削除するなど、ダンプを正規化するためにこのスクリプトを作成しました: https://github.com/luissquall/dbdump

あなたがする必要があるのは:

npm install -g @luissquall/dbdump

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

おそらく正規表現を実行して、40014や40111などを含む行を削除します。

0
MindStalker

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
Mark Byers

Structure.sqlファイルをgit/githubに含めようとしてこの答えにつまずいた場合は、db:structure:dumpを実行した直後に次のコードで自動インクリメントを削除できます。

# 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
0
jwg2s

別のオプション。vi/ vimを使用していて、ステートメントcontentsを保存するために迅速で汚い方法が必要であるが、括弧付きのコメントを消す必要がある場合:

: %s/\/\*!\d\+\s//g
: %s/\*\///g

mysqldumpsでのみ安全です。エンディング*/commentマーク、ただし少なくとも5.5の時点では人間が読み取れるコメントは、行コメント構文を使用します--)。

0
msanford