Pengguna mengeluh bahwa sistem berjalan lambat ketika mysqldump sedang berlangsung

9

Database MYSQL (ibdata1) berukuran 73 GB dan dikonfigurasi untuk dijalankan sebagai server database khusus pada Windows 2008 O / S untuk tabel INNODB. Kami menjalankan pencadangan menggunakan mysqldump mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table --complete-insert - set-charset - kompres --log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

File cadangan Proddb0635.sql disimpan di server terpisah dari server database. RAM adalah 12 GB. Ukuran INNODB Buffer Pool adalah 6 GB. Mem.pool tambahan adalah 32 MB. Ukuran Cache Kueri adalah 2 GB Panjang buffer bersih adalah 16 M Maks. ukuran paket 1 GB.

versi mysql adalah 5.0.67.

Ketika cadangan tidak berjalan, pengguna senang dengan kinerja tersebut.

Ketika cadangan menjalankan INNODB Buffer pool, hit rate tinggi mendekati 100%. Tidak ada tulisan yang tertunda atau tulisan yang tertunda. innodb tunggu gratis adalah 0. Penggunaan CPU tidak tinggi, minimum 9% hingga maks 15%. Hit rate cache cache rendah sekitar 40% dengan atau tanpa mysqlbackup berjalan. Saat ini Windows Task Manager sedang menampilkan bahwa 10GB RAM sedang digunakan. Haruskah saya meningkatkan Query Cache dengan hanya tersedia 2GB RAM? mysqlld-nt mengambil 9,2 GB RAM dan mysqldump mengambil 5 MB RAM. Alos, mencatat bahwa ukuran file dump sama dengan ada atau tidak adanya opsi --compress.

Haruskah saya mengurangi ukuran Buffer Pool iNNODB?

Terima kasih

dbachacha
sumber

Jawaban:

8

Ada masalah yang diketahui di Windows, bahwa ketika Anda mendorong file besar ke server lain semua memori akhirnya dialokasikan ke cache Sistem alih-alih proses pengguna. Anda dapat melihat di bagian Memori Fisik (MB) dari pengelola tugas untuk melihat berapa banyak memori yang dialokasikan ke cache sistem.

Ini dapat diatasi dengan mencadangkan ke disk lokal, kemudian meminta mesin remote menarik file itu.

mrdenny
sumber
Terima kasih, tuan. Kami memiliki disk kami disimpan di SAN. Apakah ada bedanya juga?
dbachacha
1
Ini masalah tidak peduli bagaimana penyimpanan disajikan. Karena penyimpanannya adalah penyimpanan SAN, tidak perlu menyalin file melalui jaringan ke komputer lain. Sajikan LUN baru ke Server MySQL, lalu cadangkan ke mesin itu. Jika Anda perlu mendapatkan file ke komputer lain untuk backup tape, gunakan SAN. Snap the LUN, presentasikan snapshot ke server cadangan, buat cadangan file, lalu hapus snapshot. Ulangi keesokan harinya. Ini mungkin semua bisa ditulis.
mrdenny
Saran pertama Anda: # tidak berubah dalam cache sistem. Mengenai LUN, saya akan menyampaikannya kepada kolega saya yang bekerja di System & Network Team.
dbachacha
Saya memindahkan skrip cadangan untuk dijalankan di server lain dan ada peningkatan yang cukup besar. Selain itu, kami menemukan kode aplikasi tidak menggunakan kembali koneksi sinngle tetapi membuka / menutup beberapa fungsi yang dikelompokkan ke dalam satu permintaan ke server database. Juga, saya menemukan bahwa satu kartu NIC digunakan bersama oleh data cadangan dan data transaksional online. Jadi, kami berencana memiliki NIC khusus hanya untuk cadangan. Terima kasih banyak.
dbachacha
7

Berikut adalah beberapa pemikiran saya tentang meningkatkan kinerja mysqldump, mengingat keadaan Anda. Ini perintahmu:

