วันพฤหัสบดีที่ ๒๕ ตุลาคม พ.ศ. ๒๕๕๐

โค้ด Restore Database สำหรับ SQL Server

จากบทความที่แล้วเราสามารถทำการ 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.Click

Dim strSQL As String
Dim strCon As String

strCon = "Data Source=NITHI;Initial Catalog=master;Integrated Security=True"

Dim cmdRestore As SqlClient.SqlCommand = New SqlClient.SqlCommand

sqlConnection1.ConnectionString = strCon
SqlConnection1.Open()
cmdRestore.Connection = SqlConnection1
Cursor = Cursors.WaitCursor
Try
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
c
mdRestore.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 เพิ่มนะครับ เพราะมันทำได้หลายอย่างมาก

ไม่มีความคิดเห็น: