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
İş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
- Tablo Veri
- Tablo Dizinler
- MVCC (Multiversioning Concurrency Control) Veri
- Geri Alma Segmentleri
- Alanı Geri Al
- Tablo Meta Veri (Veri Sözlüğü)
- Tampon (OS önbellekleme arka plan bağımlılığı önlemek için yazma) çift Yazın
- Ekle Tampon (benzersiz olmayan dizinler için ikincil değişiklikleri yönetme)
Pictorial Representation of ibdata1
bkz
Bunu Mimari
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:
(Örneğin,
mysqldump
ile).sql
bir metin dosyası içine tüm veritabanları (SQLData.sql
aşağıda kullanılır) dökümü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
Giriş ve
SET GLOBAL innodb_fast_shutdown = 0;
mysql çalıştırmak için (Bu tamamenib_logfile0
ib_logfile1
tüm kalan işlem değişiklikler silinecektir)Kapatma MySQL
/etc/my.cnf
(veya Windowsmy.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)
ibdata*
ib_logfile*
İsteğe bağlı olarak silmek/var/lib/mysql/mysql
dışında/var/lib/mysql
tüm klasörleri kaldırabilirsiniz.MySQL (Bu 1G
ibdata1
[varsayılan olarak 10 MB]ib_logfile0
ib_logfile1
her yeniden başlatın.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.
Aug 27, 2012
: Proper tuning for 30GB InnoDB table on server with 48GB RAMJan 17, 2013
: MySQL 5.5 - Innodb - innodb_log_file_size higher than 4GB combined?
Ş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.
Nasıl bir mysql tablo veya hali hazırd...
Nasıl daha sonra düz metin alma için e...
Nasıl MySQL kullanıcı hesaplarının bir...
Nasıl Python ile MySQL Veritabanına ba...
Nasıl çıkış için MySQL csv biçiminde s...