web-dev-qa-db-ja.com

mysqldumpからの出力を小さなファイルに分割するにはどうすればよいですか?

MySQLデータベース間でテーブル全体を別のデータベースに移動する必要があります。私は2番目のものへのフルアクセスを持っていません、phpMyAdminアクセスのみです。アップロードできるのは、圧縮された2MBより小さいsqlファイルのみです。ただし、最初のデータベースのテーブルのmysqldumpからの圧縮出力は10MBを超えています。

Mysqldumpからの出力を小さなファイルに分割する方法はありますか?リモートサーバーでファイルをcat(1)できないため、split(1)を使用できません。

または私が逃した別の解決策はありますか?

編集

最初の投稿者が提案したmysqldumpの--extended-insert = FALSEオプションは、適切な--linesオプションでsplit(1)が呼び出された場合、インポート可能なファイルに分割できる.sqlファイルを生成します。試行錯誤によって、bzip2は.sqlファイルを20倍に圧縮することがわかったため、SQLコードの行数が約40MBに相当するかどうかを把握する必要がありました。

41
lindelof

最初にスキーマをダンプします(2Mbに確実に収まりますか?)

mysqldump -d --all-databases 

復元します。

その後、データのみを個別の挿入ステートメントにダンプします。そのため、リモートサーバーで連結することなく、ファイルを分割して復元できます。

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
29
Vinko Vrsalovic

このbashスクリプトは、1つのデータベースのダンプファイルを csplit でテーブルと名前ごとに個別のファイルに分割し、それに応じて名前を付けます。

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://Gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

https://Gist.github.com/jasny/1608062 に基づく
and https://stackoverflow.com/a/16840625/106908

35
rubo77

2番目のサーバーにアクセスできないと言います。ただし、テーブルがある最初のサーバーへのシェルアクセスがある場合は、テーブルごとにダンプを分割できます。

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

これにより、各テーブルのgzipファイルが作成されます。

Mysqldumpの出力を別のファイルに分割する別の方法は、-tabオプションを使用することです。

mysqldump [connecting options] --tab=directory_name dbname 

どこ ディレクトリ名 空のディレクトリの名前です。このコマンドは、CREATE TABLEステートメントを含む各テーブルの.sqlファイルと、LOAD DATA INFILEを使用して復元されるデータを含む.txtファイルを作成します。ただし、phpMyAdminがこれらのファイルを特定の制限で処理できるかどうかはわかりません。

11
Giuseppe Maxia

この優れた mysqldumpsplitter スクリプトがあります。このスクリプトには、mysqldumpから抽出する際のオプションがたくさんあります。

ここからレシピをコピーして、あなたのケースを選択します:

1)mysqldumpから単一のデータベースを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name_

上記のコマンドは、指定された "filename" sqlファイルから指定されたデータベースのsqlを作成し、それを圧縮形式でdatabase-name.sql.gzに保存します。

2)mysqldumpから単一のテーブルを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name_

上記のコマンドは、指定された "filename" mysqldumpファイルから指定されたテーブルのsqlを作成し、圧縮形式でdatabase-name.sql.gzに保存します。

3)mysqldumpから正規表現に一致するテーブルを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression_

上記のコマンドは、指定された「ファイル名」mysqldumpファイルから指定された正規表現に一致するテーブルのsqlを作成し、圧縮形式で個々のtable-name.sql.gzに保存します。

4)mysqldumpからすべてのデータベースを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract ALLDBS_

上記のコマンドは、指定された「ファイル名」mysqldumpファイルからすべてのデータベースを抽出し、個々のdatabase-name.sql.gzに圧縮形式で保存します。

5)mysqldumpからすべてのテーブルを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract ALLTABLES_

上記のコマンドは、指定された「ファイル名」mysqldumpファイルからすべてのテーブルを抽出し、圧縮形式で個々のテーブル名.sql.gzに保存します。

6)mysqldumpからテーブルのリストを抽出します。

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

上記のコマンドは、指定された "filename" mysqldumpファイルからテーブルを抽出し、それらを圧縮形式で個々のtable-name.sql.gzに保存します。

7)圧縮されたmysqldumpからデータベースを抽出します。

_sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip_

上記のコマンドは、gzipを使用してfilename.sql.gzを解凍し、「filename.sql.gz」から「dbname」という名前のデータベースを抽出し、out/dbname.sql.gzとして保存します

8)圧縮されていない形式で圧縮されたmysqldumpからデータベースを抽出します。

_sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none_