mysqldump --skip-opt --quick --single-transaction --create-options --extended-insert --disable-keys --add-drop-table - insert lengkap --set-charset --compress - -log-error = Proddb0635.err -u root -pjohndoe Proddb> \ devNas \ devNas \ sqlbackup \ LIVE \ db \ Proddb0635.sql

Hal pertama yang saya perhatikan adalah Anda mengarahkan output ke sistem file. Dikatakan 'devNas' jadi saya akan menganggap ini adalah Network Attached Storage . Saya penggemar NAS untuk cadangan, tetapi harus terhubung pada NIC fisik terpisah dari lalu lintas produksi . Anda mungkin tidak menjenuhkan bandwidth, tetapi mereka masih bersaing. Ini akan menjadi lebih banyak masalah karena flag --quick, karena flag tersebut memerah setiap baris alih-alih menahannya di memori.

Hal berikutnya yang saya lihat adalah bahwa Anda telah memanggil --compress. Sepertinya Anda menjalankan mysql secara lokal karena Anda tidak menggunakan -h switch. Ini dapat menggunakan CPU lokal yang tidak perlu dalam konteks ini. Apakah --compress diperlukan? Ini hanya memampatkan data antara klien mysqldump dan server mysql, bukan konten file.

Selanjutnya saya melihat Anda menggunakan flag --single-transaction. Ini akan menyebabkan CPU ekstra karena pengujian pada setiap pilih sebagai bagian dari mysqldump.

Ini tidak ada hubungannya dengan kinerja, tetapi Anda menggunakan --disable-keys yang hanya berfungsi pada MyISAM ( manual ).

Anda mungkin ingin bereksperimen dengan menjalankan mysqldump dari jarak jauh dari host offline dan memindahkan file dump ke NAS setelah selesai untuk mengambil sebanyak mungkin operasi ini dari band.

randomx
sumber
Ya, saya melakukan pengecekan dengan Network & System Administrator. Ini adalah Network Attached Storage. Saya dapat mencoba memindahkan mysqldump ke server yang berbeda. Juga, sekarang masuk akal bagi saya tentang penggunaan --compress. Manual mengatakan bahwa --compress bekerja dengan klien dan server, namun saya menaruhnya untuk melihat apakah ada bedanya. Jenis data apa yang mengalir antara klien yang menjalankan mysqldump dan server database mysql. Data mengalir antara server database mysql dan devNas. Dokumentasi MySQl dan buku Basis Data Desain dan Tuning lebih suka penggunaan transaksi tunggal untuk tabel INNODB.
dbachacha
Saya memindahkan skrip cadangan untuk dijalankan di server lain dan ada peningkatan yang cukup besar. Selain itu, kami menemukan kode aplikasi tidak menggunakan kembali koneksi sinngle tetapi membuka / menutup beberapa fungsi yang dikelompokkan ke dalam satu permintaan ke server database. Juga, saya menemukan bahwa satu kartu NIC digunakan bersama oleh data cadangan dan data transaksional online. Jadi, kami berencana memiliki NIC khusus hanya untuk cadangan. Terima kasih banyak.
dbachacha
Saya senang ini membantu. Semoga sukses.
randomx
Di sini saya perlu bantuan untuk memahami skenario berikut: Database mysql ada di Server A. mysqldump berjalan di Server B yang membuang data di Server C. Kami memiliki NIC khusus dari Server A ke Server C. Apakah ini benar? Saya tidak yakin jadi Tadi malam mysqldump berjalan di Server A. Saya ingin menjalankannya di Server yang berbeda untuk mengurangi pertikaian CPU.
dbachacha
mysqldump adalah 'utilitas klien' yang berarti Anda dapat menjalankannya dari host apa pun yang memiliki hak istimewa untuk mengakses tabel pada database. Strategi untuk Anda adalah menjalankan mysqldump dari shell Server yang menargetkan tabel Server A. Tentu saja, Anda harus memberikan akses dari Server C ke skema yang ingin Anda buang.
randomx
2

PENGAMATAN # 1

Berikut adalah sesuatu yang perlu diingat ketika melakukan mysqldump terhadap InnoDB.

