Bagikan melalui


Transaksi Yang Ditangguhkan (SQL Server)

Berlaku untuk: SQL Server

Di SQL Server Enterprise, transaksi yang rusak dapat ditangguhkan jika data yang diperlukan oleh pembatalan (batalkan) offline selama startup database. Transaksi yang ditangguhkan adalah transaksi yang tidak dilakukan ketika fase roll forward selesai dan yang mengalami kesalahan yang mencegahnya digulung balik. Karena transaksi tidak dapat digulung balik, transaksi ditangguhkan.

Catatan

Transaksi yang rusak hanya ditangguhkan di SQL Server Enterprise. Dalam edisi SQL Server lainnya, transaksi yang rusak menyebabkan startup gagal.

Umumnya, transaksi yang ditangguhkan terjadi karena, saat database sedang digulirkan ke depan, kesalahan I/O mencegah membaca halaman yang diperlukan oleh transaksi. Namun, kesalahan di tingkat file juga dapat menyebabkan transaksi yang ditangguhkan. Transaksi yang ditangguhkan juga dapat terjadi ketika urutan pemulihan parsial berhenti pada titik di mana pembatalan transaksi diperlukan dan transaksi memerlukan data yang offline.

Transaksi pengguna yang bergulir kembali dan mencapai kesalahan I/O menyebabkan seluruh database offline. Ketika database dikembalikan secara online, pengulangan memperoleh kembali semua kunci yang dimilikinya dan mencoba mengembalikan semua transaksi yang tidak dilakukan. Semua data yang dimodifikasi oleh transaksi tetap dikunci dengan tepat sampai transaksi dapat digulung balik. Transaksi yang tidak dapat digulung balik akan menyerahkan kunci mereka ketika kerusakan diperbaiki dan database dimulai ulang atau, setelah pemulihan online, ketika transaksi yang ditangguhkan diselesaikan saat database tetap online. Sampai saat itu, transaksi yang ditangguhkan dapat menahan kunci yang mencegah operasi tertentu pada database secara keseluruhan. Misalnya, jika transaksi yang ditangguhkan berisi instruksi CREATE TABLE, tidak ada pengguna yang dapat membuat tabel hingga transaksi yang ditangguhkan telah diselesaikan.

Transaksi yang ditangguhkan juga dapat terjadi karena pemulihan sepotong memulihkan database ke titik di mana satu atau beberapa transaksi aktif memengaruhi grup file yang belum dipulihkan dan offline. Karena transaksi tidak dapat digulung balik, transaksi akan ditangguhkan.

Tabel berikut mencantumkan tindakan yang menyebabkan database melakukan pemulihan dan hasilnya jika terjadi masalah I/O.

Perbuatan Resolusi (jika masalah I/O terjadi atau data yang diperlukan offline)
Server mulai Transaksi yang ditangguhkan
Pulihkan Transaksi yang ditangguhkan
Lampirkan Lampirkan gagal
Penargetan Otomatis Transaksi yang ditangguhkan
Membuat rekam jepret database atau database Pembuatan gagal
Mengulangi pencerminan database Transaksi yang ditangguhkan
Grup file sedang offline Transaksi yang ditangguhkan

Persyaratan dan Batasan

  • Database harus menggunakan model pemulihan FULL atau BULK-LOGGED.
  • Setidaknya satu database dan cadangan log harus telah diselesaikan untuk database
  • Transaksi yang di-deffer tidak berlaku untuk kesalahan yang ditemui selama pembatalan transaksi setelah database online. (misalnya kesalahan runtime)
  • Transaksi tidak dapat ditangguhkan untuk kegagalan pemulihan selama lampiran database
  • Beberapa transaksi seperti transaksi sistem (Mis. alokasi halaman) tidak dapat ditangguhkan

Memindahkan Transaksi Keluar dari Status DEFERRED

Penting

Transaksi yang ditangguhkan menjaga log transaksi tetap aktif. File log virtual yang berisi transaksi yang ditangguhkan tidak dapat dipotong sampai transaksi tersebut dipindahkan dari status ditangguhkan. Untuk informasi selengkapnya tentang pemotongan log, lihat Log Transaksi (SQL Server).

Untuk memindahkan transaksi keluar dari status yang ditangguhkan, database harus dimulai dengan bersih tanpa kesalahan I/O. Jika transaksi yang ditangguhkan ada, Anda harus memperbaiki sumber kesalahan I/O. Solusi yang tersedia, yang tercantum dalam urutan di mana mereka biasanya dicoba, adalah sebagai berikut:

  • Mulai ulang database. Jika masalah bersifat sementara, database harus dimulai tanpa transaksi yang ditangguhkan.

  • Jika transaksi ditangguhkan karena grup file offline, bawa grup file kembali online.

    Untuk membuat grup file offline kembali online, gunakan pernyataan Transact-SQL berikut:

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • Pulihkan database. Setelah pemulihan online, setiap transaksi yang ditangguhkan diselesaikan.

    Di bawah model pemulihan penuh atau dicatat secara massal, jika transaksi yang ditangguhkan hanya disebabkan oleh beberapa halaman yang rusak, pemulihan halaman online dapat mengatasi kesalahan (jika didukung).

  • Jika Anda tidak lagi memerlukan grup file yang status offlinenya menyebabkan transaksi yang ditangguhkan, buat grup file offline tidak berfungsi. Transaksi yang ditangguhkan karena grup file sedang offline dipindahkan dari status ditangguhkan setelah grup file dihentikan.

    Penting

    Grup file yang tidak dapat dipulihkan.

    Untuk informasi selengkapnya, lihat Menghapus Defunct Filegroups (SQL Server).

  • Jika transaksi ditangguhkan karena halaman yang buruk dan jika cadangan database yang baik tidak ada, gunakan proses berikut untuk memperbaiki database:

    • Pertama-tama masukkan database ke dalam mode darurat dengan menjalankan pernyataan Transact-SQL berikut:

      ALTER DATABASE <database_name> SET EMERGENCY  
      

      Untuk informasi tentang mode darurat, lihat Status Database.

    • Kemudian, perbaiki database dengan menggunakan opsi REPAIR_ALLOW_DATA_LOSS DBCC di salah satu pernyataan DBCC berikut: DBCC CHECKDB, DBCC CHECKALLOC, atau DBCC CHECKTABLE.

      Ketika DBCC menemukan halaman buruk, DBCC membatalkan alokasinya dan memperbaiki kesalahan terkait. Pendekatan ini memungkinkan database untuk dibawa kembali online dalam keadaan konsisten secara fisik. Namun, data tambahan mungkin juga hilang; oleh karena itu, pendekatan ini harus digunakan sebagai upaya terakhir.

Lihat Juga

Gambaran Umum Pengembalian dan Pemulihan (SQL Server)
Hapus Defunct Filegroups (SQL Server)
Pemulihan File (Model Pemulihan Penuh)
Pemulihan File (Model Pemulihan Sederhana)
Pulihkan Halaman (SQL Server)
Pemulihan Piecemeal (SQL Server)
MENGUBAH DATABASE (T-SQL)
RESTORE (Transact-SQL)