mysqldump-自動インクリメントなしでのみ構造をエクスポートします


87

MySQLデータベースがあり、自動インクリメント値を使用せずに、その構造のみをエクスポートする方法を見つけようとしています。mysqldump --no-dataほとんど仕事をしますが、auto_increment値を保持します。PHPMyAdminを使用せずにそれを行う方法はありますか(私はそれができることを知っています)?


MySQL 5.5(サーバー)のように見え--no-dataますが、デフォルトでauto_increment値が省略されます。
ジョーイアダムス

@JoeyAdamsよろしいですか?それは私が経験する行動ではありません
2016

2
@JoeyAdams MySQL 5.7。*のmysqldumpは、-no-dataを使用するときにauto_incrementを省略しません。
Tiberiu-Ionuț Stan 2016

回答:


68

あなたはこれを行うことができます :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

他の人が述べたようにしたい場合は、sed適切な作品に、追加g(のためのグラムこのようなローブ交換)パラメータ:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(あなたはGUIツールがインストールされている場合にのみ動作します。mysqldump --skip-auto-increment

コメントのおかげで新しいUPDATE。

これ\bは役に立たず、コマンドが壊れることがあります。説明については、このSOトピックを参照してください。したがって、最適化された答えは次のようになります。

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
私は--skip-auto-increment本当の選択肢ではないと思います。ドキュメントに見つかりません。この問題には2つのMySQLのバグのどちらもそれを言及:2078630957。どのバージョンのmysqldumpにこのオプションがありますか?
リッチ

1
--skip-auto-increment正しく覚えていれば、MySQLGUIツールに追加されるオプションです。(わからない^^)だから実際にはそれは本当に解決策ではありません!しかし、2番目のインラインコマンドは正しいので、自動インクリメントの問題について話しているトピックでここにそれを見つけsedフィルタリングのアイデアを提供します!
JoDev 2013年

4
複数のテーブルをエクスポートする場合、sedオプションはすべての自動増分を削除するのではなく、最後の1つだけを削除します。また、-skip-auto-incrementは既存のオプションではありません。この答えはどのようにしてそれほど高く評価されたのですか?
レックス2015年

3
sedコマンドの最後にagが必要です:sed's /.../.../ g 'すべてのオカレンスを置き換えます。
p91paul 2015

このコマンドは正しくありません。--skip-auto-incrementは存在しません。正規表現が正しくありません。p91paulが指摘したように、すべてのオカレンスを置き換えるには、g修飾子を追加する必要があります。代わりに@JohnWソリューションを使用してください。
Aalex Gabi 2016

52

JoDevの答えは、sedの正規表現を少し調整するだけで完璧に機能しました。

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
ええ\b、それがsedステートメント内で何をするのかはわかりませんが、ここでの@JohnWの提案によると、そのスイッチを削除することは私にとってもトリックです。
デビッド

4

AUTO_INCREMENTテーブル定義を生成するのは、デフォルトで--optに含まれている--create-optionsです。

ベーステーブルのみが必要な場合は、

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

ビュー、トリガー、ルーチンも必要な場合は、

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
注これはまた、任意の自動インクリメントフィールド、低下していることdrop tableの、文字セット、など
ディアナ

2

この投稿のおかげで、私は私の質問に答えることができました:

データベースでバージョン管理を行うにはどうすればよいですか?

次に、このスクリプトを作成しました。 db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

次に、これをcrontabに追加しました。

30 5 * * * sh /home/scripts/db_bkp.sh

次に、リポジトリで結果db_structure.sqlをgitに追加し、変更をprodにプッシュする前に、すべてのデータベースで行うのを忘れた構造上の変更があるかどうかを常に確認します。


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