binlog_cache_size — это размер памяти, используемый для сохранения binlog во время обработки транзакции, который можно рассматривать как размер транзакции. Он эксклюзивен для каждого сеанса.
Значение по умолчанию — 32 КБ, а значение — целое число, кратное 4 КБ.
Официальный сайтпредставлять: https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_binlog_cache_size
Обычно 32 КБ по умолчанию достаточно, но при увеличении количества подключений он все равно занимает много памяти. Но если настройка слишком мала, диск будет использоваться, что в настоящее время повлияет на производительность. вам необходимо оптимизировать эту часть памяти.
Мы можем использовать следующий SQL, чтобы проверить, используется ли диск, поскольку binlog слишком мал.
show global status like '%Binlog_cache%_use%';
Binlog_cache_disk_use указывает, сколько раз используется кэш binlog диска.
Binlog_cache_use указывает, сколько раз используется кэш binlog. Если binlog включен, это можно рассматривать как количество транзакций.
Если Binlog_cache_disk_use слишком велик, вам необходимо увеличить значение binlog_cache_size. Если оно всегда равно 0 или очень мало, вы можете уменьшить значение binlog_cache_size.
Какова подходящая настройка?
мы можемРазобрать бинлогПолучить размер транзакции. Затем просто выберите размер, который может вместить 99,9% транзакций. По отдельным важным делам Нет необходимости это рассматривать.
Этот скрипт написан на Python, не имеет пакетов зависимостей и поддерживает Python2 и Python3. Просто запустите его напрямую. Затем следует анализируемый файл binlog. Поддерживает регулярные выражения.
пример
python binlog_trx_4kf.py /data/mysql_3314/mysqllog/binlog/m3314.00010*
Например, в моей среде транзакции обычно занимают 4 КБ. Тогда я могу установить binlog_cache_size равным 4 КБ, чтобы сэкономить больше памяти.
Требование по значению должно соответствовать 99,9% бизнеса, но для задач с низкими требованиями к производительности, таких как некоторые запланированные обновления, его не нужно принимать во внимание. Конечно, при наличии достаточного объема памяти рекомендуется включать. это насколько возможно (за исключением особо крупных дел)
адрес гитхаба: https://github.com/ddcw/ddcw/blob/master/python/binlog_trx_4kf.py
Исходный код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Разобрать бинлог получает размер транзакции, питон2 и питон3 Применимо ко всем
# binlog_cache_size Округлить до 4 КБ
# python binlog_trx_4kf.py mysql-bin.000002
import argparse,glob,struct,datetime,time
import sys,os
def _argparse():
parser = argparse.ArgumentParser(add_help=True, description='Разобрать бинлог/relay log Получить размер транзакции')
parser.add_argument('--version', '-v', '-V', action='store_true', dest="VERSION", default=False, help='Show version')
parser.add_argument("files", nargs="*", help="binlog/relay log list. support RE")
if parser.parse_args().VERSION:
print('VERSION: v0.2')
sys.exit(0)
return parser.parse_args()
def gettrxfrombinlog(filename,TRX,MAX_TRX):
offset = 0
with open(filename,'rb') as f:
if f.read(4) != b'\xfebin':
f.seek(0,0)
while True:
bdata = f.read(19)
if bdata == b'':
break
timestamp, event_type, server_id, event_size, log_pos, flags = struct.unpack("<LBLLLh",bdata[0:19])
f.seek(event_size-19,1) #Данные не будут прочитаны
if event_type == 33: #BEGIN GTID_EVENT
offset = f.tell()
elif event_type == 16: #commit XID_EVENT
size = f.tell() - offset
size = int(size/4096)
if size > MAX_TRX:
TRX[MAX_TRX] += 1
else:
TRX[size] += 1
return TRX
if __name__ == '__main__':
parser = _argparse()
filelist = []
for pattern in parser.files:
filelist += glob.glob(pattern)
fileset = set(filelist)
if len(fileset) == 0:
print('At least one binlog file')
sys.exit(1)
MAX_TRX = 1*256 #256 * 4KB
TRX = [ 0 for x in range(MAX_TRX) ] #Инициализируем список размеров транзакций. Округлить до 1 КБ
TRX.append(0) #Добавляем счетчик выходов за пределы диапазона
for filename in fileset:
TRX = gettrxfrombinlog(filename,TRX,MAX_TRX)
for idx,val in enumerate(TRX):
if val>0:
print(str((idx+1)*4) + " Количество транзакций внутри КБ: " + str(val) if idx < MAX_TRX else "Превосходить " + str(idx*4) + " Количество транзакций в КБ: " + str(val)) #python2если Если получен кортеж, Не поддерживает китайский язык