จากบทความที่แล้วเราสามารถทำการ backup database ออกมาเป็น file ทีนี้ถ้าเราต้องการทำ restore ละ ก็ใช้ T-SQL เหมือนเดิม ลองดู syntax กันก่อนครับ
RESTORE DATABASE { database_name @database_name_var }
[ FROM <> [ ,...n ] ]
[ WITH
[ RESTRICTED_USER ]
[ [ , ] FILE = { file_number @file_number } ]
[ [ , ] PASSWORD = { password @password_variable } ]
[ [ , ] MEDIANAME = { media_name @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword @mediapassword_variable } ]
[ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ]
[ ,...n ]
[ [ , ] KEEP_REPLICATION ]
[ [ , ] { NORECOVERY RECOVERY STANDBY = undo_file_name } ]
[ [ , ] { NOREWIND REWIND } ]
[ [ , ] { NOUNLOAD UNLOAD } ]
[ [ , ] REPLACE ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]
จะเห็นว่ามันมี option เยอะแยะเลย รายละเอียดของ option ไปดูใน Online book นะครับ
ในตัวอย่างผมจะทำการ Full Recovery ไป
สำหรับการ Restore มันมีจุดสำคัญคือ ต้องไม่มี user ใช้งาน datbase ครับ
ดังนั้นก่อนจะทำการ restore ให้บอก user ที่ใช้งานให้ออกไปก่อน (เราสามารถใช้ store procedure ดูรายชื่อคนที่ใช้งาน database อยู่ครับ แล้วจะให้ดีในโค้ดเราควรจะเตะ user ที่ใช้งานอยู่ออกไปด้วยเพื่อความปลอดภัย
ก่อนอื่นผมจะไปสร้าง table ใหม่ใน Northwind ก่อน สมมติชื่อ table1 จากนั้นก็ backup เป็นไฟล์ชื่อ mybackup.bak
เมื่อ backup เสร็จแล้วก็ทำการ drop table1 ทิ้งไปครับ เดี๋ยวเราจะลอง restore database ถ้าผ่าน table1 ก็จะกลับมาหาเราอีกครั้ง เอาละ หายไปเรียบร้อยแล้วครับคราวนี้มาดูโค้ดกันบ้าง จากบทความที่แล้วเราได้สร้างปุ่มเผื่อไว้แล้วชื่อ btnRestore
Private Sub btnRestore_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRestore.ClickDim strSQL As StringDim strCon As String
strCon =
"Data Source=NITHI;Initial Catalog=master;Integrated Security=True"Dim cmdRestore As SqlClient.SqlCommand = New SqlClient.SqlCommandsqlConnection1.ConnectionString = strCon
SqlConnection1.Open()
cmdRestore.Connection = SqlConnection1
Cursor = Cursors.WaitCursor
strSQL = "ALTER DATABASE Northwind SET SINGLE_USER"
cmdRestore.CommandText = strSQL
cmdRestore.ExecuteNonQuery()
strSQL = "RESTORE DATABASE Northwind FROM DISK = 'C:\mybackup.bak' "
cmdRestore.CommandText = strSQL
cmdRestore.ExecuteNonQuery()
MsgBox("finish")
Catch ex As Exception
MsgBox("Error")
Finally
strSQL = "ALTER DATABASE Northwind SET MULTI_USER"
cmdRestore.CommandText = strSQL
cmdRestore.ExecuteNonQuery()
End Try
Cursor = Cursors.Arrow
SqlConnection1.Close()
cmdRestore.Dispose()
cmdRestore = Nothing
End Sub
จุดสังเกตุ
1. ใน Connection String ผมกำหนด Initial Catalog เป็น master (คือจริงๆเป็น database ตัวไหนก็ได้ที่ไม่ใช่ตัวที่เราต้องการ restore) ถ้าเรากำหนด Initial Catalog เป็น Northwind ก็เท่ากับว่าเรากำลังล๊อก database ด้วยตัวเองครับ (ผมก็เป็น กว่าจะรู้ตัว error ไปแล้ว)
2. ผมเลือกใช้คำสั่ง ALTER TABLE เพื่อ SET SINGLE_USER เพื่อกัน user อื่นออกจาก database
3. รันคำสั่ง Restore เสร็จแล้วก็อย่าลืม SET กลับเป็น MULTI_USER นะครับ
4. เนื่องจากบางครั้งกระบวนการ restore มันจะนานก็เลยสั่งให้เปลี่ยน cursor จะได้บอกให้ user รู้ว่ายังทำงานไม่เสร็จนะจ๊ะ
ลองรันโค้ดดูครับ
จะเห็นว่าระหว่างทำงาน Database จะเปลี่ยน mode เป็น Single User
เสร็จการ restore
Table1 กลับมาแล้ว การ restore ประสบผลสำเร็จ
Note: อยากให้ไปศึกษา option ต่างๆของการ restore เพิ่มนะครับ เพราะมันทำได้หลายอย่างมาก