Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Blog Entries posted by antonch

  1. antonch
    Αρκετές φορές έχω ερωτηθεί και έχω πει την άποψη μου για το τι είναι ANSI Transact SQL και τι όχι, όπως επίσης έχω πει και το πόσο ο SQL Server έχει δώσει βάρος στο να είναι κοντά στο ANSI.

    Όπως και να έχει όμως είτε θέλω να γράφω pure ANSI επειδή ενδεχομένως να θέλω portability είτε γιατί απλά είμαι περίεργος και θέλω να ξέρω αυτό που γράφω πόσο ANSI είναι , μπορώ το κάνω απλά χρησιμοποιώντας την SET FIPS_FLAGGER level> πριν από την εκτέλεση του/των query(s) που θέλω να ελέγξω.

    Στην παράμετρο level ορίζω την «αυστηρότητα» του ελέγχου μου. Οι τιμές που η παράμετρος μπορεί να δεχθεί είναι




    Value
    Description

    ENTRY
    Standards checking for ISO entry-level compliance.

    FULL
    Standards checking for ISO full compliance.

    INTERMEDIATE
    Standards checking for ISO intermediate-level compliance.

    OFF
    No standards checking.
    Έτσι αν για παράδειγμα θέλω να ελέγξω αν το





    select top(5) * from sys.databases
    go




    είναι 100% ANSI Compatible τότε εκτελώ.





    set fips_flagger 'full'
    go

    select top(5) * from sys.databases
    go




    Το οποίο θα μου δώσεις τα παρακάτω messages





    FIPS Warning: Line 1 has the non-ANSI statement 'SET'.
    FIPS Warning: Line 2 has the non-ANSI clause 'TOP'.



  2. antonch
    Σε αυτό το post θα σας παρουσιάσω ένα θέμα το οποίο είναι κάτι που αντιμετωπίζουν οι web developers και ιδιαίτερα αυτοί που ασχολούνται με Content Management Systems (CMS). Όπως είναι γνωστό σε αυτά αποθηκεύουμε το περιεχόμενο που βάζουμε στα sites μας, είτε σαν HTML, είτε σαν XML ή κάτι άλλο. Αρκετές είναι οι περιπτώσεις που χρειαζόμαστε να αντλήσουμε από αυτά μόνο το καθαρό περιεχόμενο αγνοώντας δηλαδή τα διάφορα HTML/XML tags.
    περισσότερα
  3. antonch
    Αρκετές φορές σαν DBA θέλουμε να έχουμε κάποια objects (tables, stored procedures) σε ένα σημείο από όπου να μπορούμε να τα καλούμε από οποιαδήποτε βάση μας χωρίς να χρειάζεται να αναφερόμαστε σε αυτά με qualified name (πχ db_name.schema_name.obj_name). Να είναι τρόπο τινά system object.
    περισσότερα
  4. antonch
    Κάθε φορά που στο μυαλό σου έρχεται η σκέψη να κάνεις upgrade ένα υπάρχον SQL Server instance ή κάποιες databases σε επόμενη έκδοση τα αισθήματα σου είναι ανάμικτα. Από την μια λες πρέπει να γίνει καθώς θα πάω σε κάτι νέο με περισσότερα χαρακτηριστικά και δυνατότητες και έτσι θα είμαι σε θέση να παρέχω καλύτερες υπηρεσίες στους χρήστες μου. Από την άλλη αναρωτιέσαι αν αυτό θα σου δημιουργήσει προβλήματα καθώς μπορεί κάποια πράγματα μπορεί να μην δουλέψουν γιατί μπορεί να μην υπάρχει συμβατότητα καθώς κάτι μπορεί να μην υποστηρίζεται στην νέα έκδοση. Κάπως έτσι ξεκινάει ο εφιάλτης. Αλλά για μια στιγμή μήπως τελικά ο εφιάλτης είναι πόνημα φαντασίας;
     
    http://www.sqlschool.gr/blog/how-to-deal-with-migration-or-instance-upgrade-nightmares-1023.aspx
  5. antonch
    Συχνά έχω την ερώτηση από μαθητές μου αλλά και από συνεργάτες που ήταν συνηθισμένοι με τα SQL Server 2000 DTS όπου υπήρχε η δυνατότητα να κάνουν export αυτά σε VB code module και να τα καλούν μέσα από τις εφαρμογές τους, πως μπορούν να κάνουν το ίδιο ή σχεδόν το ίδιο με τα SSIS packages.
    Η απάντηση είναι σχετικά απλή και θα σας την παρουσιάσω σε αυτό το post. Όμως θα πρέπει εξ αρχής να επισημάνω ότι απαιτούνται γνώσεις προγραμματισμού σε .net περιβάλλον άνω του μετρίου.
    Επίσης κατά την άποψη μου πρέπει να υπάρχει μια αρκετά καλή εξοικειώσει με το object model των SSIS καθώς αυτό είναι λίγο περίεργο σε σχέση με άλλα, και αυτό πάλι είναι μια προσωπική άποψη που ίσως να μην σας βρει σύμφωνους. Όπως και να έχει όμως η δουλεία μας γίνεται.
    Το SSIS Πακέτο
    Ας πάρουμε τα πράγματα από την αρχή και ας φτιάξουμε ένα απλό SSIS πακέτο (με το όνομα ThePackage) το οποίο θα κάνει κάτι αρκετά απλό.

    Θα έχει ένα Data Flow Task

    το οποίο θα έχει ένα OLEDB Data Source που θα διαβάζει τον πίνακα Products από την Northwind database και θα κάνει export τα δεδομένα του πίνακα σε ένα semicolon( delimited flat file.

    Για να γίνει το παραπάνω θα έχω δύο Connection Managers,

    ένα Flat File Connection Manager με το όνομα FlatFile που θα έχει τα στοιχεία για το flat file που θα κάνουμε export και έναν OLEDB Connection Manager που θα συνδέεται στην Northwind database από την οποία θα διαβάζουμε τον πίνακα Products. Το όνομα αυτού είναι Northwind.
    Για εκπαιδευτικούς λόγους βάζω ένα variable το οποίο δεν θα το χρησιμοποιήσω πουθενά καθώς το πακέτο που φτιάχνω δεν έχει κάποια απαίτηση τέτοια, αλλά θέλω να σας δείξω πως μπορώ να την γεμίσω από την εφαρμογή μου. Το όνομα της variable είναι AVar.

    Το σενάριο μου είναι ότι θέλω να ορίζω κατά την εκτέλεση, από την εφαρμογή μου, του SSIS πακέτου τα connection strings των connection managers αλλά και να θέτω τιμή στην variable.
    Η εγκατάσταση του στον SQL Server
    Αφού το έχω φτιάξει και το έχω δοκιμάσει ότι δουλεύει μέσα από το BIDS (BI Development Studio aka Visual Studio) θέλω να βγάλω deployment manifest ώστε να μπορώ να το κάνω deploy στο SQL Server που θέλω.
    Για να γίνει αυτό πάω πάνω στο SSIS Project στον Solution Explorer και κάνω δεξι κλικ και επιλέγω Properties όπου και μου εμφανίζεται το Property Pages Window. Επιλέγω Deployment Utility από τα Configuration Properties και στα δεξιά εμφανίζονται οι επιλογές αυτού όπου επιλέγω να κάνω true το CreateDeploymentUtility property.

    Με την ολοκλήρωση τις διαδικασίας αυτής και αφού κάνω Build to SSIS Project μου, στο φάκελο Deployment ο οποίος υπάρχει μέσα στο Bin folder του folder που έχω φτιάξει το SSIS Project θα έχω τα παρακάτω αρχεία

    Παίρνω τα περιεχόμενα του φακέλου αυτού και τα πάω στον SQL Server στον οποίο και θέλω να στήσω το πακέτο που. Αφού γίνει αυτό απλά κάνω double click στο αρχείο με το extention SSISDeploymentManifest και ο SSIS Package Installation Wizard ξεκινάει. Στο βήμα που ακολουθεί επιλέγω να κάνω εγκατάσταση στον SQL Server και όχι στο file system και πατώ Next.

    Στο επόμενο βήμα μιας και είμαι πάνω στο SQL Server που θέλω να γίνει η εγκατάσταση κάνω τις εξής επιλογές και πατώ Next.

    Στα επόμενα βήματα πατάω απλά Next μέχρι που θα γίνει η εγκατάσταση στον SQL Server.
    Αφού αυτή ολοκληρωθεί επιτυχώς τότε μέσα από τον SSMS συνδέομαι στα SSIS και θα δω το πακέτο να είναι εγκατεστημένο.

    To Application που θα εκτελεί το SSIS Package
    Ας έρθουμε να φτιάξουμε τώρα το application το οποίο θα καλεί το πακέτο που μόλις βάλαμε στον SQL Server. Με το Visual Studio φτιάχνω ένα console application σε C# στο οποίο για να μπορέσω να χρησιμοποιήσω τον SSIS Runtime θα πρέπει να κάνω reference το Microsoft.SQLServer.ManagedDTS assembly.

    Ο κώδικας που χρειάζεται να έχω γράψει για να μπορέσω να καλέσω μέσα από την εφαρμογή μου είναι ο παρακάτω
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SqlServer.Dts.Runtime;

    namespace CallingSSISPackage
    {
    class Program
    {
    static void Main(string[] args)
    {
    Application app = new Application();

    Package pkg = new Package();
    pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null);

    Variables vars2 = pkg.Variables;
    vars2["AVar"].Value = "20";


    ConnectionManager filemgr = pkg.Connections["FlatFile"];
    filemgr.ConnectionString = @"c:\temp\products4.txt";
    Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString);


    ConnectionManager NWDB = pkg.Connections["Northwind"];
    NWDB.ConnectionString = @"Data Source=SQL2008R2;
    Initial Catalog=Northwind;
    Provider=SQLNCLI10.1;
    Integrated Security=SSPI;";
    Console.WriteLine(pkg.Connections["Northwind"].ConnectionString);

    DTSExecResult rv = pkg.Execute();
    Console.WriteLine("Package Execution results: {0}",rv.ToString());

    Console.Read();
    }
    }
    }

    Ας εξηγήσουμε λίγο τι κάνει αυτός.


    Δημιουργούμε ένα νέο instance του SSIS Application object.


    Application app = new Application();
    Φορτώνουμε το πακέτο από τον SQL Server συνδεόμενοι στο SQL Server με Windows integration όσον αφορά το security

    Package pkg = new Package();
    pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null);

    Θέτουμε τιμή στις διάφορες μεταβλητές (αυτό είναι για εκπαιδευτικούς σκοπούς, δεν κάνει τίποτα η μεταβλητή αυτή μέσα στο πακέτο)


    Variables vars2 = pkg.Variables;
    vars2["AVar"].Value = "20";

    Και το επόμενο είναι ορίσουμε τις τιμές στα connection strings των connection managers που έχω μέσα στο πακέτο μου.


    ConnectionManager filemgr = pkg.Connections["FlatFile"];
    filemgr.ConnectionString = @"c:\temp\products4.txt";
    Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString);


    ConnectionManager NWDB = pkg.Connections["Northwind"];
    NWDB.ConnectionString = @"Data Source=SQL2008R2;
    Initial Catalog=Northwind;
    Provider=SQLNCLI10.1;
    Integrated Security=SSPI;";
    Console.WriteLine(pkg.Connections["Northwind"].ConnectionString);

    Τέλος απλά κάνω την εκτέλεση του SSIS πακέτου και δείχνω το status της εκτέλεσης.


    DTSExecResult rv = pkg.Execute();
    Console.WriteLine("Package Execution results: {0}",rv.ToString());

    Εγκαθιστώντας την εφαρμογή πάνω στον SQL Server και εκτελώντας την όλα θα δουλέψουν μια χαρά εφόσον έχω κάνει login στον server με ένα account το οποίο είναι στους local admins της μηχανής και είναι και sysadmin στον SQL Server.


    H εκτέλεση της εφαρμογής από έναν σταθμό εργασίας


    To ίδιο ισχύει και αν εκτελέσω την εφαρμογή από έναν άλλο σταθμό εργασίας, εφόσον σε αυτόν έχω συνδεθεί με το ίδιο account που χρησιμοποίησα παραπάνω.


    Στην περίπτωση όμως που πάω σε ένα σταθμό εργασίας στο οποίο έχω συνδεθεί με ένα απλό χρήστη που δεν είναι admin και απλά έχει δικαιώματα πρόσβασης στον SQL Server και δικαιώματα read στην Northwind database τότε αρχίσει μια μικρή περιπέτεια.


    Δοκιμάζοντας να εκτελέσω το πακέτο εμφανίζεται το πρώτο μήνυμα λάθους





    Αποφασίζω να πάω και να δώσω πρόσβαση στο συγκεκριμένο χρήστη στην msdb database βάζοντας τον ταυτόχρονα να είναι μέλος του database role που υπάρχει στην msdb db_ssisltduser.


    Στην επόμενη εκτέλεση που θα κάνω θα πάρω το επόμενο διαφορετικό μήνυμα λάθους





    Η επόμενη κίνηση είναι το συγκεκριμένο χρήστη να του δώσω περισσότερα δικαιώματα όσον αφορά την εκτέλεση των SSIS πακέτων και αυτό γίνεται βάζοντας τον στον msdb database role db_ssisoperator. Αυτό έχει σαν αποτέλεσμα όλα να δουλέψουν ομαλά.


    Όλα τα παραπάνω δουλεύουν εφόσον είμαι σε domain environment. Σε διαφορετική περίπτωση θα πρέπει τα accounts να υπάρχουν και στις δύο μηχανές με το ίδιο password.


    Υπάρχουν όμως και άλλες περιπτώσεις που πιθανότατα δεν θα μπορείτε να συνδεθείτε στα Integrations Services για μερικές από αυτές μπορείτε να δείτε αυτό, αλλά γενικά αυτές είναι σπάνιες. Εάν πάντως πέσετε σε κάποια από αυτές θα μπορούσα να σας βοηθήσω εφόσον μου αναφέρεται όλες τις λεπτομέρειες για το πώς προσπαθείτε να κάνετε την εκτέλεση αυτή.


    Αυτή είναι σε γενικές γραμμές η λύση για το πώς εύκολα μπορείτε να καλέσετε ένα SSIS πακέτο μέσα από την εφαρμογή σας.


    /*antonch*/
  6. antonch
    Εάν έχετε βαρεθεί να περιμένετε να ανοίξει το SQL Server Management Studio υπάρχει λύση. Απλά ανοίξτε τον Internet Explorer και πηγαίνεται στα Tools>Internet Options. Στα παράθυρο που θα εμφανιστεί διαλέξτε και το Advanced Tab και εκει βρείτε και κάνετε uncheck το Check for server certificate revocation, κάνετε Apply και restart τον IE. Την επόμενη φορά που θα ανοίξετε τον SSMS θα δείτε την διαφορά .

  7. antonch
    Ο SQL Server 2012 είναι προ των πυλών και πιθανών αρκετοί θα θέλετε να τον δείτε . Από τα βασικά πράγματα που θα πρέπει να έχετε διαθέσιμα είναι τα BOL, που δεν ακολουθούν πλέον το pattern του παρελθόντος.
     
     
     
     
    Τα BOL έχουν αλλάξει μορφή εξαιτίας ότι πλέον το περιβάλλον εργασίας μας είναι μέσα στο Visual Studio 2010 shell και χρησιμοποιούν τον νέο Help Viewer.
     
     
     
    Μέσα από αυτόν σου δίνεται η δυνατότητα να δεις το περιεχόμενο είτε online (στην ουσία χτυπάς το msdn site) είτε offline.
     
     
     
    Για την offline δυνατότητα θα πρέπει να κατεβάσεις το περιεχόμενο τοπικά. Δεν στήνεται με την εγκατάσταση του SQL Server όπως στις προηγούμενες εκδόσεις.
     
     
     
    Για να γίνει κάτι τέτοιο θα πρέπει να το κάνεις με την χρήση του Manage Help Settings (Start > Programs > Microsoft SQL Server 2012 RC > Documentation & Community ).
     
     
     

     
     
     
    Από την επιλογή Choose Online or Local Help επιλέγεις local. Θα πρέπει να το κατεβάσεις όμως και αυτό θα πρέπει να το κάνεις από την επιλογή Install Content from Online με την προϋπόθεση ότι ο server σου βγαίνει στο internet. Τι γίνεται όμως όταν δεν βγαίνει;
     
     
     
    Η λύση είναι απλή πρέπει να κατεβάσεις τα BOL από εδώ και αφού με κάποιο τρόπο τα κάνεις copy/extract στον server σου, από την επιλογή Install Content from disk του Manage help Settingse επιλέγεις το path στο οποίο έχεις κάνει copy/extract τα αρχεία του help και μετά από μια σύντομη διαδικασία γίνονται διαθέσιμα προς χρήση.
     
     
     
    Προσωπική άποψη είναι ότι ακόμα και σε server παραγωγής τα BOL πρέπει να είναι εγκατεστημένα, καθώς μπορεί αν πάσα στιγμή να μου χρειαστούν. Εδώ και πολλά χρόνια έχω πάψει να θυμάμαι σύνταξη εντολών και λεπτομέρειες αυτών, το μόνο που θυμάμαι είναι ότι υπάρχουν και μια γενική εικόνα για αυτές.
     
     
     
    /*
    Keep Rocking with SQL Server 2012
     
    antonch
    */
  8. antonch
    Αφορμή για αυτό το post είναι ένα ερώτημα από ένα φίλο της κοινότητα μας (autoexec.gr). Είναι για τον SQL Server 2005 αλλά μπορείτε να το εφαρμόσετε και στις επόμενες εκδόσεις
    Για να εγκαταστήσουμε το database mail θα πρέπει να ακολουθήσουμε τα παρακάτω βήματα. Μια βασική προυπόθεση είναι να έχουμε ένα smtp server με ένα mail account.
    Ανοίγουμε το SSMS και πάμε

    δεξί κλικ Configure Database Mail

    όπου ο Database mail configuration wizard ξεκινάει
     



     
    Στο ερώτημα αυτό απαντάμε Yes στην ουσία ενεργοποιεί το database mail στον SQL Server. Aν πούμε όχι μετά τα πρέπει να πάμε στο Surface Area Configuration για να το ενεργοποίησουμε

    Δίνουμε ένα αναγνωριστικό στο Profile name και πατάμε Add

     
    Συμπληρώνουμε τα στοιχεία που ζητάει η συγκέκριμένη φόρμα με τα στοιχεία του mail account και του smtp server που αυτό υπάρχει, και πατάμε ΟΚ. Θα γυρίσουμε στην προηγούμενη φόρμα και η εικόνα μας θα είναι κάπως έτσι

    Πατάμε Next κάνουμε τα παρακάτω ανάλογα το πως θέλουμε να είναι το profile μας. Εγώ εδώ ορίζω και τα δύο.


    και πατάμε Next

     
     
     
    Πατάμε Next

    Πατάμε Finish

    Πατάμε Close

    και για να ελέγουμε ότι όλα είναι εντάξει επιλέγουμε Send Test E-Mail

    Αφού βεβαιώθουμε ότι όλα είναι ΟΚ πατάμε ΟΚ

    Έαν στον διάλογο που μας ρωτούσε για το αν θέλουμε να ενεργοποιήσουμε το database mail δεν είχαμε απαντήσει καταφατικά θα πρέπει να πάμε στα configuratio tools του SQL Server και να ανοίξουμε το SQL Server Surface Area Configuration Tool, επιλέγοντας το Surface Area Configuration for Features

    και έπειτα πάμε database mail και κάνουμε κλικ στο Enable Database Mail Stored procedured όπως στη παρακάτω εικόνα

    Εάν τώρα θέλουμε μέσα απο τον SQL Server να στέλνουμε mails τότε θα πρέπει αυτό να γίνει με την χρήση της stored procedure sp_send_dbmail. Ένα παράδειγμα έχω στην παρακάτω εικόνα το οποιο εκτελεί ένα query και στέλνει τα αποτελέσματα στους παραλήπτες που έχουμε ορίσει. Αυτοί μπορεί να είναι πολλοί απλά θα πρέπει στην αντίστοιχη παράμετρο να βάλω τα emails τους χωριζόμενα με semicolon (. Για περισσότερες πληροφορίες για την sp αυτή στα books online.
    Ανοίγουμε ένα νέο query window και εκτελούμε την stored procedure sp_send

     
     
     
     
     
     
     
     
     
    Το αποτέλεσμα θα είναι ο παραλήπτης να δει στο mail box του την παρακάτω εικόνα

  9. antonch
    Πρόσφατα αντιμετώπισα ένα πρόβλημα στα SQL Server 2005 Reporting Services.
    Ενώ όλα ήταν μια χαρά και όλοι μέσα στην εταιρεία δούλευαν μια χάρα, ένα πρωί όπως συμβάνει πάντα σε αυτές τις περιπτώσεις είχαν σπάσει τα τηλέφωνα, είχα 40 mail, και 20 msn χρήστες να θέλουν να μιλήσουν μαζί μου.
    Τι έγινε ρε παιδιά...
    1. πήραμε φωτία;
    2. δεν θα βγει ο Ομπάμα;
    3. θα μας πέσει ο ουρανός στο κεφάλι;
    Τιποτα από όλα αυτά, απλά, όταν πήγαιναν να τυπώσουν είχαν ένα ώραίο μύνημα που τους έλεγε "Unable to load client print control".
    Μετά από ψάξιμο βρήκα ότι η αιτία είναι ότι ένα security patch μπλοκάρει τη εκτέλεση του συγκεκριμένου dll και η λύση είναι
    1. Κατεβάσουμε το Microsoft Report Viewer Redistributable 2005 Service Pack 1
    2. Πάμε και κάνουμε unistall τα security patches KB956803 & KB956391 και από τον server αλλα και από τους clients
    3. Στήνουμε το Microsoft Report Viewer Redistributable 2005 Service Pack 1
    4. Κάνουμε restart τον server
  10. antonch
    Μια από τις αγαπημένες functions που την χρησιμοποιώ αρκετά συχνά ιδιαίτερα σε περιπτώσεις που υπάρχει κάποιο πρόβλημα με συγκεκριμένη βάση είναι η fn_dblog.
    Παρόλο που είναι μια undocumented function εντούτοις είναι ευρέως γνωστή και φυσικά χρησιμοποιούμενη σε όσους σοβαρά ασχολούνται με τον SQL Server.
    Φυσικά είναι μια εναλλακτική λύση για να διαβάσεις τα περιεχόμενα του transaction log καθώς υπάρχουν και άλλοι τρόποι όπως η DBCC LOG και η DBCC LOGINFO που και αυτές είναι undocumented.
    Αυτό που με κάνει να χρησιμοποιώ την fn_dblog() είναι το γεγονός ότι μπορώ να πάρω τα δεδομένα μου σε μορφή table χωρίς να χρησιμοποιώ τεχνικές με temporary tables, καθώς επίσης μπορώ να έχω filtering σε αυτά με ένα απλό where statement πάνω σε αυτή.
    Η fn_dblog δέχεται δύο παραμέτρους τις @start και @end οι οποίες στην ουσία είναι από – έως LSN (Log Sequence Number) και σκοπό όπως είναι αυτονόητο έχουν να περιορίσουν το αποτέλεσμα στο δοσμένο διάστημα των LSNs. Φυσικά μπορείς να περάσεις την τιμή null και στις δύο εφόσον θέλεις να δεις όλο το Transaction Log.
    Στην περίπτωση που θέλεις να δεις το Transaction Log πχ της AdventureWorks2008R2 μπορείς σε ένα query window να δώσεις τα παρακάτω
    use AdventureWorks2008R2
    go

    select * from fn_dblog(null,null)
    go

    Το αποτέλεσμα που θα πάρεις είναι τεράστιο (117 πεδία) και δεν μπορεί να απεικονισθεί ολόκληρο αλλά ένα μικρό δείγμα από αυτό φαίνεται στην παρακάτω εικόνα





    Η χρησιμότητα της συγκεκριμένης function είναι σημαντική καθώς μπορείς να βρεις αν πχ ένα transaction σου είναι μέσα στο backup σου ή να μάθεις πως δουλεύει το checkpoint και πολλά ακόμα…


    Δεν θα ασχοληθώ με αυτά καθώς μπορείτε εύκολα να τα βρείτε στο web με μια απλή αναζήτηση.


    Το πρόβλημα


    Θα ασχοληθώ όμως με κάτι το οποίο αντιμετώπισα όταν άρχισα να χρησιμοποιώ την εν λόγο function και αυτό αφορά το πώς θα την χρησιμοποιήσω με συγκεκριμένες τιμές στις παραμέτρους που δέχεται.


    Όπως ανάφερα παραπάνω η συγκεκριμένη function παίρνει δύο παραμέτρους οι οποίες σου δίνουν την δυνατότητα να περιορίσεις το αποτέλεσμα σου μεταξύ δύο διαφορετικών LSNs (από – έως LSN).


    Βλέποντας το αποτέλεσμα που επιστρέφεται από αυτή στην κολώνα Current LSN, η οποία στην ουσία είναι και αυτή που φιλτράρεται, θα υποθέσει κανείς ότι με τον ίδιο τρόπο θα περάσω και τις τιμές σε αυτές. Αμ δεν είναι έτσι…


    Τι είναι το LSN;


    Για να μπορέσω να δώσω την λύση σε αυτό το πρόβλημα επιστράτευσα τις γνώσεις μου στην ανάγνωση αυτού του «περίεργου αριθμού» που ονομάζεται LSN και τις οποίες πρέπει να μοιραστώ μαζί σας ώστε να γίνει κατανοητή η λύση του.


    Ξεκινώντας θα πρέπει να καταλάβουμε τι είναι το LSN και καλύτερος τρόπος για να μάθουμε για αυτό δεν είναι άλλος από τα BOL όπου στο link αυτό υπάρχει η ερμηνεία του.





    «Every record in the SQL Server transaction log is uniquely identified by a log sequence number (LSN). LSNs are ordered such that if LSN2 is greater than LSN1, the change described by the log record referred to by LSN2 occurred after the change described by the log record LSN.


    The LSN of a log record at which a significant event occurred can be useful for constructing correct restore sequences. Because LSNs are ordered, they can be compared for equality and inequality (that is, , >, =, , >=). Such comparisons are useful when constructing restore sequences.»



    Επίσης εκεί υπάρχει μια αρκετά σημαντική σημείωση





    «LSNs are values of data type numeric(25,0). Arithmetic operations (for example, addition or subtraction) are not meaningful and must not be used with LSNs. »



    Έχοντας αυτό σαν βασική γνώση που όμως δεν φτάνει καθώς θα πρέπει να γνωρίζουμε το Transaction Log Physical Architecture είμαστε σε θέση να μπορούμε αρχικά να διαβάζουμε και να εξηγούμε – κατανοούμε αυτόν τον «περίεργο αριθμό».


    Τα τρία μέρη του LSN


    Όπως έχετε δει ο αριθμός αυτός χωρίζεται σε τρία μέρη:



    Το πρώτο μέρος δείχνει το sequence number του Virtual Log File (VLF).

    Το δεύτερο μέρος δείχνει το offset του log block.

    Το τρίτο μέρος δείχνει τον αριθμό του slot μέσα στο log block.


    Έτσι αν πάρουμε από την παραπάνω εκτέλεση της function το πρώτο LSN που είναι ο 00000030:00000084:0001 και το μεταφράσουμε θα δούμε ότι



    Το VLF sequence number είναι το 00000030 ήτοι 0x30 ήτοι 48 στο δεκαδικό

    Το log block offset είναι το 00000084 ήτοι 0x84 ήτοι 132 στο δεκαδικό

    Το slot number είναι το 1


    Εκτελώντας την DBCC LOGINFO παίρνουμε το παρακάτω αποτέλεσμα





    Από το VLF sequence number μαθαίνουμε ότι είναι το 3o VLF (FSeqNo=48) το οποίο μάλιστα είναι ενεργό (Status=2), αρχίζει από το offset 925696 και το μέγεθος του είναι 458752.


    Επιβεβαιώνοντας πλέον το LSN μπορούμε να περάσουμε σωστά τις παραμέτρους στην fn_dblog.


    H λύση


    Έτσι το 00000030:00000084:0001 γίνεται 48:132:1 και αν πχ θέλουμε να διαβάζουμε μέχρι εκεί αρκεί να δώσουμε το παρακάτω query


    SELECT * FROM fn_dblog(null,N'48:132:1')

    Και το αποτέλεσμα μας θα είναι αυτό που ζητήσαμε !!!





    Keep Rocking with SQL Server


    /*antonch*/
  11. antonch
    Δεν είναι λίγες οι φορές που θέλουμε να αυτοματοποιήσουμε διαδικασίες ή να κάνουμε εργασίες μαζικά χωρίς να μπλέκουμε με το UI στα SQL Server Reporting Services. Για να κάνουμε κάτι τέτοιο πολλές φορές θα χρειαστεί να γράψουμε κάποιο script σε Visual Basic .NET το οποίο θα πρέπει να εκτελεστεί με το rs.exe utility που έχουν τα SSRS.
    more
  12. antonch
    Πρόσφατα αγόρασα ένα netbook για να έχω κάποια πράγματα τα οποία ήθελα μαζί μου και να μην κουβαλάω μεγάλο βάρος. Θέλησα να βάλω Windows 7 αλλά όπως είναι γνωστό dvd αυτά δεν έχουν. Έτσι ψαχνοντας από εδώ και απο εκεί βρήκα την λύση που σας την δίνω εδω http://www.intowindows.com/how-to-install-windows-7vista-from-usb-drive-detailed-100-working-guide/ . Είμαι σίγουρος ότι οι περισσότεροι την ξέρετε αλλα ίσως υπάρχουν κάποιοι που δεν την γνωρίζουν οπότε καλό είναι να την ξέρουν. Βέβαια μπορεί να χρησιμοποιηθεί και για άλλους σκοπούς, ένα bootable USB είναι πάντα χρήσιμο δεν νομίζετε;
  13. antonch
    Σήμερα έλαβα ένα mail από το MVP Program το οποίο με ενημέρωνε ότι έγινα MVP στον SQL Server.
    Ήταν το πρώτο και μοναδικό mail που πήρα για το 2010 και με γέμισε χαρά, ικανοποίηση αλλά και υποχρεώσεις για το μέλλον.
    Θα ήθελα να ευχαριστήσω όλους σας για αυτό και ιδιαίτερα τον Νάσο Κλαδάκη και την Μάρθα Πετροπούλου για την βοήθεια τους και την προτροπή τους στο να προσπαθήσω για τον τίτλο αυτό.
    ΚΑΛΗ ΧΡΟΝΙΑ ΣΕ ΟΛΟΥΣ
  14. antonch
    Με αφορμή το τελευταίο μου SQL Server Saturday Night που σαν θέμα είχε τον SQL Server Profiler και μπορείτε να το δείτε εδώ και στο οποίο αναφέρθηκα στο συγκεκριμένο θέμα αποφάσισα να γράψω το συγκεκριμένο ώστε να δώσω περισσότερες λεπτομέρειες.
    Όπως ανέφερα και στη παρουσίαση μου το ποια events θα διαλέξει κάνεις έχει περισσότερο να κάνει με την εμπειρία που έχει αλλά και την ικανότητα με αυτά να εντοπίσει το εν λόγω πρόβλημα.
    Προσωπικά επιλέγω αυτά που θα σας παραθέσω παρακάτω αλλά αυτό φυσικά δεν είναι το απόλυτο. Ο καθένας από εσάς μπορεί να προσθέσει ή να αφαιρέσει events με τα οποία πιστεύει ότι θα κάνει καλύτερα την αναζήτηση του στο θέμα μας.
    Για να διαβάσετε την συνέχεια του άρθρου κάνετε click εδώ
    Enjoy it!
    antonch
  15. antonch
    Ένα από τα πράγματα τα οποία προσωπικά θεωρώ από τα διαμάντια του SQL Server που έχουμε διαθέσιμα από την έκδοση του SQL Server 2005 (Standard & Enterprise) SP1 είναι το Database Mirroring.

    Μέχρι την εμφάνιση του για να έχω αυτό που όλοι θέλουμε και δεν είναι άλλο από το database availability έπρεπε να καταφύγουμε σε κάποιες λύσεις όπως:

    1. Clustering

    Ιδανική λύση αλλά στοιχίζει αρκετά σε χρήμα τόσο για την υλοποίηση της όσο και στη διαχείριση του.

    2. Replication

    Αξιόπιστη λύση, με κάποια θεματάκια στην υλοποίηση της, αλλά και με κάποιες παραδοχές που πρέπει να λάβουμε ανάλογα με το τι είδος replication θα υλοποιήσουμε και αφορούν στην παλαιότητα της πληροφορίας που θα έχουμε στην replica.

    3. Log Shipping

    Μια ιδανική λύση για αυτούς που δεν έχουν χρήματα για να υλοποιήσουν τις παραπάνω λύσεις, αλλά έχουν την δυνατότητα να υποστούν απώλεια δεδομένων πχ τα transactions των τελευταίων 15 λεπτών. Αλλά έχουν και την πολυτέλεια να έχουν ένα αρκετά υψηλό downtime μέχρι το αντίγραφο να έρθει σε κατάσταση λειτουργίας και να ενημερωθούν όλες οι εφαρμογές να χρησιμοποιούν αυτό πλέον.

    Προσωπικά και χαριτολογώντας πάντα αυτό το ονομάζω το cluster του φτωχού.

    Έχοντας υλοποιήσει στο παρελθόν και τις τρεις λύσεις, έχω μόνο καλά λόγια να πω και για τις τρεις. Απλά θέλω να υποσημειώσω ότι κάθε μία έχει υλοποιηθεί με οδηγό τις ανάγκες του κάθε πελάτη. Για παράδειγμα αν αυτός δεν μπορεί να έχει data loss και θέλει zero downtime δεν θα του βάλεις την 2 και την 3 λυση.



    Σημείωση

    Αν και με την λύση 2 έχοντας ένα transactional replication σε ένα πολύ γρήγορο δίκτυο μπορείς να έχεις παλαιότητα πληροφορίας κάτω από 1 sec

    Τι είναι όμως το Database Mirroring;

    Είναι δυνατότητα που μας δίνει ο SQL Server ώστε να έχω ένα hot standby αντίγραφο της βάσης μου σε ένα άλλο server που είναι σε διαφορετική γεωγραφική περιοχή. Η μόνη απώλεια δεδομένων που θα έχω θα είναι μόνο τα transactions τα οποία ήταν σε εξέλιξη (δεν είχαν προλάβει να γίνουν commit) κατά την στιγμή της καταστροφής της βάσης ή του server, όπως ακριβώς συμβαίνει και με την λύση του cluster.

    Σημείωση

    Το Database Mirroring είναι σε επίπεδο database και όχι σε επίπεδο server όπως το clustering. Αυτό σημαίνει ότι αν στο server της παραγωγής έχω 10 databases θα πρέπει να κάνω Mirror κάθε μια ξεχωριστά.



    ΔΕΝ ΜΠΟΡΩ ΝΑ ΚΑΝΩ MIRROR ΣΤΙΣ SYSTEM DATABASES (MASTER, MSDB, MODEL, TEMPDB)

    Ποια είναι η Αρχιτεκτονική του Database Mirroring;

    Η αρχιτεκτονική του database mirroring είναι σχετικά απλή όπως φαίνεται στο παρακάτω σχεδιάγραμμα.



    Αυτή είναι η απλή λύση όπου έχω τους δύο servers μου. Τον Server της παραγωγής με την βάση μου το ονομάζουν Principal Server ενώ το mirror server τον ονομάζουν Mirror Server. Σε αυτή την περίπτωση όμως αν "σκάσει" ο Principal θα πρέπει με το "χέρι" να φέρω στην ζωή τον Mirror ο οποίος θα γίνει μετά από αυτή την διαδικασία Principal.

    Μα καλά θα πει κάποιος τι σόι διαθεσιμότητα είναι αυτή αν πρέπει να το κάνω με το "χερι"; Είπαμε αυτή είναι η απλή λύση.

    Υπάρχει η κανονική λύση η οποία είναι η παρακάτω:



    Σε αυτή την περίπτωση εμπλέκεται ακόμα ένας server o Witness Server του οποίου η δουλειά είναι να παρακολουθεί το database mirroring έτσι ώστε αν "πέσει" o principal αυτόματα να κάνει principal τον mirror server.

    Σημείωση

    Συνηθίζουμε να ονομάζουμε τους τρεις αυτούς servers (Principal, Mirror, Witness) σαν Mirror Partners ή Partners.



    Προϋποθέσεις και μικρά αλλά σημαντικά μυστικά για την Υλοποίηση

    1. Όλοι οι servers πρέπει να είναι στην ίδια version του SQL Server π.χ 2008. Δεν μπορεί κάποιος από αυτούς να είναι σε 2005

    2. Ο Principal και ο Mirror πρέπει να είναι στην ίδια edition πχ. Standard ή Enterprise

    3. O Witness πρέπει να είναι σε ένα reliable computer system και μπορεί να είναι Standard, Enterprise, Workgroup ή Express edition.

    4. O Mirror server πρέπει να έχει τον χώρο που χρειάζεται η βάση που έχουμε στον Principal.

    5. Στην περίπτωση που θα υλοποιήσουμε το σενάριο high safety with automatic failover σε όλους τους partners το cpu load να είναι μικρότερο από το 50% (ειδικά για τον principal και τον mirror). Και αυτό διότι αν έχουμε cpu overload o failover partner μπορεί να μην μπορέσει να κάνει ping τα άλλα server instances με αποτέλεσμα να έχω unnecessary failover!!!. Εάν αυτό δεν μπορεί να γίνει τότε διαλέξετε κάποιο άλλο από τα διαθέσιμα σενάρια (high safety without automatic failover ή high performance).

    6. Όλοι οι SQL Servers που συμμετέχουν στο database mirroring πρέπει στην master database να έχουν το ίδιο code page και collation, αλλιώς θα έχουμε προβλήματα κατά την διάρκεια του database mirroring setup!.

    7. Για καλύτερο performance είναι καλύτερα να χρησιμοποιηθεί dedicated network adapter για το mirroring.

    8. Εάν έχουμε 32bit system, τότε το database mirroring μπορεί να υποστηρίξει μέχρι 10 databases ανά SQL Server instance εξαιτίας του αριθμού των worker threads τα οποία καταναλώνονται για κάθε database mirroring session.

    9. Το database mirroring υποστηρίζει οποιοδήποτε database compatibility level.

    10. To RESTORE του BACKUP από την principal server στον mirror server πρέπει να γίνει με WITH NORECOVERY.

    11. Μόνο το FULL RECOVERY model υποστηρίζεται στο database mirroring. Αυτό σημαίνει ότι η database που θα κάνω Mirror θα πρέπει να έχει αυτό το recovery model, κανένα

    12. Databases που έχουν Filestream enable δεν μπορούν να γίνουν mirror.

    Ποια είναι τα πλεονεκτήματα του Database Mirroring;

    1. Αυξάνει την ασφάλεια των δεδομένων

    2. Αυξάνει την διαθεσιμότητα της database.

    3. Αυξάνει την διαθεσιμότητα του παραγωγικού περιβάλλοντος στην περίπτωση που θελήσουμε σε αυτό να κάνουμε upgrades.

    Πώς δουλεύει το Database Mirroring;



    Ο principal και ο mirror server έχοντας ένα database mirror session μεταξύ τους και στην ουσία του πράγματος ότι γίνεται στον principal server γινεται redo στον mirror server. Αυτό γίνεται όσο το δυνατό γρηγορότερα και στην πραγματικότητα ο principal server στέλνει κάθε ενεργό transaction log record στον mirror server, ο οποίος με την σειρά του το κάνει στην mirror database.

    Σημείωση

    Δεν είναι όπως στο transactional replication το οποίο είναι σε logical level, εδώ είναι σε physical log record level.

    Το database mirroring session τρέχει είτε σύγχρονα είτε ασύγχρονα. Το αν θα χρησιμοποιήσω κάποιο από αυτά εξαρτάται από τον τρόπο με τον οποίο θέλω να γίνεται το database mirroring, επιλέγοντας ένα από τους παρακάτω:

    1. High Safety (synchronous operation)

    Κάθε φορά που ένα transaction γίνεται στην database του principal, αυτός στέλνει τα active log στον mirror server. O mirror με την σειρά του γράφει το active log που πήρε το δυνατόν γρηγορότερα και αφού το κάνει αυτό τότε o principal server παίρνει ένα μήνυμα ότι mirror server έχει κάνει την δουλειά του και κάνει commit (ο principal).



    Σημείωση

    Ο Mirror δεν κάνει commit απλά γράφει το log στο δίσκο μιας και όπως θα δούμε παρακάτω η database στον mirror server είναι σε φάση restore.

    Μετά από αυτό το status τον database είναι synchronized και όσο διατηρείται το database mirroring session αυτό θα είναι πάντα το ίδιο.

    Στον συγκεκριμένο τρόπο έχω δύο ακόμα επιλογές και αυτές είναι αν θα έχω automatic failover ή όχι. Απλά στην πρώτη περίπτωση πρέπει να έχω και witness server, ο οποίος κοιτάζει αν ο principal είναι στην ζωή και αν δεν τότε σηκώνει τον mirror μόνος του. Στην άλλη περίπτωση θα πρέπει να τον σηκώσω εγώ κάνοντας αλλαγή ρόλου είτε με Τ-SQL είτε μέσα από τα UI

    Σημείωση για τους Developers

    Εάν θέλετε οι εφαρμογές που έχετε φτιάξει αυτόματα να βλέπουν τον mirror όταν πέσει ο principal τότε καλό είναι να χρησιμοποιήσετε το SQL Native Client Access σαν provider στο connection string βάζοντας ακόμα μέσα σε αυτό την επιλογή failover parter στην οποία θα βάζεται το όνομα του Mirror Server ενώ στο Server/Data Source θα έχετε κανονικά τον principal π.χ



    Provider=SQLNCLI10.1; Data Source=ac-demosrv; Failover Partner=ac-demosrv\inst01;…

    Στην περίπτωση που έχετε legacy εφαρμογές υπάρχουν δύο λύσεις που σας προτείνω:

    a) Να έχετε 2 connection strings το ένα να δείχνει στον principal και το άλλο στον mirror. Πάντα χρησιμοποιούμε το πρώτο και αν αυτό είναι κάτω πιάνουμε το timeout error και μετά χρησιμοποιούμε το άλλο

    Με κάποιον τρόπο έχουμε εκτός εφαρμογής το connection string και το αλλάζουμε με το χέρι πχ udl file , registry entry με ότι βέβαια συνεπάγεται αυτό από κόστος σε χρόνο για να γίνει.



    Σημείωση

    Εάν θέλω να αλλάξω τους ρόλους με t-sql θα πρέπει να εκτελέσω το εξής command

    ALTER DATABASE SET PARTNER FAILOVER;

    To ίδιο μπορώ να το κάνω από εάν κάνω δεξί κλικ Properties πάνω στην βάση μου και πάω στην επιλογή Mirroring και πατήσω το κουμπί Failover



    Εδώ πρέπει να τονίσω ότι υπάρχουν και μερικές παραλλαγές αλλά για αυτές δείτε τα BOL.



    Ο τρόπος αυτός προσφέρει ασφάλεια και εγγυάται ότι δεν θα έχω απώλεια δεδεμένων στον mirror server όμως έχω κάποιο performance penalty στον principal όσον αφορά το transaction

    2. High Performance (asynchronous operation)

    Εδώ αν και έχω καλύτερο performance μιας και ή όλη διαδικασία γίνεται ασύγχρονα υπάρχει η πιθανότητα να έχω απώλεια δεδομένων στον Mirror Server. Και αυτό διότι όταν γίνεται το transaction στον Principal Server αυτός στέλνει στον Mirror Server το log αλλά δεν περιμένει να πάρει απάντηση για αν το έκανε ή όχι apply αλλά κάνει commit και φυσικά στέλνει στον client ότι όλα είναι ΟΚ. Αυτό σημαίνει ότι ο Mirror Server μπορεί να είναι πίσω όσον αφορά τα δεδομένα που έχει πάρει και σε περίπτωση που πέσει ο Principal και έρθει στην ζωή θα έχει λιγότερα δεδομένα. Στην περίπτωση αυτή ο Mirror Server είναι DISCONNECTED.

    Αυτός ο τρόπος είναι ιδανικός στην περίπτωση που έχω Principal που είναι oveloaded ή στην περίπτωση που έχω τον Mirror σε WAN το οποίο δεν έχει κάλο δίκτυο.

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


    Εάν χαθεί ο Mirror Server ο Principal πρέπει να κάνει connect στον Witness αν δεν τα καταφέρει τότε ο Principal κάνει την database offline ακόμα και αν μετά συνδεθεί είτε ο Mirror είτε ο Witness.
    Στην περίπτωση που χαθεί ο Principal ο Mirror με την σειρά του πρέπει να κάνει connect στον Witness και αν αυτός είναι μη διαθέσιμος τότε η database δεν θα γίνει διαθέσιμη.
    Bήματα Yλοποίησης του Database Mirrorning με T-SQL (εύκολος τρόπος ;-) )

    Aς δούμε την υλοποίηση με κώδικα t-sql στο demo που ακολουθεί

    Demo Video

    Τον κώδικα της παρουσίασης μπορείτε να τον κάνετε download από εδώ

    Bήματα Yλοποίησης του Database Mirrorning με την χρήση του SSMS (δύσκολος τρόπος ;-) )

    Aφού είδαμε το εύκολο τρόπο ας δούμε τον δυσκολο τρόπο υλοποίησης

    Demo Video

    Σας ευχαριστώ για την προσοχή σας

    Αντώνης
  16. antonch
    Πολλές φορές χρειαζόμαστε σε strings να κάνουμε συγκρίσεις για το αν αυτά είναι όμοια ή πόσο κοντά είναι το ένα στο άλλο. Αυτό όπως καταλαβαίνει κανείς εγκυμονεί αρκετούς κινδύνους, παραδοχές και πολλά ακόμα που πρέπει να λάβουμε υπόψη, ειδικά αν δεν έχουμε βάλει αυστηρούς ελέγχους στο τι πληκτρολογεί ο χρήστης.
    Παρ’ ότι στον SQL Server έχουμε την SOUNDEX και την DIFFERENCE υπάρχουν περιπτώσεις που δεν μας είναι αρκετές για ικανοποιήσουμε τις ανάγκες μας.
    Για αυτές τις περιπτώσεις θα πρέπει να δράσουμε κάπως διαφορετικά και θα πρέπει να δημιουργήσουμε εμείς κάτι το οποίο να καλύπτει τις ανάγκες αυτές.
    περισσότερα
  17. antonch
    Μέσα στα τόσα νέα features που υπάρχουν στον SQL Server 2012 κάποια είναι δημοφιλέστερα από κάποια άλλα. Κάποια τραβάνε εύκολα την προσοχή γιατί πουλάνε περισσότερο κάποια άλλα όχι. Για τα πρώτα θα βρείτε αρκετά άρθρα στον ιστό. Για τα δεύτερα, αυτά που δεν φαίνονται με γυμνό μάτι θα βρείτε λίγα ή καθόλου. Αυτά τα δεύτερα όμως είναι αυτά που κάνουν την ουσιαστική διαφορά και είναι η πεμπτουσία, πάντα κατά την ταπεινή μου γνώμη, στον SQL Server.
    Ένα από αυτά που μου τράβηξαν από την αρχή την προσοχή ήταν τα Indirect Checkpoints.
    Περισσότερα εδώ
  18. antonch
    Εισαγωγή
    Αρκετό καιρό έχω να γράψω ένα μεγάλο άρθρο, έτσι σήμερα μου ήρθε η όρεξη να το κάνω. Έσπαγα το κεφάλι μου να βρω ένα ωραίο θέμα ώστε να σας κεντρίσει το ενδιαφέρον. Αμέσως στο μυαλό μου ήρθε το θέμα που ο τίτλος περιγράφει.
    Γιατί όμως επέλεξα αυτό; Αφορμή για αυτό είναι κάποια γεγονότα και καταστάσεις που αντιμετώπισα τον τελευταίο διάστημα. Επίσης ένας ακόμα σημαντικός λόγος είναι ότι πλέον η εποχή του virtualization είναι πραγματικότητα και μάλιστα χωρίς να το καταλάβεις βρίσκεσαι με ένα μεγάλο αριθμό από τέτοιες μηχανές.
    Σαν σοβαροί επαγγελματίες που θέλουμε να εξοικονομήσουμε χρόνο συνήθως έχουμε προετοιμάσει κάποια base images των λειτουργικών που θέλουμε με εγκατεστημένα τα προϊόντα που εκ προοιμίου θέλουμε, και με την γνωστή διαδικασία (SysPrep) η δημιουργία μιας νέας virtual machine να είναι υπόθεση μερικών λεπτών.
    Σε αυτή την περίπτωση όμως αν είχαμε εγκαταστήσει SQL Server είχαμε να αντιμετωπίσουμε μερικά προβλήματα. Δεν ήταν άλυτα, δεν ήταν φοβέρα. Απλά σου χάλαγαν λίγο την διάθεση και την ευκολία, αλλά τελικά τι δουλεία σου την έκανες (με λίγο γκρίνια βέβαια).
    Όλα αυτά όμως ανήκουν στο παρελθόν. Στον SQL Server 2008 R2 μας δίνεται η δυνατότητα να εγκαταστήσουμε τον SQL Server στο base image μας χωρίς όμως να τον κάνουμε να λειτουργεί. Στην ουσία στήνονται όλα τα binaries, δεν γίνονται όμως configure θέματα που αφορούν computer, network, account-specific information.
    Αυτό μου δίνει τη δυνατότητα να μπορώ ευκολότερα να φτιάξω μια πλειάδα από μηχανές που περιέχουν ετοιμοπόλεμο SQL Server και μάλιστα με το ίδιο configuration!!!
    Τι μπορώ να έχω
    · Με την συγκεκριμένη διαδικασία μπορώ να έχω έτοιμα μόνο τα Database Engine Service & Reporting Services. Τα SQL Server Browser, SQL Server Writer & SQL Server Native Client γίνονται εγκατάσταση όταν τελικά ενεργοποιώ τον SQL Server
    · Μπορώ μετά την προετοιμασία να προσθέσω ή να αφαιρέσω features του SQL Server.
    · Μπορώ να έχω προετοιμάσει πολλά Instances του SQL Server.
    Τι δεν μπορώ
    · Δεν έχω την δυνατότητα να έχω "ετοιμα" SQL Server Analysis Services.
    · Δεν υποστηρίζεται SQL Server Cluster Installation.
    · Δεν υποστηρίζεται η εγκατάσταση των SQL Server Tools (SSMS κλπ)
    · Δεν υποστηρίζεται ΙΑ-64 εγκατάσταση.
    · Δεν μπορώ να κάνω προετοιμασία ένος SQL Server 2008 R2 Instance σε μηχανή που έχει ήδη προηγούμενες εκδόσεις του SQL Server.
    Η διαδικασία προετοιμασίας (Preparation)
    Ξεκινάμε το setup το SQL Server και επιλέγουμε Advanced > Image preparation of a stand-alone instance of SQL Server

    Ξεκινάει η διαδικασία εγκατάστασης όπως την έχουμε συνηθίσει

    Με την ολοκλήρωση της φάσης Setup Support Rules πατάμε OK

    Ακολουθεί η φάση Setup Support Files στην οποία πατάμε Install.

    Η διαδικασία ξεκινάει

    και με την ολοκλήρωση της

    ακολουθούν ο διάλογος με την License Terms όπου φυσικά και επιλέγουμε τα παρακάτω

    Ο επόμενος διάλογος μας δίνει τη δυνατότητα να επιλέξουμε τα features που θέλουμε να έχουμε διαθέσιμα όταν θα ενεργοποιήσουμε το instance μας. Φυσικά όπως είπα και παραπάνω διαθέσιμα δεν είναι όλα

    Αφού επιλέξουμε ο επόμενος διάλογος μας δίνει την δυνατότητα να ορίσουμε κάποιες βασικές πληροφορίες για το instance μας.

    Η βασικότερη είναι το Instance ID. Αυτό χρησιμοποιείται για να ξεχωρίζει τα installation directories και τα registry key του instance σας. Αυτό βέβαια δεν είναι δεσμευτικό όταν θα γίνει η ενεργοποίηση. Μπορείς πχ να ορίσεις σαν Instance ID κάτι και κατά την επόμενη φάση της ενεργοποίησης να δώσεις κάτι άλλο. Απλά το Instance ID θα παραμείνει το ίδιο ώστε να μην υπάρχει αλλαγή όσα παραπάνω ανάφερω.
    Ακολουθούν μερικοί διάλογοι που μας ενημερώνουν για την εξέλιξη της διαδικασίας μας στους οποίους απαντάμε τα βασικά


    Ώσπου φτάνουμε στο σημείο που είμαστε έτοιμοι για την δημιουργία του image. Στο οποίο βλέπουμε τι έχουμε επιλέξει και πατάμε Prepare

    Η διαδικασία ξεκινάει

    και με την ολοκλήρωση της φτάνουμε στον παρακάτω διάλογο

    πριν φύγετε από εδώ καλό είναι να κάνετε κλικ στο link που σας λέει, όπως επίσης και να πάτε στο directory που δείχνει το link αυτό μιας και σε αυτό θα βρείτε το ConfigurationFile.ini το οποίο και μπορείτε να χρησιμοποιήσετε σαν βάση για εγκατάσταση του SQL Server από configuration file
    Με την ολοκλήρωση της διαδικασίας αυτής έχουμε έτοιμο το instance του SQL Server.
    Μπορούμε να προχωρήσουμε στη διαδικασία του Windows SysPrep και να φτίαξουμε μια νέα μηχανή χρησιμοποιώντας το image αυτό το οποίο περιέχει το λειτουργικό μαζί με τον SQL Server.
    Η διαδικασία ενεργοποίησης (Completion)
    Όταν ανοίξουμε την νέα μηχανή και τελειώσουμε με τα του λειτουργικού πάμε στο Start menu και διαλέγουμε μια από τις παρακάτω επιλογές

    και πάμε

    ακολουθούμε τα βήματα


    ώσπου φτάνουμε στον παρακάτω διάλογο στον οποίο επιλέγουμε το προετοιμασμένο μας instance


    Στον παρακάτω διάλογο μπορείς να επιλέξει αν θα το ενεργοποιήσεις σαν default ή named instance

    Ακολουθούν μερικοί διάλογοι με τους οποίους ορίζεις τα παρακάτω





    και φτάνουμε στο σημείο στο οποίο έχουμε δώσει όλες τις απαραίτητες πληροφορίες ώστε να κάνουμε ενεργοποίηση του Instance μας


    Ακολουθούμε τις οδηγίες και τελικά φτάνουμε στο επιθυμητό μας αποτέλεσμα
  19. antonch
    Η ώρα είναι 3:40 πμ (άγρια χαράματα δηλαδή) αλλά ύπνος δεν μου κολλάει. Ίσως φταίει ότι το μεσημέρι έφαγα μια κατσαρόλα λαγό στιφάδο (να είσαι καλά μάνα με την προσφορά σου αυτή) και κατανάλωσα και δύο μπύρες. Όπως είναι φυσικό μετά από τέτοιο τσιμπούσι ο ύπνος είναι απαραίτητος. Έτσι σαν καλό παιδί κοιμήθηκα και ξύπνησα στις 21:00 για να δω ποδόσφαιρο. Αφού τελείωσε λέω “δεν βάζω τον SQL Server 2008 στα Windows 2008 EE που έχω στήσει”. Ξεκίνησα την εγκατάσταση και όλα καλά. Βέβαια θα πρέπει να τονίσω ότι μου έβγαλε το warining για το Windows Firewall αλλά λέω ok θα το λύσω μετά γνωστό είναι…
    Στο ενδιάμεσω μίλαγα με φίλους στον messenger και όταν τελείωσε η εγκατάσταση λέω “αντε να βάλω και το SP1 μιας και χωρίς αυτό δεν θα παίζει τίποτα”.
    Όπως είναι φυσικό υπό την επήρεια του λαγού ξέχασα το windows firewall και η εγκατάσταση κολλούσε. Βρε καλέ μου, βρε γλυκό μου τίποτα. Αφού έκανα και την αντίστοιχη δέηση στην προστάτιδα των απανταχού κομπιουτεράδων την Αγία Θέκλα θυμήθηκα το Windows Firewall.
    Έτσι το έκλεισα προσωρινά και μετά έστησα το SP1 και όπως ήταν φυσικό είδα με χαρά το παρακάτω μήνυμα

    Καλημέρα σε όλους σας
  20. antonch
    Αρκετές φορές υπάρχουν πράγματα τα οποία ερωτεύεσαι από την πρώτη στιγμή και θέλεις να είναι όλα πλέον έτσι. Εδώ και λίγο καιρό έχω αρχίσει να φτιάχνω νέα labs για τον SQL Server 2012 σε περιβάλλον Windows Server 2012 Datacenter Edition. Ο συγκεκριμένος συνδυασμός είναι από αυτά που έχουν συνηθίσει να λέμε ότι τα σπάει.Φυσικά όπως πάντα όλα μου τα labs είναι σε Ηyper-V Virtual Machines. Είναι γνωστή η λατρεία μου για τα virtual environments εδώ και χρόνια έτσι και αλλιώς.
    read more
  21. antonch
    Αν ψάχνετε να εκπαιδευτείτε στον SQL Server 2012 τότε μην περιμένετε άλλο πλέον έχουν ήδη βγει τα σεμινάρια για αυτόν και είμαι όλος χαρά να τα διδάξω και να σας πω τι έχω δει στο SQL Server 2012 τα τελευταία 2 χρόνια που από beta ασχολούμαι μαζί του

    Ποια είναι όμως αυτά τα σεμινάρια και ποίες εξετάσεις αντιστοιχούν σε αυτά:
    περισσότερα

     
  22. antonch
    Πριν από λίγο καιρό στο SQL Server Magazine διάβασα το παρακάτω το οποίο είναι αρκετά ενδιαφέρον μιας και την απάντηση την έχει δώσει ένας άνθρωπος που τον έχει φτίαξει ο Paul Randal, απολαύστε το
    Q: I’ve been wondering about the algorithm for generating log sequence numbers for transaction log records and I’m concerned that with a high enough workload it may be possible to run out of log sequence numbers. What happens in that case?
    A: There’s no need to worry as for all practical purposes it is not possible to run out of log sequence numbers.
    As a bit of background, a log sequence number is a three-part number used to uniquely identify a transaction log record – constructed from the sequence number of the virtual log file (VLF) containing the log record; the log block number within the virtual log file; the log record number within the log block.
    This isn’t really important, but what is important is that the VLF sequence number is a 64-bit number. Whenever a VLF is reused in the transaction log, the VLF sequence is increased by 1. So let’s do a little math…
    Imagine a transaction log with 65536 VLFs, each one a quarter megabyte in size (not a nonsensical situation, depending on how your transaction log is being managed – for more details on this and on transaction log internals, see Importance of proper transaction log size management). Each time the log is completely used and wraps around to the start, the VLF sequence number will increase by 65536, which is 2 to-the-power 16 (2^16).
    A 64-bit number can support 2^64 values. To be able to exhaust the 2^64 possible VLF sequence numbers, our example transaction log would have to wrap 2^64 / 2^16 = 2^48 times. That’s a lot of log wrapping. But how much transaction log does that equate to?
    Our example log is 65536 x 1/4MB in size, which is 16GB. To wrap that log 2^48 times, you’d need to generate 2^48 x 16GB of transaction log. Which equates to 4 billion petabytes (a petabyte = 1024 terabytes) of transaction log – quite an undertaking!
    Even being able to write that log out to an SSD capable of a sustained 600 MB/s, it would take 4 billion petabytes / 600 megabytes = approximately 240 million years to generate 4 billion petabytes of transaction log.
    As you can clearly see – no-one’s in any danger of running out of log sequence numbers!
  23. antonch
    Σε μια μεγάλη εφαρμογή που έχουμε αναπτύξει κάνουμε μεγάλη χρήση του Filestream feature που έχει ο SQL Server.
    Μέχρι σήμερα τα αρχεία, κυρίως φωτογραφίες σε διάφορα formats (png, jpg, bmp) που ανέβαιναν δεν ήταν ιδιαίτερα μεγάλα.
    Σήμερα όμως ήρθαμε αντιμέτωποι με το να ανεβεί ένα αρχείο που είχε μέγεθος 25ΜΒ.
    Φυσικά αυτό δεν μπορούσε να γίνει καθώς δεν επιτρεπόταν από τις default ρυθμίσεις που έχει ο SQL Server καθώς αυτές θέτουν περιορισμό στα 64ΚΒ.
    Η λύση που υπάρχει για αυτό ώστε να επιτρέπονται μεγαλύτερα αρχεία (2GB το μέγιστο) είναι να αλλάξεις την ρύθμιση που ορίζεται από το max text repl size configuration setting
    Αν και αυτό δεν έχει να κάνει με το filestream άμεσα αλλά με το μέγιστο μέγεθος των text, ntext, varchar(max), nvarchar(max), varbinary(max), xml, image data types που γίνονται replicate ή συμμετέχουν σε CDC, όπως αναφέρουν τα BOL, παρόλα αυτά όμως με την ρύθμιση αυτή δίνεται η δυνατότητα να περάσω μεγάλα αρχεία στο filestream
    Όπως ανέφερα και παραπάνω η default τιμή είναι 65536 bytes. Η μέγιστη τιμή είναι 2147483647 bytes και αν βάλεις την τιμή -1 σημαίνει unlimited (μέχρι το max φυσικά)
    Η ρύθμιση αυτή δεν χρειάζεται για ισχύσει να γίνει restart o SQL Server και για την ορίζεις αρκεί να γράψεις σε ένα νέο query window τα παρακάτω
    sp_configure 'max text repl size', -1

    go

    reconfigure

    go

     
  24. antonch
    Βλέποντας μέσα από το forum μας διάφορες συζητήσεις σχετικά με το θέμα του μεγέθους του transaction log (T-Log) διαπίστωσα ότι υπάρχει ένα θολό τοπίο γύρω από το θέμα disaster recovery (backup - restore) πάνω στον SQL Server.
    Πήρα την απόφαση να γράψω για αυτό το θέμα ώστε να το ξεκαθαρίσω μια και καλή διότι είναι τόσο απλό και τόσο δυνατό που είναι αμαρτία από το Θεό να παιδεύεται ο κόσμος.
    Πριν ξεκινήσω να παρουσιάζω το θέμα θα πρέπει να ξεκαθαρίσω, και θα ήθελα αυτό να το έχετε σαν αρχή, στον SQL Server παίρνουμε SQL Server Backup και όχι οτιδήποτε άλλο.
    Μέχρι σήμερα δεν σας έχω πει τίποτα για Ευαγγέλια, όσοι έχετε κάνει μάθημα μαζί μου όμως ξέρετε, σήμερα θα σας πω ένα από αυτά.
    Επίσης θεωρώ φρόνιμο να ρίξετε πρώτα μια ματιά σε αυτό το post μου διότι θα σας φανεί χρήσιμο για να κατανοήσετε το παρόν άρθρο.
    Database Recovery Models
    Πρώτα από όλα θα πρέπει να καταλάβουμε τι είναι τα database recovery models, τι κάνουν, ποια είναι και πως επηρεάζουν το disaster recovery strategy που θα ακολουθήσουμε.
    Simple Recovery Model
    Είναι το απλούστερο μοντέλο το οποίο μπορεί κάποιος να επιλέξει σε μια βάση δεδομένων.
    Ενδείκνυται για :
    1. μικρές βάσεις δεδομένων,
    2. για βάσεις που έχουν μικρό αριθμό αλλαγών (transactions),
    3. για τις περιπτώσεις που θέλουμε να έχουμε μικρό μέγεθος στο T-Log file,
    4. για βάσεις που είναι read-only,
    5. για τις βάσεις που είναι σε φάση development ή δουλεύουν developers με αυτές για την κατασκευή εφαρμογών.
    Το συγκεκριμένο μοντέλο δουλεύει με τον εξής τρόπο, κάθε φορά που γίνεται διαδικασία checkpoint ή φτάνει να γεμίσει το φυσικό αρχείο του T-Log file γίνεται αυτόματα truncate με αποτέλεσμα να επαναχρησιμοποιείτε ο εσωτερικά ελεύθερος χώρος.
    Το μειονέκτημα στο μοντέλο αυτό είναι ότι μπορείς να γυρίσεις στον τελευταίο full backup που έχεις πάρει στην περίπτωση που η βάση σκάσει.
    Full Recovery Model
    Είναι το default recovery model. Όλα τα transactions που γίνονται στην βάση καταγράφονται στην λεπτομέρεια τους σε επίπεδο data page και row και αυτό έχει σαν αποτέλεσμα να χρειάζεται περισσότερος χώρος για το T-Log file. Το πλεονεκτήματα του είναι ότι στις περιπτώσεις που έχω πτώση της βάσης μπορώ να γυρίσω ακριβώς στο σημείο της πτώσης της χάνοντας μόνο τα transactions που την στιγμή της πτώσης ήταν σε εξέλιξη δηλαδή δεν είχαν γίνει commit!.
    Bulk-Logged Recovery Model
    Είναι ίσως αυτό που πολλοί DBA δεν το έχουν καταλάβει πως δουλεύει!. Αυτό κάνει ακριβώς ότι κάνει και το Full Recovery Model με μια σημαντική διαφορά. Καταγράφει τα πάντα σε επίπεδο extent (8 συνεχόμενες σελίδες). Αυτό έχει σαν αποτέλεσμα να μπορώ να γυρίσω πάλι στο σημείο της πτώσης της βάσης αλλά χρειάζομαι περισσότερο χρόνο για να έρθει αυτή σε κατάσταση online.
    Για να γίνει κατανοητό αυτό ας πάρουμε σαν παράδειγμα το εξής:
    Έστω ότι έχω μια βάση που είναι σε Full Recovery Model και φτιάχνω ή συντηρώ κάποιον index που έχω σε αυτή. Αφού έχει τελειώσει η εργασία αυτή έστω ότι έχω πτώση της βάσης. Όταν θα κάνω restore η εργασία αυτή θα είναι έτοιμη. Εάν όμως είμαι σε Bulk-Logged Model τα πράγματα είναι λίγο διαφορετικά. Για να το κάνω πιο κατανοητό ας πούμε ότι καταγράφεται η ενέργεια και όχι το αποτέλεσμα της. Έτσι όταν θα κάνω restore θα πρέπει να ξανακάνει πάλι την ενέργεια αυτή, που όπως γίνεται εύκολα αντιληπτό από την φύση της ενέργειας θα πάρει χρόνο για να την ολοκληρώσει.
    Σε αυτό το μοντέλο όλες οι bulk εργασίες γίνονται logged με το ελάχιστο δυνατό τρόπο. Τέτοιες εργασίες είναι:
    · Bulk imports of data (BCP, BULK INSERT, OPENROWSET with BULK clause)
    · BLOB operations ( WRITETEXT, UPDATETEXT)
    · SELECT INTO statements
    · CREATE/ALTER INDEX, ALTER INDEX REBUILD, DBCC REINDEX
    Το μοντέλο αυτό είναι ιδανικό για περιπτώσεις που έχω data warehouses και βάσεις με μεγάλο όγκο από bulk εργασίες. Το μειονέκτημα του είναι δεν μπορώ να γυρίσω σε συγκεκριμένο σημείο (point-in-time) το οποίο όμως θα δούμε παρακάτω τι είναι αυτό.
    SQL Server Backup Types
    Για να δούμε όμως τις δυνατές επιλογές που έχουμε για backup στον SQL Server. Επίσης θα πρέπει να επισημάνω, κάτι το οποίο ισχύει για όλα τους τύπους, ότι μπορώ να πάρω backup ενώ υπάρχει κόσμος και δουλεύει πάνω στην βάση μου (το λέω γιατί μπορείς κάποιος να μην το έχει καταλάβει ότι αυτό γίνεται). Μπορώ να έχω όσα backups θέλω μέσα στην ημέρα αν αυτό δεν μου δημιουργεί προβλήματα απόδοσης στην βάση κατά τη στιγμή που γίνεται αυτή backup. Ναι υπάρχει κάποιο πέναλτι το οποίο επηρεάζεται από πολλούς παράγοντες όπως ταχύτητα μαγνητικών μέσων, μέγεθος βάσης και τύπος του backup.
    Full Backup
    Είναι η βάση για όλες τις άλλες επιλογές που έχω για backup στον SQL Server. Με άλλα λόγια δεν μπορώ να κάνω πχ Differential, Transaction, Tail-Log κλπ εάν δεν έχω πάρει έστω ένα Full Backup. Στην ουσία παίρνει τα πάντα backup με τον έξης τρόπο. Πρώτα κάνει την διαδικασία checkpoint όπου κατεβάζει με αυτή όλα τα data pages της βάσης, που παίρνω backup, από την buffer cache στον δίσκο και μετά ρουφάει σαν σκούπα hoover τα αρχεία από δίσκο και τα βάζει στο backup μου. Ο χρόνος εκτέλεσης μιας τέτοιας εργασίας είναι πάντα σχετικός με το μέγεθος το δεδομένων μου. Το μέγεθος του backup είναι πάντα το πραγματικό μέγεθος των δεδομένων που έχω στην βάση και όχι το φυσικό μέγεθος των αρχείων που υπάρχουν στο δίσκο. Εάν θέλει κάποιος να κάνει εκτίμηση του μεγέθους του Full Backup σε μια βάση του δεν έχει από το να εκτελέσει την sp_spaceused stored procedure και θα πάρει την απάντηση στο ερώτημα του. Επίσης θα πρέπει να γνωρίζουμε ότι Full Backup μπορώ να πάρω με οποιοδήποτε επιλεγμένο Recovery Model έχω στην βάση μου. Εν κατακλείδι ΠΑΝΤΑ FULL BACKUP είναι η ΒΑΣΗ ΟΛΩΝ.
    Στην ουσία το επόμενο full backup που θα πάρω περιέχει μέσα του όλα τα προηγούμενα.
    Differential Backup
    Για να πάρω Differential Backup πρέπει να έχω πάρει Full Backup. Μπορώ να πάρω diffrential backup με όλα τα recovery models. Κάθε τέτοιου τύπου backup περιέχει ΟΛΕΣ τις αλλαγές που έχουν γίνει από το τελευταίο Full Backup που έχω πάρει. Στην ουσία κάθε νέο differential backup "καταργεί" όλα τα προηγούμενα diffential backups.
    Ας πάρουμε ένα παράδειγμα. Έστω ότι έχω πάρει full backup στις 05:00 και στις 10:00 παίρνω differential backup. Αυτό περιέχει ότι έχει γίνει από τις 05:00 μέχρι τις 10:00. Εάν στις 13:00 ξαναπάρω differential αυτό περιέχει ότι έχει γίνει από τις 05:00 μέχρι τις 13:00.
    Ελπίζω αυτό να έγινε κατανοητό διότι αρκετοί συνάδελφοι πιστεύουν ότι το κάθε differential περιέχει τις αλλαγές από το τελευταίο backup.
    Ιδανικό σενάριο για μεγάλες βάσεις που το full backup παίρνει χρόνο. Επίσης το χρησιμοποιούμε και για να μειώσουμε τον αριθμό των αρχείων αλλά και το χρόνο που θα χρειαστούμε σε περίπτωση που θελήσουμε να κάνουμε restore.
    Transaction Log Backup
    Αυτός ο τύπος backup παίζει μόνο εφόσον στην βάση μου έχω FULL ή BULK-LOGGED Recovery Model.
    Φυσικά για να πάρω T-Log backup θα πρέπει να έχω πάρει ένα full backup. Κάθε T-Log backup περιέχει τα transactions που έχουν γίνει στην βάση μου για το χρονικό διάστημα από το τελευταίο full ή differential ή t-log backup. Ο χρόνος που απαιτείται για αυτό συνήθως είναι μικρός και το πέναλτι στην απόδοση σχεδόν ασήμαντο. Επίσης θα πρέπει να τονιστεί ότι EINAI ΤΟ ΜΟΝΑΔΙΚΟ BACKUP ΠΟΥ ΚΑΝΕΙ TRUNCATE TO LOG FILE. (δείτε το άρθρο μου "Ο θαυμαστός κόσμος του Transaction Log")
    Ας πάρουμε ένα παράδειγμα. Έστω ότι έχω πάρει full backup στις 05:00 και στις 07:00 παίρνω t-log backup αυτό περιέχει τα transactions που έχουν γίνει από τις 05:00 έως τις 07:00. Εάν στις 09:00 πάρω ξανά t-log backup αυτό θα περιέχει τα transactions που έχουν γίνει από τις 07:00 έως τις 09:00.
    Προσοχή: Το κάθε t-log backup χρειάζεται την προηγούμενη βάση του για να γίνει restore. Εάν για παράδειγμα χάσω το t-log backup που πήρα στις 07:00 δεν θα μπορέσω να κάνω restore αυτό που πήρα στις 09:00 αυτό στην ορολογία του SQL Server το ονομάζουμε transaction log chain.
    Tail-Log Backup
    Ένα tail-log backup είναι στην ουσία ένα t-log backup το οποίο περιέχει το κομμάτι του log το οποίο δεν έχει παρθεί backup. Μα θα μου πει κάποιος αυτό δεν είναι t-log backup; Όχι ακριβώς. Για να γίνει κατανοητό θα πάρουμε ένα παράδειγμα. Έστω ότι κάθε μέρα στις 05:00 κάνω full backup και κάθε 2 ώρες από εκεί και μετά t-log backup. Έστω ότι στις 11:30 η βάση μου αποδημεί εις τον Κύριο. Σύμφωνα με αυτά που έχουμε πει μέχρι τώρα στα χέρια μου έχω backups που όταν θα τα κάνω restore θα με γυρίσουν στις 11:00 άρα χάνω ότι έχω κάνει από 11:00-11:30. Ξαναλέω ότι η βάση είναι off. Πριν αρχίσω να κάνω restore θέλω να βάλω στην τσέπη μου αυτό το μισάωρο. Εάν τα καταφέρω τότε θα είμαι σε θέση να γυρίσω στις 11:30. Και τώρα κάποιος θα πει, "και γιατί δεν προσπαθώ να πάρω t-log backup;". Αυτό δεν μπορεί να γίνει διότι πρέπει για μια ακόμα φορά να τονίσουμε ότι κάθε φορά που πάω να πάρω t-log backup αυτός κάνει διαδικασία checkpoint αλλά επειδή η βάση είναι off δεν μπορεί να πάρει και backup. Έτσι παίρνω tail-log backup όπου ρουφάει σαν σκουπα hoover το log file χωρίς να κάνει διαδικασία checkpoint. Μάλιστα από την έκδοση του SQL Server 2005 και σας ζητάει σε κάποιες περιπτώσεις να πάρετε πρώτα tail-log backup και μετά να κάνετε restore. Θα σας εξηγήσω παρακάτω τον τρόπο με τον οποίο μπορείτε να κάνετε κάτι τέτοιο.
    File/Filegroup Backup
    Είναι το δυσκολότερο σε υλοποίηση backup στον SQL Server μιας και πρέπει να ξέρεις αρκετά πράγματα για το πώς είναι δομημένη η βάση στην οποία θέλεις να το εφαρμόσεις. Ας πάρουμε ένα παράδειγμα για να το κατανοήσουμε καλύτερα. Έστω ότι έχω μια βάση που έχει 2 data files και 1 log file, αν και το log δεν με ενδιαφέρει στο συγκεκριμένο τύπο backup το λέω για να μην υπάρχει κάποια παρεξήγηση. Έστω αυτός που σχεδίασε την βάση αποφάσισε να βάλει τους πίνακες που δέχονται τα transactions πχ τιμολόγια, κινήσεις λογιστηρίου στο 2ο data file και όλους τους άλλους στο 1ο data file. Επίσης αυτή η βάση είναι τεράστια και ο χρόνος που χρειάζεται να την πάρεις full backup είναι 10 ώρες (υπερβολικό μεν αλλά το έχω δει σε βάση που είναι κάτι ΤΒ). Σε αυτή την περίπτωση μπορεί να παίρνεις full backup κάθε Κυριακή και κάθε μέρα στις 05:00 κάνεις bakup μόνο το 2ο data file το οποίο περιέχει τις κινήσεις.
    Τώρα κάποιος θα μου πει και το filegroup; Δεν ξέρω αν γνωρίζεται τι είναι το filegroup. Μπορείτε να κοιτάξετε στα BOL του SQL Server αν δεν το ξέρετε, απλά εγώ εδώ θα σας πω ότι είναι λογικές οντότητες μέσα στης οποίες ανήκουν τα data files μιας βάσης. Κάθε filegroup ανήκει σε μια συγκέκριμένη βάση και μπορεί να έχει μέσα του περισσότερα από ένα data files. By default κάθε βάση έχει το primary filegroup στο οποίο ανήκει by default το πρώτο data file της βάσης (.mdf). Εάν στο παραπάνω παράδειγμα αντικαταστήσουμε τα files με filegroup θα έχουμε το ίδιο ακριβώς αποτέλεσμα του backup.
    ΠΡΟΣΟΧΗ ΠΡΟΣΟΧΗ ΠΡΟΣΟΧΗ: ΜΕΤΑ ΑΠΟ ΚΑΘΕ FILE/FILEGROUP BACKUP ΠΑΙΡΝΟΥΜΕ Τ-LOG BACKUP. AYTO EINAI ΑΠΑΡΑΒΑΤΟΣ ΚΑΝΟΝΑΣ. Παίζει με Full & Bulk-Logged Recovery Model.
    Partial Backup
    Στην ουσία είναι το backup κάποιου ή κάποιον filegroup(s). Στο παράδειγμα που σας έδωσα στο file/filegroup backup ας έρθουμε να προσθέσουμε ακόμα ένα data file το οποίο θα ανήκει σε ένα ακόμα filegroup. Έτσι η βάση θα έχει τρία (3) data files έστω τα (a1.mdf,a2.ndf,a3.ndf) και έχω και τρία (3) filegroups το primary που έτσι και αλλιώς το έχω και το fg1 και fg2. Στο primary by default ανήκει το πρώτο data file και έχουμε a2.ndf->fg1 & a3.ndf->fg2. Στο 3ο data file βάζουμε τα δεδομένα που είναι από κλεισίματα προηγούμενων χρήσεων και τα οποία δεν θέλουμε αν τα αλλάζουν οι χρήστες. Αυτό είναι εύκολο να γίνει διότι μπορώ να κάνω το fg2 read-only. Ένα τώρα θελήσω να πάρω partial backup στην ουσία παίρνω full backup απλά προσδιορίζω αν θέλω να πάρω τα read only ή τα read-write filegroups. Παίζει με Full & Bulk-Logged Recovery Model.
    Copy Only
    Από τον SQL Server 2005 και μετά έχουμε διαθέσιμο τον συγκεκριμένο τύπο και ομολογώ ότι ήταν κάτι το οποίο έλειπε από το εργαλείο. Θα καταφύγω πάλι σε παράδειγμα για την κατανόηση του τύπου αυτού. Έστω ότι σε ημερήσια βάση έχω μια πολιτική για το backup σε μια βάση μου που είναι η εξής:
    · Full Backup στις 05:00 πμ
    · Transaction Log Backup κάθε μια ώρα
    Στις 15:00 έρχεται το αφεντικό και μου λέει "Θέλω να πάρεις την βάση έτσι όπως είναι τώρα και να την βάλει στο laptop μου γιατί θέλω να πάω ένα ταξίδι και θέλω να έχω τα δεδομένα μαζί μου". Στις προηγούμενες εκδόσεις είχα θέμα με τέτοιου είδους ερωτήματα. Εάν για παράδειγμα έκανα το λάθος και έκανα full backup στην ουσία κατέστρεφα την αλληλουχία των t-logs backups από τις 15:00 και μετά, διότι αυτά θα είχαν σαν βάση το full backup που μόλις έκανα. Έτσι στην περίπτωση που θα ήθελα να κάνω restore στην συγκεκριμένη ημέρα δεν θα ξεκίναγα από το full backup που πήρα στις 05:00 αλλά από αυτό που πήρα στις 15:00. Εάν ήθελα να γυρίσω πριν τις 15:00 θα ξεκίναγα από των 05:00, αλλά θα έπρεπε να τα κάνω όλα με την σειρά που τα πήρα και φυσικά θα χρειαζόμουν περισσότερο χρόνο. Βέβαια όλα θα ήταν καλά αν το backup στις 15:00 το κρατούσα στο μέσο που παίρνω τα backups μου. Για σκεφτείτε όμως τι θα γίνει αν μετά από την μεταφορά στο laptop του αφεντικού το έσβηνα; Πολύ απλά αν ήθελα να γυρίσω στην συγκεκριμένη μέρα αυτό θα ήταν εφικτό να γίνει αλλά μέχρι τις 14:00 όπου ήταν τα τελευταίο valid t-log backup.
    To Copy Only αυτό ακριβώς το πρόβλημα λύνει. Μπορείς να πάρεις full backup οποιαδήποτε στιγμή μέσα στην ημέρα θέλεις χωρίς να επηρεάζεις την συνέχεια στην πολιτική του backup που έχεις.
    How To Backup Database
    Αφού είδαμε, και ελπίζω να έγιναν κατανοητοί οι διάφοροι τύποι του backup, είναι η στιγμή να δούμε και πως παίρνουμε backup αυτούς. Για να το κάνουμε αυτό μπορούμε να χρησιμοποιήσουμε το SQL Server Management Studio ή T-SQL. Δεν θα δώσω ιδιαίτερη βάση στο περιβάλλον του SSMS διότι κυρίως το χρησιμοποιούμε για να πάρουμε ad-hoc backups. Το T-SQL είναι αυτό που μας χρειάζεται διότι αφού το δοκιμάσουμε μετά το κάνουμε schedule. Ναι ξέρω τι θα μου πείτε ότι μπορώ να το κάνω schedule και μέσα από τον SSMS (Maintenance Plans, κλπ), δεν θα διαφωνήσω μαζί σας απλά πιστεύω ότι ο καλύτερος τρόπος εκμάθησης είναι με T-SQL.
    Backup Devices
    Πριν αρχίσω να σας δείχνω τους τρόπους και τις εντολές backup, θέλω να σας πω μερικά πράγματα σχετικά με τα backup devices στα οποία μπαίνουν τα backups που παίρνουμε. Αυτά μπορεί να είναι είτε στον σκληρό δίσκο σας είτε σε ταινία, θα πρέπει όμως να γνωρίζεται ότι η συσκευή της ταινίας πρέπει να είναι φυσικά συνδεδεμένη στη μηχανή στην οποία έχετε βάλει τον SQL Server. Δεν μπορείς π.χ να πάρεις tape backup σε βάση όταν το tape device είναι συνδεμένο στον domain controler server και έχεις σε άλλο server τον SQL Server. Επίσης για τα disk devices αυτά θα πρέπει να είναι δίσκους που βλέπει φυσικά ο server στον οποίο έχουμε εγκαταστήσει τον SQL Server. Εάν θέλουμε να είναι κάποιος share folder μπορεί να γίνει μόνο με UNC Name και όχι με map drive, και φυσικά το account το οποίο ξεκινάει το sql service να έχει τα απαραίτητα read-write permissions σε αυτό.
    Για να σας κάνω την ζωή ευκολότερη θα σας έλεγα να θεωρήσετε ότι το backup device είναι μια συρταριέρα με πολλά συρτάρια, όπου το κάθε ένα συρτάρι είναι ένα backup που παίρνουμε, οποιουδήποτε τύπου (full, diff, t-log) και από οποιαδήποτε βάση. Το μόνο που θα πρέπει να ξέρω είναι τι έχω σε κάθε συρτάρι, το οποίο φυσικά δεν χρειάζεται να το θυμάμαι μιας υπάρχει τρόπος που θα δούμε παρακάτω πως γίνεται να βρω τι έχω μέσα σε αυτό. Θα σας έδινα όμως μια συμβουλή και αυτή είναι backup device να είναι με backups από μια συγκεκριμένη βάση ώστε να μην χάσετε την μπάλα.
    Υπάρχουν δύο είδη backup devices, τα permanent και τα temporary. Η ουσιαστική διαφορά τους είναι ότι τα permanent τα βλέπεις μέσα από SSMS και μπορείς να τα διαχειριστείς με γραφικό περιβάλλον, ενώ τα temporary μόνο με T-SQL μπορείς να τα διαχειριστείς και φυσικά δεν τα βλέπεις από το SSMS. Υπάρχει ακόμα μία διαφορά σε αυτά και είναι ο τρόπος με τον οποίο δημιουργούνται. Τα permanent δημιουργούνται είτε μέσα από το γραφικό περιβάλλον είτε με T-SQL πριν πάρω κάποιο backup, ενώ τα temporary με την εντολή που θα δώσω για να πάρω backup.
    Για να φτιάξω ένα permanent backup device με το SSMS πάω στο Object Explorer Window > Server Objects > Backup Devices > Right Click > New Backup Device. Στο διάλογο που μας δίνεται δίνουμε το όνομα του device και το destination (disk or tape). Ενώ με T-SQL χρησιμοποιώ την sp_addumpdevice πχ
    EXEC master.dbo.sp_addumpdevice 'disk', 'demodevice', 'C:\....\demodevice.bak'
    GO
    Σημείωση : Μέχρι να βάλω το πρώτο backup στο device αυτό δεν υπάρχει σαν αρχείο στο δίσκο αν είναι τύπου disk.
    Όπως είπα και παραπάνω για να φτιάξω temporary device αυτό γίνεται μόνο με T-SQL και μόνο κατά την στιγμή που πάω να πάρω backup π.χ.
    BACKUP DATABASE demoDB TO DISK='C:\...\tempDevName.bak'
    BACKUP LOG demoDB TO DISK='C:\...\tempDevName.bak'
    BACKUP Statement
    Αντιγραφή από τα SQL Server Books Online.

    Backing Up a Whole Database
    BACKUP DATABASE { database_name | @database_name_var }
    TO [ ,...n ]
    [ ] [ next-mirror-to ]
    [ WITH { DIFFERENTIAL | [ ,...n ] } ]
    [;]
    Backing Up Specific Files or Filegroups
    BACKUP DATABASE { database_name | @database_name_var }
    [ ,...n ]
    TO [ ,...n ]
    [ ] [ next-mirror-to ]
    [ WITH { DIFFERENTIAL | [ ,...n ] } ]
    [;]
    Creating a Partial Backup
    BACKUP DATABASE { database_name | @database_name_var }
    READ_WRITE_FILEGROUPS [ , [ ,...n ] ]
    TO [ ,...n ]
    [ ] [ next-mirror-to ]
    [ WITH { DIFFERENTIAL | [ ,...n ] } ]
    [;]

    Backing Up the Transaction Log (full and bulk-logged recovery models)
    BACKUP LOG { database_name | @database_name_var }
    TO [ ,...n ]
    [ ] [ next-mirror-to ]
    [ WITH { | } [ ,...n ] ]
    [;]
    ::=
    {
    { logical_device_name | @logical_device_name_var }
    | { DISK | TAPE } =
    { 'physical_device_name' | @physical_device_name_var }
    }
    ::=
    MIRROR TO [ ,...n ]
    ::=
    {
    FILE = { logical_file_name | @logical_file_name_var }
    | FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
    }
    ::=
    FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
    [ ,...n ]::=
    --Backup Set Options
    COPY_ONLY
    | { COMPRESSION | NO_COMPRESSION }
    | DESCRIPTION = { 'text' | @text_variable }
    | NAME = { backup_set_name | @backup_set_name_var }
    | PASSWORD = { password | @password_variable }
    | { EXPIREDATE = { 'date' | @date_var }
    | RETAINDAYS = { days | @days_var } }
    --Media Set Options
    { NOINIT | INIT }
    | { NOSKIP | SKIP }
    | { NOFORMAT | FORMAT }
    | MEDIADESCRIPTION = { 'text' | @text_variable }
    | MEDIANAME = { media_name | @media_name_variable }
    | MEDIAPASSWORD = { mediapassword | @mediapassword_variable }
    | BLOCKSIZE = { blocksize | @blocksize_variable }
    --Data Transfer Options
    BUFFERCOUNT = { buffercount | @buffercount_variable }
    | MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable }
    --Error Management Options
    { NO_CHECKSUM | CHECKSUM }
    | { STOP_ON_ERROR | CONTINUE_AFTER_ERROR }
    --Compatibility Options
    RESTART
    --Monitoring Options
    STATS [ = percentage ]
    --Tape Options
    { REWIND | NOREWIND }
    | { UNLOAD | NOUNLOAD }
    --Log-specific Options
    { NORECOVERY | STANDBY = undo_file_name }
    | NO_TRUNCATE
    Θα σταθώ όμως σε μερικά options του BACKUP statement
    Mirror Backup - Enterprise Edition Only
    Με το mirror κάνω αυτό που λέει και η λέξη με μια κίνηση έχω δύο devices που περιέχουν το ίδιο backup. Αυτά όμως πρέπει να είναι του ίδιου τύπου πχ disk και όχι το ένα disk και το άλλο tape. Αρκετά χρήσιμο διότι έτσι εξασφαλίζω ότι θα έχω περισσότερη ασφάλεια.
    Compression Backup - Enterprise Edition Only
    Πολλές φορές μέχρι τώρα για να εξοικονομήσουμε χώρο στο δίσκο αφού τελειώναμε με το backup μας κάναμε compress το device. Πλέον αυτό μπορεί να γίνει αυτόματα από τον SQL Server. Υπάρχει ένα πέναλτι σε χρησιμοποιούμενους πόρους από το σύστημα αλλά είναι πολύ λιγότεροι από αυτούς που χρησιμοποιούσα όταν έκανα μόνος τη διαδικασία με εξωτερικά εργαλεία. Γενικά θα πρέπει να δεις αν το πέναλτι που έχεις αξίζει να το έχεις. Με αυτό θέλω να πω ότι πρέπει να δεις το πόσο compression ratio και αυτό μπορείς να το δεις με αυτό το query
    SELECT backup_size/compressed_backup_size FROM msdb.dbo.backupset
    Striped Backups
    Είναι η δυνατότητα να έχω το backup σε περισσότερα από ένα backup device (μέχρι 64). Χρήσιμο σε περιπτώσεις που βλέπω ότι έχω μια διαδικασία backup να παίρνει μεγάλο χρόνο πχ 4 ώρες, με αυτό μειωνεται ο χρονος στο μισό αν χρησιμοποιήσω 2 backup devices. Ακόμα μια χρήση του είναι όταν έχω πρόβλημα χώρου είτε με το δίσκο που είναι το device είτε με το χώρο τoυ tape (αρκεί βέβαια να έχω δύο tape device).
    How To Restore Database
    Η διαδικασία του restore χωρίζεται σε τρεις φάσεις:
    1. Data Copy Phase
    2. Redo Phase
    3. Undo Phase and Recovery
    Copy Data Phase
    Είναι η πρώτη φάση σε κάθε restore που κάνουμε. Σε αυτή την φάση γίνονται copy όλα (data, log, indexes) από τα backup της βάσης στα database files. Με το τέλος της φάσης αυτής όλα τα περιέχομενα της βάσης έχουν γίνει reset στα περιεχόμενα του backup που κάνουμε restore. Αυτό γίνεται με τα full και differential backups.
    Redo Phase
    Σε αυτή την φάση γίνονται apply όλα τα logged transactions στα δεδομένα που έγιναν copy στην προηγούμενη φάση. Αυτό γίνεται κατά τη στιγμή που γίνονται restore τα transactions log backup. Στην ουσία κοιτάζει ποια transactions που τα logs έχουν δεν υπάρχουν μέσα στα data files και τα κάνει apply.
    Undo Phase and Recovery
    Με το τέλος της προηγούμενης φάσης το επόμενο βήμα είναι βρει τα transactions τα οποία δεν έχουν γίνει commit και κάνει rollback ότι έχουν αυτά κάνει με σκοπό να κρατηθεί η ακεραιότητα και συνοχή των δεδομένων. Αυτό γίνεται διαβάζοντας τα transaction logs. Αφού τελειώσει με την διαδικασία Undo το επόμενο βήμα είναι να προχωρήσει στην επόμενη εσωτερική εργασία της φάσης αυτή που είναι το Recovery Process με την οποία φέρνει στη βάση σε κατάσταση λειτουργίας (online).
    Τι σημαίνουν οι φάσεις αυτές για την διαδικασία Restore;
    Ας απαντήσουμε σε αυτό το κρίσιμο ερώτημα με ένα παράδειγμα. Έστω ότι σε ημερήσια βάση έχουμε το εξής σενάριο για το backup στην βάση μας.
    · FULL BACKUP στις 00:00.
    · DIFFERENTIAL BACKUP στις 06:00, 12:00, 18:00
    · TRANSACTION LOG BACUP κάθε μία ώρα στις εναπομείνασες ώρες
    Στη παρακάτω εικόνα βλέπουμε το σενάριο μας.

    Η ώρα είναι 19:30 και η βάση μας σκάει….
    Τι πρέπει να κάνουμε restore και πως;
    1. Προσπαθούμε να πάρουμε tail-log backup. Εάν το καταφέρουμε γυρνάμε ακριβώς στο σημείο της πτώσης 19:30. Αλλιώς αναγκαστικά γυρνάμε στις 19:00.
    2. Κάνουμε restore to full backup που έχουμε πάρει τα μεσάνυκτα αλλά χωρίς να ενεργοποιήσουμε τις φάσεις 2 & 3. Αυτό γίνεται βάζοντας στην εντολή RESTORE DATABASE το option NORECOVERY. Αυτό το κάνουμε διότι έχουμε να κάνουμε restore και άλλα backups που μας χρειάζονται μέχρι να φτάσουμε στο επιθυμητό σημείου που είναι το σημείο της πτώσης μιας το full backup περιέχει την εικόνα της βάσης όπως ήταν τα μεσάνυκτα.
    3. Επειδή στο σενάριο μας έχουμε differential backups το επόμενο βήμα είναι να κάνουμε restore το ποιο πρόσφατο που έχουμε και δεν είναι άλλο από αυτό των 18:00 όπου και αυτό θα γίνει χωρίς να ενεργοποιήσουμε τις φάσεις 2 & 3. (WITH NORECOVERY).
    4. Μετά κάνουμε restore το t-log backup που έχουμε μετά και αυτό είναι των 19:00. Εδώ τώρα υπάρχουν δύο δρόμοι.
    a. Ο πρώτος δρόμος είναι αυτός που έχει προκύψει από την περίπτωση να μην έχουμε στα χέρια μας tail-log backup. Σε αυτή την περίπτωση με το τέλος του restore θέλουμε να ενεργοποιηθούν οι φάσεις 2 & 3 μιας και δεν έχω κάτι άλλο να κάνω restore έτσι επιλέγω αυτό να το κατεβάζω με την επιλογή WITH RECOVERY, οπότε στο τέλος της θα έχω Online την βάση μου, αλλά θα έχω χάσει αυτή την μίση ώρα.
    b. Ο δεύτερος είναι αυτό που έχει προκύψει από τη περίπτωση να έχω tail-log backup στα χέρια μου. Οπότε επειδή έχω να κάνω restore και αυτό, το t-log backup των 19:00 το κάνω restore χωρίς να ενεργοποιήσω τις φάσεις 2 & 3.
    5. Εφόσον έχω tail-log backup, το κάνω restore και επιλέγω να γίνουν οι φάσεις 2 & 3 (WITH RECOVERY).
    Από το παραπάνω παράδειγμα γίνεται κατανοητό ότι υπάρχει ένας βασικός κανόνας ο οποίος λέει: "ΚΑΝΩ RESTORE ΟΛΑ ΤΑ BACKUPS ΠΟΥ ΕΧΩ ΜΕ ΝΟRECOVERY ΕΚΤΟΣ ΤΟΥ ΤΕΛΕΥΤΑΙΟΥ ΠΟΥ ΤΟ ΚΑΝΩ ΜΕ RECOVERY, ΧΩΡΙΣ ΟΜΩΣ ΝΑ ΞΕΧΝΑΩ ΠΡΙΝ ΚΑΝΩ RESTORE NΑ ΠΡΟΣΠΑΘΗΣΩ ΝΑ ΠΑΡΩ TAIL-LOG BACKUP".
    Restore Statement
    Αντιγραφή από τα SQL Server Books Online.
    --To Restore an Entire Database from a Full database backup (a Complete Restore):
    RESTORE DATABASE { database_name | @database_name_var }
    [ FROM [ ,...n ] ]
    [ WITH
    {
    [ RECOVERY | NORECOVERY | STANDBY =
    {standby_file_name | @standby_file_name_var }
    ]
    | , [ ,...n ]
    | ,
    | ,
    | ,
    | ,
    } [ ,...n ]
    ]
    [;]

    --To perform the first step of the initial restore sequence
    -- of a piecemeal restore:
    RESTORE DATABASE { database_name | @database_name_var }
    [ ,...n ]
    [ FROM [ ,...n ] ]
    WITH
    PARTIAL, NORECOVERY
    [ , [ ,...n ]
    | ,
    ] [ ,...n ]
    [;]

    --To Restore Specific Files or Filegroups:
    RESTORE DATABASE { database_name | @database_name_var }
    [ ,...n ]
    [ FROM [ ,...n ] ]
    WITH
    {
    [ RECOVERY | NORECOVERY ]
    [ , [ ,...n ] ]
    } [ ,...n ]
    [;]

    --To Restore Specific Pages:
    RESTORE DATABASE { database_name | @database_name_var }
    PAGE = 'file:page [ ,...n ]'
    [ , ] [ ,...n ]
    [ FROM [ ,...n ] ]
    WITH
    NORECOVERY
    [ , [ ,...n ] ]
    [;]

    --To Restore a Transaction Log:
    RESTORE LOG { database_name | @database_name_var }
    [ [ ,...n ] ]
    [ FROM [ ,...n ] ]
    [ WITH
    {
    [ RECOVERY | NORECOVERY | STANDBY =
    {standby_file_name | @standby_file_name_var }
    ]
    | , [ ,...n ]
    | ,
    | ,
    } [ ,...n ]
    ]
    [;]

    --To Revert a Database to a Database Snapshot:
    RESTORE DATABASE { database_name | @database_name_var }
    FROM DATABASE_SNAPSHOT = database_snapshot_name

    ::=
    {
    { logical_backup_device_name |
    @logical_backup_device_name_var }
    | { DISK | TAPE } = { 'physical_backup_device_name' |
    @physical_backup_device_name_var }
    }
    ::=
    {
    FILE = { logical_file_name_in_backup | @logical_file_name_in_backup_var }
    | FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
    | READ_WRITE_FILEGROUPS
    }

    [ ,...n ]::=
    --Restore Operation Options
    MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name'
    [ ,...n ]
    | REPLACE
    | RESTART
    | RESTRICTED_USER
    --Backup Set Options
    | FILE = { backup_set_file_number | @backup_set_file_number }
    | PASSWORD = { password | @password_variable }
    --Media Set Options
    | MEDIANAME = { media_name | @media_name_variable }
    | MEDIAPASSWORD = { mediapassword | @mediapassword_variable }
    | BLOCKSIZE = { blocksize | @blocksize_variable }
    --Data Transfer Options
    | BUFFERCOUNT = { buffercount | @buffercount_variable }
    | MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable }
    --Error Management Options
    | { CHECKSUM | NO_CHECKSUM }
    | { STOP_ON_ERROR | CONTINUE_AFTER_ERROR }
    --Monitoring Options
    | STATS [ = percentage ]
    --Tape Options
    | { REWIND | NOREWIND }
    | { UNLOAD | NOUNLOAD }
    ::=
    | KEEP_REPLICATION
    ::=
    | KEEP_CDC
    ::=
    | ENABLE_BROKER
    | ERROR_BROKER_CONVERSATIONS
    | NEW_BROKER
    ::=
    | {
    STOPAT = { 'datetime' | @datetime_var }
    | STOPATMARK = { 'lsn:lsn_number' }
    [ AFTER 'datetime' ]
    | STOPBEFOREMARK = { 'lsn:lsn_number' }
    [ AFTER 'datetime' ]
    }
    ::=
    | {
    STOPAT = { 'datetime' | @datetime_var }
    | STOPATMARK = { 'mark_name' | 'lsn:lsn_number' }
    [ AFTER 'datetime' ]
    | STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }
    [ AFTER 'datetime' ]
    }
    Παράδειγμα Backup
    Ας πάρουμε για παράδειγμα το τελευταίο μας
    · FULL BACKUP στις 00:00.
    · DIFFERENTIAL BACKUP στις 06:00, 12:00, 18:00
    · TRANSACTION LOG BACUP κάθε μία ώρα στις εναπομείνασες ώρες

    1. Φτιάχνω ένα permanent device
    EXEC sp_addumpdevice 'disk','pdev1','c:\temp\pdev1.bak'
    GO
    2. Παίρνω το Full backup στις 00:00
    BACKUP DATABASE BackupDemoDB
    TO PDEV1
    WITH INIT, STATS
    GO
    3. Για το Differential backup το statement είναι
    BACKUP DATABASE BackupDemoDB
    TO PDEV1
    WITH DIFFERENTIAL, STATS
    GO
    3. Για το transaction log backup το statement είναι
    BACKUP LOG BackupDemoDB
    TO PDEV1
    WITH DIFFERENTIAL, STATS
    GO
    Και όπως είπαμε παραπάνω η βάση μου σκάει στις 19:30
    Παράδειγμα Restore
    1. Πρώτη κίνηση είναι να πάρω tail-log backup
    BACKUP LOG BackupDemoDB
    TO PDEV1
    WITH NO_TRUNCATE, STATS
    GO
    2. H επόμενη κίνηση είναι κάνω restore το full backup που έχω από τις 00:00. όμως όλα τα backups τα έχω στο ίδιο backup device. Έτσι πρέπει να μάθω τι θα επιλέξω μέσα από αυτό. Για αυτό το λόγο εκτελώ το statement
    RESTORE HEADERONLY FROM PDEV1
    Από το αποτέλεσμα που θα δω με ενδιαφέρουν τα πεδία BackupType , Position, και DatabaseName για την περίπτωση που έχω backup από διαφορετικές βάσεις στο ίδιο backup device. Εδώ δεν έχουμε.
    Το πεδίο BackupType δείχνει τον τύπο του backup (1=FULL, 5=DIFFERENTIAL, 2=TRANSACTION LOG) και το πεδίο Position την θέση του. Αν θυμάστε πιο πάνω το παράδειγμα με την συρταριέρα είναι ας πούμε το συρτάρι. Έτσι αφού έχουμε τις απαραίτητες πληροφορίες προχωράμε
    3. Κάνουμε restore to full backup με ΝΟRECOVERY μιας και πρόκειτε να κάνουμε restore και άλλα backups. Αλλά για να το επιλέξουμε από το backup device χρησιμοποιούμε το FILE=? όπου αντικαθηστούμε το ? με το αριθμό του Position που έχουμε βρει από το βήμα 2 και στο οποίο αντιστοιχεί το Full backup (BackupType=1)
    RESTORE DATABASE BackupDemoDB FROM PDEV1 WITH FILE=1, NORECOVERY
    4. Κάνουμε restore το differential backup των 18:00
    RESTORE DATABASE BackupDemoDB FROM PDEV1 WITH FILE=19, NORECOVERY
    5. Κάνουμε restore το t-log backup των 19:00
    α. για την περίπτωση που έχουμε tail-log backup από το βήμα 1
    RESTORE LOG BackupDemoDB FROM PDEV1 WITH FILE=20, NORECOVERY
    β. εάν δεν έχουμε tail-log
    RESTORE LOG BackupDemoDB FROM PDEV1 WITH FILE=20, RECOVERY
    6. Εφόσον έχουμε tail-log
    RESTORE LOG BackupDemoDB FROM PDEV1 WITH FILE=21, RECOVERY
    Επίλογος
    Σε αυτό το άρθρο σκοπός μου ήταν να κάνω μια καλή εισαγωγή σε αρεκτό βάθος όμως για το τι είναι backup & restore στον SQL Server. Δεν ασχολήθηκα με κάποια σενάρια πχ file/filegroup backup, όμως είναι κάτι που θα το κάνω σύντομα.
×
×
  • Create New...