大きな.sqlファイルのインポートの進行状況を監視するにはどうすればよいですか?


204

foobar.sqlローカルデータベースのテーブルを復元するために7 GB をインポートしています。

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

進捗状況を監視するにはどうすればよいですか?


1
この質問に対する答えは、これはmysqlクライアントの明確な不足であることを示す
ウィリアム・エントリケン

回答:


267

* nixのCLIからダンプファイルからインポートするだけの場合、たとえば

mysql -uxxx -pxxx dbname < /sqlfile.sql

次に、まずパイプビューアをOSにインストールしてから、次のようなものを試してください。

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

プログラムの実行中に進行状況バーが表示されます。

これは非常に便利で、mysqldumpの進行状況の推定値を取得するためにも使用できます。

pvはダンプしsqlfile.sql、それらをmysqlに渡します(パイプ演算子のため)。ダンプ中は、進行状況が表示されます。すばらしいことは、mysqlがデータを処理できる速度で処理するため、pvはインポートの進行状況を表示できることです。私には証拠がありません。しかし、そうです。バッファが使用されていると思いますが、ある時点で、mysql処理中のためまだデータを読み取れないと思います。

Pipe Viewerスクリーンショット


1
mysqlには、完全に「処理」されることなく、一部のデータをパイプインできるバッファーがあるかもしれません(つまり、エラーが発生した場合、pvは実際に受信したものをわずかに過剰報告する可能性があります)。しかし、一般的に、これがパイプの仕組みです。これsudo hd /dev/sda1 | lessは、システムパーティション全体をメモリ内に配置できないのと同じ理由です。
snapfractalpop

