【 バックアップとリストア 】

1. SQL-DMO の概要
2. バックアップ
3. 同一 SQLServer にリストア
4. MSDE 2000 Release A のインストール
5. MSDE 2000 にデータをリストア

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>
    


    注意事項
  • バックアップファイルに書き込まれているデータベースファイルの物理
    位置情報を変更しています