Bagaimana cara mencadangkan database mysql, tetapi dengan prioritas rendah?

15

Saya ingin membuat cadangan database, tetapi pada siang hari ketika ada beban di server. Sangat penting bahwa cadangan tidak memengaruhi apache dan database lain yang berjalan di server yang sama.

Seharusnya dimungkinkan untuk menggunakan perintah mysqldump , tetapi jalankan perintah dengan prioritas rendah.

Bagaimana saya bisa melakukan ini?

Pembaruan: Sepertinya hanya menggunakan nice dengan mysqldump tidak berfungsi karena mysqldump memunculkan proses baru.

andyuk
sumber
sudahkah Anda melihat mysqlhotcopy?
@ fsb, bagaimana mysqlhotcopy mendukung apa yang diinginkan OP?
Tomas

Jawaban:

8

Jika Anda memiliki server cadangan di sekitarnya yang dapat mengatasi beban tulis server Anda, Anda dapat mengatur replikasi ke server itu, dan kemudian membuat cadangan dari server slave. Ini juga memiliki keuntungan bahwa Anda dapat menghentikan replikasi saat Anda melakukan pencadangan dan mendapatkan snapshot yang konsisten dari data Anda di semua basis data, atau semua tabel dalam satu basis data tanpa memengaruhi server basis data. Ini adalah pengaturan yang saya selalu rekomendasikan untuk membuat cadangan MySQL jika Anda memiliki sumber daya.

Sebagai bonus yang bagus, Anda sekarang memiliki budak read-only yang dapat Anda gunakan untuk permintaan yang berjalan lama.

David Pashley
sumber
Sayangnya opsi ini sepertinya itu yang paling berhasil, tapi saya kira ini satu-satunya pilihan nyata jika saya ingin dampak minimal pada server utama.
andyuk
2
Ini hampir satu-satunya cara untuk mendapatkan cadangan quiesced yang benar jika Anda tidak ingin mempengaruhi operasi. Karena melambat mysqldumpakan menyebabkan kunci panjang ditahan atau tabel tidak sinkron.
Dan Carley
15

Andy, sekarang kurasa kau punya banyak waktu untuk menemukan solusi. Saya baru-baru ini datang dengan solusi untuk ini yang bekerja sangat baik untuk saya di tsheets , dan saya pikir saya akan membagikannya.

cstream adalah alat penanganan aliran untuk keperluan umum seperti UNIX dd, biasanya digunakan pada pipa yang dibangun dengan commandline. Hal yang membuat cstream berguna bagi kami adalah memungkinkan Anda menentukan bandwidth maksimum untuk semua input. Ini berarti Anda dapat membatasi disk IO dari perintah mysqldump Anda dengan perintah sederhana seperti ini:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Dengan anggapan Anda membuat cadangan database yang menggunakan semua tabel InnoDB, perintah di atas aman (tidak akan memengaruhi kueri lainnya) dan akan melakukan mysqldump Anda sambil membatasi disk-nya hanya baca satu megabyte per detik. Sesuaikan bandwidth dengan parameter -t ke nilai apa pun yang memungkinkan lingkungan Anda melakukan pencadangan tanpa memengaruhi pengalaman pelanggan Anda.

Brandon
sumber
Baru diuji dan saya bekerja seperti pesona! Terima kasih telah berbagi Brandon!
sucotronic
4

FWIW Anda juga harus dapat melakukan ini dengan pv ( http://linux.die.net/man/1/pv )

mysqldump --satu transaksi - cepat -u -p | pv --rate-limit 1m> tujuan (atau | nc atau | tar cfj backup.bz2 -)

Yang menyenangkan tentang ini adalah berbagai opsi untuk memantau kemajuan dan opsi -R yang memungkinkan Anda untuk meneruskan opsi ke proses yang sudah berjalan, misalnya; --rate-limit untuk mengubah laju transfer.

alex.pilon
sumber
1

jika Anda menggunakan innodb, Anda dapat mencoba xtrabackup dengan opsi --thottottle .

Anda juga bisa melihat ionice dan menjalankan mysqldump dengannya.

atau mungkin Anda ingin mengaktifkan log biner di mysql dan menjalankan dump penuh sekali per minggu / malam, sambil menyalin bin-log ke lokasi aman setiap 1-2 jam. dan .. read-only slave untuk keperluan cadangan saja juga merupakan opsi.

pQd
sumber
0

Jika Anda menjalankannya di Linux, atau varian * nix lain Anda dapat melakukannya dengan yang berikut:

bagus -n ## mysqldump

Ini akan memberikan prioritas penjadwalan yang lebih rendah. Penjadwalan rentang prioritas dari -20 (prioritas tertinggi) hingga 19 (prioritas terendah) standar untuk nice adalah 10 jika argumen -n dihilangkan ..

Kevin K.
sumber
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice untuk prioritas I / O dan bagus untuk prioritas cpu.

Jalankan vmstat 5, periksa kolom yang mengatakan WA. Nilai tinggi berarti CPU sedang menunggu I / O. Gunakan ionice, jika hanya memuat CPU, gunakan bagus.

Tanggapan untuk memperbarui:

Sepertinya kamu benar. Itu memanggil mysql yang tidak niced. Saya kira Anda bisa menggunakan renice untuk ini dan mengatur nilai bagus setelah dijalankan.

Saya tidak memiliki database yang cukup besar untuk membuang atm untuk membuat skrip yang berguna bagi Anda.

Replikasi, seperti yang disarankan tautan Anda, adalah salah satu cara untuk melangkah. Replikasi, berhenti, dan buang, pada host anthoer.

artifex
sumber
0

Letakkan data MySQL Anda pada LV, dan gunakan tugas mylvmbackup yang telah diambil yang mengambil snapshot dari LV dan menyusun file data MySQL. Dengan cara ini Anda tidak mengunci tabel, meminimalkan dampak pada aplikasi Anda hanya untuk memuat IO.

rodjek
sumber
0

Anda selalu dapat mencoba untuk tidak menjalankannya selama jam sibuk. Apa pun prioritas yang Anda gunakan, tempat sampah masih akan membutuhkan kunci di semua meja Anda.

Peter
sumber
Itu tidak benar: jika tabel adalah InnoDB, tidak ada kunci yang ditempatkan pada mereka untuk membaca.
dr01