ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverのトランザクションログの使用状況を確認する

SQL Serverトランザクションログの使用状況を確認する方法を知りましたので、ここにメモします。

以下のコマンドで各データベースのトランザクションログの使用状況を確認することができます。

DBCC SQLPERF(LOGSPACE)


私の環境で実行した結果は以下の通りです。

DBCC SQLPERFコマンド実行結果

Log Size(MB)が、現在ログに割り当てられているファイルサイズで、Log Space Used(%)がログの使用済み領域の割合となるようです。

たとえば、sampleDBでは7.992188がログに割り当てられているサイズ(MB)で、実際の使用済み領域は、15.83578(約15%)となりますね。

因みに、トランザクションログの使用状況の確認方法ですが他にもあるようで、SQL Server 2012以降では上記のDBCC SQLPERF(LOGSPACE)の代わりにsys.dm_db_log_space_usageを使用する方法を推奨しているようです。

私の環境で実行した結果は以下の通りです。

sys.dm_db_log_space_usageの参照結果

実行結果の詳細の説明は割愛しますが、DBCC SQLPERF(LOGSPACE)と同様の情報に加えて、前回のログ バックアップ以降に使用された領域の量も確認することができるようです。

詳細は、本記事の下部の参考欄にあるMicrosoftの公式サイトをご参照ください。

今回は簡単ですが、コマンドの紹介まで。
最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

SQL Serverの論理バックアップデバイスについて

最近SQL Serverのバックアップ・復元周りを勉強しているのですが、その中で論理バックアップデバイスなるものを知りましたので、備忘としてここに残したいと思います。

論理バックアップデバイスとは?

簡単に説明すると、バックアップファイルへのエイリアスというイメージで良さそうです。

通常であれば、たとえば完全バックアップを行う場合のクエリは以下のようなものになると思います。バックアップ先のファイル名を物理パスとして記載しています。

BACKUP DATABASE [testdb]
TO DISK = N'c:\tmp\testdb.bak';


論理バックアップデバイスを作成することで、以下のようにスマートにクエリを書くことができます。つまり、ここでは論理バックアップデバイスとしてtestdbBackupsを指定することで、たとえば「c:\tmp\testdb.bak」にバックアップすることができます。

BACKUP DATABASE [testdb]
TO [testdbBackups];

長くて間違えやすい物理パス名の代わりに、論理バックアップデバイスを使うことでクエリも非常に簡潔で見やすくなると思います。

論理バックアップデバイスの作り方

それでは、論理バックアップデバイスの作り方をSSMSで簡単に説明します。

以下のキャプチャのとおり、SSMSのオブジェクトエクスプローラーの「サーバーオブジェクト」-「バックアップデバイス」を選択して右クリックし、「新しいバックアップデバイス」を選択します。

SSMSプロジェクトエクスプローラーのサーバーオブジェクト

以下のようなダイアログが開くので、「デバイス名」とバックアップ先の「ファイル」を指定します。
ここでは、「デバイス名」にtestdbBackups、「ファイル」にC:\tmp\testdb.bakを指定しました。

論理バックアップデバイスの作成ダイアログ

上記2項目を指定して、「OK」ボタン押下で論理バックアップデバイスの完成です。以下のように表示されていたら問題なく作成されています。これで記事冒頭で紹介したように論理バックアップデバイスを指定して、バックアップをすることができます。

バックアップデバイスに作成したものが追加されている

他にも

因みに既存の論理バックアップデバイスは、sys.backup_devicesビューを参照することで確認することができます。以下のような結果が表示されます。各カラムの意味は本記事下部の公式サイトリンクからご確認ください。

sys.backup_devicesビュー確認

あと、論理バックアップデバイスですがSSMSだけではなくてTransact-SQLでも、もちろん作成できます。以下のようなクエリになります。こちらも詳細は、本記事下部の公式サイトリンクからご確認ください。

USE AdventureWorks2016 ;  
GO  
EXEC sp_addumpdevice 'disk', 'mydiskdump', 'c:\dump\dump1.bak' ;  
GO

