TempDB tidak akan menyusut. Tidak Ada Transaksi Terbuka

9

Saya memiliki TempDB di SQL 2008 yang sudah sangat besar (> 40GB) dan saya ingin menyusutkannya. Saya telah menggunakan dbcc shrinkdatabase, dbcc shrinkfile dan perintah shrink melalui Management Studio.

Saya mendapatkan kesalahan berikut:

Halaman 1: 4573184 tidak dapat dipindahkan karena ini adalah halaman tabel kerja.

Saya telah dapat memperoleh kembali beberapa ruang untuk mengeluarkan saya dari bahaya dengan menjalankan DBCC FREEPROCCACHE dan menjalankan salah satu rutinitas psikiater, tetapi jelas ini tidak ideal dan kemungkinan hanya akan memberi saya sedikit waktu.

Saya telah menjalankan DBCC OpenTran dan tidak ada yang nongkrong di sana.

Di mana-mana saya telah membaca di internet turun untuk mendaur ulang SQL Server ... pasti harus ada cara yang lebih baik ... siapa pun?

Terima kasih,

Tom

pengguna45117
sumber

Jawaban:

7

Catatan: posting ini mungkin berguna juga:

Masalah dengan file mdf TempDB semakin meningkat

Kecuali Anda dapat mengetahui proses apa yang menggunakan tabel kerja itu (dan dapat dengan aman membunuhnya), saya harus setuju dengan apa yang sudah dihasilkan oleh pencarian Anda: siklus server dan Anda harus dapat mengecilkan tempdb.

Sebuah pertanyaan berbeda telah berurusan dengan mencari tahu ini untuk tabel #temp; Saya tidak tahu apakah itu bisa disesuaikan untuk tabel kerja:

Temukan sesi mana yang memegang tabel sementara mana

Saya juga membuat blog tentang hal itu (sekali lagi, untuk tabel #temp):

http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table

Saya ragu meja kerja terkait dengan snapshot isolasi / versi store, tetapi untuk berjaga-jaga:

Temukan transaksi yang mengisi toko versi

Juga, jangan mengandalkan DBCC OPENTRAN;- Saya telah mengamati banyak skenario di mana saya tahu saya memiliki transaksi aktif tetapi tidak muncul di sana. Dan perhatikan bahwa konteks basis data penting; database tempat transaksi aktif belum tentu tempdb. apa yang kamu lihat di sini? Apa pun?

SELECT * FROM sys.dm_tran_active_transactions
  WHERE name = N'worktable';

Setelah Anda menyusutkan tempdb

Tentu saja, ini bukan solusi permanen. Anda akan menyusutkan tempdb, dan kemudian akan tumbuh lagi. Ini bisa menjadi sangat membosankan dan membosankan untuk memainkan game ini setiap kali itu terjadi. Dan jika itu akan tumbuh lagi, apa yang akan Anda lakukan dengan ruang kosong itu sementara itu? Sewa keluar dan kemudian mengusir orang ketika tempdb membutuhkannya lagi? Anda perlu:

  1. Perbaiki proses yang membuat tempdb tumbuh abnormal besar di tempat pertama.
  2. Alokasikan cukup ruang untuk tempdb sehingga tidak perlu tumbuh, dan berhenti menyusut (terutama jika hanya sementara; ini hanya pekerjaan sia-sia!).

Beberapa saran lain:

  • Jangan gunakan SHRINKDATABASE(yang seharusnya disebut auto-fragment) atau UI. Tulis SHRINKFILEperintah spesifik yang ditargetkan untuk memengaruhi file individual.
  • Pertimbangkan untuk menggunakan banyak file untuk tempdb (yang dapat Anda sebarkan ke penyimpanan yang berbeda jika / bila memungkinkan), dan pertimbangkan untuk melacak flag 1117 (selama perilaku ini tidak akan memengaruhi basis data pengguna Anda juga) dan 1118.
  • Beberapa tips untuk meminimalkan pemanfaatan tempdb di sini:
Aaron Bertrand
sumber
1
PILIH * DARI sys.dm_tran_active_transactions WHERE name = N'worktable '; mengembalikan 6 baris semua dari tanggal yang sama (7/10/14). Apakah transaction_id mewakili SPID?
user45117
Tidak, transaction_id bukan SPID. Jika transaksi benar-benar aktif (dan itu bukan transaksi sistem ), Anda harus dapat mencocokkan dengan session_id di sys.dm_tran_session_transactions. Bagaimanapun, apakah Anda yakin ini adalah pesan yang Anda dapatkan dari DBCC SHRINKFILE? Bagaimana dengan DATABASE ALTER ... MODIFIKASI FILE? Juga saya tidak yakin saya mengerti mengapa membersihkan cache prosedur membuat Anda keluar dari masalah; cache prosedur ada di memori, bukan di tempdb ...
Aaron Bertrand
Pesan itu datang dari DBCC SHRINKDATABASE. Saya belum mencoba ALAT DATABASE ... MENGUBAH FILE ... itu akan menjadi berikutnya. Mengosongkan cache prosedur memungkinkan tempdb menyusut sekitar 10% dan memberi saya ruang drive 4gb kembali. Saya tidak dapat menautkan transaksi_id tersebut dari sys.dm_tran_active_transactions ke apa pun di sys.dm_tran_session_transactions
user45117
1
Saya pikir membersihkan cache prosedur kurang terkait dengan "memungkinkan" tempdb menyusut daripada yang Anda pikirkan. Kebetulan terjadi setiap saat.
Aaron Bertrand
0

Di mana-mana saya telah membaca di internet turun untuk mendaur ulang SQL Server ... pasti harus ada cara yang lebih baik ... siapa pun?

Tidak, ini solusi sementara. Saya kira Anda memposting pertanyaan yang sama sebelum bisa tolong katakan berapa ukuran total database yang Anda miliki dalam contoh SQL Server Anda. Ukuran tempdb tergantung pada seberapa banyak permintaan Anda menggunakannya. Itu tidak bisa tumbuh dengan sendirinya kecuali Anda menggunakannya. Tautan yang dibagikan oleh Aron akan membantu tetapi Anda harus menyetel kueri jika mereka banyak menggunakan temdbb atau mungkin merupakan persyaratan standar lingkungan Anda. Saya telah melihat beberapa env. di mana 200 G tempdb dapat diterima karena permintaan membutuhkan banyak ruang tempdb.

Shanky
sumber