Menyusutkan database tempdb
Berlaku untuk: SQL Server Azure SQL Managed Instance
Artikel ini membahas berbagai metode yang bisa Anda gunakan untuk menyusutkan tempdb
database di SQL Server.
Anda dapat menggunakan salah satu metode berikut untuk mengubah ukuran tempdb
. Tiga opsi pertama dijelaskan dalam artikel ini. Jika Anda ingin menggunakan SQL Server Management Studio (SSMS), ikuti instruksi di Menyusutkan database.
Metode | Perlu menghidupkan ulang? | Informasi selengkapnya |
---|---|---|
ALTER DATABASE |
Ya | Memberikan kontrol penuh pada ukuran file default tempdb (tempdev dan templog ). |
DBCC SHRINKDATABASE |
No | Beroperasi pada tingkat database. |
DBCC SHRINKFILE |
No | Memungkinkan Anda menyusutkan file individual. |
SQL Server Management Studio | No | Menyusutkan file database melalui antarmuka pengguna grafis. |
Keterangan
Secara default, database dikonfigurasi tempdb
untuk ditumbuhi otomatis sesuai kebutuhan. Oleh karena itu, database ini mungkin secara tak terduga tumbuh tepat waktu ke ukuran yang lebih besar dari ukuran yang diinginkan. Ukuran database yang lebih besar tempdb
tidak berdampak buruk pada performa SQL Server.
Saat SQL Server dimulai, tempdb
dibuat ulang dengan menggunakan salinan model
database, dan tempdb
diatur ulang ke ukuran terakhir yang dikonfigurasi. Ukuran yang dikonfigurasi adalah ukuran eksplisit terakhir yang diatur dengan menggunakan operasi perubahan ukuran file seperti ALTER DATABASE
yang menggunakan MODIFY FILE
opsi atau DBCC SHRINKFILE
pernyataan atau DBCC SHRINKDATABASE
. Oleh karena itu, kecuali Anda harus menggunakan nilai yang berbeda atau mendapatkan resolusi langsung ke database besar tempdb
, Anda dapat menunggu mulai ulang layanan SQL Server berikutnya agar ukurannya berkurang.
Anda dapat menyusut tempdb
saat tempdb
aktivitas sedang berlangsung. Namun, Anda mungkin mengalami kesalahan lain seperti pemblokiran, kebuntuan, dan sebagainya, yang dapat mencegah penyusutan selesai. Oleh karena itu, untuk memastikan bahwa penyusutan tempdb
berhasil, kami sarankan Anda melakukan ini saat server berada dalam mode pengguna tunggal atau ketika Anda menghentikan semua tempdb
aktivitas.
SQL Server hanya mencatat informasi yang tempdb
cukup dalam log transaksi untuk mengembalikan transaksi, tetapi tidak mengulangi transaksi selama pemulihan database. Fitur ini meningkatkan performa INSERT
pernyataan di tempdb
. Selain itu, Anda tidak perlu mencatat informasi untuk mengulangi transaksi apa pun karena tempdb
dibuat ulang setiap kali Anda menghidupkan ulang SQL Server. Oleh karena itu, tidak memiliki transaksi untuk digulirkan ke depan atau untuk menggulung balik.
Untuk informasi selengkapnya tentang mengelola dan memantau tempdb
, lihat Perencanaan kapasitas dan Memantau penggunaan tempdb.
Gunakan perintah ALTER DATABASE
Catatan
Perintah ini hanya beroperasi pada file tempdev
logis default tempdb
dan templog
. Jika lebih banyak file ditambahkan ke tempdb
, Anda dapat menyusutkannya setelah memulai ulang SQL Server sebagai layanan. Semua tempdb
file dibuat ulang selama pengaktifan. Namun, mereka kosong dan dapat dihapus. Untuk menghapus file tambahan di tempdb
, gunakan ALTER DATABASE
perintah dengan REMOVE FILE
opsi .
Metode ini mengharuskan Anda untuk memulai ulang SQL Server.
Hentikan SQL Server.
Pada prompt perintah, mulai instans dalam mode konfigurasi minimum. Untuk melakukan ini, ikuti langkah-langkah berikut:
Pada prompt perintah, ubah ke folder tempat SQL Server diinstal (ganti
<VersionNumber>
dan<InstanceName>
dalam contoh berikut):cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
Jika instans adalah instans bernama SQL Server, jalankan perintah berikut (ganti
<InstanceName>
dalam contoh berikut):sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
Jika instans adalah instans default SQL Server, jalankan perintah berikut:
sqlservr -c -f -mSQLCMD
Catatan
Parameter
-c
dan-f
menyebabkan SQL Server dimulai dalam mode konfigurasi minimum yang memilikitempdb
ukuran 1 MB untuk file data, dan 0,5 MB untuk file log. Parameter-mSQLCMD
mencegah aplikasi lain selain sqlcmd mengambil alih koneksi pengguna tunggal.
Sambungkan ke SQL Server dengan sqlcmd, lalu jalankan perintah Transact-SQL berikut. Ganti
<target_size_in_MB>
dengan ukuran yang diinginkan:ALTER DATABASE tempdb MODIFY FILE (NAME = 'tempdev', SIZE = <target_size_in_MB>); ALTER DATABASE tempdb MODIFY FILE (NAME = 'templog', SIZE = <target_size_in_MB>);
Hentikan SQL Server. Untuk melakukan ini, tekan
Ctrl+C
di jendela Prompt Perintah, mulai ulang SQL Server sebagai layanan, lalu verifikasi ukurantempdb.mdf
file dantemplog.ldf
.
Gunakan perintah DBCC SHRINKDATABASE
DBCC SHRINKDATABASE
menerima parameter target_percent
. Ini adalah persentase ruang kosong yang diinginkan yang tersisa dalam file database setelah database diciutkan. Jika Anda menggunakan DBCC SHRINKDATABASE
, Anda mungkin harus memulai ulang SQL Server.
Tentukan ruang yang saat ini digunakan
tempdb
dengan menggunakan prosedur tersimpansp_spaceused
. Kemudian, hitung persentase ruang kosong yang dibiarkan untuk digunakan sebagai parameter keDBCC SHRINKDATABASE
. Perhitungan ini didasarkan pada ukuran database yang diinginkan.Catatan
Dalam beberapa kasus, Anda mungkin harus menjalankan
sp_spaceused @updateusage = true
untuk menghitung ulang ruang yang digunakan dan untuk mendapatkan laporan yang diperbarui. Untuk informasi selengkapnya, lihat sp_spaceused.Pertimbangkan contoh berikut:
Asumsikan bahwa
tempdb
memiliki dua file: file data utama (tempdb
.mdf) yaitu 1.024 MB dan file log (tempdb.ldf
) yaitu 360 MB. Asumsikan bahwasp_spaceused
melaporkan bahwa file data utama berisi 600 MB data. Selain itu, asumsikan bahwa Anda ingin menyusutkan file data utama menjadi 800 MB. Hitung persentase ruang kosong yang diinginkan setelah penyusutan: 800 MB - 600 MB = 200 MB. Sekarang, bagi 200 MB dengan 800 MB = 25 persen, dan itu adalah Andatarget_percent
. File log transaksi disusutkan sesuai dengan itu, membiarkan 25 persen atau 200 MB ruang kosong setelah database menyusut.Sambungkan ke SQL Server dengan SQL Server, Azure Data Studio, atau sqlcmd, lalu jalankan perintah Transact-SQL berikut. Ganti
<target_percent>
dengan persentase yang diinginkan:DBCC SHRINKDATABASE (tempdb, '<target_percent>');
Ada batasan dengan DBCC SHRINKDATABASE
perintah pada tempdb
. Ukuran target untuk data dan file log tidak boleh lebih kecil dari ukuran yang ditentukan saat database dibuat, atau lebih kecil dari ukuran terakhir yang secara eksplisit diatur dengan menggunakan operasi pengubahan ukuran file seperti ALTER DATABASE
yang menggunakan MODIFY FILE
opsi . Batasan DBCC SHRINKDATABASE
lain adalah perhitungan target_percentage
parameter dan dependensinya pada ruang saat ini yang digunakan.
Gunakan perintah DBCC SHRINKFILE
DBCC SHRINKFILE
Gunakan perintah untuk menyusutkan file individualtempdb
. DBCC SHRINKFILE
memberikan lebih banyak fleksibilitas daripada DBCC SHRINKDATABASE
karena Anda dapat menggunakannya pada satu file database tanpa memengaruhi file lain yang termasuk dalam database yang sama. DBCC SHRINKFILE
target_size
menerima parameter . Ini adalah ukuran akhir yang diinginkan untuk file database.
Tentukan ukuran yang diinginkan untuk file data utama (
tempdb.mdf
), file log (templog.ldf
), dan file tambahan yang ditambahkan ketempdb
. Pastikan bahwa ruang yang digunakan dalam file kurang dari atau sama dengan ukuran target yang diinginkan.Sambungkan ke SQL Server dengan SQL Server, Azure Data Studio, atau sqlcmd, lalu jalankan perintah Transact-SQL berikut untuk file database tertentu yang ingin Anda susutkan. Ganti
<target_size_in_MB>
dengan ukuran yang diinginkan:USE tempdb; GO -- This command shrinks the primary data file DBCC SHRINKFILE (tempdev, '<target_size_in_MB>'); GO -- This command shrinks the log file, examine the last paragraph. DBCC SHRINKFILE (templog, '<target_size_in_MB>'); GO
Keuntungannya DBCC SHRINKFILE
adalah dapat mengurangi ukuran file ke ukuran yang lebih kecil dari ukuran aslinya. Anda dapat mengeluarkan DBCC SHRINKFILE
file data atau log apa pun. Anda tidak bisa membuat database lebih kecil dari ukuran model
database.
Kesalahan 8909 saat Anda menjalankan operasi penyusutan
Jika tempdb
sedang digunakan, dan jika Anda mencoba menyusutkannya dengan menggunakan DBCC SHRINKDATABASE
perintah atau DBCC SHRINKFILE
, Anda mungkin menerima pesan yang menyerupai berikut ini, tergantung pada versi SQL Server yang Anda gunakan:
Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).
Kesalahan ini tidak menunjukkan kerusakan nyata di tempdb
. Namun, mungkin ada alasan lain untuk kesalahan kerusakan data fisik seperti kesalahan 8909, dan alasan tersebut termasuk masalah subsistem I/O. Oleh karena itu, jika kesalahan terjadi di luar operasi penyusutan, Anda harus melakukan lebih banyak penyelidikan.
Meskipun pesan 8909 dikembalikan ke aplikasi atau kepada pengguna yang menjalankan operasi penyusutan, operasi penyusutan tidak gagal.