おわりに

いかがでしたでしょうか。あまり知っていてもいなくても正直変わらなさそうですが、バックアップクエリをシンプルに出来たりするので使ってみるのも良さそうですね。

今回は簡単ですがここまで。最後までお読みいただきありがとうございました。

Windowsで容量の大きいファイルを探す方法

今回は、タイトルの通りWindowsで容量の大きいファイルを探す方法を調べたのでここにメモします。

ネットを検索してみると今回の要件を解決するにはたくさんの方法があるようですが、個人的に一番使いやすそうだったものを紹介したいと思います。

さっそく実際のやり方ですが、PowerShellで以下のコマンドを入力すると、Cドライブの配下で容量が大きいファイルを上位10個まで表示してくれます。

Get-ChildItem C: -Recurse | Sort-Object Length -Descending | Select-Object -First 10


上記は、Cドライブ配下を検索対象としていますが他のドライブであればここ(上記の例では、"C:")を変更すれば良さそうです。あと、上位10個ではなくてたとえば30個とかであれば最後の"10"を"30"に変更して実行すればOKです。

因みに検索結果に出力されるLengthですが、これの単位はByteです。

検索結果のLength

このやり方でスマートに容量の大きいファイルが探せます。
こういうのは覚えられないので、今後のためにメモしておくことが重要と思います。

今回は簡単ですがここまで。最後までお読みいただきありがとうございました。

Windowsサービスの停止・起動をコマンドで実施する方法

今回は、Windowsサービスの停止・起動をコマンドで実施する方法を調べたので備忘としてここに記載します。

netコマンドでWindowsサービスの停止・起動を行う

早速ですが、Windowsサービスの停止・起動を行うコマンドですが”net”と呼ばれるものがあります。使い方は以下の通りでとっても簡単です。

Windowsサービス起動
net start "<サービス名>"

以下はnetコマンドでのサービス起動の実行例です。例としてTomcat8を起動しています。

netコマンドでサービス起動実行例
Windowsサービス停止
net stop "<サービス名>"

以下はnetコマンドでのサービス停止の実行例です。例としてTomcat8を停止しています。

netコマンドでサービス停止実行例

scコマンドでWindowsサービスの停止・起動を行う

上記までnetコマンドでWindowsサービスの起動と停止を見てきました。実は同じようにWindowsのサービスの起動や停止を行えるコマンドは、もう一つあります。”sc"コマンドと呼ばれるものです。まずはこちらも使い方を見ていきます。

Windowsサービス起動
sc start "<サービス名>"

以下はscコマンドでのサービス起動の実行例です。こちらも例としてTomcat8を起動しています。

scコマンドでサービス起動実行例
Windowsサービス停止
sc stop "<サービス名>"

以下はscコマンドでのサービス停止の実行例です。例としてTomcat8を停止しています。

scコマンドでサービス停止実行例

netコマンドとscコマンドの違いはあるか?

netコマンドとscコマンドの使い方を簡単に紹介しました。通常使う分にはどちらを使っても問題ないと思います。

因みにこれらの違いについてですが、以下サイトを引用させていただきますと、scコマンドは非同期(サービスの起動完了を待たずにコマンド制御が戻る)で、 netコマンドは同期(サービスの起動完了を待ってコマンド制御が戻る)となるようです。
sc start - Windowsコマンド虎の巻

たとえばバッチファイルを作成していて、スクリプトの中でサービス起動(もしくは停止)を完全に待ってから処理をしたい場合などには、同期するnetコマンドを使うといった具合でしょうか。上記違いは一応頭に入れておいたほうが良さそうですね。

GUIWindowsサービスの停止や起動を行う

本題からは逸れますが、まずはコマンドではなくGUIWindowsサービスの停止・起動についても軽く触れておきます。

Windowsのメニューから、Windows管理ツール - サービスを選択します。

メニューからサービス起動

上記押下すると、以下のようなサービス画面が開きます。

GUIでサービス起動

サービスを起動したい場合は、該当のサービスを選択して右クリックから「開始」を押下すればOKです。停止も手順は同じです。

