[PowerShell] : SQL Server 2008 でバックアップを取る方法(Agent版あり)

実は、SQL Server 2008 のバックアップもPowerShellで簡単に実行することができます。

こんな、バックアップスクリプトをSQLで作っておき、それをInvoke-SqlCmd で、ファイル名を指定して実行するだけ。

SQLスクリプト

DECLARE @backupSetId as int 

DECLARE @now as nvarchar(10)
DECLARE @backupfile nvarchar(max)
SELECT 	@now = CONVERT(varchar, getdate(), 112),
@backupfile = N'D:\backup\SampleDb_' + @now + '.bak'
BACKUP DATABASE [SampleDb] TO  DISK = @backupfile
WITH NOFORMAT,
INIT,
NAME = N'SampleDb-完全 データベース バックアップ',
SKIP,
NOREWIND,
NOUNLOAD,
STATS = 10
SELECT 	@backupSetId = position
FROM
msdb..backupset
WHERE
database_name = N'SampleDb'
AND 	backup_set_id = (select max(backup_set_id) from msdb..backupset where database_name=N'SampleDb' )
IF @backupSetId is null
BEGIN
raiserror(N'確認に失敗しました。データベース ''SampleDb'' のバックアップ情報が見つかりません。', 16, 1)
END
RESTORE VERIFYONLY FROM  DISK = @backupfile WITH  FILE = @backupSetId, NOUNLOAD,  NOREWIND

上記バックアップスクリプト実行するPowerShellのコマンドライン

 # Invoke-SqlCmd -InputFile 'バックアップ用SQLスクリプト'
Invoke-SqlCmd -InputFile 'D:\backup\SampleDb_Backup.sql'

たった、これだけなんですが、1つだけ注意点!

それは、Invoke-SqlCmd コマンドをSQL Server Agent で動かす時、このままだとエラーになります。

ちなみに、SQL Server Agent で、PowerShellを動かしたい場合は、下記で行けます。

手順1:Management Studio で、[管理]→[SQL Server Agent] を選択する

手順2:新規ジョブを作成し、下記のように設定する

手順3:ジョブを作成する際、[種類]にPowerShellを選択し、コマンド欄には、下記のように入力します。(SQL Server 認証の例)

  
# ユーザIDとパスワードを指定する
#(コマンドライン実行と違い、SQL Server Agentは接続情報をもっていないため)
Invoke-SqlCmd -InputFile 'D:\backup\SampleDb_Backup.sql'
-ServerInstance "サーバ名\SQL Serverのインスタンス名" -U ユーザID -P パスワード

手順4:後は、ジョブに対するエラー発生時の対処方法などを設定すればOKです。

手順5:作成したジョブを右クリックし、[ステップでジョブを開始] します。

成功メッセージが返ってきて、所定のフォルダにDBバックアップファイルが無事格納されていればOKです。

ただ、もう1つわからないことがあります。(T-SQL を私が忘れているだけかもしれませんが)

それは、Invoke-SqlCmd コマンドって、SQL Server でいう、EXEC(正式名はEXECUTE) ですよね?

ストアド実行時に関しては戻り値がとれるんで、OKなんですが、SQLスクリプトファイルで実行したものって

戻り値とれないんでしたっけ?

もし、それができれば、Invoke-SqlCmd でスクリプトファイルをSQL Server Agent で実行しても、

きちんとした戻り値処理ができるんですけどね・・・ うーん、知っている方、教えてください。

PowerShellASP を使ってみよう!

ネタ元:http://www.powershelltoys.com/default.aspx (PowerShellASP)

ASP.NETのISAPI Extensionの力(aspnet_isapi.dllのこと)を借り、PowerShellの構文で

ASP(Active Server Pages)やASP.NETのように動作させることができる

「PowerShellASP」というのが提供されている。

良く、こんなものを作ったなぁ・・・ 作った人を褒めたい。

さて、そのPowerShellASPの導入方法ですが、IIS6.0の場合、下記の通りです。

(今回は、導入手順説明はかなり雑です。後で清書するのでご勘弁を)

また、PowerShellASPはIIS7.0でも動作しますが、今手元に環境がないので、

IIS6.0の手順で説明します。

手順1: http://www.powershelltoys.com/default.aspx (PowerShellASP)

から、「PowerShellASP」のモジュールを入手する

