DBAtlas · Veritabanı operasyon atlası

Default partition tuzağı: yeni partition 'would be violated by some row' hatası verirse

PostgreSQLPartition

Komut

-- Default partition'a hangi dönemlerden satır düşmüş?
SELECT date_trunc('month', tarih)::date AS month, count(*) AS row_count
FROM satislar_default
GROUP BY 1
ORDER BY 1;

-- Satırları yeni partition'a taşı ve tek transaction'da ekle
BEGIN;
SET LOCAL lock_timeout = '5s';
LOCK TABLE satislar_default IN ACCESS EXCLUSIVE MODE;
CREATE TABLE satislar_2027_02 (LIKE satislar INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
WITH moved AS (
  DELETE FROM satislar_default
  WHERE tarih >= DATE '2027-02-01' AND tarih < DATE '2027-03-01'
  RETURNING *
)
INSERT INTO satislar_2027_02 SELECT * FROM moved;
ALTER TABLE satislar ATTACH PARTITION satislar_2027_02
  FOR VALUES FROM ('2027-02-01') TO ('2027-03-01');
COMMIT;

Ne yapar?

Default partition'a düşmüş satırları dönem bazında sayar; yeni partition'ın aralığına giren satırları aynı transaction içinde yeni tabloya taşıyıp tabloyu partition olarak ekler.

Ne zaman kullanılır?

CREATE TABLE ... PARTITION OF veya ATTACH 'updated partition constraint for default partition would be violated by some row' hatası verdiğinde ya da default partition'ın şiştiği fark edildiğinde.

Dikkat

Default partition varken her yeni partition eklemesi default'u tamamen tarar ve bu sürede default üzerinde ACCESS EXCLUSIVE tutar; büyük bir default partition her bakımda kesinti demektir. Taşıma sırasında default yazmaya kapalıdır; işlemi düşük trafikte yap. Kalıcı çözüm: partition'ları önceden oluştur, default'u boş kalacak şekilde izle (satır sayısı > 0 alarmı) ya da hiç kullanma; o zaman aralık dışı INSERT hata verir ve sorun erken görünür. Default partition ayrıca DETACH ... CONCURRENTLY kullanımını engeller.

DBAtlas'ta aç →

İlgili