Mulai / Hentikan MySQL

8

Saya mencari bantuan untuk memahami apa yang terjadi ketika baris perintah berikut dijalankan:

root@prodn$ service mysqld stop

Ya, itu menutup server MySQL sehingga akses ke sana tidak lagi tersedia sampai layanan dimulai lagi. Namun, lebih khusus lagi, apakah ada hal lain yang terjadi ketika layanan dihentikan? Maafkan pemula saya di sini tetapi ketika mysqld restart, apakah itu berarti bahwa log dihapus, beberapa memori dibebaskan, cache dikosongkan, dll?

Alasan saya bertanya adalah sebagai berikut:

Data warehouse DB kami adalah DB MySQL dan dalam 4 bulan terakhir, dibutuhkan rata-rata 8,5 jam.

Rabu lalu, saya menghentikan layanan mysql, dan kemudian memulai kembali setelah 30 menit. Sejak itu, saya mulai melihat peningkatan besar pada kinerja keseluruhan - proses SELECT / INSERT / UPDATE / DELETE lebih efisien. DW selesai hampir 4 jam sebelumnya dengan jumlah baris data yang sama

Namun, setiap hari, 15-20 menit ditambahkan ke waktu selesai. Jadi, saya curiga saya harus me-restart layanan mingguan.

Apakah ada penjelasan untuk perilaku ini? Saya tidak tahu pertanyaan lain apa yang relevan tetapi akan sangat bagus untuk mengetahui apa yang terjadi ketika mysqldlayanan dimulai kembali.

Adakah yang bisa menjelaskan ini?

dat789
sumber
1
coba tanyakan pada serverfault atau dba.
gbjbaanb
1
Sepertinya Anda memiliki banyak data dalam memori yang dikomit. dev.mysql.com/doc/refman/5.0/en/server-shutdown.html
ethrbunny
@ dat789, tempat yang tepat untuk mencari jawaban sudah diberikan oleh ethrbunny. Itulah tempat pertama yang harus kamu kunjungi untuk menemukannya.
Mrigesh Raj Shrestha

Jawaban:

2

Ketika Anda mengeluarkan service mysql stop, lebih banyak terjadi daripada hanya memotong Konektivitas DB. Tautan dalam komentar dari @ethrbunny sudah menjelaskan hal-hal apa yang terjadi.

Saya ingin fokus pada satu aspek tertentu: The InnoDB Buffer Pool. InnoDB harus menyiram halaman kotor InnoDB Buffer Pool. Jika Anda ingin tahu berapa banyak, jalankan ini sebelum shutdown:

SELECT CONCAT(dpbytes/power(1024,expo),' ',SUBSTR(units,expo*2+1,2)) DirtyPages FROM
(SELECT dpbytes,FLOOR(LOG(dpbytes)/LOG(1024)) expo FROM
(SELECT dirty_pages*page_size dpbytes FROM
(SELECT VARIABLE_VALUE dirty_pages FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty') AAA,
(SELECT VARIABLE_VALUE page_size FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_page_size') BBB) AA) A,(SELECT ' BKBMBGBTB' units) B;

Ini akan memberi tahu Anda berapa banyak data yang perlu disiram dari Pool Buffer InnoDB.

Harap diingat bahwa InnoDB memiliki banyak bagian yang bergerak di tablespace sistem (file ibdata1). Klik di sini untuk melihat Representasi Pictorial dari seluruh Infrastruktur InnoDB .

Beberapa informasi transaksional ditulis sedemikian rupa sehingga Crash Recovery dilakukan ketika Anda menjalankan service mysql start.

PILIHAN

Anda bisa mendapatkan semua data memerah dan semua transaksi dilakukan dengan bersih dari ibdata1 dan Transaction Logs ( ib_logfile0, ib_logfile1) dengan menjalankan ini

SET GLOBAL innodb_fast_shutdown = 0;

sebelum berlari

service mysql stop

Cobalah !!!

UPDATE 2013-04-24 07:17 EDT

Karena Anda memiliki MyISAM sebagai mesin penyimpanan utama, maka satu-satunya hal yang terjadi adalah pembilasan perubahan indeks ke semua .MYIfile yang memiliki perubahan yang tertunda.

Saya juga ingin merekomendasikan bahwa Anda mematikan mysqld berikutnya, jalankan ini sebelumnya di sesi lain:

tail -f /var/log/mysqld.log

dan perhatikan pesan-pesan yang lewat dan melihatnya memberi tahu Anda apa yang dilakukan mysqld dengan mesin penyimpanan apa pun. Jika Anda sama sekali tidak memiliki tabel InnoDB yang digunakan, maka Anda harus mempertimbangkan untuk menonaktifkan InnoDB

[mysqld]
skip-innodb

karena ini akan membuat startup lebih cepat dan mungkin shutdown lebih cepat.

RolandoMySQLDBA
sumber
Terima kasih untuk ini. Saya seharusnya lebih spesifik tentang satu aspek lain yang tidak saya sebutkan - kami menggunakan mesin MyISAM di sebagian besar tabel kami. Apakah ini ada bedanya dibandingkan dengan InnoDB? Apakah ada cara untuk melakukan hal yang sama tanpa me-restart mysqld? Jika tidak, ini berarti saya harus mengganggu admin sistem kami dari waktu ke waktu. Juga, alasannya agak sederhana - setelah setiap hari berlalu sejak restart terakhir, operasi SELECT / UPDATE / INSERT tampaknya tertunda 25-40 menit. Restart mengembalikannya ke waktu 'dioptimalkan'. Saya tidak bisa menjelaskan mengapa.
dat789
Saya sangat percaya InnoDB sudah dinonaktifkan. Lihat ekstrak: 130422 15:35:31 mysqld_safe Memulai daemon mysqld dengan basis data dari / srv / mysqldb / mysql 130422 15:35:33 [Catatan] Plugin 'FEDERATED' dinonaktifkan. 130422 15:35:33 [Catatan] Plugin 'InnoDB' dinonaktifkan. 130422 15:35:33 [Catatan] Penjadwal Acara: Memuat 0 acara 130422 15:35:33 [Catatan] / usr / libexec / mysqld: siap untuk koneksi. Versi: '5.5.17' socket: '/srv/mysqldb/mysql/mysql.sock' port: 3306 Server Komunitas MySQL (GPL) Bagaimana kita dapat menyiram perubahan indeks ke semua .MYI tanpa memulai ulang? Bisa jadi?
dat789