Подробно объясните журналы MySQL

MySQL

Логи MySQL

Журналы MySQL записывают ежедневные операции MySQL и сообщения об ошибках.Благодаря этим журналам мы можем знать, что происходит внутри MySQL, и можем предоставить необходимую информацию для оптимизации и управления MySQL.

Журналы MySQL в основном включают: двоичный журнал, общий журнал запросов, журнал медленных запросов, журнал ошибок, журнал транзакций и т. д.

двоичный журнал

Двоичный журнал используется для записи операций записи (включая добавления, удаления и изменения, но не запросы) в базу данных MySQL.Операционные операторы сохраняются в виде событий для описания изменений данных.

Есть две основные функции бинарника:

  1. Репликация, когда настроена репликация master-slave, главный сервер будет отправлять сгенерированный им двоичный журнал на подчиненную сторону, а подчиненная сторона будет использовать информацию двоичного журнала для локального повтора для достижения синхронизации master-slave.
  2. Восстановление, поскольку двоичный журнал содержит все обновления с момента создания резервной копии, его можно использовать для максимального восстановления базы данных. Поэтому рекомендуется сохранять бинарный журнал на отдельный диск для восстановления данных после повреждения диска.   

Проверьте, включено ли ведение двоичного журнала

двоичный файл можно передатьshow variables like 'log_bin';Проверьте, не открыт ли он уже.

Следующий возврат указывает, что он закрыт:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+

Настроить двоичный журнал MySQL под Windows

  1. Сначала убедитесь, что сервер MySQL установлен. Автор установил 64-разрядную службу MySQL5.7 в операционной системе Windows 10. Имя службы MySQL:MySQL57.

После успешной установки проверьте версию MySQL:

C:\>mysql -V
mysql  Ver 14.14 Distrib 5.7.17, for Win64 (x86_64)
  1. ОткрытьC:\ProgramData\MySQL\MySQL Server 5.7(Обратите внимание, что каталог указан правильно) файл my.ini в каталоге и в[mysqld]Добавьте следующую конфигурацию ниже группы конфигурации:
# MySQL二进制日志配置
# bin log输出的目录及文件
log-bin="C:/1workspace/develop/db/mysql/mysql57/logs/binlog"
# bin log清理时间
expire_logs_days=7
# 每个bin log文件大小
max_binlog_size=200m
#binlog缓存大小
binlog_cache_size=10m
#最大binlog缓存大小
max_binlog_cache_size=20m
  1. пройти черезрежим администратораОткройте cmd и перезапустите службу MySQL:
C:\>net stop MySQL57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。


C:\>net start MySQL57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
  1. Подключиться к сервису MySQL:
C:\>mysql -uroot -pmysqltao
  1. Ниже показано, что бинарный журнал MySQL включен:
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+

В это время вы можете открыть настроенный вами путь к бинарному журналу и увидеть сгенерированный двоичный файл журнала: binlog.000001,

И индексный файл двоичного журнала: binlog.index.

Просмотр бинарного журнала

Каждый раз, когда вы перезапускаете MySQL, создается новый файл binlog черезshow binary logsОператор может видеть все файлы binlog, а возвращаемое содержимое совпадает с количеством файлов binlog, записанных в файле binlog.index.

Теперь есть 3 файла binlog:

mysql> show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       177 |
| binlog.000002 |       177 |
| binlog.000003 |       154 |
+---------------+-----------+

Выполните оператор обновления:

update demo_java_db_1.t_user set name='Jack' where id=1;

пройти сноваmysqlbinlogЗаявление для просмотра текущего файла binlog:

C:\1workspace\develop\db\mysql\mysql57\logs>mysqlbinlog binlog.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190704 17:19:28 server id 1  end_log_pos 123 CRC32 0xaf193fc6  Start: binlog v 4, server v 5.7.17-log created 190704 17:19:28 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
oMQdXQ8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACgxB1dEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AcY/Ga8=
'/*!*/;
# at 123
#190704 17:19:29 server id 1  end_log_pos 154 CRC32 0xc916f3aa  Previous-GTIDs
# [empty]
# at 154
#190704 17:39:43 server id 1  end_log_pos 219 CRC32 0xcecca4bf  Anonymous_GTID  last_committed=0    sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#190704 17:39:43 server id 1  end_log_pos 287 CRC32 0xb6a3de97  Query   thread_id=7     exec_time=0 error_code=0
SET TIMESTAMP=1562233183/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 287
#190704 17:39:43 server id 1  end_log_pos 358 CRC32 0xd1ce52d6  Table_map: `demo_java_db_1`.`t_user` mapped to number 115
# at 358
#190704 17:39:43 server id 1  end_log_pos 445 CRC32 0x7a57aa7a  Update_rows: table id 115 flags: STMT_END_F

