วิธีทำการ Native Backup และ Restore ไปยัง SQL Server บน RDS

เราสามารถสร้างข้อมูลสำรองทั้งหมดจากเซิร์ฟเวอร์ในเครื่องของเราเก็บไว้ใน S3 แล้วกู้คืนไปยัง Instance Amazon RDS DB ที่มีอยู่ และทำการสำรองข้อมูลจาก RDS เก็บไว้ใน S3 แล้วกู้คืนได้ทุกที่ที่เราต้องการ

สวัสดีครับ 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

ค้นหา 🔍︎ S3 คลิก S3

เลือก Buckets

คลิก Create bucket

การตั้งค่า 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

เลือก Roles จากเมนูด้านซ้าย

คลิก Create role

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/*"

แล้วคลิก Review policy

ต่อไปป้อน 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 group

เมื่อเข้ามาหน้า 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

แล้วคลิก ▶ Execute

เมื่อแสดงข้อความ "Query executed successfully." ด้านล่างแล้ว รอระบบอ่านและเขียนข้อมูลสักครู่

แล้วคลิกปุ่ม Refresh ก็จะเห็น Database ที่ทำการรันคำสั่งเมื่อสักครู่นี้ (ตัวอย่างนี้คือ tinnakorn)
ถ้า Database ยังไม่แสดง ให้รอและลองคลิก Refresh ดูเรื่อยๆ จนกว่า Database ของเราจะแสดงขึ้นมา

ตรวจสอบผลลัพธ์การ Restore

คลิก Database ของเรา เช่น tinnakornTables
แล้วคลิกขวาที่ Person.AddressSelect 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'

แล้วคลิก ▶ Execute

เมื่อแสดงข้อความ "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) ครับ !

Link อ้างอิง