大きな mysqldump 出力を小さなファイルに分割する
あるデータベースから別のデータベースにテーブルを転送する必要がありますが、mysqldump からのダンプ出力は多くの場合、特定のアップロード制限を超えて大きすぎます。この記事では、かさばる mysqldump 出力を管理しやすい小さなファイルに分割する賢い解決策について説明します。
シェル スクリプトによって提案される考えられるアプローチの 1 つは、ダンプをテーブルごとに個別のファイルに分割することです。これは、csplit コマンドを使用し、テーブル構造マーカーを分割ポイントとして指定することで実現できます。
この手法を採用する次の bash スクリプトについて考えてみましょう。
#!/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 ] || [[ == "--help" ]] || [[ == "-h" ]] ; then echo "USAGE: extract all tables:" echo " DUMP_FILE" echo "extract one table:" echo " DUMP_FILE [TABLE]" exit fi if [ $# -ge 2 ] ; then #extract one table csplit -s -ftable "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1" else #extract all tables csplit -s -ftable "$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*
このスクリプトは、csplit を使用してダンプ ファイルを分割します。個々のテーブル ファイルに分割され、各ファイルには対応するテーブルにちなんだ名前が付けられます。これにより、後で単一のファイルに簡単に再構築することができます。このスクリプトを使用するには、最初の引数としてダンプ ファイルへのパスを指定し、オプションで 2 番目の引数として抽出する特定のテーブルを指定します。
以上が大きな MySQL ダンプを小さなファイルに分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。