DBCC SHRINKDATABASE (Transact-SQL)

  • 07/17/2017
  • 8 perc olvasás
    • p
    • M
    • j
    • i
    • K
    • +12

Ezekre vonatkozik: SQL Server (minden támogatott verzió) Azure SQL Database Azure Synapse Analytics

A megadott adatbázisban lévő adat- és naplófájlok méretének csökkentése.

Transact-SQL szintaxis konvenciók

Szintaxis

DBCC SHRINKDATABASE ( database_name | database_id | 0 ) 
-- Azure Synapse AnalyticsDBCC SHRINKDATABASE ( database_name ) 

Jegyzet

Az SQL Server 2014 és korábbi verziók Transact-SQL-szintaxisának megtekintéséhez lásd a Korábbi verziók dokumentációját.

Argumentumok

database_name | database_id | 0
A zsugorítandó adatbázis neve vagy azonosítója. A 0 azt adja meg, hogy az aktuális adatbázist használja.

target_percent
Az adatbázisfájlban az adatbázis zsugorítása után meghagyott szabad hely százalékos aránya.

NOTRUNCATE
A fájl végéről a kijelölt oldalakat a fájl elején lévő nem kijelölt oldalakra helyezi át. Ez a művelet tömöríti az adatokat a fájlban. target_percent opcionális. Az Azure Synapse Analytics nem támogatja ezt az opciót.

A fájl végén lévő szabad hely nem kerül vissza az operációs rendszerhez, és a fájl fizikai mérete nem változik. Így a NOTRUNCATE megadásakor az adatbázis látszólag nem zsugorodik.

A NOTRUNCATE csak az adatfájlokra alkalmazható. A NOTRUNCATE nem érinti a naplófájlt.

TRUNCATEONLY
A fájl végén lévő összes szabad helyet átadja az operációs rendszernek. Nem mozgat lapokat a fájlon belül. Az adatfájl csak az utolsó kijelölt kiterjedésig zsugorodik. Figyelmen kívül hagyja a target_percent értéket, ha a TRUNCATEONLY opcióval van megadva. Az Azure Synapse Analytics nem támogatja ezt az opciót.

A TRUNCATEONLY a naplófájlt érinti. Ha csak az adatfájlt szeretné csonkítani, használja a DBCC SHRINKFILE parancsot.

WITH NO_INFOMSGS
A 0 és 10 közötti súlyossági szintű információs üzenetek elnyomása.

Eredményhalmazok

A következő táblázat az eredményhalmaz oszlopait ismerteti.

Az oszlop neve Megnevezés
DbId Az adatbázis azonosítószáma, amelyet az adatbázis-motor zsugorítani próbált.
FileId Az adatbázis-motor által zsugorítani próbált fájl azonosítószáma.
CurrentSize A fájl által jelenleg elfoglalt 8 kB-os oldalak száma.
MinimumSize A fájl által minimálisan elfoglalható 8 kB-os oldalak száma. Ez az érték megfelel a fájl minimális méretének vagy eredetileg létrehozott méretének.
UsedPages A fájl által jelenleg használt 8 kB-os oldalak száma.
EstimatedPages A 8 kB-os oldalak száma, amelyre az adatbázis-motor becslése szerint a fájl zsugorítható lenne.

Jegyzet

Az Adatbázis-motor nem jeleníti meg a sorokat a nem zsugorított fájlok esetében.

Megjegyzések

Jegyzet

A parancs futtatása nem ajánlott, mivel ez egy i/o intenzív művelet, és offline állapotba hozhatja az adattárházat. Ráadásul a parancs futtatása után az adattárház pillanatfelvételeinek költségvonzata lesz.

Egy adott adatbázis összes adat- és naplófájljának zsugorításához hajtsa végre a DBCC SHRINKDATABASE parancsot. Egy adott adatbázis egy-egy adat- vagy naplófájljának zsugorításához hajtsa végre a DBCC SHRINKFILE parancsot.

Az adatbázisban lévő szabad (ki nem osztott) hely aktuális mennyiségének megtekintéséhez futtassa a sp_spaceused parancsot.

A DBCC SHRINKDATABASE műveletek a folyamat bármely pontján leállíthatók, és az elvégzett munka megmarad.

Az adatbázis nem lehet kisebb, mint az adatbázis konfigurált minimális mérete. A minimális méretet az adatbázis eredeti létrehozásakor adja meg. Vagy a minimális méret lehet az utolsó, kifejezetten a fájlméret megváltoztatása művelettel beállított méret. Az olyan műveletek, mint a DBCC SHRINKFILE vagy az ALTER DATABASE példák a fájlméret-módosító műveletekre.

