50

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

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

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

編集

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

4

18 に答える 18

44

この 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
        # cut off all other tables
        mv $FILE foot
else
        # cut off the end of each file
        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
およびhttps://stackoverflow.com/a/16840625/1069083に基づく

于 2012-03-30T19:37:16.673 に答える
33

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

mysqldump -d --all-databases 

そしてそれを復元します。

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

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
于 2008-09-25T12:16:05.517 に答える
14

この優れたmysqldumpsplitterスクリプトには、mysqldump からの抽出に関して多くのオプションが付属しています。

ここにレシピをコピーして、ケースを選択します。

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

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

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

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

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

上記のコマンドは、指定された「ファイル名」の mysqldump ファイルから指定されたテーブルの SQL を作成し、それを圧縮形式でデータベース名.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 ファイルからすべてのデータベースを抽出し、圧縮形式で個々のデータベース名.sql.gz に保存します。

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

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

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

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

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

上記のコマンドは、指定された「ファイル名」の mysqldump ファイルからテーブルを抽出し、圧縮形式で個々のテーブル名.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 を解凍し、"filename.sql.gz" から "dbname" という名前のデータベースを抽出し、プレーン sql out/dbname.sql として保存します。

9) mysqldump からすべてのテーブルを別のフォルダーに抽出します。

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

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

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

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

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

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

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

  • そうは言っても、それが必要な場合 (より頻繁に発生します)、分割する必要のない個別のダンプを実際に作成するmydumperの使用を検討してください。

于 2015-02-25T12:49:00.373 に答える
12

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 

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

于 2008-09-25T16:15:19.530 に答える
10

返信が遅れましたが、同じ解決策を探していて、以下の Web サイトから次のコードに出くわしました。

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individual-files

于 2011-01-22T03:39:41.713 に答える
3

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

于 2014-08-03T13:04:56.413 に答える
2

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

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

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

これで完了です。:-)

お役に立てれば

于 2009-10-07T15:08:59.663 に答える
1

を実行することにより、mysqldumpを使用して個々のテーブルをダンプできます。mysqldump database table1 table2 ... tableN

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

于 2008-09-25T12:20:14.120 に答える
1

ユーティリティ bigdump をお勧めします。ここから取得できます。http://www.oserov.de/bigdump.php これにより、一度に行全体を実行して、制限にできるだけ近づけてダンプの実行をずらします。

于 2011-02-19T13:47:35.057 に答える
1

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

于 2015-11-21T02:52:13.803 に答える
1

既存のファイルを 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}';
于 2014-11-02T09:16:52.640 に答える
0

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

于 2008-09-25T12:18:52.033 に答える
0

このスクリプトはそれを行う必要があります:

#!/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
于 2012-11-16T00:49:15.040 に答える
0

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

于 2014-02-07T21:27:03.920 に答える
0

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

sqldumpsplitter.com

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

于 2010-06-16T20:30:23.650 に答える