Apa pun halaman kotor yang ada di Pool Buffer InnoDB harus dibuang ke disk terlebih dahulu. Mysqldump akan memicu pembilasan tabel InnoDB yang masih memiliki halaman kotor di dalamnya.

Ada opsi server yang disebut innodb_max_dirty_pages_pct . Nilai defaultnya adalah 75 adalah MySQL 5.5 dan 90 dalam versi MySQL sebelum 5.5. Dalam lingkungan produksi, boleh saja meninggalkan nomor ini pada nilai default.

Untuk melihat apakah Anda memiliki banyak halaman kotor di InnoDB Buffer Pool, jalankan ini:

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';

BTW halaman adalah 16K seperti yang ditunjukkan dari ini:

SHOW GLOBAL STATUS LIKE 'Innodb_page_size';

Ketika datang InnoDB dan mysqldump, Anda dapat menurunkan angka ini dalam dua keadaan.

CIRCUMSTANCE 1: Atur secara permanen ke 0

Cukup tambahkan ini ke my.ini:

[mysqld]
innodb_max_dirty_pages_pct=0

Ini akan membuat InnoDB Buffer Pool ramping dan jahat. Langkah membilas tabel InnoDB yang sedang dibuang akan cepat karena beberapa halaman kotor mungkin (mungkin 0) perlu disiram sebelum mysqldump beroperasi di atasnya.

Satu-satunya kelemahan adalah jika Anda mysqldump dari DB yang sangat diperdagangkan, mungkin ada peningkatan yang lebih kecil dalam penulisan I / O karena membilas halaman kotor lebih sering. Anda dapat menentukan apakah ini tanpa me-restart mysql dengan menjalankan ini:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Biarkan pengaturan selama 12-24 jam, jika kinerja penulisan dapat diterima, Anda dapat melakukannya. Jika tidak, atur kembali dengan:

SET GLOBAL innodb_max_dirty_pages_pct = 90;

CIRCUMSTANCE 2: Atur ke 0 sekitar 1 jam sebelum mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Jalankan mysqldump

SET GLOBAL innodb_max_dirty_pages_pct = 90;

PENGAMATAN # 2

Anda memiliki --complete-insert sebagai opsi mysqldump. Ini akan menyematkan nama-nama kolom pada setiap status INSERT sebelum klausa VALUES. Bahkan dengan --extended-insert, pada setiap batch baris yang disisipkan memiliki nama kolom yang dikirim ke mysqldump. Anda dapat mengurangi jumlah byte yang dikirim ke mysqldump dengan menghapus --complete-insert.

REKOMENDASI

Jika Anda memiliki Windows Server lain yang dapat diatur sebagai Slave, lakukan mysqldumps dari slave itu dan bukan dari mesin produksi.

RolandoMySQLDBA
sumber
Terima kasih. Saya lupa menyebutkan bahwa pengguna mengeluh bahwa "menghemat" membutuhkan waktu daripada membaca. Saya akan segera menerapkan pengamatan Anda # 2. Saya sangat menyukai rekomendasi Anda untuk memiliki budak dan kemudian mengambil mysqldump dari budak.
dbachacha
innodb_buffer_pool_dirty_pages tidak terlalu tinggi sebelum pencadangan dimulai. Itu sekitar 9 hingga maks. 196. Master-Slave juga merupakan rekomendasi yang bagus.
dbachacha
1
Saya memindahkan skrip cadangan untuk dijalankan di server lain dan ada peningkatan yang cukup besar. Selain itu, kami menemukan kode aplikasi tidak menggunakan kembali koneksi sinngle tetapi membuka / menutup beberapa fungsi yang dikelompokkan ke dalam satu permintaan ke server database. Juga, saya menemukan bahwa satu kartu NIC digunakan bersama oleh data cadangan dan data transaksional online. Jadi, kami berencana memiliki NIC khusus hanya untuk cadangan. Terima kasih banyak. Jika tidak ada yang berhasil maka saya yakin budak master akan baik juga.
dbachacha