SQLサーバー データベースの圧縮
監査ログを掃除したのがいいけど、DB自体のサイズが一向に減りません。
圧縮か? 圧縮についていろいろ情報が散在していたので、まとめておきます。
【手順】
●まず、ディスク使用量を確認する●
圧縮しても、実際減るかわからない場合、使用量を見てから行うとよいです。
また、圧縮はサーバ負荷がかかりますので、一気にするとユーザに影響します。
なので、MAX圧縮できるサイズを確認し、段階的に圧縮をかけていくのがお勧め(だそうです)
1、[SQL Management Studio] を起動し、SQL サーバーに接続。
2、該当のデータベースを右クリックし、[レポート] - [標準レポート] - [ディスク使用量] をクリック。
3、レポート作成が開始する。表示されたレポートで、[データ ファイルで使用されているディスク領域] 部分を展開するとディスク使用量が確認できる。
"未割り当て" および "未使用" 領域が存在した場合、下記方法で圧縮が可能。
●段階的に圧縮実行(SHRINKFILEで)●
① PRESS.sqlファイルを作成(ファイル名はなんでもよし)
下記例は80Gに減らす場合です。
---内容 スクリプト ---
use <圧縮するデータベース名>
go
dbcc shrinkfile(1, 81920)
go
------------
②サーバでコマンドプロンプトを開き、スクリプトを実行。
> osql -E -i <パス名>\PRESS.sql -o <パス名>\shrink.txt
(コマンド例) > osql -E -i D:\PRESS.sql -o D:\shrink.txt
③ shrink.txtにログが残ります。mdf ファイルの容量が減少してるはず。
なお、1回であきらめちゃだめらしい。数回すれば減ることがあるんだって。なんででしょうかね。
また、SharePoint からのアクセスがある状態で実行しても、問題ないそうです。
なお、画面からする↓の方法だと、圧縮を最大限まで一気に行うため、
1時間くらいかかっちゃいました。
(70G)
shrinkfile コマンドで圧縮すれば、段階的に小さくできます。
●万が一、処理の途中で止めちゃったら元に戻っちゃう?●
DBCC SHRINKFILE はデータの移動、ページの再割り当てと解放、
ファイルサイズの変更が基本的な動作。
これらは複数のトランザクションに区切られて実行される。
よって、圧縮をキャンセルした場合、必ずしも圧縮処理実行前の状態まで戻るとは限らない。
なお、圧縮をキャンセルした場合においても、データベースの論理構造に問題は発生しないだろうとのこと。
●SHRINKFILEはTEMPDB領域使う?●
使わない
●UIからの圧縮●
Management Studio で、[タスク] - [圧縮] - [ファイル] からファイルの圧縮をする場合に、[圧縮アクション] の選択する。
すると、下記の動きが行われます。
なお、こちらもキャンセル可能。
メニューバーの停止ボタン (赤の■マーク) をクリックすることでキャンセルできます。
DB 圧縮処理を途中でキャンセルした場合の影響はなく、途中まで圧縮された状態になります。
[未使用領域を解放する]
データベース ファイル末尾のすべての空き領域を切り捨て、データベース ファイルのサイズを小さくする。
-> ファイルの末尾に空き領域がない場合、サイズが縮小されない場合があるそうです。
[未使用領域の解放前にページを再構成する]
圧縮では、データベース ファイル内で後ろに位置するページを先頭に向けて移動し、
できるだけファイル後半に空き領域を作成し、その後、ファイル末尾のすべての
空き領域を切り捨て、データベース ファイルのサイズを小さくする動作が行われる。
そのため 後ろに位置するページが使用されている等により、移動できない場合
には空き領域を作成することができないので、サイズが縮小されない場合があるとのこと。
●DBCC SHRINKDATABASE での圧縮は?●
なお、似たようなコマンドにDBCC SHRINKDATABASE ステートメントがあるのですが
データベース全体を作成時よりも小さいサイズに圧縮することはできないそうです。
一方、DBCC SHRINKFILE ステートメントでは、target_size を指定することが可能で、
つまり初期サイズよりも小さいサイズを指定することで圧縮することが可能になります。
DBCC SHRINKFILE はデータの移動、ページの再割り当てと解放、ファイルサイズの変更が基本的な動作となっており、これらは複数のトランザクションに区切られて実行されるため、中止した時点で実行中のトランザクションのみがロールバックされます。そのため、圧縮をキャンセルした場合、必ずしも圧縮処理実行前の状態まで戻るとは限りません。なお、圧縮をキャンセルした場合においても、データベースの論理構造に問題は発生しません。
●圧縮するとトランザクションログが生成される●
データベース ファイルを圧縮する際に、データベース ファイル内で後ろに位置するページを先頭に向けて移動し、できるだけファイル後半に空き領域を作成します。ページ移動に伴うトランザクションがトランザクションログに書き込まれるので、トランザクションログが増加する。
●圧縮の途中でキャンセルしたら?●
圧縮は、結構時間かかります。70G程度のSharePointのコンテンツDBで1時間かかりました。
もし途中でやめちゃったら?
データベースの圧縮処理のキャンセル方法は、ご使用いただいているツールによりますが、SQL Management Studio をご使用いただいている場合は、メニューバーの停止ボタン (赤の■マーク) をクリックすることでキャンセルできます。
DB 圧縮処理を途中でキャンセルした場合の影響はございません。圧縮処理はロールバックされず、途中まで圧縮された状態になります。
●圧縮中、ユーザへの影響はある?●(MOSS環境に関して)
圧縮処理中にユーザーの更新処理ができなくなることはない。
ただし、サーバーに負荷がかかるため、パフォーマンスが低下する。
圧縮か? 圧縮についていろいろ情報が散在していたので、まとめておきます。
【手順】
●まず、ディスク使用量を確認する●
圧縮しても、実際減るかわからない場合、使用量を見てから行うとよいです。
また、圧縮はサーバ負荷がかかりますので、一気にするとユーザに影響します。
なので、MAX圧縮できるサイズを確認し、段階的に圧縮をかけていくのがお勧め(だそうです)
1、[SQL Management Studio] を起動し、SQL サーバーに接続。
2、該当のデータベースを右クリックし、[レポート] - [標準レポート] - [ディスク使用量] をクリック。
3、レポート作成が開始する。表示されたレポートで、[データ ファイルで使用されているディスク領域] 部分を展開するとディスク使用量が確認できる。
"未割り当て" および "未使用" 領域が存在した場合、下記方法で圧縮が可能。
●段階的に圧縮実行(SHRINKFILEで)●
① PRESS.sqlファイルを作成(ファイル名はなんでもよし)
下記例は80Gに減らす場合です。
---内容 スクリプト ---
use <圧縮するデータベース名>
go
dbcc shrinkfile(1, 81920)
go
------------
②サーバでコマンドプロンプトを開き、スクリプトを実行。
> osql -E -i <パス名>\PRESS.sql -o <パス名>\shrink.txt
(コマンド例) > osql -E -i D:\PRESS.sql -o D:\shrink.txt
③ shrink.txtにログが残ります。mdf ファイルの容量が減少してるはず。
なお、1回であきらめちゃだめらしい。数回すれば減ることがあるんだって。なんででしょうかね。
また、SharePoint からのアクセスがある状態で実行しても、問題ないそうです。
なお、画面からする↓の方法だと、圧縮を最大限まで一気に行うため、
1時間くらいかかっちゃいました。
(70G)
shrinkfile コマンドで圧縮すれば、段階的に小さくできます。
●万が一、処理の途中で止めちゃったら元に戻っちゃう?●
DBCC SHRINKFILE はデータの移動、ページの再割り当てと解放、
ファイルサイズの変更が基本的な動作。
これらは複数のトランザクションに区切られて実行される。
よって、圧縮をキャンセルした場合、必ずしも圧縮処理実行前の状態まで戻るとは限らない。
なお、圧縮をキャンセルした場合においても、データベースの論理構造に問題は発生しないだろうとのこと。
●SHRINKFILEはTEMPDB領域使う?●
使わない
●UIからの圧縮●
Management Studio で、[タスク] - [圧縮] - [ファイル] からファイルの圧縮をする場合に、[圧縮アクション] の選択する。
すると、下記の動きが行われます。
なお、こちらもキャンセル可能。
メニューバーの停止ボタン (赤の■マーク) をクリックすることでキャンセルできます。
DB 圧縮処理を途中でキャンセルした場合の影響はなく、途中まで圧縮された状態になります。
[未使用領域を解放する]
データベース ファイル末尾のすべての空き領域を切り捨て、データベース ファイルのサイズを小さくする。
-> ファイルの末尾に空き領域がない場合、サイズが縮小されない場合があるそうです。
[未使用領域の解放前にページを再構成する]
圧縮では、データベース ファイル内で後ろに位置するページを先頭に向けて移動し、
できるだけファイル後半に空き領域を作成し、その後、ファイル末尾のすべての
空き領域を切り捨て、データベース ファイルのサイズを小さくする動作が行われる。
そのため 後ろに位置するページが使用されている等により、移動できない場合
には空き領域を作成することができないので、サイズが縮小されない場合があるとのこと。
●DBCC SHRINKDATABASE での圧縮は?●
なお、似たようなコマンドにDBCC SHRINKDATABASE ステートメントがあるのですが
データベース全体を作成時よりも小さいサイズに圧縮することはできないそうです。
一方、DBCC SHRINKFILE ステートメントでは、target_size を指定することが可能で、
つまり初期サイズよりも小さいサイズを指定することで圧縮することが可能になります。
DBCC SHRINKFILE はデータの移動、ページの再割り当てと解放、ファイルサイズの変更が基本的な動作となっており、これらは複数のトランザクションに区切られて実行されるため、中止した時点で実行中のトランザクションのみがロールバックされます。そのため、圧縮をキャンセルした場合、必ずしも圧縮処理実行前の状態まで戻るとは限りません。なお、圧縮をキャンセルした場合においても、データベースの論理構造に問題は発生しません。
●圧縮するとトランザクションログが生成される●
データベース ファイルを圧縮する際に、データベース ファイル内で後ろに位置するページを先頭に向けて移動し、できるだけファイル後半に空き領域を作成します。ページ移動に伴うトランザクションがトランザクションログに書き込まれるので、トランザクションログが増加する。
●圧縮の途中でキャンセルしたら?●
圧縮は、結構時間かかります。70G程度のSharePointのコンテンツDBで1時間かかりました。
もし途中でやめちゃったら?
データベースの圧縮処理のキャンセル方法は、ご使用いただいているツールによりますが、SQL Management Studio をご使用いただいている場合は、メニューバーの停止ボタン (赤の■マーク) をクリックすることでキャンセルできます。
DB 圧縮処理を途中でキャンセルした場合の影響はございません。圧縮処理はロールバックされず、途中まで圧縮された状態になります。
●圧縮中、ユーザへの影響はある?●(MOSS環境に関して)
圧縮処理中にユーザーの更新処理ができなくなることはない。
ただし、サーバーに負荷がかかるため、パフォーマンスが低下する。