วิธีทำการ Native Backup และ Restore ไปยัง SQL Server บน RDS
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้ผมจะมาแนะนำวิธีทำการ Native Backup และ Restore ไปยัง SQL Server บน RDS
Amazon RDS รองรับการสำรองข้อมูลแบบ Native และกู้คืนฐานข้อมูล Microsoft SQL Server โดยใช้ไฟล์สำรองข้อมูลแบบเต็ม (ไฟล์ .bak) เมื่อเราใช้ RDS เราจะเข้าถึงไฟล์ที่จัดเก็บไว้ใน Amazon S3 แทนที่จะใช้ระบบไฟล์ในเครื่องบนเซิร์ฟเวอร์ฐานข้อมูล
ดูรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
นอกจากนี้ RDS มีฟังก์ชัน Snapshot และ Restore แม้ว่าเราจะใช้ SQL Server บน RDS เราก็สามารถใช้ฟังก์ชัน Snapshot และ Restore เหล่านี้ได้ โปรดดูบทความต่อไปนี้สำหรับวิธีใช้ Snapshot และ Restore
สิ่งที่ต้องมี
- สร้าง EC2 (Windows Server) แล้ว
- สร้าง Microsoft SQL Server บน RDS แล้ว
- ติดตั้ง SSMS บน EC2 (Windows Server) แล้ว
- เชื่อมต่อจาก SSMS บน EC2 (Windows Server) ไปยัง Microsoft SQL Server บน RDS แล้ว
ดูวิธีการเตรียม Resource ตามที่กล่าวมาด้านบนได้ที่ลิงก์ด้านล่างนี้
การสร้าง Buckets ใน Amazon S3
การตั้งค่า General configuration:
» Bucket name: tinnakorn-mssql-backup
(ชื่ออะไรก็ได้)
» AWS Region: Asia Pacific (Singapore) ap-southeast-1
(Region S3 Bucket ต้องเหมือนกับ Region ของ RDS for SQL Server)
เลื่อนลงมาด้านล่างสุด แล้วคลิกปุ่ม Create bucket
การสร้าง Role ใน IAM
เข้ามาที่ Service IAM โดยค้นหา ?︎ IAM
แล้วเลือก IAM
Step 1 - Select trusted entity:
Trusted entity type
» เลือก AWS service
Use case
» Use cases for other AWS services: ค้นหา RDS
แล้วเลือก RDS
» เลือก ◎ RDS - Add Role to Database
» คลิก Next
Step 2 - Add permissions:
ยังไม่ต้องตั้งค่าใดๆ ซึ่งจะตั้งค่าในภายหลัง ดังนั้นให้เลื่อนลงมาด้านล่างสุด แล้วคลิก Next
Step 3 - Name, review, and create:
» Name: tinnakorn-mssql-backup-role
(ชื่ออะไรก็ได้)
เลื่อนลงมาด้านล่างสุด แล้วคลิก Create role
Create inline policy
ค้นหาแล้วเข้ามาที่ Role ของเรา ในตัวอย่างนี้คือ tinnakorn-mssql-backup-role
จากนั้นดูที่แท็บ Permissions
แล้วคลิก Add permissions ▼
แล้วเลือก Create inline policy
ต่อไปคลิกแท็บ JSON
แล้วลบข้อมูลเก่าใน JSON ออกให้หมด และคัดลอกโค้ดด้านล่างนี้วางลงใน JSON
{
"Version": "2012-10-17",
"Statement":
[
{
"Effect": "Allow",
"Action":
[
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::bucket_name"
},
{
"Effect": "Allow",
"Action":
[
"s3:GetObjectAttributes",
"s3:GetObject",
"s3:PutObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::bucket_name/*"
}
]
}
แล้วเปลี่ยน "bucket_name" ใน Resource ให้เป็น S3 Bucket ที่สร้างในตอนแรก เช่น
"Resource": "arn:aws:s3:::tinnakorn-mssql-backup"
"Resource": "arn:aws:s3:::tinnakorn-mssql-backup/*"
ต่อไปป้อน Name*: tinnakorn-mssql-backup-policy
(ชื่ออะไรก็ได้) แล้วคลิก Create policy
เมื่อสร้างเสร็จแล้วจะแสดงหน้าจอแบบนี้
การ Modify RDS
เราจะทำการ Modify Option group ใน Microsoft SQL Server บน RDS ของเรา
การสร้าง Option group
ไปที่ Service Amazon RDS แล้วเข้าไปที่ DB identifier ของเรา แล้วเลือกแท็บ Configuration
แล้วดูที่ Engine version: 15.00.4236.7.v1
ซึ่งเราตรวจสอบเพื่อจะเลือก Major Engine Version ในขั้นตอนถัดไป
ต่อไปเลือก Option groups
จากเมนูด้านซ้าย
เมื่อเข้ามาหน้า Create option group แล้วตั้งค่า Option group details ตามนี้
» Name: tinnakorn-mssql-backup-og
(ป้อนชื่อที่ต้องการ)
» Description: tinnakorn-mssql-backup-og
(ป้อนตามต้องการ)
» Engine: sqlserver-ex
("sqlserver-ex" ย่อมาจาก "SQL Server Express Edition")
กรณีที่ใช้ Edition อื่น ให้ตั้งค่าดังนี้
sqlserver-web
=> SQL Server Web Edition
sqlserver-se
=> SQL Server Standard Edition
sqlserver-ee
=> SQL Server Enterprise Edition
» Major Engine Version: 15.00
(เลือกตาม Version ที่ตรวจสอบเมื่อสักครู่นี้)
» คลิก Create
ค้นหาชื่อ Option group ของเราและคลิกเข้ามา แล้วเลื่อนลงมาด้านล่างที่หัวข้อ Options แล้วคลิก Add option
ตั้งค่าหน้า Add option ดังนี้
Option details
Option name: SQLSERVER_BACKUP_RESTORE
IAM role
IAM role: tinnakorn-mssql-backup-role
(เลือก Role ที่สร้างตอนแรก)
Scheduling
Schedule for adding option: Immediately
แล้วคลิก Add option
การ Modify Option group ใน RDS
เข้าไปที่ DB identifier ของเรา แล้วคลิก Modify
เลื่อนลงไปด้านล่างที่หัวข้อ Additional configuration ให้ดูที่ Database options แล้วเปลี่ยน Option group ให้เป็นอันที่เราสร้างเมื่อสักครู่นี้ เช่น tinnakorn-mssql-backup-og
แล้วเลื่อนลงมาด้านล่างสุด แล้วคลิก Continue
ตรวจสอบการเปลี่ยนแปลงที่หัวข้อ Summary of modifications และเลือก ◎ Apply immediately
ในหัวข้อ Schedule modifications แล้วคลิก Modify DB instance
แล้วรอระบบ Modify สักครู่
การเตรียม Backup files ใน S3 Bucket
Download Sample Database
คลิก Download backup files แล้วเลือกดาวน์โหลด AdventureWorks2019.bak
(ตัวอย่างนี้ดาวน์โหลดใน Google Chrome)
อัปโหลด Backup files ลงใน S3 Bucket
ไปที่ S3 Bucket ของเรา แล้วคลิกไฟล์ AdventureWorks2019.bak
ค้างไว้ แล้วลากลงใน Objects ตามรูปภาพ
แล้วจะเข้ามาหน้านี้อัตโนมัติ แล้วคลิก Upload
ด้านล่าง แล้วรอการอัปโหลดสักครู่จนกว่าจะเสร็จ
เมื่อเสร็จแล้วจะแสดงหน้าจอแบบนี้ แล้วคลิก Close
แล้วจะเห็นว่าไฟล์ AdventureWorks2019.bak ถูกอัปโหลดเข้ามาเรียบร้อยแล้ว
ทีนี้ให้คลิก ✅ AdventureWorks2019.bak
แล้วคลิก Copy S3 URI
เตรียมไว้ใช้ในขั้นตอนถัดไป
ผลลัพธ์ที่ได้คือ S3 URI: s3://tinnakorn-mssql-backup/AdventureWorks2019.bak
สิ่งที่จะนำไปใช้ในขั้นตอนถัดไปคือ
tinnakorn-mssql-backup
(bucket_name)
AdventureWorks2019.bak
(file_name.extension)
ซึ่งจะอธิบายในภายหลัง
การ Restore
ขั้นตอนนี้ดำเนินการใน Remote Desktop Connection (Windows Server)
เราจะทำการ Restore ข้อมูลไปยัง SQL Server บน RDS
เชื่อมต่อ Database จาก SSMS ไปยัง SQL Server บน RDS
หากเชื่อมต่อกับ SQL Server บน RDS อยู่แล้ว ข้ามขั้นตอนนี้ไปได้เลย
กดปุ่ม Windows แล้วเลือกโฟลเดอร์ Microsoft SQL Server Tools 18
แล้วคลิก Microsoft SQL Server Management Studio 18
แล้วรอโปรแกรมเริ่มต้นสักครู่
ระหว่างรอให้ไปคัดลอก Endpoint ที่หน้า Amazon RDS บน AWS Management Console ของเรา
แล้วกลับมาที่ Remote Desktop Connection (Windows Server) แล้วป้อนข้อมูลดังนี้
» Server name: ป้อน Endpoint ที่คัดลอกจากขั้นตอนที่แล้ว
» Authentication: เลือก SQL Server Authentication
» Login: admin
(Login ด้วย Username ที่สร้างใน RDS)
» Password: PassW0rd
(Login ด้วย Password ที่สร้างใน RDS)
» คลิก Connect
Restore ข้อมูลไปยัง SQL Server บน RDS
คลิกขวา Database ที่เราสร้างไว้ก่อนหน้านี้ ตัวอย่างนี้คือ test
แล้วเลือก New Query
รัน SQL ตามด้านล่างนี้โดยคัดลอกไปวางใน SQL Query ที่เปิดจากขั้นตอนที่แล้ว
exec msdb.dbo.rds_restore_database
@restore_db_name='database_name',
@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name.extension',
@with_norecovery=0|1,
[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
[@type='DIFFERENTIAL|FULL'];
แล้วลบโค้ดที่ไม่จำเป็นออกและเปลี่ยนข้อมูล "database_name", "bucket_name", "file_name.extension", "0|1" เช่น
exec msdb.dbo.rds_restore_database
@restore_db_name='tinnakorn',
@s3_arn_to_restore_from='arn:aws:s3:::tinnakorn-mssql-backup/AdventureWorks2019.bak',
@with_norecovery=0
เมื่อแสดงข้อความ "Query executed successfully." ด้านล่างแล้ว รอระบบอ่านและเขียนข้อมูลสักครู่
แล้วคลิกปุ่ม Refresh
ก็จะเห็น Database ที่ทำการรันคำสั่งเมื่อสักครู่นี้ (ตัวอย่างนี้คือ tinnakorn)
ถ้า Database ยังไม่แสดง ให้รอและลองคลิก Refresh ดูเรื่อยๆ จนกว่า Database ของเราจะแสดงขึ้นมา
ตรวจสอบผลลัพธ์การ Restore
คลิก Database ของเรา เช่น tinnakorn
> Tables
แล้วคลิกขวาที่ Person.Address
> Select Top 1000 Rows
แล้วจะเห็นข้อมูลต่างๆ ใน Database แสดงขึ้นมา
การ Backup
คลิกขวาที่ Database ของเรา เช่น tinnakorn
แล้วเลือก New Query
รัน SQL ตามด้านล่างนี้โดยคัดลอกไปวางใน SQL Query ที่เปิดจากขั้นตอนที่แล้ว
exec msdb.dbo.rds_backup_database
@source_db_name='database_name',
@s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name.extension',
[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
[@overwrite_s3_backup_file=0|1],
[@type='DIFFERENTIAL|FULL'],
[@number_of_files=n];
แล้วลบโค้ดที่ไม่จำเป็นออกและเปลี่ยนข้อมูล "database_name", "bucket_name", "file_name.extension" เช่น
exec msdb.dbo.rds_backup_database
@source_db_name='tinnakorn',
@s3_arn_to_backup_to='arn:aws:s3:::tinnakorn-mssql-backup/tinnakorn-20221208.bak'
เมื่อแสดงข้อความ "Query executed successfully." ด้านล่างแล้ว รอระบบ Backup ข้อมูลสักครู่
ตรวจสอบผลลัพธ์การ Backup
ขั้นตอนนี้ดำเนินการใน AWS Management Console
ให้เข้ามาที่หน้า AWS Management Console แล้วไปที่ S3 Bucket ของเรา
จะเห็นว่ามีไฟล์ที่เรา Backup มาจาก SSMS ใน Windows Server แล้ว (ในตัวอย่างนี้คือไฟล์ tinnakorn-20221208.bak)
เพียงเท่านี้การ Native Backup และ Restore ไปยัง SQL Server บน RDS ก็เสร็จเรียบร้อยแล้ว
สรุป
การใช้ (ไฟล์ .bak) แบบ Native เพื่อสำรองและกู้คืนฐานข้อมูล เป็นวิธีที่เร็วที่สุดในการสำรองและกู้คืนฐานข้อมูล Microsoft SQL Server
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP จากบริษัท Classmethod (Thailand) ครับ !