Predeployment I/O Best Practices
27 marzo 08 09.54 | mbuttazzoni | 1 comment(s)

Su Technet c'è un interessante articolo relativo alle Best Practises di strutturazione e configurazione dello storage per un database server. Basta con i db server "generalisti"! Se le criticità di un sistema risiedono nel volume dei dati e/o nel carico di lavoro, non si deve trascurare la struttura fisica dello storage a disposizione, progettandola in accordo con la struttura dei dati. Invece troppo spesso si incontrano db server con un unico volume in RAID 5, come fosse un qualsiasi file server. Meglio pensarci prima che lamentarsi di un "database lento".

Ecco il link.

Filed under:
SQL 2005 in Cluster, traversie di un setup
14 marzo 08 11.33 | mbuttazzoni | with no comments

Sto ultimando il setup di SQL 2005 Enterprise in cluster attivo/passivo ed approfitto per riportare la sequenza di errori nei quali mi sono imbattuto nel corso dell'installazione e come ne sono venuto fuori.

Scenario: setup di SQL Server 2005 sui nodi di un cluster che precedentemente ospitava servizi di Exchange 2003. Exchange è stato rimosso completamente con successo ed il cluster non è stato reinstallato. Sono state applicate le patch del sistema operativo ed è stato riorganizzato lo storage.

Ho seguito le indicazioni contenute nel documento SQL Server 2005 Failover Clustering White Paper, già segnalata da Luca Bianchi Risorse per Clustering e la sezione Before Installing Failover Clustering su BOL.

BOL ricorda, tra le altre cose di avviare Windows Cryptographic Service Provider e Task Scheduler servie su entrambi i nodi.

Rassicurato da questi controlli preliminari, ma tradito dalla precedente configurazione del cluster dove Task Scheduler era clusterizzato come Generic Service ho iniziato la sarabanda con Task Scheduler clusterizzato.

Risultato il setup esce praticamente subito con errore: 7023 "The task Scheduler service terminated with the following error: The device is not ready".

Chiaro! Il servizio di Task Scheduler è il responsabile dell'installazione su entrambi i nodi. Il setup avviene in contemporanea, e avendo messo i file di setup su un disco clusterizzato, mi faccio una ragione e rimuovo la Task Scheduler dal resource group.

Secondo tentativo: lancio il setup ma ricevo subito un altro errore e l'installazione abortisce. Questa volta la colpa è del fatto che avevo aperte due sessioni RDP, una per ogni nodo, anche se il setup l'ho lanciato ovviamente solo su uno dei due. Faccio logoff da uno delle due sessioni e riparto.

Terzo Tentativo: ancora setup ed ancora un fallimento. I file di log riportano l'indicazione che non è possibile trovare un file. Seguendo le indicazioni di questo thread : agisco così:

 dcomcnfg - component services - computers - my computer
- properties - default protocols
following protocols:
connection orientated tcp/ip (was already installed)
connection orientated SPX
datagram UDP/IP
tunneling TCP/IP

Quarto Episodio: questa volta finalmente il setup sembra reagire alle cure. Tuttavia quando siamo quasi alla fine ricevo l'ennesimo errore: SQL Server Setup could not validate the service accounts. Uffa! avrò sbagliato di digitare la password, penso da ingenuo. Rimuovo da Control Panel Add/Remove program su entrambi i nodi tutto quello che il setup era riuscito a montare, faccio il reboot dei nodi e riparto.

Nel frattempo cancello lo user account indicato per i servizi di SQL dai gruppi amministrativi (SQL Server Administrators, SQL Agent Admins, SQL FTS Admins)

Quarto Episodio, bis: stesso errore di prima. Questa volta scopro che avevo messo la password giusta ma, che essa contiene quotation marks. Vedi in kb http://support.microsoft.com/?id=926621.

Rimuovo allora gli avanzi da Control Panel, e cambio user account, finalmente con una password senza "accidenti" e finalmente il setup arriva fino alla fine!!!

Che sudata!

 

.

Filed under:
Heat Map con Reporting Services 2005
16 dicembre 07 12.43 | mbuttazzoni | with no comments

Segnalo l'interessante post di Andrew Fryer sulla possibilità di colorare le celle di un report in maniera condizionale e produrre un risultato come quello qui riportato!

Questo è il link: http://blogs.technet.com/andrew/archive/2007/12/06/heat-maps-in-sql-server-reporting-services-2005.aspx

il codice della dll è allegato al post di Fryer

 Heat Map w SSRS 2005

Rules to Better SQL Reporting Services 2005
16 dicembre 07 12.12 | mbuttazzoni | with no comments

