考えられる解決策 (回避策)
- ストレージ エミュレーターを終了します。
- 管理 Sql Server Management Studio 2012 を開きます。
C:\Users\<username>\DevelopmentStorageDb201206.mdf
ファイルを添付(<username>
は影響を受けるユーザーの名前);
- アタッチできない場合は、mdf ファイルとログ ファイルを別のドライブにコピーしてからアタッチします。それ以外の場合は、LocalDB (
(localdb)\v11.0
) にアクセスできます。
- ストアド プロシージャを検索します
CommitBlockList
。
- に変更
SET UncommittedBlockIdLength = NULL
しSET UncommittedBlockIdLength = 0
ます。
- それを実行します。
- Management Studio を閉じます。
- これらの編集された mdf、ログ ファイルを元の場所にコピーします。
- ストレージ エミュレーターを起動します。
どうやってそこにたどり着いたか
約 7 日ごとに BLOCK BLOB のみが削除されていることがわかりました。
テスト目的でこれらのブロブを再度作成することは、開発/テストの途中で苦痛でした。
ストレージ エミュレーターのソース コードを検索しようとしましたが、見つかりませんでした。
以下を追加
して、でのロギングを有効にしましたC:\Users\<username>\AppData\Local\DevelopmentStorage
DevelopmentStorage.201206.config
<LogPath>C:\Users\<username>\AppData\Local\DevelopmentStorage\Logs</LogPath>
<LoggingEnabled>true</LoggingEnabled>
苦労して待った後、次のログが見つかりました:
DefragmentBlobFiles BlobInfo 名 40f5e12f-65a5-4a3a-ae46-41c71c8514c0/file1.txt、ContainerName storage1、ディレクトリ c:\users\username\appdata\local\developmentstorage\ldb\blockblobroot\1\12735b4b-f9ed-481b-a091-78387facf05b、 ROFile 、 RWFile c:\users\username\appdata\local\developmentstorage\ldb\blockblobroot\1\12735b4b-f9ed-481b-a091-78387facf05b\1、Size5
上記の最適化が問題を引き起こしているとは思いません。
別のログが見つかりました:
BlockBlob: 読み込み間隔に失敗しました。IsGC: True、Microsoft.WindowsAzure.DevelopmentStorage.Store.BlockBlobGarbageCollector.GetTimerIntervalOrDefault(Boolean isGC) での System.Number.ParseDouble(String 値、NumberStyles オプション、NumberFormatInfo numfmt) での例外
したがって、BlockBlobs の場合、コミットされていないブロックは、この BlockBlobGarbageCollector によってガベージ コレクションされます。このコミットされていないブロックがガベージコレクションされる頻度はどこにもありません。これでさえ問題を引き起こしているとは思いません。
別のログ:
BlockBlob: 有効なディレクトリのリストでディレクトリ C:\Users\username\AppData\Local\DevelopmentStorage\LDB\BlockBlobRoot\1\0477877c-4cb3-4ddb-a035-14a5cf52d86f を確認しています
BlockBlob: ディレクトリ C:\Users\username\AppDataを削除しています\Local\DevelopmentStorage\LDB\BlockBlobRoot\1\0477877c-4cb3-4ddb-a035-14a5cf52d86f
この上記のログは問題を示しています。エミュレーターは、有効なブロックブロブ ディレクトリを決定している必要があります。
データベース のスキーマをチェックしDevelopmentStorageDb201206
ました。IsCommitted
やのような列がいくつか見つかりましUncommittedBlockIdLength
た。ClearUncommittedBlocks
に設定UncommittedBlockIdLength
されていることがわかりましたnull
。削除されていない Blob のUncommittedBlockIdLength
値は 0 でした。そのため、ストアド プロシージャをチェックし、.ではなく 0 にCommitBlockList
変更しました。以前のバージョンのエミュレーターは、有効なブロック blob ディレクトリを決定するために両方をチェックする必要があると思いますが、このバージョンでは、それらのブロック blob ファイルのみをチェックして削除する可能性があります。UncommittedBlockIdLength
null
IsCommitted
UncommittedBlockIdLength
UncommittedBlockIdLength
null
私が言ったように、このソリューションが完全に修正されるかどうかを確認するには、約 7 日かかります。検証まであと4日あります。
これが機能する回避策である場合、... Microsoft は私に 6 時間の猶予を与えています;)