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если Если получен кортеж, Не поддерживает китайский язык