Adam Cogan MSDN Regional Director pubblica sul sito della sua società un utilissimo repertorio di trips&tricks con Reporting Services 2005. Davvero prezioso

http://www.ssw.com.au/ssw/Standards/Rules/RulesToBetterSQLReportingServices.aspx#BadWordInReport

Disinstallare SQL Server Express Embedded Edition
04 dicembre 07 01.31 | mbuttazzoni | with no comments

Alle volte la rimozione di Windows Sharepoint Services 3.0 (ma pare anche di altri servizi che utilizzano la versione Embedded di SQL Server Express, come WSUS) non rimuovono l'istanza di database server dedicata ed il relativo servizi.

Per fare pulizia ho seguito le indicazioni fornite in questo post http://coppercoins.spaces.live.com/blog/cns!E15FE96DB520E62C!136.entry nel blog Connex' Copper Coins:

  1. da RegEdit andare in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  2. trovare tra le tante presenti la cartella relativa a SQL Server Express Embedded Edition da rimuovere
  3. copiare il contenuto della chiave UninstallString
  4. aprire il prompt di comandi, incollare quanto copiato (per esempio “MsiExec.exe /X{BDD79957-5801-4A2D-B09E-852E7FA64D01}"
  5. Aggiungere di seguito CALLERID=OCSETUP.EXE
  6. Eseguire il comando
  7. e gran finale con il reboot
Filed under:
MOSS, Excel Services e SQL
29 novembre 07 12.10 | mbuttazzoni | with no comments

Ho appena scoperto che tramite Excel Services (disponibili con MOSS 2007 versione enterprise) è NON è possibile accedere a file excel che contengano Tabelle! Ed io che ero convinto di poter utilizzare Excel 2007 come una sorta di report designer per realizzare viste su dati residenti su database SQL Server in maniera furbissima, impiegando le funzionalità di formattazione condizionale di Excel 2007.

Ecco come riprodurre il problema:

da Central Administration di MOSS bisogna verificare le impostazioni di Excel services, facendo attenzione soprattutto a Trusted file locations, Trusted data connection libraries e Trusted data provider.

Una volta che siamo sicuri di quali siano le document libraries servite dagli Excel Services (trusted file locations), possiamo caricare la connessione ODC (utilizzata da Excel) in una delle Trusted Data Connection libraries presenti sul portale.

Per onestà il provider per l'accesso ai dati deve essere presente tra i Trusted Data Provider, ma sarebbe davvero sorprendente non trovarne uno per SQL Server.

a questo punto siamo pronti per creare un nuovo file con Excel 2007: dal ribbon Data -> Get External Data-> Existing Connections, 

  

scegliamo la connessione, pescandola dalle Trusted Data Connection libraries

 

. si apre la finestra "Import Data" con selezionata l'opzione TABLE

Il risultato è che ci ritroviamo in formato tabella i dati pescati da SQL Server. E possiamo divertirci con icone, color bar e quanto Excel 2007 ci offre. Siamo anche in grado di uploadare il file su una document library di MOSS.

Però, quando da browser cerchiamo di aprire il file...

Excel Services si rifiuta di aprire il file!!! perchè contiene la feature non supportate: External data ranges

Il problema è dovuto al fatto che Excel Services NON SUPPORTANO le TABELLE. Possiamo aggirare il problema al momento dell'importazione, indicando di inserire i dati in una PIVOT TABLE.

Ma quanta fatica....

SQL e Sharepoint [2]
18 ottobre 07 06.21 | mbuttazzoni | with no comments

Continuano le (dis-)avventure di un DBA alle prese con Sharepoint e proseguo dal mio precedente post.

In un'installazione tipica di MOSS 2007, (una web application per il portale, più le web application distinte per Shared Services Provider, Personal Sites, amministrazione centrale) ritrovo sul database server 8 distinti database (MOSS_Config, SharePoint_AdminContent_GUID,  SharedServices1_MOSS_DB, SharedServices1_Search_MOSS_DB, WSS_MOSS_Content, WSS_Personal_Content, WSS_Search_MOSS, WSS_SSP_Content). I nomi possono venir impostati al momento del setup, in maniera da ritrovarsi delle entità facilmente riconducibili al rispettivo contenuto, quindi è possibile che, in installazioni differenti, siano diversi da quelli sopra riportati.

Oltre ai database, viene creato sul db server anche un job (nel mio caso SharedServices1_MOSS_DB_Job_DeleteExpiredSessions) incaricato di eliminare le sessioni "spirate" dal database dello stato delle sessioni ovvero "Deletes expired sessions from the session state database."

Meglio saperlo in anticipo e monitorare l'esito di questo job, specialmente nel caso si utilizzi il db server per ospitare più portali o magari un ambiente pilota con il quale provare MOSS. Se i database del portale pilota vengono rimossi dal server alla conclusione del pilota, bisogna ricordarsi di rimuove anche i relativi job. Altrimenti questi continueranno a girare, ma puntando la connessione al primo database (in ordine alfabetico...) e cercheranno di eseguire la stored procedure DeleteExpiredSessions.

 Inoltre osservando con il Profiler cosa succede al db-server che ospita i database di MOSS, ho notato un elevato numero di errori

Error: 1934, Severity: 16, State: 1

Missing Column Statistics :([AllDocs].[LTCheckoutUserId]) .

A fronte di queste segnalazioni ho provveduto a creare le statistiche richieste sui database che contengono la tabella AllDocs (tanto per non sbagliare)

CREATE STATISTICS WS_AllDocs_LTCheckoutUserId
ON AllDocs( LTCheckoutUserId)

e poi (tanto per non sbagliare) a schedulare un sp_updatestats.

Finchè si tratta di aggiornare le statistiche, non è un gran problema. Tuttavia come bisogna comportarsi con gli indici e la frammentazione delle tabelle?

A questo riguardo non ho trovato indicazioni e confesso il timore ad applicare strategie di indicizzazione o tuning a database dedicati ad applicazioni fuori dal mio controllo diretto. Anzi nello specifico i database e le applicazioni sono scritte da MS "in persona": sarà la timidezza, ma prima di fare un dbcc dbreindex ci penso, specialmente se il db pesa molti Gb e magari è utilizzato sia dagli utenti sia dai job di indicizzazione di sharepoint.

Insomma è opportuno per il dba conoscere più da vicino MOSS e lavorare a stretto contatto con gli amministratori di Sharepoint.

 

 

 


 

Filed under:
SQL e Sharepoint: la strana coppia
11 ottobre 07 05.25 | mbuttazzoni | with no comments

La tecnologia Sharepoint (Windows Sharepoint Services e Microsoft Office Sharepoint Server, rispettivamente WSS e MOSS) utilizzano pesantemente SQL Server come repository di praticamente tutto il contenuto dei portali/siti realizzati con tramite Sharepoint stesso.

Il fatto che Sharepoint utilizzi un database server e che Sharepoint sia in grado di immagazzinare dati e presentarli in forma tabellare (le liste per esempio) ha spesso indotto molti a pensare a Sharepoint come ad una specie di "database" oppure, in altri casi, a cercare di accedere direttamente ai contenuti del portale rivolgendosi direttamente a SQL Server.

Si tratta decisamente di errori o fraintendimenti: l'unica maniera "autorizzata" per accedere ai contenuti di Sharepoint è attraverso gli strumenti di programmazione che Sharepoint offre: web services e SDK . Se abbiamo necessità di programmare sul portale dobbiamo scordarci che dietro ci sia un database server.

In verità, con la versione 2007 di MOSS, il numero di database impiegati per un portale è molto cresciuto e la struttura dei database è più "oscura" di quanto non fosse nella versione 2003 di Portal Server. Se nella versione SPS 2003 avevamo tipicamente 4 database per un portale, adesso, in un'installazione base ne ritroviamo il doppio.

Se lo sviluppatore e (almeno in parte) l'amministratore del portale sono invitati a scordarsi dell'esistenza di SQL Server dietro le quinte, cosa invece possiamo dire al DBA che si ritrova sul suo server una decina di nuovi database dei quali non conosce praticamente nulla?

Come devono essere mantenuti? Quale politica di backup implementare, quale recovery model scegliere? Come gestire l'allocazione di spazio e come gestire gli indici? E via discorrendo.

Purtroppo non ho ancora trovato indicazioni esaustive su come attuare una politica di amministrazione di un database server che ospita database di sharepoint. Personalmente ho sempre impostato il recovery model a SIMPLE, perchè - almeno con sps 2003 le capacità native di recupero in caso di errore di un utente erano piuttosto brutali, e c'erano poche alternative ad un ripristino integrale del portale. Detto in questi termini è piuttosto estremistico, però non mi discosto molto dal vero.

E comunque non mi è mai parso sensato implementare una gestione transazionale (con la relativa politica di mantenimento dei log) per un'applicazione della quale non ho sostanziale controllo.

Nei prossimi giorni, vorrei affrontare il discorso dell'indicizzazione e della gestione dei db.

Ogni commento è il benvenuto!

Filed under:
BCP, Stored Procedures e queryout
25 giugno 07 02.46 | mbuttazzoni | with no comments

Probabilmente tutti sapranno già che BCP e Stored Procedure in certi casi non vanno molto daccordo.

Io invece l'ho scoperto solo di recente! ed ovviamente spiaccicandomi brutalmente con il dannato caso reale.

Scenario: Un'applicazione lato server in SQL 2000 deve esportare dati in file di testo su base schedulata. Niente di meglio che usare DTS e stored procedure a manetta: causa altre considerazioni che rimando ad un prossimo post, si è realizzato un DTS che lancia una shell con BPC con l'opzione queryout. Il comando BCP viene composto dinamicamente, seguendo apposite strutture di configurazione e morale l'OUTPUT di una stored procedure viene sbattuto nel file di output.

Dopo un lungo periodo di sereno esercizio del sistema, metto mano ad una delle stored procedure che generano l'output.

La procedura precedente viene riscritta ed ora utilizza delle tabelle temporanee. Viene messo in piedi un meccanismo di logging dei record destinati all'output, per tracciare la corrispondenza tra file in uscita e record utilizzati, in modo che uno stesso record non possa finire in due file distinti.

Ovviamente quando si esegue la procedura direttamente da QA tutto funziona per il verso giusto.

Quando la si fa eseguire dal DTS ovviamente NO! Armati di santa pazienza e di Profiler scopriamo che riceviamo una caterva di errori di tipo 208

Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name #...

Il DTS si suicida e non è affatto chiaro né il come né il perchè. Le tabelle temporanee vengono create rispettando le regole di scope (uso stored procedure annidate e le temp table vengono create nella sp chiamante e referenziate in quelle chiamate), tant'è che da QA tutto è OK.

Forse ci sono dei problemi con l'ottimizzatore di SQL, magari non si tratta di veri e propri errori ma solo di Warning.

Riscrivo comunque la procedura, sostituendo le tabelle temporanee con base table e faccio attenzione a gestire possibili esecuzioni concorrenti della stessa stored procedure, utilizzando gli SPID e marcando i record coinvolti.

Questo work-around risolve i problemi degli errori 208, ma il DTS fallisce ugualmente.

Anzi, seguendo la traccia ottenuta con il Profiler mi pare che il comportamento di SQL sia del tutto delirante: controlli (IF EXISTS) che dovrebbero fallire invece funzionano, UPDATE che dovrebbero agire su una riga non trovano nulla e così via! Un vero incubo.

Non volendo credere di aver a che fare con un server posseduto e non avendo un esorcista a portata di mano, guardo meglio il Profiler e scopro che la stored procedure viene invocata DUE VOLTE di fila!!!!

Non c'è dubbio! Aggiungo istruzioni per loggare le esecuzioni e vedo chiaramente che il DTS, lanciando una BCP via shell di sistema operativo, ESEGUE DUE VOLTE la mia stored procedure.

Ecco spiegato il comportamento delirante a run-time: i controlli logici, dei quali il codice T-SQL era imbottito per garantire la consistenza dei dati, fallivano alla seconda esecuzione, perchè era giusto fosse così. Stolto io a non sapere che, quando BCP scarica su file l'output di una stored procedure con l'opzione QUERYOUT, esegue due volte la stored stessa: la prima per ricavare il formato di uscita, la seconda per ottenere i dati veri e propri.

Finora non ce ne eravamo mai accorti perchè le esportazioni erano ripetibili, ma questa volta, avendo messo in pista un meccanismo di log, il giocattolo si è sfasciato per una delle solite features by design.

In proposito vi segnalo questo illuminante articolo di Nigel Rivett (se solo lo avessi letto prima, avrei rispamiato parecchio sudore freddo)

http://www.simple-talk.com/sql/database-administration/creating-csv-files-using-bcp-and-stored-procedures/

Quale soluzione adottare allora? per ragioni di tempi di sviluppo abbiamo allora preferito abbandonare il BCP e sostituirlo nel package con un ActiveX Script task che usa un banale recordset ado e lo scaraventa su file. Meno performante di sicuro, ma anche molto meno "sorprendente".

Non si finisce mai di imparere ed ora, con una mano sulla coscienza, quanti di voi conoscevano questa particolarità del BCP?

Filed under: ,
Inaugurazione
25 giugno 07 02.32 | mbuttazzoni | 2 comment(s)

Ecco il post inaugurale del mio blog!

Mi sento animato dai migliori propositi e partecipo con piacere alla Comunità Ugiss, capace di offrire sempre graditissime novità.

Cercherò di utilizzare questo blog per raccogliere e condividere le esperienze e le scoperte riguardanti SQL Server. Da parecchi anni sono immerso in SQL Server fin sopra le orecchie, ma non finisco mai di imbattermi in qualche novità. Vale allora la pena di raccogliere proprio qui queste pillole di esperienza e di vita vissuta.

... ed allora si inizi!

buoni post a tutti