Bölümlenmiş tablolarda çalışan bu sorunu çözmek için belki de daha havalı bir yol olduğunu öğrendim. Birkaç yıl önce bölümleri bırakmam gerekiyordu ve 2014 için bazı bölümler eklemek zorunda kaldım. Hemen hemen tüm bölümler bu hatayı, yani eski bölümleri bildiriyor. Çok kötü bir kaza.
Bu yüzden eski DROPPING ve MAXVALUE bölümünün REORGANIZE (sonuncusu) kullanarak, tamam yeni dosyalar oluşturur, bu yüzden daha az uyarı alırım. Bu arada, günlük dizisi sayacını artırmaya yardımcı olur, bu yüzden sahte veri eklemek gerekmez. Bu bir ana sunucu btw üzerinde oluyor ...
Yani bu:
ALTER TABLE Events DROP PARTITION p1530 , p1535 , p1540 , p1545 ,
p1550, p1555 , p1560 , p1565 , p1570 , p1575 , p1580 , p1585 , p1590 ,
p1595 , p1600 , p1605 , p1610 , p1615 , p1620 , p1625 , p1630 , p1635 ,
p1640 , p1645 , p1650 , p1655 , p1660 , p1665 , p1670 , p1675 , p1680 ,
p1685 , p1690 , p1695 , p1700 , p1705 , p1710 , p1715 , p1720 , p1725 ,
p1730 , p1735 , p1740 , p1745 , p1750 , p1755 , p1760 , p1765 , p1770 ,
p1775 , p1780 , p1785 , p1790 , p1795 , p1800 , p1805 , p1810 , p1815 ,
p1820 , p1825 , p1830 , p1835 , p1840;
Ve bu:
ALTER table Events REORGANIZE PARTITION p3000 INTO (
PARTITION p3500 VALUES LESS THAN (TO_DAYS('2013-01-01')),
PARTITION p3510 VALUES LESS THAN (TO_DAYS('2013-01-04')),
PARTITION p3520 VALUES LESS THAN (TO_DAYS('2013-01-07')),
PARTITION p3530 VALUES LESS THAN (TO_DAYS('2013-01-10'))
...
PARTITION p4740 VALUES LESS THAN (TO_DAYS('2014-01-08')),
PARTITION p9000 VALUES LESS THAN MAXVALUE)
Bu, her bölümü etkili bir şekilde değişime düşürecek ve orada bulunan içeriğin geçici bir kopyasıyla yeniden oluşturacaktır. İsterseniz bunu tablo başına yapabilirsiniz, uygulamam bunun olmasına izin verir, bu nedenle senkronize edilmiş yedeklemeler vb. İçin endişelenmenize gerek yoktur.
Şimdi tablonun geri kalanı için, süreçteki tüm bölümlere dokunmadığım için, bazıları günlük sekans uyarısı ile bırakılacak, kırık olan ve bu yeniden yapılanma eylemi kapsamında olanlar için muhtemelen bunu çalıştıracağım:
ALTER TABLE Events REBUILD PARTITION p0, p1;
yada bu
ALTER TABLE Events OPTIMIZE PARTITION p0, p1;
Yani, bu beni düşündürdü, Bunu düz vanilya masaları ile yapabilirsin, geçici olarak bölümleri ekle ve sonra kaldır (ya da onları sakla, bölümleri şiddetle tavsiye edebilirim).
Ben mariadb kullanıyorum, ancak mysql (yani XtraDB)
Belki de bu birisine yardım eder. Hala çalıştırıyorum, şimdiye kadar çok iyi. MOTOR'u değiştirmek de bu işi yapıyor gibi görünüyor, bu yüzden MyIsam ve onlar arasında InnoDB'ye geri / ileri getiriyorum.
MOTORU değiştirirseniz, tablo innodb'dan kaybolur, bu yüzden artık bir sorun olmayacaktır.
ALTER TABLE Events ENGINE=MyISAM;
ALTER TABLE Events ENGINE=InnoDB;
burada çalışıyor gibi görünüyor. Bölümlenmiş tablolarda birkaç şeyi onaylayabilirim:
- ALTER TABLE xyz ENGINE = InnoDB çok yavaş, Aria'ya (mariadb) iki kat daha hızlı, ancak genel olarak log sekansı sayacını arttırmanın yavaş bir yolu
- ALTER TABLE xyz REBUILD PARTITION ALL, tabloları 'düzeltmenin' ve sayacın artırılmasına yardımcı olmanın en hızlı yoludur
- ALTER TABLE xyz ANALYZE PARTITION ALL, öncekiyle yavaş karşılaştırılır ve tamam olup olmadığını kontrol eden bölümleri yeniden yazmaz. REBUILD, geçici tablo şemasının yeniden yazılmasını sağlar.
Sonuncuyu birkaç masada kullandım. Uyarılar dosyaları açmaya çalışırken oluşur ve sayaç sorunları ile açtığı her bölüm tanımı için bir tane vardır. Son tablolar için neredeyse bugün tezgahın üzerine yuvarlandı. Sanırım hepsi işlendikten sonra ikili günlükleri yıkamak gerekiyor.
Güncelleme : Bu sorunu çözmeyi başarabildiğim birkaç şeyi sonuçlandırabilirim.
- Çökmem Aria biçimindeki (MariaDB) bir tabloda bölümleri yeniden organize etmekten kaynaklandı.
- (benim için) bölümleri yeniden oluşturmak dizi sayacı almak için en iyi ve en hızlı çalıştı. Motorun değiştirilmesi yavaştır ve innodb'u etkilemek için iki kez yapmanız gerekir. innoDB'yi değiştirmek MyIsam veya Aria'ya göre oldukça yavaştır.
- MariaDB 5.3 ve 5.5 için yükseltildi (oldu: 5.2) ve iyi çalışıyor. Ben arria, 5.5 ile bölümleri (ve teyit böcek) bu kombinasyonu kullanmak için çok fazla sorun olduğunu düşünüyorum.
- Günlük dizisi sayacını sıfırlamanın daha iyi bir yolu olmalı.