SQLファイルを分割

MySQL > SQLファイルを分割

サイズの大きいダンプファイルをインポートしようとした場合、サーバー側のキャパによってははねられるケースがあります。

そんなときはBigDumperを使ってインポートするなどの工夫が必要になりますが、環境によってそれができない場合について。

下記のスクリプト実行することでテーブルダンプ時に予めSQLファイルを分割したうえでエクスポートすることが可能です。

#テーブルデータ分割ダンプ
#!/bin/bash

# 定数定義
DB=データベース名
tbl=テーブル名
USER=root               # ダンプ出力するユーザ名
PW=ユーザ名のパスワード
CMD=/usr/bin/mysqldump  # mysqldump コマンドのフルパス
WK_DIR=/home/ユーザー名  # 作業ディレクトリパス
DMP_DIR=$WK_DIR/dump    # ダンプファイル格納ディレクトリ
OPTS="--skip-opt --quick --no-create-info --extended-insert --disable-keys" # mysqldump オプション(*)
DCNT=16000              # 分割するレコード件数
# ダンプファイルクリア
rm -f $DMP_DIR/*

  # テーブル内に存在するレコード件数(*)
  rows=`mysql -u $USER -p$PW $DB -N -B -e "SELECT COUNT(*) FROM $tbl;"`
  #rows=`MYSQL_PWD=${PW} $CMD -u $USER $DB -N -B -e "SELECT COUNT(*) FROM $tbl;"`
  echo "* $tbl [$rows records]"

  # レコード件数から分割数を算出してループ処理
  for ((i = 0; i <= $(($rows / $DCNT)); i++))
  do
    # 出力ダンプファイル名
    fname=$(printf ${tbl}_%02d $i)
    # オフセット算出
    offset=$((i * $DCNT))
    echo "  $fname [OFFSET: $offset]"
    # ダンプ出力(*)
    $CMD -u $USER -p$PW $DB $tbl $OPTS -w "true LIMIT $offset, $DCNT" | gzip > $DMP_DIR/$fname.sql.gz
    #MYSQL_PWD=${PW} $CMD -u $USER $DB $tbl $OPTS -w "true LIMIT $offset, $DCNT" | gzip > $DMP_DIR/$fname.sql.gz
  done;

各コメントを参考に各項目を環境に応じて埋めてください。

データベースまるごとではなく単体のテーブルを対象にダンプします。

ユーザー名はubuntuの場合は「root」になります。

mysqldumpコマンドのフルパスは環境に応じて書き換えてください。

作業ディレクトリパスはスクリプトファイルを置く場所、「ホーム」ディレクトリに置くのであればホームディレクトリのパスを入力してください。

生成されるダンプファイルが格納されるディレクトリを「dump」名で予め作成しておいてください。

分割件数は16000になっていますが状況に応じて変更してください。

単体で圧縮ダンプした場合の容量が800MB位であれば、だいたい16分割位(あくまで目安)になります。

快適なインポート処理を考えると、ひとつのファイルでだいたい50MBくらいが妥当ではないかと思います。
上記コードを「db_table_data_only_dump_split.sh」で保存した後、「ホーム」ディレクトリに置きシェルコマンドラインから下記コマンドを実行してください。

chmod +x db_table_data_only_dump_split.sh
./db_table_data_only_dump_split.sh

予め作成しておいた「dump」ディレクトリ内に分割されたgzファイルが出力されます。