Εδώ και χρόνια ( από τον 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
|
Για να μπορέσουμε να πραγματοποιήσουμε 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
|
Επόμενο βήμα είναι δημιουργηθεί ένας 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 χωρίς αυτό.
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