【 バックアップとリストア 】
Enterprise Manager をスクリプトする |
SQL-DMO は分散管理オブジェクトという意味の COM オブジェクトの セットです 130にも及ぶオブジェクトを有していますが、SQLServer を Enterprise Manager から利用した事のある技術者にとっては、ADSI や WMI に比 べれば非常に理解しやすいものです
|
BackupDevice |
SQLServerの バックアップ方法としての標準的な考え方は、外部装置 に対するデータベースの保存です。外部装置はテープであったり、ハー ドディスクであったりします ここでは、MSDE7.0 から MSDE2000 へのデータベースのコピーを目的 としてコーディングされており、一番最初に行なうのはバックアップデバイ スの作成です
|
CreateDevice.hta
<SCRIPT language="VBScript">
Const SQLDMODevice_DiskDump = 2
' **********************************************************
' ディスクタイプのバックアップデバイス作成
' **********************************************************
Function CreateDevice()
' オブジェクト作成
Set objServer = CreateObject("SQLDMO.SQLServer")
Set objBackupDevice = CreateObject("SQLDMO.BackupDevice")
' デバイスプロパティをセット
objBackupDevice.Name = document.all("DeviceName").value
objBackupDevice.PhysicalLocation = document.all("PhysicalLocation").value
objBackupDevice.Type = SQLDMODevice_DiskDump
' 接続
Call objServer.Connect( "localhost", "sa", "" )
' 必要ならば既に存在するデバイスを削除
' Call objServer.BackupDevices.Remove( document.all("DeviceName").value )
' 追加
Call objServer.BackupDevices.Add( objBackupDevice )
' 切断
Call objServer.DisConnect()
Set objBackupDevice = Nothing
Set objServer = Nothing
' ファイルそのものはバックアップ時に作成されます
End Function
</SCRIPT>
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">
</HEAD>
<BODY id=Main>
デバイス名
<INPUT type=text name="DeviceName" value="MyBackup">
<BR>
物理位置
<INPUT type=text name="PhysicalLocation" value="D:\TEMP\MyBackup.dat" size=80>
<BR>
<INPUT type=button value="バックアップデバイス作成" onClick='Call CreateDevice()'>
</BODY></HTML>
デバイスは、SQLServer 内の論理名です。いわばインターフェイスを作成しただけであって、実体 であるファイルは、作成されません。テープ媒体である事を想定すれば良いと思います
デバイスができたら、実際にバックアップを行います
Backup.hta
<SCRIPT language="VBScript">
Const SQLDMOBackup_Database = 0
' **********************************************************
' バックアップ
' **********************************************************
Function DoBackup()
' オブジェクト作成
Set objServer = CreateObject("SQLDMO.SQLServer")
Set objBackup = CreateObject("SQLDMO.Backup")
' バックアッププロパティをセット
objBackup.Action = SQLDMOBackup_Database
objBackup.Database = document.all("DatabaseName").value
objBackup.Devices = document.all("DeviceName").value
' 接続
Call objServer.Connect( "localhost", "sa", "" )
' バックアップ
Call objBackup.SQLBackup( objServer )
' 切断
Call objServer.DisConnect()
Set objBackup = Nothing
Set objServer = Nothing
' 再度実行すると、ファイルに追加されます。初期化は OS より削除します
End Function
</SCRIPT>
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">
</HEAD>
<BODY id=Main>
デバイス名
<INPUT type=text name="DeviceName" value="MyBackup">
<BR>
データベース名
<INPUT type=text name="DatabaseName" value="lightbox">
<BR>
<INPUT type=button value="バックアップ開始" onClick='Call DoBackup()'>
</BODY></HTML>
追加した場合のバックアップのセットはファイル番号でリストア時に識別されます。これも、テープ 媒体である事を想定すれば良いと思います
データ復旧 |
同一 SQLServer へのリストアは、データ復旧を想定していますが、これ が最も簡単なリストア処理です オプションは必要ですが、既にあるデータベースを上書きしてくれるので、 開発時では、非常に便利であると思います
|
Restore.hta
<SCRIPT language="VBScript">
Const SQLDMORestore_Database = 0
' **********************************************************
' リストア
' **********************************************************
Function DoRestore()
' オブジェクト作成
Set objServer = CreateObject("SQLDMO.SQLServer")
Set objRestore = CreateObject("SQLDMO.Restore")
' リストアプロパティをセット
objRestore.Action = SQLDMORestore_Database
objRestore.Database = document.all("DatabaseName").value
objRestore.Devices = document.all("DeviceName").value
objRestore.FileNumber = 1
objRestore.ReplaceDatabase = True
' 接続
Call objServer.Connect( "localhost", "sa", "" )
' リストア
Call objRestore.SQLRestore( objServer )
' 切断
Call objServer.DisConnect()
Set objRestore = Nothing
Set objServer = Nothing
' リストア時にデータベース名は変更できますが、物理ファイル名
' はバックアップしたものになります。問題を避ける為に、バック
' アップした名前でリストアして下さい
End Function
</SCRIPT>
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">
</HEAD>
<BODY id=Main>
デバイス名
<INPUT type=text name="DeviceName" value="MyBackup">
<BR>
データベース名
<INPUT type=text name="DatabaseName" value="lightbox">
<BR>
<INPUT type=button value="リストア開始" onClick='Call DoRestore()'>
</BODY></HTML>
データベース lightbox は、create database 文で、オプションを指定せずに作成されたデータベースです 以下のセットの情報がバックアップファイルには含まれています
|
論理ファイル名 |
物理ファイル名 |
1 |
lightbox |
C:\MSSQL7\Data\lightbox.mdf |
2 |
lightbox_log
| C:\MSSQL7\Data\lightbox_log.LDF |
インストールオプション |
MSDE 2000 では、MSDE7.0 に比べてインストールが少し複雑になって います。まず、コマンドプロンプトより setup.exe を実行するのですが、 オプションを指定しないと予測できない事になる可能性があります 必ず、ReadmeMSDE2000A.htm に目を通して下さい
|
setup SAPWD="password" SECURITYMODE=SQL DISABLENETWORKPROTOCOLS=0 INSTANCENAME="M
SDE2000" TARGETDIR="c:\mssql2000\" /L*v C:/MSDELog.log
SECURITYMODE=SQLは、インスタンスが混在モードでインストールされ、Windows 認証ログイン と SQL 認証ログインの両方をサポートすることを意味します
DISABLENETWORKPROTOCOLS=0 は重要です。他のマシンからアクセスする為に必要です。規定は 1 なので注意して下さい
INSTANCENAME には、固有のインスタンス名を使用します。これによって マシン名\インスタンス名 でアクセスする為、複数のインスタンスがインストール可能です また、サービス名は MSSQL$インスタンス名となり、インストールディレクトリは、TARGETDIRサービス名 となります ( つまり、c:\mssql2000\MSSQL$MSDE2000 )
/L*v C:/MSDELog.log は、インストールログの指定です
インストールディレクトリの中の Binn ディレクトリには、osql.exe はありませんがちゃんと実行できます osql -U sa -P password -S SV\MSDE2000 でログインのテストを行います ( C:\Program Files\Microsoft SQL Server\80\Tools\Binn にあり、パスも設定済みです )
TARGETDIR="c:\mssql2000\" の最後の \ を入れないと、c:\mssql2000MSSQL$MSDE2000 というディレクトリが作成されて、そこへインストールされます
注意事項 |
MSDE2000 側にもバックアップデバイスを作成して、そこからリストアします 物理パスはどこでも良いですが、その位置にMSDE7.0 でバックアップしたフ ァイルを置きます
|
<SCRIPT language="VBScript">
Const SQLDMORestore_Database = 0
' **********************************************************
' リストア
' **********************************************************
Function DoRestore()
' オブジェクト作成
Set objServer = CreateObject("SQLDMO.SQLServer")
Set objRestore = CreateObject("SQLDMO.Restore")
' リストアプロパティをセット
objRestore.Action = SQLDMORestore_Database
objRestore.Database = document.all("DatabaseName").value
objRestore.Devices = document.all("DeviceName").value
objRestore.FileNumber = 1
objRestore.ReplaceDatabase = True
objRestore.RelocateFiles = _
"lightbox,C:\mssql2000MSSQL$MSDE2000\Data\lightbox.mdf" & _
",lightbox_log,C:\mssql2000MSSQL$MSDE2000\Data\lightbox.ldf"
' 接続
Call objServer.Connect( "SV\MSDE2000", "sa", "password" )
' リストア
Call objRestore.SQLRestore( objServer )
' 切断
Call objServer.DisConnect()
Set objRestore = Nothing
Set objServer = Nothing
End Function
</SCRIPT>
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">
</HEAD>
<BODY id=Main>
デバイス名
<INPUT type=text name="DeviceName" value="MyBackup">
<BR>
データベース名
<INPUT type=text name="DatabaseName" value="lightbox">
<BR>
<INPUT type=button value="リストア開始" onClick='Call DoRestore()'>
</BODY></HTML>
注意事項 |
バックアップファイルに書き込まれているデータベースファイルの物理 位置情報を変更しています
|
|