BINLOG '
X8kdXRMBAAAARwAAAGYBAAAAAHMAAAAAAAEADmRlbW9famF2YV9kYl8xAAZ0X3VzZXIABQgPDw8P
CGAAYABgAGAAHtZSztE=
X8kdXR8BAAAAVwAAAL0BAAAAAHMAAAAAAAEAAgAF///wAQAAAAAAAAAFZmlyc3QGcHdkMTIzA01B
TvABAAAAAAAAAARKYWNrBnB3ZDEyMwNNQU56qld6
'/*!*/;
# at 445
#190704 17:39:43 server id 1  end_log_pos 476 CRC32 0x6e49c227  Xid = 42
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

Через бинлог можно посмотреть в17:39:43измененныйdemo_java_db_1библиотекаt_userповерхность.

Восстановление данных через бинлог

пройти черезshow binlog eventsКоманда может просматривать события, записанные в бинлоге:

mysql> show binlog events in 'binlog.000003'\G
*************************** 1. row ***************************
   Log_name: binlog.000003
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.17-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: binlog.000003
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info:
*************************** 3. row ***************************
   Log_name: binlog.000003
        Pos: 154
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: binlog.000003
        Pos: 219
 Event_type: Query
  Server_id: 1
End_log_pos: 287
       Info: BEGIN
*************************** 5. row ***************************
   Log_name: binlog.000003
        Pos: 287
 Event_type: Table_map
  Server_id: 1
End_log_pos: 358
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 6. row ***************************
   Log_name: binlog.000003
        Pos: 358
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 445
       Info: table_id: 115 flags: STMT_END_F
*************************** 7. row ***************************
   Log_name: binlog.000003
        Pos: 445
 Event_type: Xid
  Server_id: 1
End_log_pos: 476
       Info: COMMIT /* xid=42 */
*************************** 8. row ***************************
   Log_name: binlog.000003
        Pos: 476
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 541
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 9. row ***************************
   Log_name: binlog.000003
        Pos: 541
 Event_type: Query
  Server_id: 1
End_log_pos: 609
       Info: BEGIN
*************************** 10. row ***************************
   Log_name: binlog.000003
        Pos: 609
 Event_type: Table_map
  Server_id: 1
End_log_pos: 680
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 11. row ***************************
   Log_name: binlog.000003
        Pos: 680
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 765
       Info: table_id: 115 flags: STMT_END_F
*************************** 12. row ***************************
   Log_name: binlog.000003
        Pos: 765
 Event_type: Xid
  Server_id: 1
End_log_pos: 796
       Info: COMMIT /* xid=69 */
*************************** 13. row ***************************
   Log_name: binlog.000003
        Pos: 796
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 861
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 14. row ***************************
   Log_name: binlog.000003
        Pos: 861
 Event_type: Query
  Server_id: 1
End_log_pos: 929
       Info: BEGIN
*************************** 15. row ***************************
   Log_name: binlog.000003
        Pos: 929
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1000
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 16. row ***************************
   Log_name: binlog.000003
        Pos: 1000
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 1085
       Info: table_id: 115 flags: STMT_END_F
*************************** 17. row ***************************
   Log_name: binlog.000003
        Pos: 1085
 Event_type: Xid
  Server_id: 1
End_log_pos: 1116
       Info: COMMIT /* xid=101 */
*************************** 18. row ***************************
   Log_name: binlog.000003
        Pos: 1116
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 1181
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 19. row ***************************
   Log_name: binlog.000003
        Pos: 1181
 Event_type: Query
  Server_id: 1
End_log_pos: 1249
       Info: BEGIN
*************************** 20. row ***************************
   Log_name: binlog.000003
        Pos: 1249
 Event_type: Table_map
  Server_id: 1
End_log_pos: 1320
       Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 21. row ***************************
   Log_name: binlog.000003
        Pos: 1320
 Event_type: Update_rows
  Server_id: 1
End_log_pos: 1405
       Info: table_id: 115 flags: STMT_END_F
*************************** 22. row ***************************
   Log_name: binlog.000003
        Pos: 1405
 Event_type: Xid
  Server_id: 1
End_log_pos: 1436
       Info: COMMIT /* xid=107 */
22 rows in set (0.00 sec)
  • Log_name: Этот журнал существует в каком файле.Из приведенного выше видно, что эти два журнала существуют в файле mysql_bin.000001.
  • Pos: начальная позиция журнала в bin-log
  • Event_type: тип информации журнала
  • Server_id: вы можете просмотреть server_id в конфигурации, указав, какой сервер генерирует журнал, а server_id можно настроить в my.ini.
  • End_log_pos: конечная позиция журнала в bin-log
  • Инфо: Некоторые замечания лога, можно интуитивно посмотреть что сделано