GUIでサービス起動

因みに、上記のサービス画面は「Windows + R」押下し、ファイル名を指定して実行画面を開き「services.msc」を入力してOKを押下するだけで簡単に開けます。

ファイル名を指定して実行でサービスを開く

まとめ

いかがでしたでしょうか。私自身、普段サービスを起動・停止する際はGUIで実施していたのですがコマンドで実施する方法も何となく知ってたら役に立ちそうかなという思いで調べてみました。

netコマンドはサービスの起動や停止以外にも様々な用途で使うことができます。scコマンドについても、単純サービスの起動・停止だけではなくサービスに関するあらゆる設定を行うことができるみたいですので、詳しく知りたい方は別途確認していただければと思います。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

SQL Server の名前を指定する形式について

先日、SQL Serverの書籍を見ていたところSQL Serverのログイン時にサーバー名を指定するときに接続プロトコルを指定する書式を知りました。具体的には以下のような感じで指定します。

tcp:APPHOST

上記は、記載の通り接続プロトコルTCPを使って接続する書式になります(APPHOSTは、サーバーのホスト名です)。
他にもlpc(共有メモリ)も指定できたりするみたいです。

詳細は以下のMicrosoftのドキュメントをご参照いただければと思います。
SQL Server へのログイン - SQL Server | Microsoft Docs


こんな知識役立たないとは思いつつも、いつか使えると思ってここにメモしておきます。
今回は簡単な記事ですが、ここまで。

最後までお読みいただきありがとうございました。この辺で失礼いたします。

SQL Serverのデータベースの互換性レベルとは?

今回は、SQL Serverのデータベースの「互換性レベル」について調べたことを簡単に備忘として残したいと思います。

互換性レベルとは?

早速、互換性レベルについてですがまずは結論から。

互換性レベルとは、SQL Serverのバージョンごとの互換性を表す仕組みのことのようです。
通常ソフトウェアにはバージョン毎に互換性があったり、なかったりしますがそのような意味と同じようです。たとえば、互換性レベルはバージョンアップやリストア、バックアップに影響するようです。

そして、この互換性レベルごとにサポートされる機能などが変わってくるため、安易に変えてしまうとよくなさそうです。ここらへんの互換性レベルが変わることにより、何が起きるかは公式ページに記載がありますので適宜参照する必要がありそうです。
ALTER DATABASE 互換性レベル (Transact-SQL) - SQL Server | Microsoft Docs


SQL Serverのバージョン毎にサポートされる互換性レベルが決まっています。以下は、各SQL Serverでサポートされる互換性レベルが記載された場所を抜粋したものです。

SQL Server互換性レベルのサポート表

上記の表は以下のページから引用しました。
ALTER DATABASE 互換性レベル (Transact-SQL) - SQL Server | Microsoft Docs

互換性レベルの確認方法

それでは互換性レベルの確認方法を紹介します。

まずは、簡単にGUIで見る方法です。SSMSで該当のデータベースを選択し、右クリック - プロパティを選択します。するとデータベースのプロパティ画面が開きますので、「ページの選択」ペインのオプションを選択すると、画面上部に現在の互換性レベルが確認できます。

データベースのプロパティ - オプション欄

もちろん、SQLでも確認できます。以下のSQLを実行することで確認できます。引数は、確認するデータベース名に置き換えてください。

SELECT compatibility_level  
FROM sys.databases WHERE name = 'AdventureWorks2016';
SQLで互換性レベルを確認する。

互換性レベルの変更方法

あまり実施することはなさそうですが、互換性レベルの変更方法も紹介します。SQLで実施する場合は以下のようになります。SSMSで実施する場合は、先ほど確認した画面で互換性レベルのところがプルダウンになっていて簡単に変更できるようになっています。

ALTER DATABASE AdventureWorks2016
SET COMPATIBILITY_LEVEL = 120;  

まとめ

いかがでしたでしょうか。普段意識することはないかもしれません。データベースの移行とかで必要な知識になりそうですね。ちょっと頭の隅にでもおいておこうと思います。

