2013-10-20 20 views
52

私はUbuntuのコマンドラインから約300MBのsqlファイルをMySqlにインポートしようとしています。今ながら、それは少し実行されていますが大きなSQLファイルをMySqlにコマンドラインでインポートする

Query OK, 1 row affected (0.03 sec) 

:私は今、それは一見無限の行を表示しています

source /var/www/myfile.sql; 

を使用しました。私は大規模なファイルをインポートしていないので、これが正常であるかどうか、プロセスが停止したりエラーが発生した場合は、これがコマンドラインに表示されるのか、このプロセスが無期限に続行されるのかを知りたいだけです。

おかげ

+0

クライアントがクラッシュするか、mysqlが終了するか、または処理するクエリが不足するまで、スクリプト内の各クエリを実行し続けます。 –

+0

クライアントがクラッシュしたり、mysqlが停止したりすると、コマンドラインでエラーメッセージが表示されますか、それとも無限に続くだけで、実行中のように表示されますか?私が知りたいのは、インポートが何時間も続く場合、プロセスを再起動しない時間を無駄にしないようにすることです。 – user2028856

+0

クライアントがクラッシュした場合、シェルプロンプトに戻るだけです。サーバーがクラッシュした場合は –

答えて

99

あなたはこのような標準入力使用して.sqlファイルをインポートすることができます

mysql -u <user> -p<password> <dbname> < file.sql

注:<-p><password>

リファレンスの間にスペースがありいけないし。 http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html

推奨編集に関する注意:この回答は、インラインパスワードパラメータを使用するよう提案された編集によってわずかに変更されました。私はスクリプトのためにそれをお勧めできますが、パラメータ(-p<password>)に直接パスワードを書き込むときは、ヒストリファイルを読むことができるすべての人にパスワードを明らかにするシェル履歴によってキャッチされる可能性があることに注意してください。一方、-pは標準入力でパスワードを入力するように要求します。

+0

ああ、私は参照してください、しかし、私も大丈夫使用した方法ですか、間違っています – user2028856

+0

あなたの方法については、http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commandsを参照してください。 html –

+0

わかりました。あなたの経験に基づいて、CLI経由で300MBのSQLファイルをインポートするにはどのくらいの時間がかかりますか? – user2028856

8

+1 to @MartinNucの場合、mysqlクライアントをバッチモードで実行すると、長い行の「OK」行は表示されません。

特定のSQLファイルをインポートするのにかかる時間は、多くのことに依存します。ファイルのサイズだけでなく、その中のステートメントのタイプ、サーバーサーバーのパワー、および同時に実行されているその他のサーバーの数。

@MartinNucは、4GBのSQLを4〜5分で読み込むことができますが、0.5GBのSQLファイルを実行し、小規模のサーバーでは45分かかると言います。

サーバー上でSQLスクリプトを実行するのにどれくらいの時間がかかりますか。あなたのコメントを再


@MartinNucはmysqlクライアント印刷すべてのステートメントを作るために選択することができますが正しいです。または、2番目のセッションを開き、mysql> SHOW PROCESSLISTを実行して、何が実行されているかを確認できます。しかし、おそらく、「完了したパーセンテージ」の数字や残りのステートメントを完了するのにかかる時間の見積もりにもっと興味があります。

申し訳ありませんが、このような機能はありません。 mysqlクライアントは、後のステートメントを実行するのにどれくらいの時間がかかっているか、あるいはどれくらいのステートメントがあるか分からない。それで、それが完了するのにどれくらいの時間がかかるかを意味のある見積りを与えることはできません。

+0

返事をありがとうBillは、Martin氏が言ったコマンドに何らかのプロセス表示などを提供していますか?現在のインポートを取り消す必要があるので、私は今実際にテストすることはできません。 – user2028856

+0

すべてのコマンドを見るには 'mysql --verbose'が必要です。参照http://dev.mysql.com/doc/refman/5.0/en/mysql-batch-commands.html –

+0

Billで述べられているように、パイプビューユーティリティを使用してパーセンテージの完全な機能を持つことができます....例えば 'sudo pv- i 1 -p -t -e DB.sql | mysql -uDB_USER -p DBANAME' – abhi

45

mysqlのデフォルト設定が "autocommit = true"なので、巨大なファイルのインポートに時間がかかることが最も重要です。ファイルをインポートする前にそれを設定してから、宝石のようなインポートの動作を確認する必要があります。 ..

まずオープンのMySQL:

のmysql -uルート次に

-pは、あなただけの次の操作を行う必要があります。

mysql>use your_db

mysql>SET autocommit=0 ; source the_sql_file.sql ; COMMIT ;

+0

これはとてもcoooooolです。私はそれが好きです。情報の部分も。すべてのsqlファイルを次のようにして1つのsqlファイルに収集します。cat * .sql >> all_data.sqlこれは非常に便利です。私は今3.5Gファイルをインポートしています:)テーブルがMyIsamでなければならないことを忘れないでください。 – kodmanyagha

+0

テーブルxxxは終了しません...なぜ –

+0

インポートが完了した後、 'SET autocommit = 1;'に戻るために自動コミットがサポートされていませんか? – machineaddict

0

大規模なSQLの復元に使用するソリューションは、mysqldumpsplitterスクリプトです。私はsql.gzを個々のテーブルに分割しました。 mysql workbenchのようなものをロードし、それを目的のスキーマへのリストアとして処理します。ここで

はスクリプト https://github.com/kedarvj/mysqldumpsplitter

であり、これは大きなSQLリストアのために働く、私が一緒に仕事1つのサイト上の私の平均は2.5ギガバイトのsql.gzファイルで、非圧縮の20ギガバイト、と〜100GBのは、一度完全に

を復元
関連する問題