sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Backup to URL for Large Databases

Antonios Chatzipavlis
Wednesday 20 September 2017

Εδώ και χρόνια ( από τον SQL Server 2012 SP1 CU2) υπάρχει η δυνατότητα για SQL Server backups σε Azure Blob storage με το γνωστό (υποθέτω σε όλους μας)  backup to URL. Αρκετοί το έχουν υλοποιήσει, μεταξύ αυτών και ένας πελάτης μου αλλά κάποια στιγμή άρχισε να μην δουλεύει. Σε αυτό το άρθρο σας δείχνω το γιατί και πως λύνεται το πρόβλημα.

Το backup to URL είναι ένα εξαιρετικό feature καθώς δίνεται άμεσα η δυνατότητα για off site backups που είναι επιτακτική ανάγκη όλοι να έχουν (αν και για αρκετούς αυτό είναι μια άγνωστη έννοια ).

Ακόμα σημαντικό και δεν πρέπει να αγνοηθεί είναι το κόστος που σε αυτή την περίπτωση είναι αρκετά χαμηλότερο σε σχέση με άλλες λύσεις καθώς το κόστος του storage στο Azure είναι πραγματικά πολύ χαμηλό.

Backup to URL μπορούν όλοι να έχουν είτε έχουν SQL Server instance on premise είτε σε VM on Azure.

Ιδιαίτερα για αυτούς που είναι σε VM on Azure θα έλεγα ότι είναι η ιδανική λύση κυρίως από άποψη network αρκεί να είναι στο ίδιο datacenter.

Create Azure Storage Account


image1

Για να μπορέσουμε να πραγματοποιήσουμε backup to URL θα πρέπει να έχουμε Azure subscription και σε αυτό να δημιουργήσουμε  ένα azure storage account

Η διαδικασία για την δημιουργία ενός azure storage account είναι αρκετά απλή αλλά έχει τρία σημεία που πρέπει να προσεχθούν

Το πρώτο σημείο είναι ότι στο Account kind θα πρέπει να επιλεχθεί η επιλογή General purpose.

Το δεύτερο σημείο είναι το deployment model που πρέπει να είναι Resource manager στο Resource Group είτε να βάλουμε κάποιο ήδη υπάρχον είτε να φτιάξουμε νέο.

Το τρίτο είναι το Location που πρέπει να επιλεχθεί αυτό που είναι καλύτερο σε επικοινωνία στην περίπτωση που έχω on premise SQL Server ή να είναι το ίδιο με αυτό που είναι το Azure VM στην περίπτωση που έχω τον SQL Server σε Azure VM.

Create Blob Container

image1

Επόμενο βήμα είναι δημιουργηθεί  ένας container με τιμή Private στο Public Access level και είμαστε σχεδόν ένα βήμα πριν την ολοκλήρωση για να μπορούμε να εκτελούμε backup to URL.

Create SQL Server Credential

Αυτό που μένει να κάνουμε είναι να πάρουμε από τα Access keys του storage account τις τιμές που υπάρχουν στο storage account name και το primary default key και με αυτά στο SQL Server να δημιουργήσουμε ένα credential με το statement

CREATE CREDENTIAL <credential name>
WITH IDENTITY ='<your storage account name>'
, SECRET = '<your primary default key>'

Πλέον το να πραγματοποιηθεί backup to URL είναι μια απλή διαδικασία αρκεί να εκτελέσει κάποιος το statement

BACKUP DATABASE <database name>
TO URL='https://<storage account>.blob.core.windows.net/<container name>/<backup file name>.bak'
WITH COMPRESSION, CREDENTIAL='<credential name>'

Backup to URL Limitations before SQL Server 2016

Πράγματι η συγκεκριμένη διαδικασία δουλεύει εξαιρετικά αρκεί να μην δημιουργείται backup device (file) μεγαλύτερο από 1 ΤΒ. Επίσης δεν επιτρέπει να κάνεις stripe backups δηλαδή να παίρνεις backup  σε περισσότερα από ένα backup devices. Αυτό σημαίνει ότι αν έχεις μια database που έχει πάνω από 1ΤΒ δεδομένα κάθε προσπάθεια να πάρεις backup to URL αποτυγχάνει.  Αυτό είναι μια πραγματικότητα εφόσον είσαι σε SQL Server 2012, 2014.

O πελάτης μου που έχει ένα super VM on Azure έφτασε σε αυτό το όριο καθώς πλέον έχει φτάσει να έχει δεδομένα πάνω από 1 ΤΒ και φυσικά έσκαγε το backup.

Backup to URL in SQL Server 2016

Ο παραπάνω περιορισμός έχει φύγει στον SQL Server 2016 και ευτυχώς ο πελάτης ήταν σε SQL Server 2016. Όμως και πάλι η παραπάνω διαδικασία σκάει καθώς το BACKUP TO URL WITH CREDENTIAL συνεχίζει να έχει τα παραπάνω limitations καθώς αυτός ο τρόπος υποδηλώνει page blob usage.

Για να μπορέσουμε να έχουμε την δυνατότητα να πάρουμε μεγαλύτερες databases backup to URL πρέπει να κάνουμε block blob usage και για να γίνει αυτό θα πρέπει μερικά πράγματα να γίνουν διαφορετικά από όσα είπαμε και κάναμε παραπάνω.