2
@snapfractalpop pvは、多くの場合、SQLの一部のチャンクが他のチャンクよりも処理に時間がかかるため、あまり正確ではありません。たとえば、単純な挿入を構成する行は、すでに多くの行があるテーブルのインデックスに作成する行よりもはるかに高速に実行されます。しかし、進歩のAA目安で使用されるリード・バッファがない限り、出力が助けになるはずですmysql特に大きい7GB入力用のバッファがレンダリングするのは非常に大きいことが必要となる(pvすべてで便利の出力はありません。
デビッドSpillett

1
@DavidSpillett確かに。あなたのコメントは私の感情を反映しています。基本的に、pvは粗雑ですが、効果的です。私が一番気に入っているのは、それがどれほど一般的かということです。これがUNIXパイプの美しさです(McIlroyに感謝します)。
snapfractalpop

1
@robこれは素晴らしい男mysqldumpです。例を挙げてください。
ジョスエアレクサンダーイバラ

非常に素晴らしい解決策!パスワードは手動であれば、それはしかしその進行を表示するために、PVが待機していません
ピエール・ド・LESPINAY

27

インポートを既に開始している場合は、別のウィンドウでこのコマンドを実行して、データベースの現在のサイズを確認できます。これは、インポートする.sqlファイルの合計サイズがわかっている場合に役立ちます。

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

クレジット:http : //forums.mysql.com/read.php?108,201578,201578


MySQLの8.0リファレンス状態が精度については、以下:

DATA_LENGTH

MyISAMの場合、DATA_LENGTHはデータファイルの長さ(バイト単位)です。

InnoDBの場合、DATA_LENGTHはクラスター化インデックスに割り当てられたメモリの概算量(バイト単位)です。具体的には、ページ単位のクラスター化インデックスサイズにInnoDBページサイズを掛けたものです。

 

INDEX_LENGTH

MyISAMの場合、INDEX_LENGTHはインデックスファイルの長さ(バイト単位)です。

InnoDBの場合、INDEX_LENGTHは、非クラスター化インデックスに割り当てられたメモリのおおよその量(バイト単位)です。具体的には、非クラスター化インデックスサイズの合計(ページ数)にInnoDBページサイズを掛けたものです。


この回答のコマンドに従って、私のテーブルは12 GiBになりましたが、まだインポート中です。sqldumpファイルは5 GiBのみです。私は、この矛盾の説明に興味がある
lucidbrot

17

単一のデータベースのmysqldumpを実行すると、すべてのテーブルがアルファベット順にダンプされます。

当然、データベースへのmysqldumpのリロードもアルファベット順になります。

SHOW PROCESSLISTを実行できます。mysqldumpを実行しているDB接続を見つけます。ダンプがリロードされると、DB接続は消滅します。

ダンプファイルに含まれるテーブルを知りたい場合は、foobar.sqlに対してこれを実行します

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

更新2012-05-02 13:53 EDT

テーブルが1つしかないことに気づかずに申し訳ありません。

テーブルがMyISAMの場合、監視する唯一の方法はOSの観点からです。理由?テーブルはリロード中は書き込みロックされます。あなたは何を求めますか?.MYDおよび.MYIファイルのサイズ。もちろん、それをインポート元の他のDBサーバーでのテーブルサイズと比較する必要があります。

テーブルがInnoDBであり、innodb_file_per_tableを有効にしている場合、監視する唯一の方法はOSの観点からです。理由?テーブルはリロード中は書き込みロックされます。あなたは何を求めますか?.ibdファイルのサイズ。もちろん、それをインポート元の他のDBサーバーでのテーブルサイズと比較する必要があります。

テーブルがInnoDBであり、innodb_file_per_tableが無効になっている場合、OSの観点でも役に立ちません。

更新2012-05-02 13:56 EDT

昨年このようなことを取り上げました。「type db.sql | mysql」の進捗率を取得するにはどうすればよいです

更新2012-05-02 14:09 EDT

標準のmysqldumpは次のようにテーブルを書き込みロックするため:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

その場合、テーブルロックが解除されるまでmysqlから進捗を取得する方法はありません。

ダンプファイルを取得LOCK TABLESしてUNLOCK TABLESコメントアウトできる場合...

  • テーブルがMyISAMの場合、SELECT COUNT(*)は機能します
  • テーブルがInnoDBの場合、SELECT COUNT(*)はおそらくカウントが完了するまでロードを遅く/停止します

うまくいきました。ありがとう。最後の質問の1つは、経験から、インポートの時間がファイルサイズとファイルサイズに関してほぼ線形かどうかを知っていますか?.MYD.MYI
qazwsx

1
テーブルのリロードは線形です。インデックスの再構築は線形です。数年前、MySQL(lists.mysql.com/mysql/202489)への質問としてこれを敢行したのではなく、DBA StackExchange(dba.stackexchange.com/a/2697/877)で言及しました
RolandoMySQLDBA

8

2秒ごとに、実行中のプロセスが表示されます。

watch 'echo "show processlist;" | mysql -uuser -ppassword';

あなたはそれがあまり頻繁にしたい場合は、追加-n xところ、xは秒数です。5秒は次のようになります。

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

出力例を投稿できますか?また、それは単にプロセスを示していますか、それとも本当にインポートの進行状況を示していますか?
qazwsx 16

これはとても役立つコードです。ありがとう
ナラヤン

6

停止しているかどうかだけを確認したい場合は、クエリを実行できます

show processlist; 

何が実行されているかを確認します。


5

pvを働かせることができない、またはpvが嘘をつく人のための解決策として。データを含む/ var / lib / mysqlのibdata1ファイルのサイズを監視できます。これにより、ソースサーバーのファイルサイズと同じサイズ(またはその程度)になります。

テーブルが多数ある場合は、/ var / lib / mysql / <データベース名>に1つずつ表示されることも確認できます。

長期データベースが3〜4年の間に20G前後のログファイルを作成したときに、最近この事実を使用しました。転送に時間がかかっていることに気付き、この手法を使用して進行状況を監視しました。

データベースがどこか他の場所にファイルを含まない日が来ることはほとんどありそうにないと思います。その間、ファイルを監視して、転送の進行状況を確認できます。私が提案した方法は、最初のsqlデータベースが作成されて以来、何らかの形でできることでした。私は、手動の騎手が後戻りできるような「公式」な手法であることを示唆するつもりはありませんでした。一般的なコンピューター、特にUNIXに関する一般的なレベルの習熟度を前提としています。


2

DBが他の方法で静かな場合(つまり、他のアクティブなユーザーがいない場合)、読み取り/書き込みアクティビティだけを見たい場合は、次のようなことをしないでください。

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

読み取り/書き込み/挿入/待機/更新の数が表示されます。

たとえば、挿入する場合、次のようなものが表示されます。

Innodb_rows_inserted                          | 28958 

28958は、間隔(私の場合は10秒)で挿入された行の数です。


1

mysqldumpあなたが使用しているパイプビューアの例を探している人にとっては、このようなことをするだけです:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

-Wフラグは、ちょうど最初のバイトは(プロンプトの後)の進行状況を表示する前に来るのを待つために、PVを伝えます



0

OK、別の回避策。しかし、それは最悪で不正確なオプションかもしれません。

とはいえ、ここにWindows用の私のソリューションがあります。

を押してタスクマネージャーを開きます

CTRL + SHIFT + ESC

「mysqld.exe」ディスク値の速度をコピーします

e.g. 11mb/s

これを次のような電卓に入れてくださいhttps : //techinternets.com/copy_calc?do

ETAを見積もります。私の場合は:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

結果:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

オプションとして 'mysql -v'を投稿したばかりの人がいないことに驚いています。スタックした場合、出力は停止します。


3
「進行状況の監視」とは、通常、プロセスの進行状況または完了時期を推定しようとすることを意味しますが、これmysql -vは提供されません。また、7 GBのデータを端末に吐き出すと、復元が著しく遅くなります。
-mustaccio

わかりました、説明ありがとう。それは本当です、7 GBの出力は端末に出力するのに適していません。-vを使用するのは、dbがスタックする小さなローカルテストケースのためだけだったと思います。
dtc

2
この提案は、問題を正確に特定するのに役立ちましたが、大きなファイルで使用するには実用的ではないかもしれません。(鉱山は小さかった)。
ケーシーパーキンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.