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に相当するかどうかを把握する必要がありました。
最初にスキーマをダンプします(2Mbに確実に収まりますか?)
mysqldump -d --all-databases
復元します。
その後、データのみを個別の挿入ステートメントにダンプします。そのため、リモートサーバーで連結することなく、ファイルを分割して復元できます。
mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE
この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
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がこれらのファイルを特定の制限で処理できるかどうかはわかりません。
この優れた 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 を使用することを検討するかもしれません。
最近作成しました sqlsplit.com 。やってみよう。
どちらのサーバーにもsshアクセスする必要はありません。 mysql [dump]クライアントで十分です。 mysql [dump]を使用すると、データベースをダンプして再度インポートできます。
PCでは、次のようなことができます。
$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u newuser -pnewpassword -h newhost newdatabase
これで完了です。 :-)
お役に立てれば
今回は適切なパーサーを使用して、SQLDumpSplitterの新しいバージョンを作成しました。多くの値を持つINSERTのような素敵なものをファイルに分割でき、マルチプラットフォームになりました。 https://philiplb.de/sqldumpsplitter3/
mysqldump database table1 table2 ... tableN
を実行すると、mysqldumpで個々のテーブルをダンプできます
どのテーブルも大きすぎない場合は、それで十分です。そうでない場合は、より大きなテーブルでデータの分割を開始する必要があります。
@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.
ユーティリティbigdumpをお勧めします。ここから入手できます。 http://www.ozerov.de/bigdump.php これは、ダンプの実行を制限し、一度に行全体を実行することで、制限を管理できる範囲で実行します。
この 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
既存のファイルを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}';
これを試してください: https://github.com/shenli/mysqldump-hugetable データを多くの小さなファイルにダンプします。各ファイルには、MAX_RECORDSレコード以下のレコードが含まれています。このパラメーターはenv.shで設定できます。
Csplit(1)を試して、正規表現に基づいて出力を個々のテーブルに分割します(テーブルの境界に一致すると思います)。
Bashスクリプトとは異なり、Windowsで動作するMySQLDumpSplitter.Javaを作成しました。ここから入手できます https://github.com/Verace/MySQLDumpSplitter 。