手順2:「インターネット インフォメーション サービス」をMMCスナップイン等から開き、

「既定のWebサイト」を右クリック→「ASP.NET」 タブを開き、

「ASP.NETバージョンが2.0」以降になっていること確認する。

(なっていなければ、ASP.NETバージョンを2.0に設定する)

手順3:「既定のWebサイト」を右クリック→[ホームディレクトリ]タブをクリック。

その後、「構成」ボタンをボチっと押すw

手順4:「アプリケーションの構成」ダイアログで「追加」ボタンをボチっと押すw

手順5:

[C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll] を実行ファイルに指定し、

「拡張子」に、「.ps1x」と指定する。(別に拡張子はお好きなものでOKです。)

この設定で、PowerShell用ASPファイルの拡張子を紐づけています。

手順6: PowerShellASPを動かすための仮想ディレクトリをIISで作成しておく

手順7:PowerShellASPの構文で記述したソースファイルを拡張子、「*.ps1x」で保存し、作成した仮想ディレクトリの下に保存しておく。

手順8:Web.config も作成した仮想ディレクトリの下に保存しておく。

なお、Web.Configには、httpHandlers に下記の情報を追加しておく

(この定義がないとASP.NET上でPowerShellを動かすことができませぬ)

<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="true" />
        <httpHandlers>
            <add verb="*" path="*.ps1x" type="PowerShellToys.PowerShellASP.PSHandler, PowerShellToys.PowerShellASP"/>
        </httpHandlers>
    </system.web>
</configuration>

手順9:作成した仮想ディレクトリの配下にBinフォルダを作成し、そのBinフォルダの中に入手した「PowerShellToys.PowerShellASP.dll」を配置する

手順10:Binフォルダにはあらかじめ、ASPNETユーザに読み取り&実行権限を付与しておく

手順11:http://[iis/[仮想ディレクトリ名]/作成したPowerShellASPのソースファイル.ps1x

にアクセスする。なお、私が作成した、*.ps1xファイルはこんな感じです。

★sample.ps1xファイル(Hello Worldの出力、変数定義、Get-CommandでPowerShellコマンドレットの一覧をリスト表示するサンプルです)

<html>
<head>
</head>
<body>

<% # おなじみのハローワールド %>
<% $Response.Write("Hello World" + "<br />") %>

<% # 変数代入 %>
<% $Name = "けろ-みお" %>

<% # 変数値出力(下記の2つは同じ意味です) %>
<% $Response.Write($Name + "<br />") %>
<%=$Name + "<br />" %>

<p>PowersShellのコマンドレット一覧をPowerShellASPを使って出力しちゃう</p>
<% $commandList = Get-Command %>
<ul>
    <% foreach($command in $commandList) { %>
        <li>
            <%=$command.Name; %>
        </li>
    <% }%>
</ul>

</body>
</html>

★sample.ps1x の実行結果

PowerShellユーザも、「PowerShellASP」を使えば、簡単にWebアプリケーションを作成することができますが、

デメリットもあります。

1. レスポンスが悪い(ngen.exeを叩くと若干レスポンスが良くなるが、微妙なとこ)

2. セキュリティへの考慮

3. ASP.NETなのか、ASPなのか、よくわからない(実際は、ASP.NETをベースに動いているのですが)

このあたりが気にならない人には、いいんじゃないかと思います。

今回は、Web.config と Binフォルダを使って、簡単にやっちまいましたけど、ちゃんとやるのであれば、

machine.config にhttpHandlersの定義をして、さらに、「PowerShellToys.PowerShellASP.dll」は、

GAC(グローバルアセンブリキャッシュ)に登録しておいても良いと思います。

興味ある方はご参考までにどうぞ。

INETA & techbank.jp & PowerShell from Japan & HIRO’s.NET 合同勉強会 in 仙台 バナー設置のお願い

先日お知らせした、

「INETA & techbank.jp & PowerShell from Japan & HIRO’s.NET 合同勉強会 in 仙台」

の宣伝用バナーを作成しました。

申込開始から3日経ちますが、場所が仙台ということもあり、申込数が振るわない状態です。

(7名の申込みがありましたが、6名がスタッフという状況なので、実質、1名の方しかお申し込みがない状態です)

参加する方はもちろんのこと、このBlogを購読されている方や、参加されない方におかれましても、

