Il falso mito della migrazione da una versione di SQL all'altra

Moltissimi DBA conoscono benissimo la seguente regola:

You can migrate a database that was created in an earlier version of SQL Server to a later version. This is a typical database upgrade and is supported. However, you cannot migrate a database that was created in a later version of SQL Server to an earlier version.”

Per moltissimo tempo la regola effettivamente non ha avuto eccezioni ed anche Microsoft, in moltissimi documenti e per bocca del suo Supporto, ha fatto di tutto per diffondere questo messaggio.

NOTA: Ho sottolineato il termine versione perché è proprio qui che si nasconde l’ambiguità !

Ebbene, è un altro falso mito o falsa leggenda metropolitana, ne esistono molti/molte in giro come anche il nostro buon amico Paul Randal (http://www.sqlskills.com/BLOGS/PAUL/) ha largamente documentato in questo documento di notevole interesse:

                http://www.sqlskills.com/BLOGS/PAUL/post/T-SQL-Tuesday-11-Misconceptions-about-EVERYTHING!!.aspx

Beh, almeno un’eccezione esiste, come Vi illustrerò tra poco e sono sicuro che non è l’unica, magari ne parlerò in un altro blog.

Dunque, il documento che ha attirato la mia attenzione è il seguente e tratta del supporto “esteso” al numero massimo di partizioni per singola tabella, passato da 1000 a 15000 con la SP2 di SQL Server 2008 e la SP1 di SQL Server 2008 R2:

                http://download.microsoft.com/download/B/E/1/BE1AABB3-6ED8-4C3C-AF91-448AB733B1AF/Support_for_15000_Partitions.docx

La parte interessante, per quanto riguarda questo mio post, è la seguente:

SQL Server 2008 SP2 databases with support for 15,000 partitions have version number 662, while SQL erver 2008 R2 RTM supports databases with version numbers up to and including 661.

Quello che in pratica è scritto qui smentisce la regola iniziale che ho citato e che è riportata anche nel sudetto documento: in questo specifico caso, non è possibile migrare un database da una istanza SQL Server 2008 SP2 (build 10.0.x.x) ad una più recente (altro termine ambiguo !) SQL 2008 R2 SP1 (build 10.50.x.x), eppure la build è superiore !

L’ambiguità sta proprio nel termine “version” che ho sottolineato più volte, è necessario rifrasare la regola iniziale nel seguente modo:

”You can migrate a database that was created in an earlier version of SQL Server to a later version to a later version if and only if this later version understand/support the existing database version number

In questo caso specifico:

  • Si può migrare un database da SQL Server 2008 SP2 a SQL Server 2008 R2 RTM se non si è abilitato il supporto esteso per le 15000 partizioni;
  • Si può migrare un database da SQL Server 2008 SP2 a SQL Server 2008 R2 SP1;

Un interessante ed importante corollario è il seguente:

“I can migrate a database that was created in a later version of SQL Server to an earlier version if and only if the database version number supported by the target instance is the same or higher of the one stamped in the database itself by the source instance”

Un esempio ? Se avete un database su SQL Server 2008 SP1 potete migrarlo/spostarlo su una nuova/differente istanza SQL Server 2008 RTM, quindi con un differente livello di Service Pack; lo stesso esempio si può fare con SQL Server 2005, in pratica le Service Pack, in genere, ma non è sempre garantito che sia così, non innalzano la “DB version” di un database e se così è, il relativo database può essere portato su una versione precedente (differente livello di SP ma stessa versione) di SQL Server.

Un’ultima annotazione: come si fa a controllare la “DB version” di un database ?

Il modo più semplice è fornito dal seguente comando non documentato (e quindi non supportato ! :)) ma ben noto a molti DBA:

 dbcc dbinfo('AdventureWorks2008')

NOTA: per visualizzare a video il relativo output, dovete prima eseguire il comando DBCC TRACEON(3604) altrimenti il tutto finirà nell’ERRORLOG dell’istanza SQL corrente.

Ecco un estratto di cosa compare a video:

DBINFO STRUCTURE:

 

 

DBINFO @0x0000000012F5D780

 

dbi_dbid = 5 dbi_status = 65544 dbi_nextid = 647673355

dbi_dbname = AdventureWorks2008R2 dbi_maxDbTimestamp = 52000 dbi_version = 661

dbi_createVersion = 661 dbi_ESVersion = 0                   

dbi_nextseqnum = 1900-01-01 00:00:00.000 dbi_crdate = 2010-06-28 15:31:23.283

La parte evidenziata in rosso fornisce l’informazione che cerchiamo, in questo caso la “DB version” è 661 !

Se invece avete fatto un backup del database che volete esaminare, potete anche esaminare una delle tabella di sistema del database MSDB con la seguente semplice query:

 select backup_set_id,database_version 
from msdb.dbo.backupset
where database_name = 'AdventureWorks2008R2'

Come ulteriore possibilità, se non avete le necessarie informazioni in MSDB ma solamente il file BAK, ecco il comando che fa per Voi:

 restore headeronly from disk = 'C:\temp\DB_BACKUP.bak'

L’informazione che cerchiamo è immediatamente visibile nell’output del comando:

Anche per questo post è tutto, buon lavoro a tutti !

 

---Igor Pagliai ---