12 GB .SQLファイルをインポートするのはなぜ36時間以上かかるのですか?
質問
12 GB .SQLファイルを簡単にインポートするのを36時間待っていました type site.sql | mysql
指図。私は見ることができます ibdata1
現在、まだ40 GB近く成長しています。
トリガーとストアドプロシージャが.SQLの終わりにあることを考慮すると、MySQLはデータとキーインデックスを追加するだけであると思います。
Site.SQLは、別のサーバーからこのコマンドを使用して生成されました。
mysqldump -R -e --databases site --add-drop-database --add-create-database --add-drop-table -C --single-transaction --triggers
何がそんなに時間がかかっていますか?
解決
これを試して:
$ ps -ef|grep [m]ysql
次に、プロセスIDを特定します
$ strace -cp <pid>
10秒または1分間そのままにしておきます ^C
. 。それは、プロセスがどこに時間を費やしているかをあなたに示します、例えば、あなたが見たなら、それはただディスクを待っているかもしれません read
と write
支配します。
他のヒント
主キーのあるinnodbテーブルはありますか
- 複数の列が含まれていますか?
- 幅広いvarcharを持っていますか?
- そして、多くの非ユニークインデックス?
- 幅広いキーを備えた1つまたは複数の非ユニークインデックス?
これらの条件のいずれかは、おそらくインデックス内の大きなbtreeノードを発生させる可能性があり、各btreeノードに葉が非常に少なくなります。プライマリキーのクラスターキーは、クラスタリングされていないキーの各非ユニークキーエントリにも添付されています。
別の考慮事項:INNODBデータページの合計は、INNODBインデックスページよりも大幅に少ないですか?
このクエリ(MB)でそれを見つけることができます:
SELECT SUM(data_length)/POWER(1024,2) InnoDBData,
SUM(index_length)/POWER(1024,2) InnoDBIndexes
FROM information_schema.tables WHERE engine='InnoDB';
追加の考慮事項:ロードしているDBサーバーでバイナリロギングを有効にしていますか?もしそうなら、これをロードしているサーバーでこれを行います:
mysql -h... -u... -p... -A -e"SET sql_log_bin=0; source site.sql"
これが役立つことを願っています!!!
読んでいるテーブルは、トリガーとインデックスと制約がないことを確認していますか?どのハードウェアとOSを実行していますか?ストレージはどのように構成されていますか?
私はOracleに精通していますが、トリガーなしでテーブルに12Gのインポートをすることは、インデックスと制約が200GB/hで簡単に移動する必要があります。 1つのトリガーが、トリガーが何をするかに応じて、カタツムリにプロセスを作成できます...
これが役立つことを願っています