上記のコマンドは、gzipを使用してfilename.sql.gzを解凍し、「dbname」という名前のデータベースを「filename.sql.gz」から抽出し、プレーンsql out/dbname.sqlとして保存します

9)別のフォルダーのmysqldumpからalltablesを抽出します。

_sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/_

上記のコマンドは、指定された「ファイル名」mysqldumpファイルからすべてのテーブルを抽出し、圧縮形式でテーブルを個々のファイル、/ path/to/extracts /に保存されているtable-name.sql.gzに抽出します。スクリプトは、フォルダー/ path/to/extracts /が存在しない場合に作成します。

10)フルダンプで1つのデータベースから1つ以上のテーブルを抽出します。

複数のデータベースを含む完全なダンプがあり、1つのデータベースからいくつかのテーブルを抽出することを検討してください。

単一データベースの抽出:_sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none_

すべてのテーブルsh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)"を抽出しますが、次のように単一のコマンドで別のオプションを使用してこれを行うことができます。

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

上記のコマンドは、tbl1とtbl2の両方を、現在のディレクトリの「out」フォルダの下にあるsql形式でDBNAMEデータベースから抽出します。

次のように単一のテーブルを抽出できます。

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11)特定のデータベースからすべてのテーブルを抽出します。

_mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none_

上記のコマンドは、DBNAMEデータベースからすべてのテーブルをsql形式で抽出し、「out」ディレクトリに保存します。

12)mysqldumpファイルの内容をリストする

_mysqldumpsplitter.sh --source filename --desc_

上記のコマンドは、ダンプファイルからデータベースとテーブルを一覧表示します。

後でファイルをロードすることを選択できます。zcatfilename.sql.gz | mysql -uUSER -p -hHOSTNAME

  • また、まだ大きいと思われる単一のテーブルを抽出したら、linux splitコマンドを使用して行数を増やし、ダンプをさらに分割できます。 _split -l 10000 filename.sql_

  • とはいえ、それが必要な場合(より頻繁に来る場合)、 mydumper を使用することを検討するかもしれません。

5
mysql_user

最近作成しました sqlsplit.com 。やってみよう。

4
vbarbarosh

どちらのサーバーにもsshアクセスする必要はありません。 mysql [dump]クライアントで十分です。 mysql [dump]を使用すると、データベースをダンプして再度インポートできます。

PCでは、次のようなことができます。

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h newhost newdatabase

これで完了です。 :-)

お役に立てれば

2
user185696

今回は適切なパーサーを使用して、SQLDumpSplitterの新しいバージョンを作成しました。多くの値を持つINSERTのような素敵なものをファイルに分割でき、マルチプラットフォームになりました。 https://philiplb.de/sqldumpsplitter3/

1
Philip

mysqldump database table1 table2 ... tableNを実行すると、mysqldumpで個々のテーブルをダンプできます

どのテーブルも大きすぎない場合は、それで十分です。そうでない場合は、より大きなテーブルでデータの分割を開始する必要があります。

1
skoob

@Véraceの答えの説明:

私は特にインタラクティブな方法が好きです。 Eclipseで大きなファイルを分割できます。 Windowsで105GBファイルを正常に試しました。

MySQLDumpSplitterライブラリをプロジェクトに追加するだけです: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

インポート方法に関する簡単なメモ:

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.
1
Alisa

ユーティリティbigdumpをお勧めします。ここから入手できます。 http://www.ozerov.de/bigdump.php これは、ダンプの実行を制限し、一度に行全体を実行することで、制限を管理できる範囲で実行します。

1
LittleT15

SQLDumpSplitter 2を確認してください。40MBのダンプを正常に分割するために使用しました。以下のリンクから入手できます。

sqldumpsplitter.com

この助けを願っています。

0
direct

この script はそれを行う必要があります:

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done
0
gadelkareem

既存のファイルをAWKで分割できます。とても簡単でシンプルです

'tables'でテーブルダンプを分割しましょう:

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

または、「データベース」でダンプを分割できます

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';
0
zalex

これを試してください: https://github.com/shenli/mysqldump-hugetable データを多くの小さなファイルにダンプします。各ファイルには、MAX_RECORDSレコード以下のレコードが含まれています。このパラメーターはenv.shで設定できます。

0
shenli3514

Csplit(1)を試して、正規表現に基づいて出力を個々のテーブルに分割します(テーブルの境界に一致すると思います)。

0
jj33

Bashスクリプトとは異なり、Windowsで動作するMySQLDumpSplitter.Javaを作成しました。ここから入手できます https://github.com/Verace/MySQLDumpSplitter

0
Vérace