俺の雑記帳

My random memorandumです。(つまり、個人的な備忘録であり、その点ご容赦を。)

SQL Serverデータファイルの特性、Take DB Offline、.ldfの肥大化対策

SQL Serverのデータファイルは、3種類:

  • *.mdf: メインのデータファイル
  • *.ndf,: サブのデータファイル。パフォーマンス向上用。
  • *.ldf: "トランザクションログ"

これらファイルの更新日付は更新されない?!

social.msdn.microsoft.com

SQL Serverのプログラムが、ずっとファイルをつかんで開きっぱなしになるため(?)、なんだかすごい古いまま。(サーバー筐体(EC2インスタンス)の停止&起動でも、更新されないようだ!!)

コピーできない?

前エントリのように、SQL Serverのデータファイルをコピーする必要があったが、

SQL Server (MSSQLSERVER) によってファイルは開かれているため、操作を完了できません。
ファイルを閉じてから再実行して下さい。
[再実行] [スキップ] [キャンセル]」

では、Database単位で止めたいが、止められない!

SQL Server インスタンス丸ごと"Stop"することはできるが、"Database"単位では出来ない。
代わりに、"Database"単位では、"Take Offline"ができる。 stackoverflow.com

しかし、止めようとしても、"Take database offline"ウィンドウで、Statusが"In progress..."のまま、ずっと。
⇒Replicationを"Delete"する必要がある、との話で、諦めた。やはり全部止めてからコピーするしかないか…

.ldfは、肥大化しがち。

肥大化する要因はいくつかある。 今回は、以下が全て当てはまった。

  • テスト環境のdatabaseなど、不必要にRecovery model "Full" になっている。
    "Simple"にすればよい。 (Microsoft SQL Server Management Studioでは、Object Explorerで、該当のDatabaseを右クリック ⇒ Database Property > Options で確認、設定できる。)
  • バックアップが正常に動作していない。
    今回は、バックアップ先のディスクが先にいっぱいになり、しばらくバックアップが取れていなかった。
    バックアップが取れていないと、古い内容を *.ldf から削除するような動作が働かない。
    Microsoft SQL Server Management Studioでは、Object Explorerで、該当のDatabaseを右クリック ⇒ Tasks > Back Up... のウィンドウで、Destination を確認すると、バックアップ先が分かる。そこのデータがきちんととれていれば、この問題はない。)

matutak.hatenablog.com (このブログの次の日の記事に、 DBCC SHRINKFILE のSQL命令が。"関連記事"にもいろいろ。)


qiita.com 総合的に書かれた長い記事だが(※)、途中に、DBCC SHRINKFILE について記載あり。SQL Server Management Studio からでも実行する方法の記載あり(DBを右クリック - タスク - 圧縮 - ファイル)。
ただ、1GBなどすごく小さい単位ずつ実行せよ、と書いてあり、信頼性に疑問。(パートナー会社は、ただ一発、以下のSQLで実行した。)

USE [TEST-DB] GO ALTER DATABASE [XXXX-XX] SET RECOVERY SIPLE GO USE [TEST-DB] GO DBCC SHRINKFILE (XXX_Log, 1000) GO

(※)このページ中に「2017年12月時点 RDS for SQL Serverではインスタンス作成時に割り当てたディスク容量を拡張することができません。」という記載があり、注意。


より信頼性の高い記事だが、ちょっと事例が違う。 www.atmarkit.co.jp ちなみに、「DBCC LOGは一般には公開されていないコマンドのため、サポートの対象外」とあるが? 一つ上のリンク先では、画面から動作させることもできるのに非公式?いや、コマンド実行が非公式なのか。。。「小さい単位で実行せよ」という話もあったが、コマンドで行うのは不安定なのか?