Pada drop table
, enjin innodb
akan mengosongkan halaman blok data yang sepadan pada jadual dalam setiap contoh buffer pool
, untuk mengelakkan kesan pada sistem , operasi pembersihan di sini sebenarnya bukan flush
, tetapi mengalih keluar halaman yang terlibat daripada baris gilir flush
. Tetapi semasa proses pengalihan keluar, proses pemadaman akan menahan kunci global setiap buffer pool
, dan kemudian cari halaman yang sepadan dalam buffer pool
ini untuk memadamkannya daripada flush list
. Jika terdapat terlalu banyak halaman yang perlu dicari dan dipadamkan dalam buffer pool
, masa traversal akan meningkat, yang akan menyebabkan operasi transaksi lain disekat, dan dalam kes yang teruk, pangkalan data mungkin dikunci.
(Kursus yang disyorkan: Tutorial MySQL)
Ada satu lagi perkara yang perlu anda perhatikan di sini Jika pangkalan data buffer pool
ditetapkan kepada saiz yang besar, ia akan menyebabkan traversal masa untuk menjadi lebih lama.
Apabila membersihkan buffer pool
, ia juga termasuk pembersihan AHI
yang mengandungi data jadual ini Fungsi AHI
tidak akan dibincangkan di sini terutamanya apabila tahap b+tree
menjadi lebih tinggi b+tree
Carian lapisan demi lapisan, AHI
boleh menanyakan terus halaman data yang sepadan berdasarkan keadaan carian tertentu, melangkau langkah penentududukan lapisan demi lapisan. Kedua, AHI akan menduduki 1/16 daripada saiz buffer pool
Jika data jadual dalam talian tidak terlalu besar dan konkurensinya tidak sangat tinggi, anda tidak disyorkan untuk mematikan AHI
fungsi
mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_adaptive_hash_index'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_adaptive_hash_index | ON | +----------------------------+-------+ 1 row in set (0.01 sec) mysql> SET GLOBAL innodb_adaptive_hash_index=OFF; Query OK, 0 rows affected (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_adaptive_hash_index'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_adaptive_hash_index | OFF | +----------------------------+-------+ 1 row in set (0.01 sec)
Apabila memadamkan fail data, jika fail data terlalu besar, proses pemadaman akan menjana besar. bilangan IO
dan mengambil lebih banyak masa, mengakibatkan cakera IO
Overhead melambung, CPU
Beban terlalu tinggi, menjejaskan pengendalian program lain. Rakan baik saya pernah memadamkan jadual 1TB daripada pangkalan data dalam talian Akibatnya, pangkalan data menjadi tidak responsif selama 20 minit, dan akhirnya pangkalan data ranap dan dimulakan semula.
Sekarang kita tahu bahawa drop table
telah melakukan 2 perkara, kita harus mengoptimumkan 2 perkara di atas
Untuk mengosongkan penimbal Buffer Pool
, untuk mengurangkan saiz buffer pool
, Anda boleh menetapkan parameter innodb_buffer_pool_instances
dengan munasabah untuk mengurangkan buffer pool
masa pengimbasan senarai blok data, dan pada masa yang sama mematikan fungsi AHI
Dalam langkah 2, anda boleh dengan bijak gunakan ciri sambungan keras linux
untuk menangguhkan pemadaman fail fizikal sebenar.
Apabila beberapa nama fail menghala ke INODE
yang sama pada masa yang sama, nombor rujukan INODE
ini ialah N>1, dan memadam mana-mana nama fail akan menjadi sangat pantas blok fail fizikal langsung belum Padam Ia hanya memadamkan penunjuk; apabila nombor rujukan INODE
ialah N=1, memadamkan fail memerlukan mengosongkan semua blok data yang berkaitan dengan fail, jadi ia akan memakan masa yang lebih lama. ; jika
diberikan kepada pangkalan data Fail .ibd
jadual mencipta pautan keras Apabila memadamkan jadual atau memadam fail fizikal, apa yang sebenarnya dipadamkan ialah penunjuk kepada fail fizikal. kelajuan tindak balas operasi pemadaman akan menjadi sangat pantas, kira-kira kurang daripada 1 saat
Berikut ialah demonstrasi operasi khusus
先创建表文件的硬链接 ln t_test.ibd t_test.ibd.bak 删除表 drop table t_test;
Langkah terakhir ialah memadam fail fizikal dan lepaskan ruang cakera yang diduduki oleh fail Kemudian persoalan timbul Bagaimana jika anda memadam fail fizikal dengan anggun. Sudah tentu, perintah coreutils
dalam set alat truncate
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.29.tar.xz 使用非root进行解压 tar -xvJf coreutils-8.29.tar.xz cd coreutils-8.29 ./configure make 使用root进行make install
bermakna, padam 10G setiap kali${i}G
#!/bin/bash TRUNCATE=/usr/local/bin/truncate for i in `seq 2194 -10 10 `; do sleep 2 $TRUNCATE -s ${i}G /data/mysql/t_test.ibd.hdlk done rm -rf /data/mysql/t_test.ibd.hdlk ;
Atas ialah kandungan terperinci Bagaimana untuk menggugurkan borang 1TB dalam perpustakaan mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!