it-swarm.asia

ما هي أفضل طريقة لتقليل حجم الإبداعات في الخلية؟

لدي بعض خوادم الإنتاج التي يزيد حجم ملفاتها ibdata يومًا بعد يوم.

لقد استهلكت بالفعل 290 غيغابايت من المساحة.

الجداول الموجودة في الخوادم هي في الغالب InnoDB وهناك طلبات عالية للقراءة والكتابة.

يزداد حجم ملف السجل أيضًا. هناك كمية هائلة من البيانات في الجداول.

كيف يمكنني التحكم في الحجم المتزايد لكليهما؟

أنا لا أستخدم innodb_file_per_table.

66
Abdul Manaf

ضع في اعتبارك أن أكثر الملفات ازدحامًا في البنية التحتية لـ InnoDB هو/var/lib/mysql/ibdata1

يحتوي هذا الملف عادةً على العديد من فئات المعلومات (عندما innodb_file_per_table تساوي 0)

  • بيانات الجدول
  • فهارس الجدول
  • بيانات MVCC (التحكم في التزامن المتعدد)
    • شرائح التراجع
    • تراجع عن Tablespace
  • بيانات تعريف الجدول
  • انظر التمثيل التصويري

ينشئ العديد من الأشخاص العديد من ملفات ibdata على أمل تحسين إدارة الأقراص والأداء. لم يساعد.

لسوء الحظ ، يؤدي تحسين الجدول مقابل جدول InnoDB المخزن في ibdata1 إلى شيئين:

  • يجعل بيانات الجدول والفهارس متجاورة داخل ibdata1
  • يجعل ibdata1 ينمو لأن البيانات المتجاورة ملحقة بـ ibdata1

يمكنك فصل بيانات الجدول وفهارس الجدول من ibdata1 وإدارتها بشكل مستقل باستخدام innodb_file_per_table . لتقليص ibdata1 مرة واحدة وإلى الأبد يجب عليك القيام بما يلي

الخطوة 01) MySQLDump جميع قواعد البيانات في ملف نصي SQL (يطلق عليه SQLData.sql) ( مزيد من التفاصيل هنا )

الخطوة 02) إسقاط جميع قواعد البيانات (باستثناء mysql، performance_schema ، و information_schema)

الخطوة 03) إيقاف تشغيل الخلية

الخطوة 04) أضف الأسطر التالية إلى /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

Sidenote: مهما كانت مجموعة Innodb_buffer_pool_size ، تأكد من أن innodb_log_file_size هو 25٪ من innodb_buffer_pool_size.

الخطوة 05) حذف ibdata1 و ib_logfile0 و ib_logfile1

عند هذه النقطة ، يجب أن يكون هناك مخطط الخلية فقط في/var/lib/mysql

الخطوة 06) إعادة تشغيل الخلية

سيؤدي هذا إلى إعادة إنشاء ibdata1 عند 10 ميغابايت و ib_logfile0 و ib_logfile1 بسرعة 1G لكل منهما

الخطوة 07) إعادة تحميل SQLData.sql إلى الخلية

سوف تنمو ibdata1 ولكنها تحتوي فقط على بيانات تعريف الجدول

سيوجد كل جدول InnoDB خارج ibdata1

افترض أن لديك جدول InnoDB يسمى mydb.mytable. إذا ذهبت إلى/var/lib/mysql/mydb ، سترى ملفين يمثلان الجدول

  • mytable.frm (رأس محرك التخزين)
  • mytable.ibd (الصفحة الرئيسية لبيانات الجدول وفهارس الجدول لـ mydb.mytable)

لن يحتوي ibdata1 أبدًا على بيانات وفهارس InnoDB بعد الآن.

باستخدام خيار innodb_file_per_table في /etc/my.cnf ، يمكنك تشغيل OPTIMIZE TABLE mydb.mytable والملف /var/lib/mysql/mydb/mytable.ibd سوف يتقلص في الواقع.

لقد فعلت ذلك عدة مرات في مسيرتي كدائرة MySQL DBA

في الواقع ، في المرة الأولى التي قمت فيها بذلك ، انهارت ملف 50 جيجا بايت ibdata1 في 500 ميجا بايت.

جربها. إذا كان لديك المزيد من الأسئلة حول هذا ، راسلني عبر البريد الإلكتروني. ثق في. سيعمل هذا على المدى القصير وعلى المدى الطويل. !!!

إذا كنت ترغب في معرفة مقدار البيانات الفعلية المخزنة في MyISAM و InnoDB ، فيرجى تشغيل هذا الاستعلام:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
110
RolandoMySQLDBA