web-dev-qa-db-ja.com

共有フォルダーのデータディレクトリを使用して仮想ボックスでMySQLを実行すると、データが破損することがある

開発環境をvagrant box(Oracle virtualboxを使用した仮想マシン)に移動しようとしています。現在、私は1つの問題に行き詰まっています。

環境にはMySQLサーバーといくつかのデータベースが必要です。 MySQLのインストール、データベースの作成と入力などを行うためのすべてのスクリプトを設定しました。

開発者はさらに独自のデータをセットアップする可能性が高いため、MySQLデータフォルダーを共有virtualboxフォルダーに配置することが私の考えでした。このように、迷惑なマシンが破壊/再作成された場合、データフォルダーは残り、データを失うことなく再利用できます。

ただし、仮想マシンを一時停止してから再開しただけの場合(常にではないが、何がトリガーになるかわからない場合)、MySQLは、テーブルのすべて(すべてではない)が破損していると不平を言い始めます。テーブルを修正すると、テーブル内のすべてのデータが失われます。明らかにこれは受け入れられません。

これがなぜ起こるのか、そしてそれをどのように防ぐのかについて誰かが何か考えを持っていますか?

いくつかの手がかりまたは赤いニシン-virtualboxの共有フォルダーが遅いということを読んだので、InnoDBバッファープールのサイズを1GBに増やして、キャッシュスペースを増やしました。 InnoDBとMyISAMを約50/50の比率で使用しています。失敗したテーブルがすべて同じエンジンに属しているかどうかはまだ確認していません。次回のクラッシュ時に注意します。

更新

ハ、私はなんとかそれを赤い手で捕まえた!それは実際に...サスペンスです... InnoDBとMyISAMの両方です。

MyISAMテーブルから選択するとエラーが発生する

テーブル 'xxx'はクラッシュしたとマークされており、修復する必要があります

mysqlcheck -A -a(すべてのテーブルを分析)を実行しようとすると、実際にはMySQLがクラッシュします。ログファイルはストーリーを伝えます(明確にするために編集されています)。

[Warning] InnoDB: Retry attempts for writing partial data failed.
[ERROR] InnoDB: Write to file ./ib_logfile0failed at offset 29885952, 1024 bytes should have been written, only 0 were written. Operating system error number 71. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.
[ERROR] InnoDB: Error number 71 means 'Protocol error'
[ERROR] mysqld got signal 6 
Query (0x7fbc12501b50): ANALYZE TABLE `yyy`

そして、すぐにsystemctlがサービスを再起動し、すべてが再び完全に実行されます。

私の学んだ推測では、仮想マシンを一時停止すると、virtualboxが開いていたファイルに対して保持していたロックが解放され、virtualboxが再起動しても再取得されません。 MySQLの観点から見ると、ファイルを開いたままにしていますが、virtualboxはそのグリップを失っており、MySQLがファイルに再度アクセスしようとすると、エラーが発生します。

2
Vilx-

データベースファイルを専用の仮想ハードディスクに置くことで、システムを安定させることができます。手順:適切なサイズのVHDを設定し、マウントポイントを指定してフォーマットし、そのマウントポイントを/ etc/fstabに追加し、すべてのデータベースファイルを新しいVHDにコピーします。次に、(データベースサーバーの)構成ファイルを編集して、新しい仮想ハードドライブ上のファイルを指すようにします。

はい、共有フォルダのファイルを保護するためにアクセス許可などを設定できますが、仮想ハードドライブを使用すると、データベースの「コンテナ」を改善でき、要件に適している可能性があります。 M橋本はいくつかのテストを実行し、共有フォルダー/仮想環境/ NFSのパフォーマンスを比較しています(レポートを参照してください: http://mitchellh.com/comparing-filesystem-performance-in-virtual-machines ) 。そのようなパフォーマンスについて不満を言っていたわけではありませんが、VirtualBoxを使用した共有フォルダーには「問題」があるようです(または、以前に問題があったようです)。

本当にVMを「サスペンド」する必要がある場合、ここにいくつかのヒントがあります( https://askubuntu.com/questions/63524/whats-the-best-way-to-pause-my-work-in -virtualbox-with-ubuntu-as-a-guest )。すべてのファイル(dbサーバーに関連付けられている)がVMに接続されている仮想ハードドライブに配置されている場合、これがよりスムーズに機能すると想像できます。

データベースファイルを含む仮想ディスクをデタッチ(および保持)して、新しいVMを作成し、必要に応じてディスクを新しいVMに接続することもできます。

1
stefan

本番環境のボックスがクラッシュし、MyISAMテーブルが破損していることがわかった場合thereであり、REPAIRに何時間(または数日)かかるかがわかった場合は、 InnoDBへの移行は正当化されます。

ある時点で、「中断」+破損によってMyISAMテーブルが混乱し、開発に影響が及ぶ可能性があります。

では、講義してください。あなたの質問に戻ります。

VMの大きさはどれくらいですか?そのボックスのInnoDB/MyISAMが50/50の場合、VMが少なくとも4GBの場合、次の設定を使用します。

key_buffer_size = 10% of the VM size
innodb_buffer_pool_size = 35%

4GB未満の場合は、それらのパーセンテージを下げてください。目標は、スワッピングを回避することです。

1
Rick James