Tegyük fel, hogy egy adatbázis eredetileg 10 MB méretűre van létrehozva. Ezután 100 MB-ra nő. Az adatbázis legkisebb mérete akkor is 10 MB-ra csökkenthető, ha az adatbázisban lévő összes adat törlésre került.

A DBCC SHRINKDATABASE futtatásakor vagy a NOTRUNCATE opciót, vagy a TRUNCATEONLY opciót adja meg. Ha ezt nem teszi meg, az eredmény ugyanaz lesz, mintha a DBCC SHRINKDATABASE műveletet NOTRUNCATE opcióval, majd a DBCC SHRINKDATABASE műveletet TRUNCATEONLY opcióval futtatja.

A zsugorított adatbázisnak nem kell egyfelhasználós üzemmódban lennie. Más felhasználók is dolgozhatnak az adatbázisban, amikor az zsugorodik, beleértve a rendszeradatbázisokat is.

Nem zsugoríthat egy adatbázist, miközben az adatbázisról biztonsági mentés készül. Fordítva, nem készíthet biztonsági mentést adatbázisról, miközben az adatbázis zsugorítása folyamatban van.

Hogyan működik a DBCC SHRINKDATABASE

A DBCC SHRINKDATABASE az adatfájlokat fájlonként zsugorítja, de a naplófájlokat úgy zsugorítja, mintha az összes naplófájl egy összefüggő naplóállományban létezne. A fájlok mindig a végétől kezdve zsugorodnak.

Tegyük fel, hogy van néhány naplófájl, egy adatfájl és egy mydb nevű adatbázis. Az adat- és naplófájlok egyenként 10 MB méretűek, az adatfájl pedig 6 MB adatot tartalmaz. Az adatbázis-motor kiszámítja az egyes fájlok célméretét. Ez az érték az a méret, amelyre a fájlt zsugorítani kell. Ha a DBCC SHRINKDATABASE a target_percent értékkel van megadva, az adatbázis-motor a célméretet úgy számítja ki, hogy az a zsugorítás után a fájlban szabadon maradt hely target_percent értéke.

Ha például a mydb zsugorításához 25 target_percent értéket ad meg, az adatbázis-motor az adatfájl célméretét 8 MB-ra számítja (6 MB adat plusz 2 MB szabad hely). Így az Adatbázis-motor az adatfájl utolsó 2 MB-nyi adatát az adatfájl első 8 MB-nyi szabad helyére helyezi át, majd zsugorítja a fájlt.

Tegyük fel, hogy a mydb adatfájl 7 MB adatot tartalmaz. A 30-as target_percent megadása lehetővé teszi, hogy ez az adatfájl a 30-as szabad százalékra zsugorodjon. A 40-es target_percent megadása azonban nem zsugorítja az adatfájlt, mivel az adatbázis-motor nem zsugorít egy fájlt kisebb méretűre, mint amekkorát az adatok jelenleg elfoglalnak.

Ezt a problémát máshogy is elképzelhetjük: A 40 százalék keresett szabad hely + 70 százalék teljes adatfájl (7 MB a 10 MB-ból) több mint 100 százalék. Bármilyen 30-nál nagyobb target_size nem zsugorítja az adatfájlt. Azért nem fog zsugorodni, mert a kívánt szabad hely százalékos aránya plusz az adatfájl által jelenleg elfoglalt százalék több mint 100 százalék.

Naplófájlok esetében az adatbázis-motor a target_percent értéket használja a teljes napló célméretének kiszámításához. Ezért a target_percent a zsugorítási művelet után a naplóban lévő szabad hely mennyisége. A teljes napló célméretét ezután lefordítja az egyes naplófájlok célméretére.

DBCC SHRINKDATABASE megpróbál minden egyes fizikai naplófájlt azonnal a célméretre zsugorítani. Tegyük fel, hogy a logikai logikai fájl egyetlen része sem marad a virtuális naplókban a naplófájl célméretén túl. Ekkor a fájl sikeresen lecsökken, és a DBCC SHRINKDATABASE mindenféle üzenet nélkül befejeződik. Ha azonban a logikai napló egy része a célméreten túl a virtuális naplókban marad, az adatbázis-motor a lehető legtöbb helyet felszabadítja, majd tájékoztató üzenetet ad ki. Az üzenet leírja, hogy milyen műveletekre van szükség ahhoz, hogy a logikai logika a fájl végére kikerüljön a virtuális naplókból. A műveletek végrehajtása után a DBCC SHRINKDATABASE segítségével felszabadítható a fennmaradó hely.