最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。

RDBの論理削除について

今回は、RDBのテーブル設計においてよく見る「論理削除」について色々とネットや書籍なりで調べたものを自分なりにまとめておこうと思い、記事にしました。

論理削除とは?

まずは簡単に論理削除という言葉の定義から確認します。

論理削除とは、DELETE文によりテーブルからデータを物理的に削除するのではなく、論理的に削除することを指します。

例えば、以下の会員テーブルを例にして論理削除をみてみましょう。
■会員テーブル

id 名前 削除フラグ
1 田中 0
2 佐藤 0
3 鈴木 1
4 吉田 0

このテーブルには削除フラグと呼ばれるカラムがあります。このカラムの値が"1"であれば削除済、"0"であれば未削除を表すというルールを作ります。上記の例であれば、id=3の鈴木さんは削除済みとなり、他の会員は未削除という状態です。

上記のようなルールの場合には、ある会員を削除したいとなった場合にはこの削除フラグを"1"(削除済)に更新することで論理的に削除した状態を表現します。これが論理削除と呼ばれるものです。

論理削除のメリット

よく言われる論理削除のメリットは以下になると思います。

  • ユーザーからは削除されたように見せるが、実際にはデータが自体は念のため残しておきたいといった要件を満たせる
  • 削除した後に、すぐに戻せる(あくまで論理的に削除しただけなので、削除フラグを更新することで簡単に元に戻せる)

論理削除のデメリット

反対によく言われる論理削除のデメリットは以下になると思います。

  • データ抽出のSQLクエリに削除フラグの条件が必要になる
  • 論理削除すると、データがテーブルに残るのでディスクを圧迫する
  • 論理削除のカラムはカーディナリティが低いので、パフォーマンスが悪い

考察

上記の通り、メリットとデメリットどちらも見てきました。
結局のところ、論理削除は使って良いのかというところですが、これは他でもよく言われていることですが、積極的に使うものではないと思います。
個人的にはデメリットの「データ抽出のSQLクエリに削除フラグの条件が毎度必要になる」がとてもやっかいだと思いました。

抽出条件に必ず削除フラグを付与しなくてはならないのは、かなり面倒ですしパフォーマンスも悪いとなるとやはり色々と問題を抱えていると思います。

それで、論理削除を使わない場合はどうするのかというと、対処法としては削除するデータは別テーブルに移動することが良いと言われています。
例えば、削除済会員テーブルを別途用意して会員テーブルから物理削除したデータを削除済会員テーブルに登録するということです。
そうすることで、元の会員テーブルから削除フラグをなくせて、抽出条件もきれいになるので良いですね。

また、すでに論理削除を運用している場合にはViewを上手く使うことでSQLクエリの抽出条件をシンプルにすることはできます。
ただし、これはあくまでも見かけ上の解決手段となりパフォーマンスをよくすることはできません。

まとめ

論理削除はすでに色々と議論されている話題ですが、その内容を自分なりに理解しながら整理することでより理解を深めることができました。

実際のところ、論理削除を絶対使ってはダメ!!ということではなく、そのメリデメをちゃんと理解して使う分には問題ないというところみたいです(これは多くのことにいえることですが)。
確かに論理削除フラグ便利ですよね。私が今まで見てきた現場でも必ずといって良いほど論理削除フラグを使っていたのですが、あれは場合によってはちょっとまずい設計だったのかなと改めて考えさせられました。

今回も最後までお読みいただきありがとうございました。この辺で失礼いたします。

参考

今回の論理削除について考えるにあたり、以下の資料を参考にさせていただきました。どれもとてもよく考察されていて、なるほどと思うところがたくさんありましたので未読の方は読まれるといいかと思います。PostgreSQLMySQLで説明している資料もありますが、多くの部分が個々のDBMSによらない内容ですので参考になると思います。

SQLアンチパターン 幻の第26章「とりあえず削除フラグ」 | PPT
MySQLで論理削除と正しく付き合う方法 | PPT
PostgreSQLアンチパターン | PPT