全部产品
Search
文档中心

ApsaraDB RDS:Masalah Ruang Tidak Mencukupi untuk RDS for SQL Server

更新时间:Nov 10, 2025

Penggunaan ruang pada instans RDS for SQL Server merupakan metrik utama yang perlu dipantau. Ruang penyimpanan yang tidak memadai dapat menyebabkan masalah serius, seperti kegagalan database dalam menulis data atau membuat cadangan. Selain itu, peningkatan skala ruang penyimpanan bisa memakan waktu. Topik ini menjelaskan cara memeriksa penggunaan ruang dan menyelesaikan masalah terkait ruang.

Lihat penggunaan ruang

  • Metode 1: Buka halaman Basic Information dari instans untuk melihat penggunaan ruang. Halaman ini hanya menampilkan total penggunaan ruang saat ini, tanpa rincian mengenai ruang yang ditempati oleh berbagai tipe data atau informasi penggunaan historis.基本信息

  • Metode 2: Buka halaman Monitoring and Alerts dari instans. Di halaman Standard Monitoring, Anda dapat melihat ruang disk yang digunakan oleh berbagai tipe data serta tren historisnya. Untuk informasi lebih lanjut tentang metrik, lihat Lihat Pemantauan Standar.

    image

  • Metode 3: Buka halaman Autonomy Services > Storage Management di konsol untuk melihat informasi penggunaan ruang yang lebih rinci. Ini mencakup perbandingan penggunaan ruang data dan log, tren historis, serta detail alokasi ruang untuk database dan tabel teratas. Untuk informasi lebih lanjut, lihat Manajemen Ruang.

    Catatan

    Instans RDS Anda tidak menjalankan SQL Server 2008 R2 dengan disk cloud.

    image

  • Metode 4: Gunakan alat klien seperti SQL Server Management Studio (SSMS) untuk melihat informasi penggunaan ruang dari instans. Untuk informasi lebih lanjut, lihat Hubungkan ke Instans RDS for SQL Server Menggunakan Klien SSMS.

    Tabel berikut mencantumkan perintah umum untuk melihat informasi penggunaan ruang pada database SQL Server.

    Tampilan sistem atau perintah

    Deskripsi

    sp_helpdb

    Lihat ukuran total ruang (jumlah ukuran file data dan file log) untuk setiap database.

    sp_spaceused

    Lihat nama, ukuran ruang yang digunakan, dan ukuran ruang yang belum dialokasikan dari database saat ini.

    DBCC SQLPERF(LOGSPACE)

    Lihat ukuran total file log dan ruang log yang sebenarnya digunakan untuk setiap database.

    DBCC SHOWFILESTATS

    Lihat ukuran total file data dan ruang data yang sebenarnya digunakan untuk semua file data dalam database saat ini.

    SELECT * FROM sys.master_files

    Lihat ukuran file data dan file log untuk setiap database.

    SELECT * FROM sys.dm_db_log_space_usage

    Lihat total ruang log dan ruang log yang sebenarnya digunakan dari database saat ini. Perintah ini hanya berlaku untuk SQL Server 2012 dan versi yang lebih baru.

    SELECT * FROM sys.dm_db_file_space_usage

    Lihat total ruang file data dan ruang data yang sebenarnya digunakan dari database saat ini. Perintah ini hanya berlaku untuk SQL Server 2012 dan versi yang lebih baru.

Jika instans memiliki penggunaan ruang yang tinggi, buka halaman Monitoring and Alarms di Konsol RDS. Periksa penggunaan ruang data, log, file sementara, dan file lainnya untuk mengidentifikasi jenis file mana yang bertambah terlalu cepat. Kemudian, evaluasi apakah Anda dapat melepaskan ruang atau mencegah pertumbuhan yang cepat. Untuk analisis mendetail dan solusi, lihat bagian berikut.

Mengklaim Kembali dan Melepaskan Ruang Data

Menganalisis Penyebab

Total ruang data merupakan jumlah dari semua ukuran file data dan terdiri dari dua bagian: ruang yang dialokasikan dan ruang yang tidak dialokasikan.

  • Ruang yang dialokasikan mencakup ruang yang digunakan dan tidak digunakan. Ruang yang tidak digunakan hanya dapat dialokasikan untuk catatan baru di tabel atau indeks yang sama dan tidak dapat dimanfaatkan langsung oleh objek basis data lainnya.

  • Ruang yang tidak dialokasikan terdiri dari ekstent yang sepenuhnya belum dialokasikan. Setiap ekstent adalah ruang kontigu sebesar 64 KB. Ruang ini tidak terkait dengan objek basis data apa pun. Anda dapat melepaskan ruang ini dengan mengecilkan file.

