apa nilai yang wajar untuk max_allowed_packet untuk Drupal 7 dengan lalu lintas sedang?

12

Saya perlu tahu beberapa nomor ball park untuk variabel ini untuk situs drupal 7 saya. Saya baru-baru ini mendapat "drupal" PDOException: SQLSTATE [08S01]: Kesalahan tautan komunikasi: 1153 "kesalahan. Saya seorang pemula untuk mysql dan saya menggunakan shared hosting. Saya mungkin perlu meminta administrator untuk melakukannya untuk saya.

Terima kasih sebelumnya.

Patrick Cheung
sumber
1
Jawaban saya menunjukkan pengalaman saya dengan ini, tetapi Anda mungkin mendapatkan tanggapan yang lebih baik di dba.stackexchange.com dari mereka yang memelihara MySQL sebagai mata pencaharian.
mpdonadio

Jawaban:

12

Saya melihat jawaban yang menarik untuk pertanyaan tentang Gumpalan terbesar yang mungkin Anda miliki. Berikut adalah pernyataan yang saya lihat di ServerFault: innodb_log_file_size dan innodb_log_buffer_size digabungkan harus lebih besar dari sepuluh kali objek gumpalan terbesar Anda jika Anda memiliki banyak yang besar .

Berdasarkan posting ServerFault dari Nils-Anders Nøttseter , Anda harus menanyakan tabel dan mencari tahu BLOB mana yang terbesar, kalikan angka itu dengan 11 atau lebih, dan gunakan jawaban itu sebagai max_allowed_packet maju.

Lucu sekali saya menjawab pertanyaan lain di mana saya menyarankan untuk mengukur ukuran paket max_allowed agar saya bisa menyelesaikan masalah .

CAVEAT

Menurut Kitab

TheBookImage

Berikut adalah apa yang dikatakan Page 99 Paragraf 1-3 tentang Paket MySQL:

Kode komunikasi jaringan MySQL ditulis dengan asumsi bahwa permintaan selalu cukup pendek, dan karena itu dapat dikirim ke dan diproses oleh server dalam satu potongan, yang disebut paket dalam terminologi MySQL. Server mengalokasikan memori untuk buffer sementara untuk menyimpan paket, dan meminta cukup untuk sepenuhnya cocok. Arsitektur ini memerlukan tindakan pencegahan untuk menghindari server kehabisan memori --- batas pada ukuran paket, yang dicapai opsi ini.

Kode yang terkait dengan opsi ini ditemukan di sql / net_serv.cc . Lihatlah my_net_read () , lalu ikuti panggilan ke my_real_read () dan perhatikan net_realloc () .

Variabel ini juga membatasi panjang hasil dari banyak fungsi string. Lihat sql / field.cc dan sql / intem_strfunc.cc untuk detailnya.

Mengetahui hal ini tentang Paket MySQL memungkinkan DBA untuk mengukurnya untuk mengakomodasi beberapa BLOB dalam satu Paket MySQL, bahkan jika mereka terlalu besar.

Mengenai situasi Anda, Anda harus mencari tahu apa BLOB terbesar dalam database Anda, gandakan nomor itu dengan 11 dan atur max_allowed_packet Anda ke nomor itu. Anda harus dapat mengaturnya untuk server tanpa me-restart mysql (Secara pribadi, saya akan mengaturnya 256 juta karena akan mengatasi masalah lain mengenai migrasi dan replikasi, yang berada di luar ruang lingkup forum ini). Untuk mengaturnya ke 256 juta untuk database Anda untuk semua koneksi yang masuk, silakan jalankan ini:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Setelah itu, tambahkan pengaturan ini ke my.cnf di bawah [mysqld]bagian:

[mysqld]
max_allowed_packet = 256M
RolandoMySQLDBA
sumber
Bukankah maks paket yang diizinkan juga mempengaruhi ukuran pernyataan penyisipan?
Buttle Butkus
@ButtleButkus Tentu saja. Inilah sebabnya mengapa Paket MySQL yang lebih besar bekerja dengan baik untuk INSERT. Harap perhatikan bahwa 1G adalah ukuran maksimum untuk max_allowed_packet. Perhatikan juga bahwa pengaturan max_allowed_packet ke 256M tidak mengalokasikan 256 juta di muka. Menurut dev.mysql.com/doc/refman/5.6/en/… , mysqld mengalokasikan apa pun net_buffer_length adalah sebagai ukuran awal Paket MySQL. Paket secara bertahap tumbuh ke ukuran yang ditentukan oleh max_allowed_packet. Oleh karena itu, tidak apa-apa untuk mengatur max_allowed_packet besar. INSERT akan mencintaimu karenanya.
RolandoMySQLDBA
Saya tidak pernah mengaturnya mendekati ukuran itu, meskipun kami memiliki beberapa mesin dengan RAM 32G. Namun, aplikasi mencekiknya, dan saya meningkatkannya menjadi 32M dari default (1M?) Dan itu berhasil. Mungkin saya akan meningkatkannya lebih jauh, jika tidak sakit. Tetapi, haruskah aplikasi memeriksa max_allowed_packet dan memecah sisipan menjadi potongan untuk menghindari memukul batas itu? Apa kerugian dari pendekatan itu? Mungkin saya harus memposting pertanyaan itu di situs stack dba.
Buttle Butkus
Bisakah Anda menguraikan lebih banyak tentang mengapa kita harus mengalikan 11? Posting terkait adalah tentang buffer Innodb - bagaimana hubungannya dengan ukuran paket?
SystemParadox
4

Diambil dari halaman Persyaratan Server Database Drupal :

Mungkin diperlukan untuk mengatur variabel sistem max_allowed_packet ke setidaknya 16M. Beberapa paket hosting murah menetapkan nilai ini terlalu rendah (standar MySQL hanya 1M). Dalam hal ini, Anda mungkin perlu memilih paket hosting yang lebih baik. Nilai 1M mungkin cukup untuk Drupal 5.

Seharusnya tidak masalah untuk situs di shared hosting.

Phize
sumber
1
Wow!! Persyaratan server Drupal secara resmi mengatakan 16 juta !! Saya tidak pernah menyadari hal itu. Akan mengingatnya lain kali. Terima kasih banyak telah berbagi info ini. Saya berharap saya bisa menandainya sebagai jawaban terbaik !!
shivams
2

Agak sulit untuk diatur max_allowed_packet. Saya belum menemukan metode untuk menghitung nilai itu. Biasanya, saya mengalami ketika mencoba mengembalikan snapshot database yang menyertakan baris dari {cache}tabel.

Ketika saya memiliki masalah ini, saya akan memilih nilai antara 4M dan 8M. Saya terus meningkatkan nilainya sampai berhenti. Namun, saya tidak tahu apakah host bersama akan mengubah nilai ini untuk Anda.

mpdonadio
sumber