Saya menggunakan MySQL di localhost sebagai "alat permintaan" untuk melakukan statistik dalam R, yaitu, setiap kali saya menjalankan skrip R, saya membuat database baru (A), membuat tabel baru (B), mengimpor data ke B , kirimkan pertanyaan untuk mendapatkan apa yang saya butuhkan, dan kemudian saya menjatuhkan B dan menjatuhkan A.
Ini berfungsi dengan baik untuk saya, tetapi saya menyadari bahwa ukuran file ibdata meningkat dengan cepat, saya tidak menyimpan apa pun di MySQL, tetapi file ibdata1 sudah melebihi 100 MB.
Saya menggunakan kurang lebih pengaturan MySQL default untuk pengaturan, apakah ada cara agar saya dapat secara otomatis mengecilkan / menghapus file ibdata1 setelah periode waktu yang tetap?
Jawaban:
Yang
ibdata1
tidak menyusut adalah fitur MySQL yang sangat mengganggu. Theibdata1
file tidak dapat benar-benar akan menyusut kecuali Anda menghapus semua database, menghapus file dan kembali dump.Tetapi Anda dapat mengkonfigurasi MySQL sehingga setiap tabel, termasuk indeksnya, disimpan sebagai file terpisah. Dengan cara
ibdata1
itu tidak akan tumbuh besar. Menurut komentar Bill Karwin, ini diaktifkan secara default pada versi 5.6.6 dari MySQL.Beberapa waktu yang lalu saya melakukan ini. Namun, untuk mengatur server Anda untuk menggunakan file terpisah untuk setiap tabel Anda perlu mengubah
my.cnf
untuk mengaktifkan ini:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Karena Anda ingin mendapatkan kembali ruang dari
ibdata1
Anda sebenarnya harus menghapus file:mysqldump
dari semua basis data, prosedur, pemicu dll kecualimysql
danperformance_schema
basis dataibdata1
danib_log
fileKetika Anda memulai MySQL pada langkah 5
ibdata1
danib_log
file akan dibuat kembali.Sekarang Anda siap untuk pergi. Saat Anda membuat database baru untuk analisis, tabel akan ditempatkan di
ibd*
file terpisah , bukan diibdata1
. Karena Anda biasanya menjatuhkan basis data segera setelahnya,ibd*
file - file tersebut akan dihapus.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Anda mungkin telah melihat ini:
http://bugs.mysql.com/bug.php?id=1341
Dengan menggunakan perintah
ALTER TABLE <tablename> ENGINE=innodb
atauOPTIMIZE TABLE <tablename>
satu dapat mengekstrak data dan indeks halaman dari ibdata1 ke file terpisah. Namun, ibdata1 tidak akan menyusut kecuali Anda melakukan langkah-langkah di atas.Mengenai itu
information_schema
, itu tidak perlu atau tidak mungkin untuk jatuh. Ini sebenarnya hanya sekelompok tampilan read-only, bukan tabel. Dan tidak ada file yang terkait dengan mereka, bahkan direktori basis data. Theinformations_schema
menggunakan memori db-mesin dan dijatuhkan dan regenerasi pada stop / restart mysqld. Lihat https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .sumber
innodb_file_per_table
secara default.Menambah jawaban John P ,
Untuk sistem linux, langkah 1-6 dapat dilakukan dengan perintah-perintah ini:
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
DROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(dan hapus ib_logfile lainnya yang mungkin dinamaiib_logfile0
,ib_logfile1
dll ...)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Peringatan: instruksi ini akan menyebabkan Anda kehilangan database lain jika Anda memiliki database lain pada instance mysql ini. Pastikan langkah 1,2 dan 6,7 dimodifikasi untuk mencakup semua basis data yang ingin Anda simpan.
sumber
create database database_name;
dan kemudiangrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
diminta (yang merupakan praktik yang lebih aman), cukup masukkan-p
tanpa kata sandi yang sebenarnya.Ketika Anda menghapus tabel innodb, MySQL tidak mengosongkan ruang di dalam file ibdata, itu sebabnya ia terus bertambah. File-file ini hampir tidak pernah menyusut.
Cara mengecilkan file ibdata yang ada:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Anda dapat membuat skrip ini dan menjadwalkan skrip untuk dijalankan setelah jangka waktu tertentu, tetapi untuk pengaturan yang dijelaskan di atas tampaknya beberapa tablespace adalah solusi yang lebih mudah.
Jika Anda menggunakan opsi konfigurasi
innodb_file_per_table
, Anda membuat beberapa tablespace. Artinya, MySQL membuat file terpisah untuk setiap tabel, bukan satu file bersama. File-file terpisah ini disimpan dalam direktori database, dan mereka dihapus ketika Anda menghapus database ini. Ini harus menghapus kebutuhan untuk mengecilkan / membersihkan file ibdata dalam kasus Anda.Informasi lebih lanjut tentang beberapa tablespace:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
sumber
Saya pikir Anda dapat menemukan penjelasan dan solusi yang bagus di sana:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
sumber
Cepat menuliskan prosedur jawaban yang diterima di bash:
Simpan sebagai
purge_binlogs.sh
dan jalankan sebagairoot
.Tidak termasuk
mysql
,information_schema
,performance_schema
(danbinlog
direktori).Mengasumsikan Anda memiliki kredensial administrator
/root/.my.cnf
dan bahwa database Anda hidup di/var/lib/mysql
direktori default .Anda juga dapat membersihkan log biner setelah menjalankan skrip ini untuk mendapatkan kembali lebih banyak ruang disk dengan:
sumber
alldatabases.sql
sebelum memeriksa ulang apakah semua tabel sehat. Adapun beberapa perbaikan: aturinnodb_fast_shutdown=0
sebelum shutdown, aturautocommit=0
sebelum mengimpor file SQL, jalankanCOMMIT
dan setelautocommit=1
setelah mengimpor file SQL, gunakanmysqlcheck --all-databases
sebelum menghapus cadangan.Jika tujuan Anda adalah untuk memonitor ruang kosong MySQL dan Anda tidak dapat menghentikan MySQL untuk mengecilkan file ibdata Anda, dapatkan melalui perintah status tabel. Contoh:
MySQL> 5.1.24:
MySQL <5.1.24:
Kemudian bandingkan nilai ini dengan file ibdata Anda:
Sumber: http://dev.mysql.com/doc/refman/5.1/id/show-table-status.html
sumber
Dalam versi baru dari resep mysql-server di atas akan menghancurkan basis data "mysql". Dalam versi lama itu berfungsi. Dalam beberapa tabel baru beralih ke jenis tabel INNODB, dan dengan demikian Anda akan merusaknya. Cara termudah adalah:
sumber
Seperti yang sudah disebutkan, Anda tidak dapat menyusutkan ibdata1 (untuk melakukannya Anda perlu membuang dan membangun kembali), tetapi sering kali juga tidak perlu.
Menggunakan autoextend (mungkin pengaturan ukuran paling umum) ibdata1 mengalokasikan penyimpanan, bertambah setiap kali hampir penuh. Itu membuat menulis lebih cepat karena ruang sudah dialokasikan.
Ketika Anda menghapus data itu tidak menyusut tetapi ruang di dalam file ditandai sebagai tidak terpakai. Sekarang ketika Anda memasukkan data baru itu akan menggunakan kembali ruang kosong dalam file sebelum menumbuhkan file lebih jauh.
Jadi itu hanya akan terus tumbuh jika Anda benar-benar membutuhkan data itu. Kecuali Anda benar-benar membutuhkan ruang untuk aplikasi lain, mungkin tidak ada alasan untuk mengecilkannya.
sumber
storage leak
.