Jika volume data terus bertambah, ruang yang tidak dialokasikan biasanya kecil. Dalam skenario ini, mengecilkan file secara langsung tidak efektif. Anda harus terlebih dahulu mengoptimalkan dan mengklaim kembali ruang yang telah dialokasikan sebelum mempertimbangkan untuk mengecilkan file.

Mengklaim Kembali Ruang Data

Metode berikut sering digunakan untuk mengklaim kembali ruang data:

  • Mengarsipkan Data

    Hapus data yang jarang digunakan, seperti data historis lama, dari database. Anda juga dapat memigrasikan data tersebut ke instans basis data lain atau mengarsipkannya dalam format lain. Metode ini secara langsung mengurangi volume data dan ruang penyimpanan yang digunakan.

    Metode ini efektif untuk mengendalikan pertumbuhan ruang data tetapi memerlukan desain khusus untuk objek basis data dan logika aplikasi. Diperlukan kerja sama dari perancang dan pengembang aplikasi.

  • Kompresi Data

    Instans yang menjalankan SQL Server 2016 atau yang lebih baru dan Instans Perusahaan yang menjalankan versi sebelum 2016 memiliki fitur kompresi data bawaan. Anda dapat mengaktifkan kompresi baris atau halaman pada tabel, indeks, atau partisi tunggal. Untuk informasi lebih lanjut, lihat Kompresi Data.

    Rasio kompresi data sangat bervariasi tergantung pada skema tabel, tipe data kolom, dan distribusi nilai. Rasio tersebut bisa berkisar antara 10% hingga 90%. SQL Server menyediakan prosedur tersimpan khusus, sp_estimate_data_compression_savings, untuk membantu Anda dengan cepat memperkirakan penghematan penyimpanan yang dihasilkan dari mengaktifkan kompresi pada tabel atau indeks tertentu.

    Catatan
    • Mengubah pengaturan kompresi pada tabel atau indeks adalah operasi Bahasa Definisi Data (DDL). Untuk tabel besar, operasi ini dapat menyebabkan kunci tabel jangka panjang dan memengaruhi bisnis Anda. Lakukan operasi ini selama jam-jam sepi.

    • Untuk instans RDS for SQL Server Enterprise, Anda dapat mengatur parameter ONLINE menjadi ON. Kemudian, Anda dapat menjalankan modifikasi dengan dampak minimal pada bisnis Anda.

    • Kompresi data meningkatkan overhead CPU. Evaluasilah dampak sesuai kebutuhan. Aktifkan kompresi data hanya pada tabel besar.

  • Defragmentasi Indeks

    Tingkat fragmentasi indeks yang tinggi dapat memperlambat kueri dan meningkatkan penggunaan penyimpanan data. Mendefragmentasi indeks dapat meningkatkan kecepatan kueri dan melepaskan ruang penyimpanan yang tidak diperlukan.

    Lihat Tingkat Fragmentasi Indeks: Di Konsol RDS, buka halaman Autonomy Services > Performance Optimization. Klik tab Index Usage untuk melihat tingkat fragmentasi indeks untuk setiap tabel. Layanan otonomi memberikan saran untuk membangun ulang atau mengatur ulang indeks.

    Catatan
    • Tingkat fragmentasi indeks adalah persentase halaman indeks yang berdekatan secara logis tetapi tidak berdekatan secara fisik. Ini berbeda dari persentase ruang bebas dalam halaman indeks. Namun, indeks dengan tingkat fragmentasi tinggi kemungkinan besar juga memiliki persentase ruang yang dapat diklaim kembali yang tinggi.

    • Untuk menganalisis persentase rata-rata ruang bebas dalam halaman indeks, Anda dapat menjalankan kueri pada tampilan sistem sys.dm_db_index_physical_stats dalam mode SAMPLED atau DETAILED. Kemudian, periksa nilai di kolom avg_page_space_used_in_percent dari set hasil. Untuk informasi lebih lanjut, lihat sys.dm_db_index_physical_stats (Transact-SQL). Kueri ini membaca banyak halaman indeks dan dapat memengaruhi kinerja basis data. Lakukan operasi ini selama jam-jam sepi.

    • Operasi Rebuild Index

      Operasi ini memberikan optimasi yang lebih baik dan lebih efisien untuk indeks dengan tingkat fragmentasi tinggi. Secara default, operasi rebuild mengunci tabel yang sesuai. Untuk Instans Perusahaan, Anda dapat mengatur parameter ONLINE menjadi ON untuk menghindari kunci tabel jangka panjang.

      Penting

      Untuk indeks besar, operasi rebuild dapat menyebabkan peningkatan signifikan dalam ruang penyimpanan basis data dan ukuran log dalam jangka pendek. Sebelum Anda membangun ulang indeks, pastikan instans RDS memiliki ruang penyimpanan bebas yang setidaknya dua kali ukuran indeks yang sedang dibangun ulang.

      • Lihat Ruang Penyimpanan Instans RDS: Buka halaman Basic Information instans RDS. Di bagian Instance Resources, Anda dapat melihat total dan ruang penyimpanan yang digunakan oleh instans.

      • Jika ruang bebas tidak cukup, Anda dapat melakukan skala keluar penyimpanan. Setelah skala keluar berhasil, Anda tidak perlu memulai ulang instans. Sistem secara otomatis menerapkan ruang baru, dan perubahan tersebut berlaku segera.

      ALTER INDEX <IX_YourIndexName> ON <YourTableName> REBUILD WITH (ONLINE = ON);

      Setelah perintah dijalankan, sistem secara asinkron mengumpulkan statistik indeks lagi di latar belakang. Proses ini memakan waktu. Oleh karena itu, tingkat fragmentasi yang ditampilkan di halaman konsol mungkin tidak diperbarui segera. Anda dapat mengklik tombol Recollect untuk mengumpulkan data terbaru secara manual. Setelah pengumpulan data selesai, Anda dapat mengklik Export Script untuk mengunduh skrip ke mesin lokal Anda dan memastikan apakah tingkat fragmentasi indeks telah berkurang.

      image

    • Operasi Reorganisasi Indeks

      Operasi ini lebih efisien untuk indeks dengan tingkat fragmentasi rendah, tetapi efek optimisasinya tidak sebesar rebuild.

