MySQLデータベースのログ管理
序文
MySQLサービスには、さまざまな種類のログもあります。ログは、データベースデータのバックアップ、データリカバリ、トラブルシューティング、およびサーバーの調整に関係します。次に、MySQLのログ管理について詳しく説明します
この環境は、
特定の構築のためにMySQL-5.7.14を構築するためのCentos7.8システムに基づいています。MySQL-5.7.14環境構築を参照してください。
MySQLログ
ログファイル | ログファイル内の情報の種類 |
---|---|
エラーログ | 開始、実行、または停止時に発生する問題を記録します |
クエリログ | 確立されたクライアント接続と実行されたステートメントを記録する |
バイナリログ | すべての変更データステートメントを記録します。主にレプリケーションとポイントインタイムリカバリに使用されます |
遅いログ | 実行時間がlog_query_time秒を超えるすべてのクエリ、またはインデックスを使用してはならないクエリをログに記録します |
トランザクションログ | InnoDBなどのサポートされているストレージエンジンの実行中に生成されたログを記録します |
1.エラーログ
エラーログは主に以下の種類のログを記録します
- サーバーの起動時とシャットダウン時の情報
- サーバー操作中のエラーメッセージ
- イベントスケジューラによって一定期間生成された情報
- スレーブサーバープロセスがスレーブサーバーで開始されたときに生成される情報
エラーログを管理する
MySQLエラーログはデフォルトでdatadir(データディレクトリ)ディレクトリに保存されますが
、ログファイルの保存パスを手動で設定することもできます
1.デフォルトのストレージパスパスをログに記録します
[root@mysql-yum ~]# vim /etc/my.cnf
log-error=/var/log/mysqld.log
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+---------------------+
| Variable_name | Value |
+---------------------+---------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /var/log/mysqld.log |
| log_error_verbosity | 3 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
2.ログストレージパスが指定されていません
[root@mysql-yum ~]# vim /etc/my.cnf
log-error
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /var/run/mysqld/mysqld.err |
| log_error_verbosity | 3 |
+---------------------+----------------------------+
3 rows in set (0.00 sec)
3.ストレージパスを設定します
[root@mysql-yum ~]# vim /etc/my.cn
log-error=mysql-yum
[root@mysql-yum ~]# systemctl restart mysqld
mysql> show global variables like '%log_error%';
+---------------------+-----------------+
| Variable_name | Value |
+---------------------+-----------------+
| binlog_error_action | ABORT_SERVER |
| log_error | ./mysql-yum.err |
| log_error_verbosity | 3 |
+---------------------+-----------------+
3 rows in set (0.00 sec)
注:MySQLエラーログはデータディレクトリに保存されます
2.クエリログ
クエリログ:確立されたクライアント接続と実行されたステートメントを記録します
クエリログを開く
[root@mysql-yum ~]# vim /etc/my.cnf
general_log=on
[root@mysql-yum ~]# systemctl restart mysqld
ログステータスの表示
mysql> show global variables like '%general_log%';
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | ON |
| general_log_file | /var/lib/mysql/mysql-yum.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
mysql> show global variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+
1 row in set (0.00 sec)
# 执行查询语句
mysql> show databases;
mysql> select database();
ログレコードを表示する
3つの遅いクエリログ
遅いログ:実行時間がlog_query_time秒を超えるすべてのクエリ、またはインデックスを使用してはならないクエリを記録します
機能:主にサーバーのチューニングに使用されます
遅いログ開始とクエリ時間を設定する
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.22 sec)
mysql> set global long_query_time=3;
Query OK, 0 rows affected (0.00 sec)
# 查看日志设定
mysql> show global variables like '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/mysql-yum-slow.log |
+---------------------+-----------------------------------+
2 rows in set (0.00 sec)
mysql> show global variables like '%long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
第四に、バイナリログ
バイナリログとは何ですか?
- バイナリログには、データが更新された、またはデータが更新された可能性のあるすべてのステートメントが含まれます(たとえば、どの行にも一致しないDELETE)。
- ステートメントは、データの変更を説明する「イベント」の形式で保存されます。バイナリログには、データベースを更新する各ステートメントの実行時間に関する情報も含まれています。データを変更しないステートメントは含まれていません。
バイナリログの役割は?
- バイナリログにはバックアップ後に実行されたすべての更新が含まれているため、バイナリログの主な目的は、データベースに障害が発生した場合のリカバリ(ポイントインタイムリカバリ)中にデータベースを可能な限り更新することです。
- バイナリログは、マスターレプリケーションサーバー上のスレーブサーバーに送信されるすべてのステートメントを記録するためにも使用されます
実稼働環境では、ステートメントの実行と実行結果の記録、バイナリログの記録を採用することがよくあります。
log_binを開きます
[root@mysql-yum ~]# systemctl restart mysqld
log_bin=mysql-bin
server_id=10
[root@mysql-yum ~]# systemctl restart mysqld
log_binのオープンステータスを表示する
mysql> show global variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.00 sec)
# 查看二进制日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.00 sec)
# 查看二进制日志文件内容
mysql> mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 10 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 10 | 154 | |
+------------------+-----+----------------+-----------+-------------+---------------------------------------+
2 rows in set (0.00 sec)
log_binの内容を表示する
[root@mysql-yum ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#210129 11:06:37 server id 10 end_log_pos 123 CRC32 0x323c980c Start: binlog v 4, server v 5.7.14-log created 210129 11:06:37 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
vXsTYA8KAAAAdwAAAHsAAAABAAQANS43LjE0LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9exNgEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQyYPDI=
'/*!*/;
# at 123
#210129 11:06:37 server id 10 end_log_pos 154 CRC32 0xb271a2b4 Previous-GTIDs
# [empty]
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*/;
メイン:MySQLの上位バージョンであるlog_binのステートメントは暗号化されており、表示するにはデコードする必要があります
log_binが有効になっている場合、server_id番号を指定する必要があり、この値はMySQLサーバークラスター内で一意です。
log_binを削除します
# 多西刷新log_bin
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
# 查看所有的log_bin
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 201 |
| mysql-bin.000002 | 201 |
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
5 rows in set (0.00 sec)
# 删除日志
---方法一:按照日志名字删除
mysql> purge binary logs to 'mysql-bin.000003';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
3 rows in set (0.00 sec)
---方法二:按照日志删除
mysql> purge binary logs before '2021-01-29 11:24:37';
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000004 | 201 |
| mysql-bin.000005 | 154 |
+------------------+-----------+
2 rows in set (0.00 sec)
---方法三:删除所有日志,重新从第一编号开始,重新记录日志
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.01 sec)
注:バイナリログファイルを直接削除することはできません。rmなどのコマンドを使用してログファイルを直接削除すると、データベースがクラッシュする可能性があります。
1.パージコマンドで削除2.
リセットコマンドで削除