lunedì 1 ottobre 2012

CAMBIO COLLATION SU DB MSSQL 2005

Un pò di appunti su come ho fatto a cambiare una collation ad un DB SERVER MSSQL 2005.

Premetto: la collation da cambiare era a livello di master database, e non di singoli database, per i quali il procedimento è un pò più all'acqua di rose...

Allora partiamo con ordine:

Sul server DB giravano (e girano tutt'ora, grazie al cielo....) circa 10 Database, suddivisi in DB che gestiscono l'E.R.P., database di sharepoint, database dei servizi di report mssql e qualche altro DB creato dal cliente...


Sul server DB la collation settata era la SQL_Latin1_General_CP1_CI_AI, dove le ultime due sigle stanno per CASE INSENSITIVE (CI) e ACCENT INSENSITIVE (AI). Tradotto vuol dire che a livello di query, il DB non fa differenza tra maiuscole/minuscole (CI) e tra gli accenti (AI) presenti nei caratteri.

A causa di un aggiornamento richiesto dall'E.R.P. (Enterprise Resource Planning... Ovvero il gestionale aziendale) che andava ad impattare sulla struttura stessa del DB, si è reso necessario il cambio di collation dall'attuale SQL_Latin1_General_CP1_CI_AI alla nuova SQL_Latin1_General_CP1_CI_AS. 

Ora... Non nego che per prima cosa.. ho cercato in tutti i modi di rintracciare colui che aveva fatto l'installazione anni addietro.. In modo da potergli dare qualche legnate sulle gambe. Ma aimè... la ricerca non ha dato esiti positivi.

Ho quindi cominciato a fare un pò di ricerchea tramite google e similari. Alla fine mi sono basato sulle informazioni che foraggia mamma Microsoft, trovate a questa pagina.

Ho provato subito a lanciare (su macchina virtuale di test) il comando menzionato:

 Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName
/SQLSYSADMINACCOUNTS=accounts /[ SAPWD= StrongPassword ]
/SQLCOLLATION=CollationName



Che  come risultato mi ha devastato il DB Server.. Ovvio... Ho quindi ripristinato la macchina virtuale e ho cercato di affinare un pò la tecnica.

Di seguito gli step:
Registriamo tutti i valori di configuraizone a livello di SERVER utilizzando la seguente query: 
SELECT * FROM sys.configurations 
Salvate i risultati in file esterno, sperando che non servano in futuro... Ma non si sa mai. 
Quindi procediamo a registrare eventuali service pack, hotfix, aggiornamenti vari applicati al DBSERVER, in quanto, finita la procedura di cambio collation, questi andranno persi e quindi ci tocca reistallarli. Lanciamo la query:
SELECT
SERVERPROPERTY('ProductVersion ') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel,
SERVERPROPERTY('ResourceVersion') AS ResourceVersion,
SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime,
SERVERPROPERTY('Collation') AS Collation;
Registriamo ora il path corrente di storage per i database di sistema. Il rebuild del Db reinstalla tutti i DB nella posizione originale. Se sono stati spostati (ovvio che si...) occorre poi riportarli alla path di lavoro. Lanciamo la query:

SELECT name, physical_name AS current_file_location
FROM sys.master_files
WHERE database_id IN (DB_ID('master'), DB_ID('model'), DB_ID('msdb'), DB_ID('tempdb'))
Ovviamente, tale query da come ritorno solo le path di lavoro dei DB master, model, msdb, tempdb, ovvero i db di sistema del server. Nessuna informazione relativa agli altri DB utente presenti nel server.

Ora, facciamo un detach di tutti i DB utente presenti nel server. Praticamente, gli unici DB attaccati al server devono rimanere quelli di sistema.

Assicuriamoci di avere una utenza amministrativa. In altre parole, l'utente con il quale ci si accinge a fare il cambio di collation, deve essere PER FORZA una utenza appartenente al gruppo di lavoro MSSQL SYSADMIN. Per avere una idea più chiara dei gruppi di utenza presenti in MSSQL potete visionare l'articolo della Microsoft inerente i Server-Level-Roles.

Assicuriamoci di inserire nel lettore cd/dvd il supporto originale di installazione del DB MSSQL.

Siamo pronti per lanciare il comando (da prompt...) per fare il rebuild del DB e quindi cambiare la collation:

Da prompt dei comandi :

posizioniamoci nella dir di lavoro del SERVER MSSQL che per me era:
 <DRIVE>\program files\microsoft sql server\90\setup\bootstrap

e quindi lanciamo:

setup.exe /QB INSTANCENAME=MSSQLSERVER REINSTALL=SQL_ENGINE REBUILDDATABASE =1 SAPWD=<password utente sa> /SQLSYSADMINACCOUNT=<COMPUTERNAME>administrator SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS.

Un breve cenno sui paramteri:

  • /QB => quite mode.. senza nessun intervento da parte dell'utente.
  • INSTANCENAME => qui, se avete fatto l'installazione del SERVER MSSQL con nome utenza, occorre inserire il nome utenza corretta. Altrimenti la standard (MSSQLSERVER)
  • REINSTALL => reinstalla il server DB
  • REBUILDDATABASE => ricrea da capo i database di sistema
  • SAPWD => la password dell'utente sa (super administrator) del server MSSQL
  • SQLSYSADMINACCOUNT => account amministrativo del server (non del DBSERVER)
  • SQLCOLLATION => la collation da applicare al rebuild del DB
Terminata la procedura (ci ha messo qualche minuto....) rilanciado la query

SERVERPROPERTY('Collation') AS Collation

Il db adesso riporta come collation quella corretta in SQL_Latin1_General_CP1_CI_AS.

Provvediamo a fare l'ATTACH di tutti i db utente.. e il gioco è fatto.

Nessun commento:

Posta un commento

Grazie per aver scritto.

Il tuo commento sarà pubblica appena approvato dall'amministratore del blog.