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 2015年

回答:


162

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

この行を取る:

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

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

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

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


2
MySQLでは、具体的なコメントについて尋ねるもう一つの問題は、(ちょうど私が掲示する)実行可能なSQLのように扱われている:stackoverflow.com/questions/25614919/...
ダンNissenbaum

1
コメントを削除すると役立つ場合があります。つまり、bugs.mysql.com / bug.php?id = 48972の場合、-insert-ignoreが期待どおりに機能しない場合
varela 2015

+1私はそれを知りませんでした。エクスポート時にmysqlダンプが実行されていたコマンドにすぎないと思いました。非常に啓発的な答え。
キャプテンハイパーテキスト2015

1
これは、古いmysqlバージョンでSQLを実行するかどうかを指定し、そうでない場合は条件付きコメントでラップする必要があるかどうかを指定する、互換性が期待されるオプションがあることを意味するとします。
CMCDragonkai 2017

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 ORを失うかもしれないということですIGNORING YOUR CURRENT SESSION VARIABLES 。自分が何をしているのかわからない場合:特に環境/ホスト間で移行する場合は、それらを削除しないでください。結果の出力は、さまざまな理由で期待どおりにならない可能性があるためです。彼らはあなたの保護のためにそこに置かれました。しかし、シートベルトを着用したくない場合は、それを選択します。
JayRizzo 2017年

1
@ rubo77このmysqlダンプパラメータも使用できます。--skip-dump-date
dehart19年

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です。ダンプファイルの先頭で1回だけ発生し、データの復元に重大な影響を与える可能性があります。私は--skip-add-locks --skip-disable-keys自分のユースケースが好きです。しかし、/*!40101 SET character_set_client = @saved_cs_client */;and /*!40101 SET character_set_client = utf8 */...などの条件付きコメントのいくつかは有用かどうか?
ベンジョンソン

1
@BenJohnsonいいえ、そうではありません。character_set_clientバグなどが原因で5.6に設定できないため、たとえばutf8mb4データをmysqldumpしている場合、不要な場所にこれらの条件付きコメントが表示されます。
スラヴァ


12

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

--no-dataを使用しているため、これらはあまり役に立ちません(ただし、無害でもあります)が、この行は単なるコメントではなく、目的を果たしていることを言及する価値があると思いました。


4

これらはコメントではありません。スクリプトのその部分の実行は、mysqlのバージョンによって異なります。

「コメント部分」は削除できます。

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

スクリプトを読みやすくする。

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


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

あなたは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を実行した直後に、次のコードを使用して自動インクリメントを取り除くことができます。

# 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 2014

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分後、これはがOPではなく探していたものですが、ここに残します...誰かがそれを使用できることを願っています:常に変更されるため、ソース管理を台無しにするこの日付変更線...


1
まさに私が探していたもの、なぜ人々はこれに反対するのですか?私からの大きな賛成票。
kungfooman

-1

それがあなたが探しているものであるかどうかはわかりません。構文ハイライトを使用できるように、すべてのmysqlコメントを削除したかっただけです。単純な正規表現を使用し、すべてを次の「/ \ *![ 0-9] {5} | \ * / "そして出来上がり!コードの素敵な色;)


-1

@Ollieと他の数人が指摘したように、これらはコメント形式で記述された条件付き実行トークンですが、目的を果たしました。それらがないと、外部キー制約が厳しく適用されたテーブルを再作成する問題が発生する可能性があります。たとえば、テーブルAにはテーブルBのFKがあるため、テーブルBが作成するまでテーブルAを作成できません。キーチェックを無効にしないと、テーブルの順序がどのように調整されるかによっては、キーチェックを再作成できない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.