Пару дней назад я настроил подчиненный сервер MySQL (Mysql Community Server 8.0.21). Пока мы используем его только для резервного копирования с помощью mysqldump. Я заметил, что он использует слишком много памяти, но меня это не смутило, потому что я использовал несколько параметров конфигурации, которые автоматически регулируют объем используемой памяти, а VPS был выделен для сервера MySQL (если я плачу за всю память, почему бы не использовать ее, верно?).
Сегодня первым делом с утра я захожу в свой Zabbix и замечаю, что подчиненный сервер не работает, поэтому я подключаюсь к нему по ssh, перезапускаю MySQL и пытаюсь запустить подчиненный сервер с помощьюНАЧАТЬ РАБОЧИЙ. И вот что у меня получилось:
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
Не уверен, что изначально вызвало проблему (это мой my.cnf)
[client]
# Usado apenas para casos especificos
port = 3306 # Porta parada
socket = /var/run/mysqld/mysqld.sock
[mysql]
# Configurações do cliente
auto-rehash # Auto completar
[mysqld]
# Configuração do servidor
pid_file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log_error = /var/log/mysql/error.log
user = mysql
bind_address = 0.0.0.0 # Ouve todos os endereços
# Configurações genericas do servidor
max_allowed_packet = 32M # Tamanho maximo do pacote.
max_connections = 2000 # Maximo de coneções
open_files_limit = 10000 # Maximo de arquivos abertos
tmp_table_size = 64M # Limite tamanho tabela em mem
max_heap_table_size = 64M # Limite tamanho tabela em mem
tmpdir = /tmp # Diretorio /tmp/
default_storage_engine = InnoDB # Engine default
skip_name_resolve # Desabilita resolução DNS
# Configurações de log binario
log_bin = mysql-bin # Arquivo de log binario
relay-log = mysql-relay-bin
log-slave-updates = 1 # Log de update no slave
read-only = 1 # Apenas leitura
binlog-format = mixed # Formato
server_id = 2 # Identifica servidor para log
max_binlog_size = 256M # Tamanho maximo log binario
binlog_expire_logs_seconds = 604800 # Max tempo log binario
innodb_flush_log_at_trx_commit = 1 # Proteção de dados
sync_binlog = 1 # Somente pra replicação
# Configurações especificas do InnoDB
innodb_dedicated_server = ON # Autoconf InnoDB
innodb_io_capacity = 2000 # Quantas escritas por segundo
innodb_read_io_threads = 64 # Threads de leitura
innodb_write_io_threads = 64 # Threads de escrita
innodb_thread_concurrency = 0 # Auto dectecta threads
# Slow query log
slow_query_log = 1 # Guarda queries lentas
long_query_time = 1.0 # Tempo query
# Funções dentro do Mysql
log_bin_trust_function_creators = 1; # Permite funções criadas
Я понятия не имею, как это исправить. Мне что, снова делать весь дамп? Как предотвратить повторение этого?
ОБНОВЛЯТЬ:
Это результат того, чтоПОКАЗАТЬ СТАТУС РАБОЧЕГО ПОЛОЖЕНИЯ:
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: IP_ADDR
Master_User: USER
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000011
Read_Master_Log_Pos: 178887867
Relay_Log_File: pergamum-relay-bin.000029
Relay_Log_Pos: 178888082
Relay_Master_Log_File: mysql-bin.000011
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 13124
Last_Error: Slave failed to initialize relay log info structure from the repository
Skip_Counter: 0
Exec_Master_Log_Pos: 178887867
Relay_Log_Space: 0
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 13124
Last_SQL_Error: Slave failed to initialize relay log info structure from the repository
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID: bef45e1b-99d6-11ea-a355-3e2547e4f083
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: 200819 09:58:32
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set (0.00 sec)
ОБНОВЛЯТЬ
Как и просили, вот переменные с обоих серверов.
ВЛАДЕЛЕЦ
GLOBAL STATUS:
https://gist.github.com/IamRichter/ef4993bbf65883baa366ff30d73b9644
GLOBAL VARIABLES:
https://gist.github.com/IamRichter/dbf08facd364548529b07bc0cbd6b2e6
РАБ
GLOBAL STATUS:
https://gist.github.com/IamRichter/fcdff1111ed52fc859ebac46a2dbfc27
GLOBAL VARIABLES:
https://gist.github.com/IamRichter/53c5638fb3c6064fd51eab332660f07f
решение1
Увы, ПЕРЕМЕННЫЕ/СТАТУСЫ не показывают никаких очевидных причин возникшей у вас проблемы. Может бытьвысокий buffer_pool_size слишком сильно сжимает оперативную память, но я сомневаюсь в этом. Вот мои анализы (первичный, затем реплика):
Наблюдения:
- Версия: 8.0.20
- 16 ГБ оперативной памяти
- Время безотказной работы = 2д 02:30:41
- Вы не работаете на Windows.
- Запуск 64-битной версии
- Судя по всему, вы используете полностью (или в основном) InnoDB.
Более важные вопросы:
Увеличьте table_open_cache
, если ОС позволит. Зачем так много таблиц??
Я считаю (без каких-либо доказательств), что неразумно использовать что-либо, кроме «2», поскольку innodb_log_files_in_group
MariaDB уже игнорирует это; об Oracle я не слышал.
Есть некоторые признаки плохо сформулированных запросов. Смотретьhttp://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlogдля анализа slowlog.
У вас была какая-то причина для этого binlog_format=MIXED
?
Подробности и другие наблюдения:
( Opened_tables ) = 452,365 / 181841 = 2.5 /sec
-- Частота открытия таблиц -- увеличить table_open_cache (теперь 3995)
( Table_open_cache_overflows ) = 448,306 / 181841 = 2.5 /sec
-- Возможно, потребуется увеличить table_open_cache (сейчас 3995)
( Table_open_cache_misses ) = 452,365 / 181841 = 2.5 /sec
-- Возможно, потребуется увеличить table_open_cache (сейчас 3995)
( innodb_lru_scan_depth * innodb_page_cleaners ) = 1,024 * 4 = 4,096
-- Объем работы для очистки страниц каждую секунду. -- "InnoDB: page_cleaner: 1000ms expected loop took ..." можно исправить, уменьшив lru_scan_depth: рассмотрите 1000 / innodb_page_cleaners (теперь 4). Также проверьте подкачку.
( innodb_page_cleaners / innodb_buffer_pool_instances ) = 4 / 8 = 0.5
-- innodb_page_cleaners -- Рекомендуется установить innodb_page_cleaners (теперь 4) на innodb_buffer_pool_instances (теперь 8)
( innodb_lru_scan_depth ) = 1,024
-- "InnoDB: page_cleaner: предполагаемый цикл занял 1000 мс ..." можно исправить, уменьшив lru_scan_depth
( Innodb_pages_written / Innodb_buffer_pool_write_requests ) = 2,102,149 / 7377368 = 28.5%
-- Запросы на запись, которые должны были попасть на диск -- Проверьте innodb_buffer_pool_size (теперь 12884901888)
( innodb_log_files_in_group ) = 9
-- Количество файлов журнала InnoDB -- 2, вероятно, единственное разумное значение. Большое количество может вызвать проблемы с производительностью.
( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 1,773,668,352 / (181841 / 3600) / 9 / 1024M = 0.00363
-- Соотношение -- (см. протокол)
( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 181,841 / 60 * 1024M / 1773668352 = 1,834
-- Минуты между ротациями журнала InnoDB Начиная с версии 5.6.8, это можно изменять динамически; не забудьте также изменить my.cnf. -- (Рекомендация 60 минут между ротациями несколько произвольна.) Отрегулируйте innodb_log_file_size (теперь 1073741824). (Нельзя изменить в AWS.)
( innodb_flush_method ) = innodb_flush_method = O_DIRECT_NO_FSYNC
-- Как InnoDB должна просить ОС записывать блоки. Предложите O_DIRECT или O_ALL_DIRECT (Percona), чтобы избежать двойной буферизации. (По крайней мере для Unix.) См. chrischandler для предупреждения об O_ALL_DIRECT
( Innodb_row_lock_time_avg ) = 1,886
-- Среднее время блокировки строки (миллисекунды) -- Возможно, конфликтующие запросы; возможно, сканирование таблиц.
( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF
-- Регистрировать ли все взаимоблокировки. -- Если вас мучают взаимоблокировки, включите это. Внимание: если у вас много взаимоблокировок, это может привести к записи большого объема данных на диск.
( max_connections ) = 2,000
-- Максимальное количество подключений (потоков). Влияет на различные распределения. -- Если max_connections (теперь 2000) слишком велико и различные настройки памяти высоки, у вас может закончиться ОЗУ.
( Handler_read_rnd_next / Com_select ) = 46,219,107,293 / 7120289 = 6,491
-- Среднее количество строк, сканируемых за SELECT. (приблизительно) -- Рассмотрите возможность увеличения read_buffer_size (сейчас 131072)
( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (358564 + 419704 + 462 + 0) / 2006877 = 0.388
-- Операторов на фиксацию (предполагается, что все InnoDB) -- Низкий: может помочь сгруппировать запросы в транзакции; Высокий: длинные транзакции нагружают различные компоненты.
( Select_scan ) = 4,386,291 / 181841 = 24 /sec
-- полное сканирование таблиц -- добавление индексов / оптимизация запросов (если только это не маленькие таблицы)
( Select_scan / Com_select ) = 4,386,291 / 7120289 = 61.6%
-- % выборок, выполняющих полное сканирование таблицы. (Могут быть обмануты хранимыми процедурами.) -- Добавить индексы / оптимизировать запросы
( binlog_format ) = binlog_format = MIXED
-- ЗАЯВЛЕНИЕ/СТРОКА/СМЕШАННАЯ. -- СТРОКА предпочитается 5.7 (10.3)
( Aborted_clients ) = 175,398 / 181841 = 0.96 /sec
-- Потоки, поднятые из-за wait_timeout -- Увеличьте wait_timeout (теперь 28800); будьте вежливы, используйте отключение
( Connections ) = 3,544,963 / 181841 = 19 /sec
-- Подключения -- Увеличить wait_timeout (теперь 28800); использовать пул?
Аномально маленький: Открытые_файлы = 3
Аномально большой: Com_do = 0,02 /HR Com_release_savepoint = 2,3 /HR Com_rollback_to_savepoint = 0,11 /сек Com_savepoint = 2,3 /HR Com_show_charsets = 0,44 /HR Com_show_create_db = 2,3 /HR Com_show_create_func = 2,5 /HR Com_show_create_proc = 1,5 /HR Com_show_create_trigger = 0,12 /HR Com_show_function_status = 2,5 /HR Com_show_procedure_status = 2,5 /HR Com_show_table_status = 0,11 /сек Com_show_triggers = 0,11 /сек Created_tmp_files = 20 /сек Handler_read_key = 139335 /сек Handler_read_next = 316713 / сек Handler_read_rnd = 46465 / сек Handler_savepoint = 2,3 / HR Handler_savepoint_rollback = 0,11 / сек Innodb_buffer_pool_read_requests = 1095747 / сек Innodb_num_open_files = 3996 Innodb_system_rows_inserted = 0,97 / HR Innodb_system_rows_read = 1,99e+7 Innodb_system_rows_updated = 0,095 / сек Open_table_definitions = 2000 Select_full_range_join = 2,1 / сек Select_full_range_join / Com_select = 5,5% back_log / max_connections = 100,0% innodb_max_dirty_pages_pct_lwm = 10 innodb_read_io_threads = 64 innodb_undo_tablespaces = 2 innodb_write_io_threads = 64 max_error_count = 1,024 max_length_for_sort_data = 4,096
Ненормальные строки: default_authentication_plugin = caching_sha2_password event_scheduler = ON innodb_dedicated_server = ON innodb_fast_shutdown = 1 optimizer_trace = enabled=off,one_line=off optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeat_subselect=on slave_rows_search_algorithms = INDEX_SCAN, HASH_SCAN
sf1030756-M
Наблюдения:
- Версия: 8.0.21
- 6 ГБ оперативной памяти
- Время безотказной работы = 5дн 23:59:45
- Вы уверены, что это был ШОУ ГЛОБАЛЬНЫЙ СТАТУС? -- Или эта реплика просто не занята??
- Вы не работаете на Windows.
- Запуск 64-битной версии
- Судя по всему, вы используете полностью (или в основном) InnoDB.
Более важные вопросы:
Как и в случае с первичным -- table_open_cache
, innodb_log_files_in_group
,binlog_format
Проверьте наличие подкачки. innodb_buffer_pool_size
довольно большой для 6 ГБ оперативной памяти.
Уменьшите max_connections
до 100 — до сих пор вы не использовали больше 5; текущие 2000 — это нагрузка на оперативную память.
Подробности и другие наблюдения:
( table_open_cache ) = 3,995
-- Количество дескрипторов таблиц для кэширования. Обычно достаточно нескольких сотен.
( Table_open_cache_misses / (Table_open_cache_hits + Table_open_cache_misses) ) = 56,436 / (1107115 + 56436) = 4.9%
-- Эффективность table_open_cache. -- Увеличьте table_open_cache (теперь 3995) и проверьте table_open_cache_instances (теперь 16).
( innodb_lru_scan_depth * innodb_page_cleaners ) = 1,024 * 4 = 4,096
-- Объем работы для очистки страниц каждую секунду. -- "InnoDB: page_cleaner: 1000ms expected loop took ..." можно исправить, уменьшив lru_scan_depth: рассмотрите 1000 / innodb_page_cleaners (теперь 4). Также проверьте подкачку.
( innodb_page_cleaners / innodb_buffer_pool_instances ) = 4 / 8 = 0.5
-- innodb_page_cleaners -- Рекомендуется установить innodb_page_cleaners (теперь 4) на innodb_buffer_pool_instances (теперь 8)
( innodb_lru_scan_depth ) = 1,024
-- "InnoDB: page_cleaner: предполагаемый цикл занял 1000 мс ..." можно исправить, уменьшив lru_scan_depth
( Innodb_pages_written / Innodb_buffer_pool_write_requests ) = 25,132 / 57003 = 44.1%
-- Запросы на запись, которые должны были попасть на диск -- Проверьте innodb_buffer_pool_size (теперь 5368709120)
( innodb_log_files_in_group ) = 5
-- Количество файлов журнала InnoDB -- 2, вероятно, единственное разумное значение. Большое количество может вызвать проблемы с производительностью.
( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 22,224,896 / (518385 / 3600) / 5 / 512M = 5.7e-5
-- Соотношение -- (см. протокол)
( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 518,385 / 60 * 512M / 22224896 = 208,704
-- Минуты между ротациями журнала InnoDB Начиная с версии 5.6.8, это можно изменять динамически; не забудьте также изменить my.cnf. -- (Рекомендация 60 минут между ротациями несколько произвольна.) Отрегулируйте innodb_log_file_size (теперь 536870912). (Нельзя изменить в AWS.)
( innodb_flush_method ) = innodb_flush_method = O_DIRECT_NO_FSYNC
-- Как InnoDB должна просить ОС записывать блоки. Предложите O_DIRECT или O_ALL_DIRECT (Percona), чтобы избежать двойной буферизации. (По крайней мере для Unix.) См. chrischandler для предупреждения об O_ALL_DIRECT
( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF
-- Регистрировать ли все взаимоблокировки. -- Если вас мучают взаимоблокировки, включите это. Внимание: если у вас много взаимоблокировок, это может привести к записи большого объема данных на диск.
( max_connections ) = 2,000
-- Максимальное количество подключений (потоков). Влияет на различные распределения. -- Если max_connections (теперь 2000) слишком велико и различные настройки памяти высоки, у вас может закончиться ОЗУ.
( (Com_show_create_table + Com_show_fields) / Questions ) = (8605 + 17405) / 313218 = 8.3%
-- Непослушный фреймворк -- трата больших усилий на повторное открытие схемы. -- Пожалуйтесь стороннему поставщику.
( tmp_table_size ) = 64M
-- Ограничение по размеруОБЪЕМ ПАМЯТИвременные таблицы, используемые для поддержки SELECT -- Уменьшите tmp_table_size (теперь 67108864), чтобы избежать нехватки оперативной памяти. Возможно, не более 64M.
( Select_full_join / Com_select ) = 8,884 / 123363 = 7.2%
-- % выборок, которые являются безиндексными соединениями -- Добавьте подходящий(ие) индекс(ы) к таблицам, используемым в соединениях.
( Select_scan / Com_select ) = 107,352 / 123363 = 87.0%
-- % выборок, выполняющих полное сканирование таблицы. (Могут быть обмануты хранимыми процедурами.) -- Добавить индексы / оптимизировать запросы
( Com_admin_commands / Queries ) = 6,755 / 320422 = 2.1%
-- Процент запросов, являющихся командами «администратора». -- Что происходит?
( binlog_format ) = binlog_format = MIXED
-- ЗАЯВЛЕНИЕ/СТРОКА/СМЕШАННАЯ. -- СТРОКА предпочитается 5.7 (10.3)
( log_slow_slave_statements ) = log_slow_slave_statements = OFF
-- (5.6.11, 5.7.1) По умолчанию реплицированные операторы не отображаются в slowlog; это приводит к их отображению. -- В slowlog может быть полезно увидеть записи, которые могут мешать чтению реплики.
( thread_cache_size / Max_used_connections ) = 28 / 5 = 560.0%
-- Нет никакого преимущества в том, чтобы кэш потоков был больше, чем вероятное количество соединений. Недостаток — пустая трата места.
( thread_stack * max_connections ) = (286720 * 2000) / 6144M = 8.9%
-- Минимальное выделение памяти для max_connections. -- Уменьшение max_connections (теперь 2000)
Аномально маленький: Получено байт = 58 / сек Com_insert = 0 Com_update = 0 Создано_tmp_files = 0,035 / HR Обновление_обработчика = 2,2 / HR Запросы_записи_в_буфере_пула = 0,11 / сек Запросы_записи_в_буфере_пула / Сброшенные_страницы_буфера_пула = 2,27 Записанные_страницы_в_д_д_в_д_в_записанные / Записанные_страницы_в_д_в_д_в_записанные = 1 Создано_страниц = 1 / HR Удалено_строк + Удалено_строк = 0 Удалено_строк = 0 Удалено_строк = 0 Удалено_строк = 0 Удалено_строк / Удалено_строк = 0 Диапазон_выбора_строк / Удалено_строк = 0 Диапазон_выбора_строк
Аномально большой: Com_do = 0,014 /HR Com_show_create_func = 0,15 /HR Com_slave_start = 0,028 /HR Innodb_num_open_files = 3996 Innodb_system_rows_read = 1,91e+7 Innodb_system_rows_updated = 2,2 /HR Open_table_definitions = 2000 back_log / max_connections = 100,0% innodb_max_dirty_pages_pct_lwm = 10 innodb_read_io_threads = 64 innodb_undo_tablespaces = 2 innodb_write_io_threads = 64 max_error_count = 1024 max_length_for_sort_data = 4096 optimizer_trace_offset = --1 performance_schema_error_size = 4,772 performance_schema_max_cond_classes = 100 performance_schema_max_mutex_classes = 300 performance_schema_max_rwlock_classes = 60 performance_schema_max_stage_classes = 175 performance_schema_max_statement_classes = 218 performance_schema_max_thread_classes = 100
Ненормальные строки: default_authentication_plugin = caching_sha2_password event_scheduler = ON innodb_dedicated_server = ON innodb_fast_shutdown = 1 optimizer_trace = enabled=off,one_line=off optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeat_subselect=on read_only = ON slave_rows_search_algorithms = INDEX_SCAN, HASH_SCAN
sf1030756-S