Mencadangkan database MySQL 22 GB setiap hari

28

Saat ini saya dapat melakukan backup menggunakan mysqldump. Tapi saya harus mencatat server web DAN dibutuhkan sekitar 5 menit untuk melakukan backup. Jika saya tidak menghapus server web, ini akan berlangsung selamanya dan tidak pernah selesai + situs web menjadi tidak dapat diakses selama pencadangan.

Apakah ada cara yang lebih cepat / lebih baik untuk membuat cadangan 22 GB saya dan mengembangkan basis data?

Semua tabel adalah MyISAM.

anon
sumber
lihat tautan ini ke pertanyaan serupa serverfault.com/questions/8044/backup-mysql-server
Charles Faiga

Jawaban:

28

Iya nih.

Atur replikasi ke mesin kedua. Ketika Anda perlu melakukan backup, Anda dapat mengunci mesin sekunder, melakukan mysqlhotcopy atau mysqldump, dan kemudian membuka kunci. Ini akan mengejar ketinggalan dengan tuanmu, dan kamu tidak perlu membuat tuan offline.

Anda bahkan dapat melakukan ini pada mesin yang sama, jika Anda tidak keberatan menggandakan penulisan I / O, tetapi idealnya Anda harus mencadangkannya secara real-time ke server fisik kedua, dan mengambil cadangan snapshot Anda sesering yang Anda butuhkan. tanpa mengganggu server produksi Anda.

Secara teori juga memungkinkan untuk mengembalikan database menggunakan status dan binlog yang dikenal. Saya belum pernah melakukannya, jadi silakan selidiki terlebih dahulu, tetapi Anda dapat membuat cadangan yang diketahui dari basis data Anda, kemudian hanya mencadangkan semua binlog baru dan memutar ulang mereka jika Anda perlu memulihkannya. Karena binlog ditulis secara linear, rsyncing binlog baru ke komputer jarak jauh akan sangat cepat.

Sunting: Memang, sepertinya menggunakan binlog untuk cadangan didokumentasikan.

Pertanyaan ini sangat terkait

John Douthat
sumber
Ya, ini bekerja dengan baik dan akan menjadi jawaban saya. Satu-satunya downside utama adalah bahwa Anda perlu memastikan bahwa replikasi bekerja dengan benar setiap hari. Kami mengambil snapshot dari database budak kami selama jam kerja dan cadangan malam dari master.
5

Maafkan saya karena menganggap OS adalah Linux. Jika Anda tidak menggunakan LVM, Anda seharusnya. Jika ya, berikut adalah cara yang sangat sederhana untuk membuat cadangan melalui snapshot.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Ini akan memungkinkan Anda untuk membuat cadangan setiap malam tanpa harus menambahkan server pendukung. Saya sangat mendukung memiliki server budak untuk Ketersediaan Tinggi, tetapi saya tidak ingin Anda berpikir bahwa Anda terjebak sampai Anda dapat membuat budak itu.

Bruno Bronosky
sumber
2

FLUSH TABLES DENGAN READ LOCK bukanlah sesuatu yang ingin Anda lakukan secara reguler (atau bahkan semi-reguler) pada sistem produksi. Itu harus menjadi pilihan terakhir saja.

Siapkan setidaknya dua budak replikasi (ini tentu saja memerlukan FLUSH TABLES WITH READ LOCK). Setelah diatur, Anda dapat mengambil cadangan salah satunya sementara yang lainnya tetap sinkron sebagai master cadangan.

Juga, jika salah satu budak Anda gagal, Anda dapat menggunakan snapshot dari sana untuk membangun kembali budak kedua (atau ketiga). Jika semua budak Anda gagal, Anda kembali ke FLUSH TABLES WITH READ LOCK.

Ingatlah untuk selalu memiliki proses yang secara teratur memeriksa data yang disinkronkan - gunakan sesuatu seperti mk-table-checksum untuk melakukan ini (ini tidak perlu diatur, bacalah dokumentasi Maatkit untuk perincian).

Karena 22 GB relatif kecil, Anda tidak akan mengalami masalah dalam melakukan ini. Melakukannya dengan database besar bisa lebih bermasalah.

MarkR
sumber
1

Solusi di sini ada dua, seperti dijelaskan di atas:

  1. Siapkan replikasi server Anda ke slave yang dapat Anda ambil luring. Cara terbaik untuk melakukan ini adalah dengan mengambil dump database menggunakan mysqldump dan parameter - master-data.
  2. Siapkan backup malam hari pada slave. Anda dapat menggunakan mysqldump dengan --master-data --flush-logs dan --single flags transaksi, atau Anda dapat menghentikan server mysql, menyalin file data pada disk, dan memulai kembali (replikasi akan mengambil tempat tinggalkan).
  3. Jalankan skrip pada slave setiap (mis. 5, 10, 20 menit) untuk memeriksa dan memastikan bahwa mysql masih mereplikasi. Saya menulis skrip python sederhana untuk melakukannya, yang dapat Anda gunakan.

Perhatikan bahwa jika Anda menggunakan InnoDB untuk tabel Anda, Anda dapat menggunakan flag --single-transaction untuk menghindari keharusan melakukan kunci tabel dan masih mendapatkan dump database yang konsisten, bahkan pada master, dan dengan demikian melakukan backup Anda tanpa mencatat server. Solusi di atas, bagaimanapun, adalah yang lebih baik.

Juga, jika Anda menggunakan LVM di Linux, Anda dapat mengambil snapshot LVM dari partisi, lalu kembali. Snapshots LVM adalah atom, jadi jika Anda melakukan 'flush tables with read lock' dan kemudian mengambil snapshot Anda dan membuka kunci, Anda akan mendapatkan snapshot yang konsisten.

Jika Anda khawatir tentang pertikaian I / O yang membuat dump terlalu lama, Anda dapat menambahkan mesin ketiga dan menjalankan mysqldump pada yang melalui jaringan untuk menghindari meronta-ronta disk Anda.

Dan Udey
sumber
0

Bergantung pada lingkungan Anda, foto biasanya merupakan cara terbaik untuk memotret. Terutama jika Anda harus membuat cadangan master untuk beberapa alasan. Kami menjalankan pasangan master dan slave, dan menggunakan cadangan snapshot pada keduanya.

  1. FLUSH TABLES WITH READ LOCK;
  2. Tarik snapshot pada basis data dan catat sistem file.
  3. UNLOCK TABLES;
  4. Salin file data Anda dari snapshot di waktu luang Anda.

Dengan tabel InnoDB, Anda ingin menjalankan SET AUTOCOMMIT=0;sebelum menjalankan kunci baca.

jasonjwwilliams
sumber
-1

Anda bisa melakukan pencadangan bertahap. Cadangkan 1/24 catatan setiap jam. Satu-satunya masalah dengan pendekatan ini adalah jika crash selama beberapa jam pertama hari itu, Anda akan kehilangan apa pun dari waktu itu hingga waktu crash. Either way, itu kurang dari 24 jam catatan hilang (saya tidak tahu betapa pentingnya bagi Anda).

musicfreak
sumber