Mengecilkan File Data

Metode pengklaiman kembali ruang data yang dijelaskan pada bagian sebelumnya umumnya dapat mengurangi penggunaan ruang data secara efektif. Jika ruang instans masih mengalami tekanan, Anda dapat menggunakan salah satu dari dua metode berikut:

Penting

Operasi pengecilan berskala besar pada RDS for SQL Server dapat menyebabkan pertumbuhan log transaksi yang signifikan dan pemblokiran jangka panjang. Gunakan Metode 1 untuk mengecilkan file dalam siklus mini-batch.

  • Metode 1: Mengecilkan file data dalam siklus mini-batch. Disarankan untuk mengecilkan file sebesar 5 GB dalam setiap iterasi. Berikut adalah contohnya:

    -- Skrip ini hanya berlaku untuk SQL Server 2012 dan versi yang lebih baru. Tentukan parameter berikut sebelum digunakan.
    DECLARE @dbName NVARCHAR(128) = 'YourDBName'  -- Nama database
    DECLARE @fileName NVARCHAR(128)  -- Nama file data
    DECLARE @targetSize INT = 2000   -- Ukuran target (MB)
    DECLARE @shrinkSize INT = 5120   -- Ukuran pengecilan dalam setiap iterasi loop (MB). Kami merekomendasikan 5 GB.
    DECLARE @currentSize INT         -- Ukuran saat ini
    DECLARE @freeSize INT            -- Ukuran ruang bebas
    DECLARE @usedSize INT            -- Ukuran ruang yang digunakan
    
    DECLARE @sql NVARCHAR(500)       
    DECLARE @waitTime INT = 10      -- Waktu tunggu setelah setiap operasi pengecilan (detik)
    
    -- Dapatkan nama file data
    SELECT @fileName = name
    FROM sys.master_files
    WHERE database_id = DB_ID(@dbName)
    AND type_desc = 'ROWS'
    
    
    -- Pengecilan dalam loop
    WHILE 1 = 1
    BEGIN
        -- Dapatkan ukuran saat ini, ukuran ruang bebas, dan ukuran ruang yang digunakan
        DECLARE @sql0 NVARCHAR(MAX) = N'
        USE [' + @dbName + '];
        SELECT
          @currentSize = (SUM(total_page_count) * 1.0 / 128),
          @freesize = (SUM(unallocated_extent_page_count) * 1.0 / 128)
        FROM sys.dm_db_file_space_usage
        WHERE database_id = DB_ID();'
    
        EXEC sp_executesql 
          @sql0,
          N'@currentSize INT OUTPUT, @freesize INT OUTPUT',
          @currentSize OUTPUT,
          @freesize OUTPUT
        
        PRINT 'Ukuran saat ini:' + CAST(@currentSize AS VARCHAR(10)) + 'MB'
        PRINT 'Ukuran bebas:' + CAST(@freeSize AS VARCHAR(10)) + 'MB'
    
        set @usedSize=@currentSize - @freeSize
        PRINT 'Ukuran yang digunakan:' + CAST(@usedSize AS VARCHAR(10)) + 'MB'
    
        -- Periksa apakah ukuran target lebih kecil dari ukuran ruang yang digunakan
        IF @targetSize <= @usedSize
        BEGIN
            PRINT 'Ukuran target terlalu kecil. Tentukan ukuran baru. Ukuran target tidak boleh lebih kecil dari: ' + CAST(@usedSize AS VARCHAR(20)) + 'MB'
            BREAK
        END
    
        
        -- Keluar jika ukuran target tercapai
        IF @currentSize <= @targetSize
        BEGIN
            PRINT 'Pengecilan selesai. Ukuran saat ini: ' + CAST(@currentSize AS VARCHAR(20)) + 'MB'
            BREAK
        END
        
        -- Hitung ukuran baru setelah operasi pengecilan ini
        DECLARE @newSize INT = @currentSize - @shrinkSize
        IF @newSize < @targetSize
            SET @newSize = @targetSize
            
        -- Jalankan operasi pengecilan
        SET @sql = 'USE [' + @dbName + '];DBCC SHRINKFILE (N''' + @fileName + ''', ' + CAST(@newSize AS VARCHAR(20)) + ')'
        PRINT 'Menjalankan pengecilan: ' + @sql
        EXEC (@sql)
        
        -- Tunggu beberapa saat dan lanjutkan
        PRINT 'Menunggu ' + CAST(@waitTime AS VARCHAR(10)) + ' detik untuk melanjutkan...'
        WAITFOR DELAY '00:00:10'
    END
  • Metode 2: Jalankan perintah DBCC SHRINKFILE untuk mengecilkan file data tunggal secara langsung. Perintah ini melepaskan ruang yang tidak dialokasikan dalam file data ke sistem operasi. Untuk informasi lebih lanjut, lihat Mengecilkan Database dan DBCC SHRINKFILE (Transact-SQL).

    DBCC SHRINKFILE(<File ID>, <Target size in MB>)

    Klik untuk melihat contoh

    案例Pada gambar di atas, ukuran sebuah ekstent adalah 64 KB. Total ukuran file data adalah (1673344 × 64) / 1024 = 104.584 MB. Ruang yang dialokasikan adalah (1313432 × 64) / 1024 = 82.089,5 MB. Ini berarti ukuran total file data setelah kompresi tidak dapat kurang dari 82.089,5 MB. Untuk mengecilkan ukuran total file data menjadi 90.000 MB, Anda dapat menjalankan perintah berikut:

    DBCC SHRINKFILE(1, 90000)

FAQ

Tingkat fragmentasi indeks instans RDS saya tinggi. Setelah menjalankan Perintah Rebuild untuk membangun ulang indeks, mengapa Fragmentation Rate di tabel Index Usage Information di Konsol RDS tetap tidak berubah?

Solusi: Setelah perintah Rebuild dijalankan, sistem secara asinkron mengumpulkan data kembali di latar belakang. Proses ini memerlukan waktu. Anda dapat mengklik tombol Recollect untuk mengumpulkan data terbaru secara manual. Setelah pengumpulan data selesai, Anda dapat mengklik Export Script untuk mengunduh skrip ke mesin lokal Anda dan memastikan status pengklaiman indeks.

image

Setelah menjalankan perintah SHRINKFILE, mengapa prosesnya memakan waktu lama dan persentase kemajuan tidak diperbarui?

Deskripsi Masalah

Pada instans RDS for SQL Server Alibaba Cloud, ketika Anda mencoba menjalankan operasi SHRINKFILE pada file data atau file log database untuk mengklaim kembali ruang bebas, Anda mungkin menghadapi masalah berikut:

  • Perintah SHRINKFILE tidak selesai dalam waktu yang lama.

  • Persentase kemajuan (percent_complete) tidak diperbarui dalam waktu yang lama.

Masalah ini biasanya disebabkan oleh transaksi jangka panjang yang memblokir, terutama ketika Snapshot Isolation diaktifkan untuk database, karena retensi versi snapshot mencegah operasi SHRINKFILE selesai dengan normal.

Solusi

  1. Hubungkan ke instans RDS for SQL Server menggunakan SQL Server Management Studio (SSMS).

  2. Jalankan kueri berikut untuk memeriksa status dan kemajuan operasi SHRINKFILE:

    SELECT 
        r.session_id AS [SPID],
        r.start_time AS [Waktu Mulai],
        r.status AS [Status],
        r.command AS [Jenis Perintah],
        r.wait_type AS [Jenis Tunggu],
        r.wait_time AS [Waktu Tunggu (ms)],
        r.last_wait_type AS [Jenis Tunggu Terakhir],
        t.text AS [Pernyataan yang Dieksekusi],
        r.percent_complete AS [Kemajuan Eksekusi]
    FROM 
        sys.dm_exec_requests r
    CROSS APPLY 
        sys.dm_exec_sql_text(r.sql_handle) t;

    Jika kolom status menunjukkan suspended dan nilai di kolom percent_complete belum diperbarui dalam waktu lama, operasi SHRINKFILE diblokir. Lanjutkan ke langkah berikutnya.

    image

  3. Periksa log kesalahan RDS for SQL Server untuk pesan serupa berikut:

    DBCC SHRINKFILE untuk ID file 1 sedang menunggu transaksi snapshot
    dengan timestamp 15 dan transaksi snapshot lain yang terhubung ke
    timestamp 15 atau dengan timestamp lebih tua dari 109 untuk selesai.

    Hasil sampel:

    Log ini menunjukkan bahwa karena isolasi snapshot diaktifkan untuk database, operasi SHRINKFILE diblokir oleh transaksi snapshot dan tidak dapat dilanjutkan.

    image

  4. Jalankan kueri berikut untuk memeriksa apakah isolasi snapshot diaktifkan untuk database:

    SELECT 
        name,
        is_read_committed_snapshot_on,
        snapshot_isolation_state,
        snapshot_isolation_state_desc
    FROM 
        sys.databases;

    Jika is_read_committed_snapshot_on=1 atau snapshot_isolation_state_desc=ON, fitur snapshot diaktifkan untuk database, dan Anda harus menyelidiki lebih lanjut untuk transaksi jangka panjang.

    image

  5. Jalankan pernyataan SQL berikut untuk memeriksa transaksi jangka panjang yang mungkin menyebabkan blokir dan memeriksa durasinya:

    SELECT db_name(exe.database_id),tr.* FROM sys.dm_tran_active_snapshot_database_transactions AS tr JOIN sys.dm_exec_requests AS exe ON tr.session_id=exe.session_id;

    Setelah eksekusi selesai, perhatikan dengan cermat bidang session_id dan elapsed_time_seconds. Bidang elapsed_time_seconds menunjukkan durasi transaksi. Nilai yang lebih besar menunjukkan bahwa transaksi telah berjalan lebih lama dan memerlukan perhatian lebih. Jika Anda menemukan bahwa transaksi jangka panjang tertentu menyebabkan pemblokiran, Anda dapat mempertimbangkan untuk menghentikan (KILL) transaksi tersebut dan mengamati apakah operasi SHRINKFILE dilanjutkan.

    Catatan

    Operasi SHRINKFILE yang diblokir tidak selalu disebabkan oleh transaksi jangka panjang di database saat ini. Penyebab utama juga bisa berupa transaksi jangka panjang di database lain dengan snapshot diaktifkan, terutama dalam skenario yang melibatkan kueri lintas database. Oleh karena itu, ketika Anda menangani masalah, Anda harus memeriksa status transaksi dari semua database terkait untuk mengidentifikasi dan menyelesaikan masalah secara akurat.

    image

  6. Jika Anda mengonfirmasi melalui langkah-langkah sebelumnya bahwa satu atau lebih transaksi jangka panjang memblokir operasi SHRINKFILE, Anda perlu mengevaluasi apakah Anda dapat menghentikan (KILL) transaksi ini untuk melanjutkan eksekusi normal operasi SHRINKFILE. Perhatikan bahwa menghentikan transaksi jangka panjang menyebabkannya dibatalkan. Oleh karena itu, sebelum Anda menjalankan operasi KILL, Anda harus sepenuhnya mengevaluasi dampak pembatalan terhadap bisnis Anda. Jika Anda tidak dapat menghentikan transaksi jangka panjang karena alasan bisnis, lihat saran berikut:

    • Tunggu transaksi jangka panjang selesai. Setelah selesai, Anda dapat menjalankan operasi SHRINKFILE lagi.

    • Hentikan operasi SHRINKFILE. Jika jendela saat ini bukan waktu yang tepat untuk menunggu, Anda dapat menghentikan operasi SHRINKFILE dan menjadwalkannya ulang untuk jendela pemeliharaan yang sesuai.

Mengembalikan ruang log

Lihat ruang log yang digunakan

Mengembalikan ruang log relatif sederhana. Anda dapat menggunakan perintah DBCC SQLPERF(LOGSPACE) atau DAS untuk melihat persentase ruang yang digunakan dalam file log database. Jika persentase ruang yang digunakan tinggi, memperkecil file log memiliki sedikit efek. Anda dapat menanyakan Tampilan sistem sys.databases. Periksa keluaran dari kolom log_reuse_wait dan log_reuse_wait_desc untuk menentukan mengapa ruang tidak dapat dikembalikan.

Catatan

Untuk informasi lebih lanjut tentang nilai-nilai dari log_reuse_wait dan log_reuse_wait_desc, lihat sys.databases (Transact-SQL).

Perkecil log transaksi

Peringatan

Jika server database Anda menunjukkan bahwa log transaksi penuh, Anda tidak dapat memperkecil log transaksi dari Konsol. Anda perlu mengeksekusi Pernyataan SQL secara manual untuk menangani masalah ini. Namun, solusi ini memiliki risiko. Untuk informasi lebih lanjut, lihat Solusi untuk ruang log yang tidak mencukupi (hanya untuk keadaan darurat). Jika ruang log tidak mencukupi, kami sarankan Anda terlebih dahulu menambah kapasitas disk.

Fitur

Solusi 1: Perkecil satu database (hanya perkecil, tanpa pencadangan)

Solusi 2: Cadangkan dan perkecil pada level instans (cadangkan dulu, lalu perkecil)

Ruang lingkup

Satu database

Seluruh instans

Cadangan

Tidak ada cadangan

Otomatis mencadangkan semua log transaksi

Kecepatan pengembalian ruang

Cepat

Lebih lambat (memerlukan pencadangan sebelum diperkecil)

Skenario

Pertumbuhan log cepat, tidak bisa menunggu pencadangan penuh atau cadangan inkremental tingkat instans berikutnya (pengembalian ruang mendesak diperlukan)

Ruang log cukup (memperkecil log transaksi mengonsumsi beberapa ruang log), optimisasi global diperlukan

Dampak pada database lain

Tidak ada dampak

Mempengaruhi seluruh instans

Operasi

Perkecil log transaksi database

Cadangkan dan perkecil log transaksi

Setelah operasi pemulihan selesai, Anda dapat membuka halaman Monitoring and Alarms dari Instans RDS untuk melihat status ruang log terbaru.

image

Mengembalikan ruang file sementara

Analisis penyebab

Database tempdb adalah database sistem di SQL Server yang menyimpan data sementara. Ruang file data dalam tempdb sering digunakan dalam berbagai skenario, seperti:

  • Objek pengguna: Tabel sementara yang dibuat oleh pengguna.

  • Objek internal: Tabel sementara yang dihasilkan secara internal oleh SQL Server.

  • Toko versi: Ketika isolasi snapshot atau snapshot komit dibaca diaktifkan untuk sebuah database, informasi versi disimpan di tempdb.

Jika operasi tertentu, seperti transaksi jangka panjang, pembuatan banyak tabel sementara, atau isolasi snapshot, menggunakan sejumlah besar ruang, file data bisa membengkak. Ini berarti ukuran file bertambah secara signifikan melampaui rentang normalnya. Untuk informasi lebih lanjut, lihat tutorial resmi Microsoft untuk database tempdb.

Solusi

Sebuah RDS for SQL Server database mencakup file data dan file log. Metode untuk mengembalikan ruang untuk masing-masing adalah sebagai berikut:

Mengembalikan ruang file data

Jika ruang file data untuk tempdb menjadi besar, penggunaan perintah SHRINKFILE untuk mengecilkan ukurannya kurang efektif. Sebagai alternatif, Anda dapat memulai ulang instans selama jam-jam sepi guna melepaskan ruang tempdb, seperti yang dijelaskan dalam tutorial resmi Microsoft (Mengecilkan database tempdb).

Gunakan solusi berikut untuk menganalisis penggunaan ruang file data tempdb:

Skenario 1: Ruang file data tempdb besar

  1. Jika sejumlah besar ruang file data tempdb sedang digunakan, jalankan pernyataan SQL berikut. Gunakan tampilan sistem sys.dm_db_file_space_usage untuk memeriksa ruang tempdb yang digunakan oleh berbagai jenis objek (User Objects, Internal Objects, dan Version Store):

    Untuk informasi lebih lanjut tentang cara menggunakan sys.dm_db_file_space_usage, lihat tutorial resmi Microsoft.

    SELECT 
        SUM(version_store_reserved_page_count) AS [halaman toko versi yang digunakan], 
        (SUM(version_store_reserved_page_count) * 1.0 / 128) AS [ruang objek toko versi dalam MB], 
        SUM(user_object_reserved_page_count) AS [halaman objek pengguna yang digunakan], 
        (SUM(user_object_reserved_page_count) * 1.0 / 128) AS [ruang objek pengguna dalam MB], 
        SUM(internal_object_reserved_page_count) AS [halaman objek internal yang digunakan], 
        (SUM(internal_object_reserved_page_count) * 1.0 / 128) AS [ruang objek internal dalam MB] 
    FROM 
        sys.dm_db_file_space_usage;
  2. Jika User Objects atau Internal Objects menggunakan sejumlah besar ruang:

    1. Jalankan pernyataan SQL berikut. Anda dapat menggunakan tampilan sistem sys.dm_db_session_space_usage untuk menemukan sesi mana yang menggunakan sejumlah besar ruang tempdb:

      Untuk informasi lebih lanjut tentang cara menggunakan sys.dm_db_session_space_usage, lihat tutorial resmi Microsoft.

      SELECT 
          session_id, 
          SUM(user_objects_alloc_page_count) AS [halaman objek pengguna yang digunakan], 
          (SUM(user_objects_alloc_page_count) * 1.0 / 128) AS [ruang objek pengguna dalam MB], 
          SUM(internal_objects_alloc_page_count) AS [halaman objek internal yang digunakan], 
          (SUM(internal_objects_alloc_page_count) * 1.0 / 128) AS [ruang objek internal dalam MB] 
      FROM 
          sys.dm_db_session_space_usage 
      GROUP BY 
          session_id;
    2. Anda dapat menggunakan ID sesi yang dikembalikan untuk menanyakan pernyataan SQL yang sedang dieksekusi oleh sesi tersebut:

      SELECT 
          r.session_id AS [SPID], 
          r.start_time AS [Waktu Mulai], 
          r.status AS [Status], 
          r.command AS [Tipe Perintah], 
          r.wait_type AS [Tipe Tunggu], 
          r.wait_time AS [Waktu Tunggu (ms)], 
          r.last_wait_type AS [Tipe Tunggu Terakhir], 
          t.text AS [Pernyataan yang Sedang Dieksekusi] 
      FROM 
          sys.dm_exec_requests r 
      CROSS APPLY 
          sys.dm_exec_sql_text(r.sql_handle) t 
      WHERE 
          r.session_id = xxx; ---xxx adalah session_id dari langkah sebelumnya
  3. Jika Version Store menggunakan sejumlah besar ruang, database mungkin memiliki isolasi snapshot yang diaktifkan. Hal ini menyebabkan banyak versi snapshot disimpan di tempdb.

    1. Anda dapat menanyakan database mana yang memiliki isolasi snapshot diaktifkan:

      SELECT 
          name, 
          is_read_committed_snapshot_on, 
          snapshot_isolation_state 
      FROM sys.databases;

      Jika nilai dari bidang is_read_committed_snapshot_on atau snapshot_isolation_state adalah 1, database yang bersangkutan memiliki isolasi snapshot diaktifkan, seperti yang ditunjukkan pada gambar berikut:

      image

    2. Anda dapat menggunakan tampilan sistem sys.dm_tran_active_snapshot_database_transactions untuk memeriksa sesi dengan transaksi jangka panjang yang belum dikomit. Transaksi ini mencegah catatan di Version Store untuk dibersihkan secara otomatis:

      SELECT * FROM sys.dm_tran_active_snapshot_database_transactions ORDER BY elapsed_time_seconds DESC;

      Rincian adalah sebagai berikut:

      image

    3. Setelah Anda mendapatkan session_id, Anda dapat menanyakan sys.sysprocesses dan sys.dm_exec_requests/sys.dm_exec_sql_text untuk memeriksa status sesi dan perintah yang dieksekusi:

      SELECT * FROM sys.sysprocesses WHERE spid = xxx;  --spid adalah session_id dari langkah sebelumnya

      Rincian adalah sebagai berikut:

      image

    4. Jika status sesi adalah sleeping, Anda dapat menggunakan perintah SQL berikut untuk memeriksa pernyataan yang dieksekusi:

      DBCC INPUTBUFFER(xxx);  --xxx adalah ID sesi (spid) dari langkah sebelumnya

      Rincian adalah sebagai berikut:

      image

Skenario 2: Menyelidiki penyebab pertumbuhan ruang tempdb di masa lalu setelah restart

Jika data langsung tidak tersedia, Anda dapat menganalisis masalah menggunakan Sesi Aktif Rata-rata (AAS), log kueri lambat, dan log audit. Langkah-langkahnya adalah sebagai berikut:

  1. Analisis waktu mulai dan akhir pertumbuhan ruang tempdb

    Pertama, analisis tren pertumbuhan penggunaan ruang tempdb. Di halaman detail instans, buka Monitoring and Alarms > Standard Monitoring. Di bagian Instance Space, catat waktu mulai dan akhir ketika metrik tmp_size meningkat. Ketika operasi SQL dimulai, tempdb mungkin masih memiliki ruang bebas yang tersedia yang digunakan kembali terlebih dahulu. Oleh karena itu, waktu ekspansi ruang aktual mungkin lebih lambat daripada waktu mulai operasi SQL. Sistem hanya memicu operasi ekspansi file untuk mengalokasikan ruang penyimpanan baru setelah ruang yang ada di tempdb habis.

    image

  2. Analisis menggunakan AAS (Sesi Aktif Rata-rata)

    Di halaman detail instans, buka Autonomy Service > Performance Optimization > > Performance Insight. Pilih periode waktu target. Anda harus memperpanjang awal rentang waktu untuk memastikan bahwa Anda menangkap semua operasi terkait. Analisis catatan eksekusi SQL dalam periode ini untuk mengidentifikasi operasi apa pun yang menggunakan tabel sementara berbasis disk secara intensif.

    Sebagai contoh, periksa pembuatan dan penggunaan tabel sementara seperti #RKD_SJ. Penggunaan tabel sementara ini secara sering dapat menjadi penyebab utama pertumbuhan ruang tempdb.

    image

  3. Analisis dengan menyaring log kueri lambat menggunakan kata kunci

    Di halaman detail instans, buka Autonomy Service > Slow SQL. Filter log kueri lambat berdasarkan kata kunci. Periksa waktu eksekusi SQL dan waktu mulai. Anda dapat menganalisis apakah waktu akhir kueri sesuai dengan waktu ketika ruang tempdb berhenti tumbuh.

    image

Mengembalikan ruang file log

Jika ruang file log untuk tempdb menjadi besar, biasanya disebabkan oleh transaksi jangka panjang yang mencegah log dipotong. Anda dapat mengembalikan ruang dengan langkah-langkah berikut:

  1. Periksa tipe tunggu penggunaan ulang log pada bidang log_reuse_wait_desc di sys.database. Jika tipe tunggu penggunaan ulang log adalah ACTIVE_TRANSACTION, berarti ada transaksi jangka panjang yang aktif.

  2. Identifikasi transaksi jangka panjang yang sedang berjalan di database tempdb. Setelah transaksi jangka panjang diakhiri, Anda dapat menggunakan perintah SHRINKFILE untuk mengecilkan file log.

Gunakan solusi berikut untuk menganalisis penggunaan ruang file log tempdb:

  1. Pertama, periksa status file log database.

    Dalam hasil eksekusi, periksa status ruang log tempdb. Jika LogReuseWaitDescription adalah NOTHING, Anda dapat langsung mengecilkan file log menggunakan SHRINKFILE. Jika nilainya bukan NOTHING, seperti nilai umum ACTIVE_TRANSACTION, terdapat transaksi jangka panjang aktif. Anda harus mengakhiri transaksi jangka panjang tersebut sebelum mengecilkan file log dengan SHRINKFILE.

    SELECT
    name AS [DatabaseName],
    recovery_model_desc AS [RecoveryModel],
    log_reuse_wait_desc AS [LogReuseWaitDescription]
    FROM sys.databases;

    image

  2. Pertumbuhan file log tempdb sering disebabkan oleh adanya transaksi jangka panjang aktif. Gunakan perintah SQL berikut untuk memeriksa transaksi terlama yang sedang berjalan di database tempdb dan tentukan apakah perlu mengakhirinya:

    USE tempdb;
    GO
    DBCC OPENTRAN;
    GO

    Seperti yang ditunjukkan pada gambar berikut, catat ID sesi (SPID) dan waktu mulai transaksi (Start time):

    image

  3. Selanjutnya, periksa aktivitas dan status sesi menggunakan ID sesi dari langkah sebelumnya:

    SELECT * FROM sys.sysprocesses WHERE spid = xxx;--spid adalah SPID dari langkah sebelumnya

    Sebagai contoh:

    image

  4. Jika status sesi adalah sleeping, gunakan perintah SQL berikut untuk memeriksa pernyataan yang dieksekusi:

    DBCC INPUTBUFFER(xxx);  --xxx adalah ID sesi (spid) dari langkah sebelumnya

    Gambar berikut menunjukkan sebuah contoh.

    image

Reklaim ruang file lainnya

Analisis penyebab

Ruang file lainnya mengacu pada ruang yang digunakan oleh file seperti sqlserver.other_size, mastersize, modelsize, dan msdbsize. File-file ini biasanya kecil, tetapi dalam beberapa kasus dapat menjadi sangat besar. Contohnya:

  • Terdapat banyak log kesalahan (errorlog) dengan ukuran file mencapai beberapa gigabyte atau lebih.

  • File dump memori dihasilkan secara otomatis selama pengecualian kritis.

Solusi

  1. Buka tab Standard Monitoring pada halaman Monitoring and Alarms di instans RDS untuk melihat ruang yang digunakan oleh file-file ini. Untuk informasi lebih lanjut tentang metrik, lihat Lihat Pemantauan Standar.

    image

  2. Jika errorlog menggunakan sejumlah besar ruang, Anda dapat membuka halaman Log Management untuk membersihkan log kesalahan. Untuk informasi lebih lanjut, lihat Kelola Log.

    Catatan

    Jika file lainnya, seperti sqlserver.other_size, menggunakan terlalu banyak ruang, Anda dapat menghubungi dukungan teknis untuk bantuan dalam mengidentifikasi penyebab dan menyelesaikan masalah tersebut.

Perluas ruang penyimpanan

Jika penggunaan ruang penyimpanan instans RDS Anda tinggi dan tidak dapat dikurangi secara efektif dengan metode sebelumnya, segera lakukan scale-out pada ruang penyimpanan instans. Untuk informasi lebih lanjut, lihat Ubah Spesifikasi Instans.