86

データベースの単純な構造のみのダンプを作成しようとしています。を使用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)

4

14 に答える 14

173

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

この行を取る:

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

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

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

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

于 2009-12-16T20:27:30.973 に答える
41

これは古くからの質問であることは承知していますが、少なくともここに答えがあります。また、条件付きコメントを削除するための 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'
于 2011-12-28T15:14:00.887 に答える
34

試してみ--skip-commentsますか?

ありがとう

編集:

なるほど..これを試してみてください

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

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

--skip-commentsバージョンなどに関するコメントを削除します..

于 2009-12-16T17:55:34.077 に答える
20

ショートカットオプションを試しました--compactか?

情報はこちら

于 2009-12-16T17:49:24.930 に答える
13

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

--no-data を使用しているため、これらはあまり役に立ちません (ただし、無害でもあります)。

于 2009-12-16T19:03:48.900 に答える
4

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

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

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

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

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

于 2011-08-02T15:44:16.503 に答える
2

条件付き実行コメントを保持することは非常に重要です。しかし、ダンプをロードする 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
于 2019-09-05T13:41:16.170 に答える
0

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
于 2013-04-03T01:12:03.307 に答える
0

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

あなたはただしなければなりません:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql
于 2015-06-02T15:03:36.173 に答える
-1

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

于 2015-07-22T16:27:23.953 に答える
-1

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

于 2013-10-07T14:13:27.137 に答える