ご自身が所有しているBlogやHPに下記のバナーを設置頂けないかと思います。

(お好きなバナーをお選び下さい。)

オフラインイベントに興味がない、参加しないから関係ないと思われる方も、

バナー設置にご協力頂けないかと思います。

コミュニティ活性化のため、皆様のお力添えの程、宜しくお願いします。

640 × 480版

640×480 版の設置HTML

<a href="http://techbank.jp/event-sendai/">
<img
src="http://techbank.jp/images/event-sendai-banner2.png"
border="0"
alt="INETA & techbank.jp & PowerShell from Japan!! & HIRO's.NET 合同勉強会 in 仙台"
width="640"
height="480" />
</a>

600 × 30 版

600 × 30版の設置HTML

<a href="http://techbank.jp/event-sendai/">
<img src="http://techbank.jp/images/event-sendai-banner3.png"
border="0"
alt="INETA & techbank.jp & PowerShell from Japan!! & HIRO's.NET 合同勉強会 in 仙台">
</a>

INETA版バナー(120×120)

INETA版バナー(120×120) 設置HTML

<a href="http://techbank.jp/event-sendai/" target="_blank">
<img src="http://techbank.jp/event-sendai/InetaStudyLogo5.jpg"
border="0"
style="border-width:1pt;border-color:#eeeeee;border-style:outset;"
alt="INETA & techbank.jp & PowerShell from Japan!! & HIRO's.NET 合同勉強会 in 仙台" />
</a>

INETA & techbank.jp & PowerShell from Japan & HIRO’s.NET 合同勉強会 in 仙台 申込開始!

お待たせ致しました! 来る2009/03/28(土)に、宮城県仙台市において、

「コミュニティ勉強会に参加しよう~仙台編 3/28開催 [参加無料]

INETA & techbank.jp & PowerShell from Japan & HIRO’s.NET 合同勉強会」

を開催することが決定しましたので、お知らせ致します。

今回は、PowerShell中心にセッションを展開しますので、ご都合のつく方は、是非、ご参加頂きたく存じます。

開催概要の詳細と参加申込については、

http://techbank.jp/event-sendai/

にアクセスを!!!!!

今回の目玉は、この「PowerShell from Japan!!」にもご協力頂いている

MS田辺さんのPowerShellセッションと、「PowerShell from Japan!!」の管理人HIROさんの

セッションかなと思いますので、 たくさんの方にいらして頂きたく存じます。

東北地方でこのようなイベントを開催した事例も少ないと思いますので、東北地方にお住いの方には、

是非、いらして頂きたいと思います。

なお、東京からのアクセスだと、秋田新幹線「こまち」の指定された新幹線に乗車すると、

25%OFFで仙台まで行くことができます!

通常、東京からだと、新幹線で、11,000円、JR常磐線で、9000円ぐらい片道でかかりますが、

頑張れば、8300円程度で、仙台に行くことができますので、ぜひ、いらしてください。

http://jreast.eki-net.com/tokudane/pdf/bullet/akita_tky0903.pdf

所要時間も、1時間30分~2時間強ぐらいです!たくさんのご応募、お待ちしております。

Remove-Service コマンドレットがなくたって・・・

 

Windows Service 関連のコマンドレットを調べてみる

> gcm *-service | select name
 
Name
----
Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service

 

ぬわんと!Remove-Service がない!

SCM(Service Control Manager)とWMIとの間に何か問題が生じ、 Remove-Serviceコマンドレットをサポートしなかったのか?

ただ単純に忘れてしまったのか?もしくは、PowerShellの特性上、作れなかった理由があるのか?

他で代替えが効くと思って用意しなかったのか?

 

それはわかりませんが、別に、Remove-Serviceコマンドレットがなかったとしても、

SCMアクセス権限さえあれば、 該当サービスを簡単に消すことができます。

 

方法1:そのまま「sc.exe delete サービス名」をPowerShell上で実行してしまう

方法2:PowerShellでWMI(Win32_Service) を操作し、サービスを削除する

$service = Get-WmiObject win32_service | Where-Object {$_.Name -eq "サービス名"}
$returnValue= $service.delete()

 

昔は、SCMにアクセスするのに、Windows APIじゃないと出来なかったんですが、 WMIのおかげでだいぶ操作しやすくなりましたね。

WMIの操作をサポートしてくれた、PowerShellにも感謝したいと思います。