A naplófájl csak a virtuális naplófájl határáig zsugorítható. Ezért előfordulhat, hogy egy naplófájlnak a virtuális naplófájl méreténél kisebb méretűre történő zsugorítása nem lehetséges. Lehet, hogy akkor sem lehetséges, ha nem használják. A virtuális naplófájl méretét az adatbázis-motor dinamikusan választja ki a naplófájlok létrehozásakor vagy bővítésekor.

A legjobb gyakorlatok

Az adatbázis zsugorításának tervezésekor vegye figyelembe a következő információkat:

  • A zsugorítási művelet egy olyan művelet után a leghatékonyabb, amely kihasználatlan helyet hoz létre, például egy tábla törlése vagy egy tábla elhagyása művelet után.
  • A legtöbb adatbázisnak szüksége van némi szabad helyre, hogy a szokásos napi műveletekhez rendelkezésre álljon. Előfordulhat, hogy többször zsugorít egy adatbázist, és azt veszi észre, hogy az adatbázis mérete ismét növekszik. Ez a növekedés azt jelzi, hogy a zsugorított helyre van szükség a rendszeres műveletekhez. Ezekben az esetekben az adatbázis ismételt zsugorítása felesleges művelet.
  • A zsugorítási művelet nem őrzi meg az adatbázisban lévő indexek töredezettségi állapotát, és általában bizonyos mértékig növeli a töredezettséget. Ez az eredmény egy újabb ok arra, hogy ne zsugorítsuk ismételten az adatbázist.
  • Hacsak nincs különleges követelménye, ne állítsa az AUTO_SHRINK adatbázis-opciót ON-ra.

Hibaelhárítás

Elképzelhető, hogy a zsugorítási műveleteket blokkolja egy olyan tranzakció, amely sorverzió-alapú elszigetelési szint alatt fut. Például egy sorverzió-alapú elkülönítési szint alatt futó nagy törlési művelet van folyamatban, amikor a DBCC SHRINK DATABASE művelet végrehajtásra kerül. Ilyen esetben a zsugorítási művelet megvárja a törlési művelet befejezését, mielőtt zsugorítaná a fájlokat. Amikor a zsugorítási művelet várakozik, a DBCC SHRINKFILE és a DBCC SHRINKDATABASE műveletek kiírnak egy tájékoztató üzenetet (5202 az SHRINKDATABASE és 5203 az SHRINKFILE esetében). Ez az üzenet az első órában ötpercenként, majd a következő órában minden következő órában kiíródik az SQL Server hibanaplójába. Ha például a hibanapló a következő hibaüzenetet tartalmazza:

DBCC SHRINKDATABASE for database ID 9 is waiting for the snapshot transaction with timestamp 15 and other snapshot transactions linked to timestamp 15 or with timestamps older than 109 to finish. 

Ez a hiba azt jelenti, hogy a 109-nél régebbi időbélyegzővel rendelkező pillanatfelvétel tranzakciók blokkolják a zsugorítási műveletet. Ez a tranzakció az utolsó tranzakció, amelyet a zsugorítási művelet befejezett. Ez azt is jelzi, hogy a sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dinamikus kezelési nézet transaction_sequence_num vagy first_snapshot_sequence_num oszlopai 15 értéket tartalmaznak. A nézetben a transaction_sequence_num vagy a first_snapshot_sequence_num oszlop olyan számot tartalmazhat, amely kisebb, mint a zsugorítási művelet által befejezett utolsó tranzakció (109). Ha ez így van, a zsugorítási művelet megvárja, amíg ezek a tranzakciók befejeződnek.

A probléma megoldásához a következő feladatok valamelyikét végezheti el:

  • Végezze el a zsugorítási műveletet blokkoló tranzakciót.
  • Végezze el a zsugorítási műveletet. Minden elvégzett munka megmarad.
  • Nem tesz semmit, és hagyja, hogy a zsugorítási művelet megvárja a blokkoló tranzakció befejezését.

Jogosultságok

Elvárja a sysadmin fix kiszolgálói szerepkör vagy a db_owner fix adatbázis szerepkör tagságát.

Példák

A. Adatbázis kicsinyítése és a szabad hely százalékos megadása

A következő példa csökkenti az UserDB felhasználói adatbázis adat- és naplófájljainak méretét, hogy az adatbázisban 10 százalék szabad hely legyen.

DBCC SHRINKDATABASE (UserDB, 10); GO 

B. Adatbázis csonkítása

A következő példa a AdventureWorks mintaadatbázis adat- és naplófájljait az utolsó kijelölt terjedelemre zsugorítja.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY); 

C. Azure Synapse Analytics adatbázisának zsugorítása

DBCC SHRINKDATABASE (database_A);DBCC SHRINKDATABASE (database_B, 10); 

Lásd még

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Adatbázis zsugorítása

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.