Create Shared Access Signature (SAS) 

Δεν υπάρχει καμία αλλαγή στον τρόπο με τον οποίο θα πρέπει να δημιουργηθεί το azure storage account και ο container σε αυτό.

Αυτό που πρέπει να κάνουμε είναι να πάμε στο azure storage account και να δημιουργήσουμε ένα SAS (Shared Access Signature) και θέλει λίγη προσοχή σε κάποια πράγματα όπως το χρονικό διάστημα που αυτό θα είναι διαθέσιμο και το οποίο ορίζουμε με τις ημερομηνίες που στο διάλογο έχουμε και ένα ακόμα σημαντικό στοιχείο είναι οι IP addresses  (των SQL Server instances) που θα έχουν πρόσβαση σε αυτό το storage account.

Aφού όλα αυτά τα ορίζουμε πατάμε το Generate SAS button.

Αυτό θα μας δημιουργήσει πολλαπλά αποτελέσματα αλλά από όλα αυτά χρειαζόμαστε το πρώτο που είναι το SAS Token το οποίο κάνουμε copy καθώς θα το χρειαστούμε στο επόμενο βήμα και η συμβουλή που σας δίνω είναι να το κάνετε paste σε ένα notepad καθώς αν κλείσετε το συγκεκριμένο blade θα το χάσετε και θα πρέπει να φτιάξετε νέο ή να γράψετε PowerShell για να το ανακτήσετε.

Επίσης κάνοντας paste σε ένα notepad θα δείτε ότι το SAS Token ξεκινάμε με ?. Αυτό πρέπει να φύγει από τη αρχή και να κρατήσουμε το SAS Token χωρίς αυτό.

image1

Create SQL Server Credential for Block blob usage

Αυτό που πρέπει να φτιάξουμε πλέον είναι ένα νέο credential ώστε να έχουμε την δυνατότητα να κάνουμε χρήση του block blob usage. Για να γίνει αυτό θα πρέπει εκτελεστεί το παρακάτω state

CREATE CREDENTIAL [https://<your azure storage account name>.blob.core.windows.net/<container name>] 
WITH IDENTITY = 'SHARED ACCESS SIGNATURE' -- ΠΡΟΣΟΧΗ ΑΥΤΌ ΘΑ ΠΡΕΠΕΙ ΝΑ ΕΊΝΑΙ ΩΣ ΕΧΕΙ
,SECRET = '<SAS TOKEN>';

Take Backup to URL using Block Blobs

Τώρα πλέον είμαστε σε θέση να μπορούμε να πάρουμε backup to URL using block blob κάνοντας χρήση του statement

BACKUP DATABASE  <database name> TO
URL = 'https://<yourstorageaccount>.blob.core.windows.net/<containername>/DB_part01.bak',
…
URL = 'https://<yourstorageaccount>.blob.core.windows.net/<containername>/DB_partN.bak',
WITH COMPRESSION,  MAXTRANSFERSIZE = 4194304, BLOCKSIZE = 65536,

Πρώτη παρατήρηση είναι ότι δεν υπάρχει το WITH CREDENTIAL.

Why striped backup needed?

Δεύτερη παρατήρηση είναι ότι μπορώ και πρέπει να έχω striped backups και αυτό γιατί μόνο έτσι μπορώ να έχω παραπάνω μέγεθος από το 1 ΤΒ στο backup. Κάθε block blob μπορεί να φτάσει τα 195GB και στον SQL Server ένα  backup μπορεί να έχει μέχρι 64 backup devices αυτό σημαίνει ότι μπορώ να έχω backups που μπορούν να φτάσουν τα 12 ΤΒ.

What the MAXTRANSFERSIZE is?

Ας πούμε ότι έχουμε μια βάση που είναι 10ΤΒ άρα για να μπορέσω να έχω backup to URL με όλα όσα έχω πει πρέπει το backup να έχει 52 backup devices που το κάθε ένα μπορεί να φτάσει το 195GB (δυνητικά). Όμως και πάλι μπορεί να έχεις πρόβλημα !!!

Μπορεί να πάρεις το εξής μήνυμα λάθους "Write to backup block blob device ... . Device has reached its limit of allowed blocks." και φυσικά μένεις κόκαλο.

Η εξήγηση δίνεται από το documentation των Azure Block Blobs

"Each block in an append blob can be a different size, up to a maximum of 4 MB, and an append blob can include up to 50,000 blocks. The maximum size of an append blob is therefore slightly more than 195 GB (4 MB X 50,000 blocks)."

Για να μπορέσουμε να έχουμε λοιπόν 4 ΜΒ block block size πρέπει να έχουμε στο statement το MAXTRANSFERSIZE = 4194304.

What the BLOCKSIZE option is ?

Τέλος ακόμα μια παράμετρος που πρέπει να υπάρχει στο statement του backup URL είναι το BLOCKSIZE με την οποία ελέγχουμε το να μην έχουμε κάτω από 4 ΜΒ κάποιο block blob.

Καλά backups to URL

//antonch

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Episode

Transparent Data Encryption (TDE)

image

More Episodes...

Tip

Refresh Intellisence in SSMS

Για να κάνουμε refresh το intellisence μέσα στο SSMS αρκεί να πατήσουμε Ctrl+Shift+R

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2023 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.