SORU
13 EKİM 2010, ÇARŞAMBA


Nasıl yapılır: mysql InnoDB depolama motoru Temiz mi?

Silinen tablodan veri depolamak değil yani mysql ınnodb depolama motoru temizlemek mümkün mü?

Ya da yeni bir veritabanı her zaman yeniden inşa etmek zorunda mıyım?

CEVAP
29 EKİM 2010, Cuma


İşte Bunu bakımından daha kapsamlı bir cevap. Uzun bir süreç, ama bu çabaya değer olabilir.

/var/lib/mysql/ibdata1 Orada altyapı işlek bir dosya olduğunu unutmayın. Normalde bilgi altı tür evlere

Bunu Mimari

InnoDB Architecture

Birçok kişi ibdata birden fazla dosya inancınızın yanlış olduğunu daha iyi disk alanı yönetimi ve performans için ancak umut oluşturmak.

OPTIMIZE TABLE çalıştırabilir miyim ?

Ne yazık ki, OPTIMIZE TABLE Orada bir masa-uzay paylaşılan saklanan karşı çalışan ibdata1 iki şey yapar dosya:

  • Yaptığı tablonun veri ve dizinler ibdata1 içinde bitişik
  • ibdata1 bitişik veri büyümesini sağlar ve dizin sayfaları vardıreklenmişibdata1

Ancak, ibdata1 Tablo Veri ve Tablo Dizinleri ayırmak ve bunları bağımsız olarak yönetebilirsiniz.

innodb_file_per_table OPTIMIZE TABLE çalıştırabilir miyim ?

/etc/my.cnf (my.ini) innodb_file_per_table eklemek için olduğunu varsayalım. Sonra sadece Orada Tablolar OPTIMIZE TABLE koşabilir misin?

İyi Haber: innodb_file_per_table OPTIMIZE TABLE etkin çalıştırdığınızda, bu tablo için .ibd Bir dosya çıkarır. Eğer tablo varsa, örneğin, /var/lib/mysql mydb.mytable bir datadır şu: üretecektir

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

.ibd bu tablo için Veri Sayfaları ve Dizin Sayfaları içerir. Harika.

Kötü Haber: Yaptığınız ibdata canlı Veri Sayfaları ve Dizin Sayfaları mydb.mytable özüdür. Her tablo için veri sözlüğü giriş, mydb.mytable da dahil olmak üzere hala veri sözlüğü (Pictorial Representation of ibdata1) kalır.SADECE BU NOKTADA ibdata1 SİLEMEZSİNİZ !!!Lütfen ibdata1 hiç küçülmüş değil unutmayın.

Orada Altyapı Temizleme

ibdata1 bir kez küçültmek için aşağıdakileri yapmanız gerekir:

  1. (Örneğin, mysqldump ile) .sql bir metin dosyası içine tüm veritabanları (SQLData.sql aşağıda kullanılır) dökümü

  2. Tüm veritabanları (mysql information_schema hariç) bırakınUYARIBir önlem olarak, lütfen tüm kullanıcıya sahip kesinlikle emin olmak için bu komut dosyasını çalıştırın:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
    
  3. Giriş ve SET GLOBAL innodb_fast_shutdown = 0; mysql çalıştırmak için (Bu tamamen ib_logfile0 ib_logfile1 tüm kalan işlem değişiklikler silinecektir)

  4. Kapatma MySQL

  5. /etc/my.cnf (veya Windows my.ini) aşağıdaki satırları ekleyin

    [mysqld]
    innodb_file_per_table
    innodb_flush_method=O_DIRECT
    innodb_log_file_size=1G
    innodb_buffer_pool_size=4G
    

    (Not: innodb_buffer_pool_size, innodb_log_file_size ** 46 % olduğundan emin olmak için Ne olursa olsun ayarlayın.

    Ayrıca:=O_DİRECT innodb_flush_method Windows üzerinde kullanılamaz)

  6. ibdata* ib_logfile* İsteğe bağlı olarak silmek /var/lib/mysql/mysql dışında /var/lib/mysql tüm klasörleri kaldırabilirsiniz.

  7. MySQL (Bu 1G ibdata1 [varsayılan olarak 10 MB] ib_logfile0 ib_logfile1 her yeniden başlatın.

  8. SQLData.sql al

Şimdi, ibdata1 hala Orada masa ibdata1 DIŞINDA kalır büyür ama sadece tablo meta verileri içerir. ibdata1 artık diğer tablolar için, Bunu veri ve dizinleri içerir.

Örneğin, Orada bir masa mydb.mytable adlı varsayalım. Eğer /var/lib/mysql/mydb, bakarsanız iki dosya tablosu temsil göreceksiniz:

  • mytable.frm (Depolama Alt Başlığı)
  • mytable.ibd (Tablo Veri ve Dizinler)

/etc/my.cnf innodb_file_per_table seçeneği /var/lib/mysql/mydb/mytable.ibd aslında küçülür OPTIMIZE TABLE mydb.mytable dosyasını çalıştırabilirsiniz.

MySQL DBA olarak kariyerim boyunca bu birçok kez yaptım. Aslında bu ilk yaptığım zaman, bir azalttım50 GBibdata1 sadece 500 MB Dosya indir!

Bir deneyin. Eğer bu konuda daha fazla sorunuz varsa, sadece sor. İnan bana, bu uzun vadede kısa vadede olarak çalışacak.

UYARI

Adım 6 düştü başlamak şema mysql çünkü mysql olamaz, yeniden, geri Adım 2 bak. mysql şema fiziksel kopyasını yaptı. Aşağıdaki gibi geri yükleyebilirsiniz

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

Adım 6 dönün ve devam edin

GÜNCELLEME 2013-06-04 11:13 SUNACAK

Adım innodb_buffer_pool_size % innodb_log_file_size ayar battaniye kural 5, açısından oldukça eski kafalı.

Geri July 03, 2006, Percona 87* *güzel bir yazı vardı. Daha sonra, Nov 21, 2008, Percona how to calculate the proper size based on peak workload keeping one hour's worth of changes başka bir madde ile takip.

Bu iki Percona makaleler alıntı yaptığım yerde günlük boyutu ve hesaplama hakkında DBA StackExchange yazılmış mesajlar beri var.

Şahsen, hala ilk Kur için % kuralı ile giderdim. İş yükünü daha doğru üretim, zaman içinde belirlenebilir, you could resize the logs birkaç dakika içinde bir bakım döngüsü sırasında.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • Simon Hayter

    Simon Hayter

    20 HAZİRAN 2010