пройти черезmysqlbinlogкоманда для восстановления данных,mysqlbinlogКоманда поддерживает добавление параметров для восстановления указанного события:

mysqlbinlog --start-date="2019-07-04 18:00:00" --stop-date="2019-07-04 18:10:00" binlog.000003 |mysql -uroot -pmysqltao

журнал ошибок

Журнал ошибок MySQL записывает, когда mysqld запускается и останавливается, а также любые серьезные ошибки, с которыми сталкивается сервер во время работы.

Как и binlog, настройте в файле my.ini:

# error log输出的目录及文件
log-error="C:/1workspace/develop/db/mysql/mysql57/logs/errorlog"

Общий журнал запросов

Общий журнал запросов может храниться в текстовом файле или таблице, все соединения и операторы записываются в файл журнала или таблицу, а журнал по умолчанию не включен.

Настройте общий журнал запросов в группе [mysqld] файла my.ini:

#通用查询日志输出格式 [none|file|table|file,table]
log_output=file
#是否启用通用查询日志[on|off]        
general_log=on
#通用查询日志位置及名字
general_log_file="C:/1workspace/develop/db/mysql/mysql57/logs/generallog"

журнал медленных запросов

Журнал медленных запросов записывает журнал запросов медленных операторов SQL и может использоваться для оптимизации производительности операторов SQL с длительным временем выполнения и низкой эффективностью выполнения.

  1. Временно включите журнал медленных запросов:
set global slow_query_log = on; 

Если вы хотите отключить журнал медленных запросов, просто выполните:

set global slow_query_log = off;

2. Временно установите критическую точку медленного времени запроса

Любое время запроса, превышающее эту критическую точку, будет записано в журнал медленных запросов.

Все sql, которые выполняются более 1 секунды, будут регистрироваться в журнале медленных запросов:

set long_query_time = 1;
  1. Как настроить медленное хранилище запросов
set globle log_output = file;

Здесь установлено значение "файл", что означает, что журнал медленных запросов сохраняется в виде файла. По умолчанию нет. Мы также можем установить его в таблицу. Если это таблица, информация о медленных запросах будет сохранена в таблице slow_log в разделе библиотека mysql.

  1. Запросите статус открытия журнала медленных запросов и место хранения журнала медленных запросов.
show variables like '%quer%';

Дополнение: Журнал транзакций

Журнал транзакций — это журнал, специфичный для механизма InnoDB, который может помочь повысить эффективность транзакций.

Используя журнал транзакций, подсистема хранения должна только изменить свою копию памяти при изменении данных таблицы, а затем записать поведение модификации в журнал транзакций, который сохраняется на жестком диске, вместо того, чтобы сохранять измененные данные на диск каждый раз. время.

В журнале транзакций используется метод добавления, поэтому операция записи журнала представляет собой последовательный ввод-вывод в небольшой области диска, в отличие от случайного ввода-вывода, который требует перемещения головок в нескольких местах на диске, поэтому журнал транзакций метод относительно намного быстрее.

После того, как журнал транзакций станет надежным, измененные данные в памяти можно будет медленно сбросить на диск в фоновом режиме. Большинство современных движков хранения реализованы таким образом, мы обычно называем это журналом с упреждающей записью, и для изменения данных необходимо дважды записать их на диск.

Если модификация данных была записана в журнал транзакций и сохранилась, но сами данные не были записаны обратно на диск, происходит сбой системы, и механизм хранения может автоматически восстановить эту часть измененных данных при перезапуске. Доступные методы восстановления зависят от механизма хранения.

Просмотр параметров журнала транзакций:

mysql> SHOWGLOBAL VARIABLES LIKE '%log%';
+-----------------------------------------+-----------------------------------+
| Variable_name                           | Value                             |
+-----------------------------------------+-----------------------------------+
| innodb_flush_log_at_trx_commit          | 1             |
|innodb_locks_unsafe_for_binlog          |OFF                               |
| innodb_log_buffer_size                  | 8388608                           |
|innodb_log_file_size                    |5242880                           |
| innodb_log_files_in_group               | 2                      |
|innodb_log_group_home_dir               |./            |
|innodb_mirrored_log_groups              |1              |

Суммировать

  • Журналы MySQL в основном включают:

Журнал ошибок, общий журнал запросов, журнал медленных запросов, журнал транзакций, двоичный журнал

  • Обычно существует три способа вывода журнала MySQL:

file (файл), table (таблица), none (не сохранять)

  • Журналы MySQL в основном используются для:

Мониторинг исключений, оптимизация производительности, восстановление данных, синхронизация master-slave


Wechat-westcall