Riscontro alcuni strani messaggi di errore su SQL Server 2017 CU3. Sto migrando database e riorganizzando filegroup. "Riorganizzando" intendo che utilizzo una procedura memorizzata che crea una funzione di partizione e uno schema di partizione sul nuovo filegroup per un oggetto, ricostruisce gli indici durante il partizionamento e quindi rimuove il partizionamento.
Alla fine ho alcuni filegroup vuoti. I loro file vengono rimossi . Anche il filegroup stesso viene rimosso. Questo funziona bene nella maggior parte dei casi. Tuttavia per due database ho rimosso i file ... mi è rimasto un filegroup con nessun file associato ma
ALTER DATABASE REMOVE FILEGROUP
genera un errore 5042:
Il filegroup 'xyz' non può essere rimosso perché non è vuoto.
Domanda
Come posso liberarmi di quel filegroup vuoto ... quale potrebbe essere il problema?
Ho già letto alcuni problemi comuni, tuttavia non sono presenti nel mio sistema:
controllato:
SELECT * FROM sys.partition_schemes; SELECT * FROM sys.partition_functions;
0 righe ... nessun oggetto di partizionamento lasciato nel database
UPDATE STATISTICS
per tutti gli oggetti nel databasenessun effetto
Verifica gli indici nel filegroup:
SELECT * FROM sys.data_spaces ds INNER JOIN sys.indexes i ON ds.data_space_id = i.data_space_id WHERE ds.name = 'xyz'
0 righe
Verifica la presenza di oggetti nel filegroup:
SELECT au.*, ds.name AS [data_space_name], ds.type AS [data_space_type], p.rows, o.name AS [object_name] FROM sys.allocation_units au INNER JOIN sys.data_spaces ds ON au.data_space_id = ds.data_space_id INNER JOIN sys.partitions p ON au.container_id = p.partition_id INNER JOIN sys.objects o ON p.object_id = o.object_id WHERE au.type_desc = 'LOB_DATA' AND ds.name ='xyz'
0 righe
Ho anche provato DBCC SHRINKFILE
con il parametro EMPTYFILE
prima di rimuovere il file dal filegroup. Non ha molto senso per me, tuttavia ho letto le soluzioni per descriverlo come una soluzione. Non ha avuto alcun effetto comunque.
Ho avuto qualche speranza leggendo questa domanda per errore del server e ho provato quanto segue:
- Aggiorna tutte le statistiche
- Elimina tutte le statistiche che non sono correlate agli indici
Tuttavia questo non ha avuto effetto. Ho ancora un filegroup senza file associato e il filegroup non può essere eliminato. Sono totalmente perplesso perché ciò accade in alcuni database e non in altri (con la stessa struttura). Quando eseguo DBCC CHECK FILEGROUP
questo filegroup vuoto, ricevo un sacco di messaggi di errore come il seguente:
Impossibile elaborare l'ID set di righe 72057594712162304 dell'oggetto "STORY_TRANSLATIONSCCC" (ID 120387498), indice "Ref90159CCC" (ID 2), poiché risiede sul filegroup "CCC_APPLICATION_new" (ID 8), che non è stato verificato.
Risultati DBCC per "STORY_TRANSLATIONSCCC". Esistono 0 righe in 0 pagine per l'oggetto "STORY_TRANSLATIONSCCC".
È normale o indica qualcosa di insolito?
Questa domanda potrebbe essere un duplicato, tuttavia non riesco a trovare una soluzione funzionante per me in altre domande su dba.stackexchange. Dai un'occhiata all'elenco di ciò che ho già provato. Ciò è identico alle soluzioni descritte in Impossibile rimuovere i filegroup inutilizzati .
Più dettagli
Forse aiuta a capire cosa faccio prima che si verifichi l'errore. Sto pianificando una migrazione a un nuovo server. Attualmente sto testando questo su un'istanza di prova. I database vengono ripristinati dal server prod e il modello di recupero è passato a semplice. Il mio obiettivo è di ristrutturare i filegroup e passare da un modello con un file per filegroup a un modello con due file per gruppo di file. A tal fine, creo nuovi filegroup vuoti con due file ciascuno e sposto i dati. Sfortunatamente la maggior parte degli oggetti ha dati LOB (XML e binari) ... quindi utilizzo il partizionamento come aiuto per spostare anche i dati lob. Alla fine tutti i dati risiedono nei nuovi filegroup e i vecchi filegroup sono vuoti. Quindi rimuovo tutti i file e rimuovo anche il rispettivo filegroup. Il filegroup primario rimane e viene semplicemente aggiunto un altro file.una mia domanda . Questo processo funziona bene ma in due database i file possono essere eliminati ma il filegroup no. Sorprendentemente la struttura di questi database dovrebbe essere la stessa della struttura di altri database in cui non si sono verificati problemi nel processo di spostamento dei dati e rimozione dei vecchi filegroup.
Quindi ecco un elenco di filegroup e file dei due database in cui si verifica il problema:
- CCC_GENTE
prima
+-----------------+------------+
| Filegroup | Filename |
+-----------------+------------+
| CCC_APPLICATION | CCC_APP |
+-----------------+------------+
| CCC_ARCHIVE | CCC_ARCHIV |
+-----------------+------------+
| CCC_AXN | CCC_AXN |
+-----------------+------------+
| CCC_GDV | CCC_GDV |
+-----------------+------------+
| PRIMARY | CCC |
+-----------------+------------+
dopo
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| Filegroup name | Filegroup temporary name | Filename (logical) | Status |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | - | CCC_APP | file removed, filegroup cannot be removed (error) |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | - | CCC_ARCHIV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | - | CCC_AXN | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | - | CCC_GDV | file and filegroup removed |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | CCC | file renamed to PRIMARY_1 |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| PRIMARY | - | PRIMARY_2 | new file added |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_APPLICATION | CCC_APPLICATION_new | CCC_APPLICATION_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_ARCHIVE | CCC_ARCHIVE_new | CCC_ARCHIVE_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_AXN | CCC_AXN_new | CCC_AXN_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_1 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
| CCC_GDV | CCC_GDV_new | CCC_GDV_2 | new filegroup renamed at the end |
+-----------------+--------------------------+--------------------+----------------------------------------------------+
Spero che sia di aiuto. C'è anche un secondo database in cui i nomi dei filegroup sono diversi ma lo lascio per brevità.