대부분의 관계형 데이터베이스와 마찬가지로 로그 파일은 MySQL 데이터베이스의 중요한 부분입니다. MySQL에는 일반적으로 오류 로그 파일, 바이너리 로그, 일반 로그, 느린 쿼리 로그 등을 포함한 여러 가지 로그 파일이 있습니다. 이러한 로그는 mysqld 내부의 이벤트, 데이터베이스 성능 오류, 기록된 데이터 변경 내역, 데이터베이스 사용자 복구 등을 찾는 데 도움이 될 수 있습니다. 이 문서에서는 주로 일반적인 쿼리 로그를 설명합니다.
1. MySQL 로그 파일 시스템 구성
a. 오류 로그: 시작 및 작동 기록 또는 mysqld를 중지할 때 문제가 발생합니다.
b. 일반 로그: 설정된 클라이언트 연결 및 실행된 명령문을 기록합니다.
c. 업데이트 로그: 데이터를 변경하는 내용을 기록합니다. 이 로그는 MySQL 5.1에서 더 이상 사용되지 않습니다.
d. 바이너리 로그: 데이터를 변경하는 모든 내용을 기록합니다. 복사에도 사용됩니다.
e. 느린 쿼리 로그: 실행 시간이 long_query_time 초를 초과하는 쿼리 또는 인덱스를 사용하지 않는 쿼리를 모두 기록합니다.
f. Innodb 로그: innodb redo 로그
기본적으로 모든 로그는 mysqld 데이터 디렉터리에 생성됩니다.
로그를 플러시하여 mysqld가 강제로 로그 파일을 닫았다가 다시 열도록(또는 어떤 경우에는 새 로그로 전환하도록) 할 수 있습니다.
FLUSH LOGS 문을 실행하거나 mysqladmin 플러시-로그 또는 mysqladmin 새로 고침을 실행하면 로그가 에이징됩니다.
MySQL 복제가 존재하는 경우 슬레이브 복제 서버는 대체 로그라는 추가 로그 파일을 유지합니다.
2. 일반 쿼리 로그
일반 쿼리 로그는 텍스트 파일로 저장하거나 table 을 사용하면 모든 연결과 명령문이 이 로그 파일이나 테이블에 기록되며 이 로그는 기본적으로 활성화되지 않습니다.
--log[=file_name] 또는 -l [file_name] 옵션으로 시작하세요. file_name 값이 지정되지 않은 경우 기본 이름은 host_name.log입니다.
Mysqld는 명령문을 수신한 순서대로 쿼리 로그에 기록합니다. 실행 순서와 다를 수 있습니다.
업데이트 로그 및 바이너리 로그와 달리 쿼리가 실행된 후 잠금이 해제되기 전에 기록됩니다.
쿼리 로그에는 모든 명령문이 포함되고, 바이너리 로그에는 데이터만 쿼리하는 명령문이 포함되지 않습니다.
서버를 다시 시작하고 로그를 새로 고치면 새로운 일반 쿼리 로그 파일이 생성되지 않습니다.
3. 일반 쿼리 로그의 시스템 변수
log_output=[none|file|table| file,table] #일반 쿼리 로그 출력 형식
General_log=[on|off] #일반 쿼리 로그 활성화 여부
General_log_file[=filename] #일반 쿼리 로그 위치 및 이름
4. 일반 쿼리 로그 백업
Linux 또는 Unix에서는 다음 명령을 통해
파일 이름을 바꿀 수 있습니다. 그리고 새 파일을 만듭니다:
shell> mvhostname.loghostname-old.log
shell>mysqladminflush-logs
shell>cphostname-old.logto-backup-directory
shell> rm hostname-old.log
Windows에서는 서버가 로그 파일을 여는 동안에는 로그 파일 이름을 변경할 수 없습니다. 먼저 서버를 중지한 다음 로그 파일의 이름을 바꿔야 합니다. 그런 다음 서버를 다시 시작하여 새 로그 파일을 만듭니다.
5. 일반 쿼리 로그 사용 시연
a、启用通用查询日志 --演示环境 root@localhost[(none)]> show variables like '%version%'; +-------------------------+------------------------------+ | Variable_name | Value | +-------------------------+------------------------------+ | innodb_version | 5.5.39 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.5.39-log | | version_comment | MySQL Community Server (GPL) | | version_compile_machine | x86_64 | | version_compile_os | Linux | +-------------------------+------------------------------+ --查看系统变量 root@localhost[(none)]> show variables like '%general%'; +------------------+----------------------------+ | Variable_name | Value | +------------------+----------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/suse11b.log | +------------------+----------------------------+ --查看当前的通用日志,显示无日志文件 root@localhost[(none)]> system ls /var/lib/mysql/suse11b.log ls: cannot access /var/lib/mysql/suse11b.log: No such file or directory --设置变量general_log以开启通用查询日志 root@localhost[(none)]> set @@global.general_log=1; Query OK, 0 rows affected (0.00 sec) --再次查看通用日志文件已存在 root@localhost[(none)]> system ls /var/lib/mysql/suse11b.log /var/lib/mysql/suse11b.log root@localhost[(none)]> select * from tempdb.tb1; --执行查询 +------+------+ | id | val | +------+------+ | 1 | jack | +------+------+ --查看通用日志文件内容 root@localhost[(none)]> system more /var/lib/mysql/suse11b.log /usr/sbin/mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Time Id Command Argument 141003 16:18:12 4 Query show variables like '%general%' 141003 16:18:55 4 Query select * from tempdb.tb1 b、更改通用查询日志位置 root@localhost[(none)]> exit Bye suse11b:~ # service mysql stop Shutting down MySQL... done suse11b:~ # mysqld --general_log_file=/tmp/suse11b.log --user=mysql & [1] 47009 suse11b:~ # ps -ef|grep mysql|grep -v grep mysql 47009 44514 1 16:22 pts/0 00:00:00 mysqld --general_log_file=/tmp/suse11b.log --user=mysql root 47053 44514 0 16:22 pts/0 00:00:00 grep mysql suse11b:~ # mysql root@localhost[(none)]> system ls /tmp/suse11b.log ls: cannot access /tmp/suse11b.log: No such file or directory root@localhost[(none)]> show variables like '%gener%'; +------------------+------------------+ | Variable_name | Value | +------------------+------------------+ | general_log | OFF | | general_log_file | /tmp/suse11b.log | +------------------+------------------+ root@localhost[(none)]> set global general_log=on; Query OK, 0 rows affected (0.01 sec) --此时从系统变量看出,通用日志已经到/tmp目录下 root@localhost[(none)]> show variables like '%gener%'; +------------------+------------------+ | Variable_name | Value | +------------------+------------------+ | general_log | ON | | general_log_file | /tmp/suse11b.log | +------------------+------------------+ --发布查询 root@localhost[(none)]> select count(*) from tempdb.tb1; +----------+ | count(*) | +----------+ | 1 | +----------+ --查看通用日志文件内容 root@localhost[(none)]> system more /tmp/suse11b.log mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Time Id Command Argument 141003 16:30:03 1 Query show variables like '%gener%' 141003 16:30:09 1 Query select count(*) from tempdb.tb1 c、通用查询日志输出方式 --可以输出为文件,表以及不输出,即TABLE,FILE,NONE --系统变量log_output root@localhost[(none)]> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | FILE | +---------------+-------+ --下面修改为输出为表方式 root@localhost[(none)]> set global log_output='TABLE'; Query OK, 0 rows affected (0.00 sec) root@localhost[(none)]> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | TABLE | +---------------+-------+ --发布查询 root@localhost[(none)]> select * from tempdb.tb1; +------+------+ | id | val | +------+------+ | 1 | jack | +------+------+ --Author: Leshami --Blog : http://www.php.cn/ root@localhost[(none)]> system more /tmp/suse11b.log mysqld, Version: 5.5.39-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Time Id Command Argument 141003 16:30:03 1 Query show variables like '%gener%' 141003 16:30:09 1 Query select count(*) from tempdb.tb1 141003 16:31:00 1 Query show variables like 'log_output' 141003 17:00:48 1 Query set global log_output='TABLE' #通用查询日志输出到文件仅仅记录到全局变量的修改 --mysql.general_log记录了通用查询日志的信息 root@localhost[(none)]> desc mysql.general_log; +--------------+------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+-------------------+-----------------------------+ | event_time | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | user_host | mediumtext | NO | | NULL | | | thread_id | int(11) | NO | | NULL | | | server_id | int(10) unsigned | NO | | NULL | | | command_type | varchar(64) | NO | | NULL | | | argument | mediumtext | NO | | NULL | | +--------------+------------------+------+-----+-------------------+-----------------------------+ --从通用查询日志表里查看通用查询日志的内容 root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log; +-----------+--------------+---------------------------------------------------------------+ | thread_id | command_type | argument | +-----------+--------------+---------------------------------------------------------------+ | 1 | Query | show variables like 'log_output' | | 1 | Query | select * from tempdb.tb1 | | 1 | Query | desc mysql.general_log | | 1 | Query | select thread_id,command_type,argument from mysql.general_log | +-----------+--------------+---------------------------------------------------------------+ root@localhost[(none)]> show variables like 'log_output'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | TABLE | +---------------+-------+ --使用FILE,TABLE 2者混合输出通用日志 root@localhost[(none)]> set global log_output='file,table'; Query OK, 0 rows affected (0.00 sec) root@localhost[(none)]> select @@global.log_output; +---------------------+ | @@global.log_output | +---------------------+ | FILE,TABLE | +---------------------+ root@localhost[(none)]> insert into tempdb.tb1 values(2,'robinson'); Query OK, 1 row affected (0.06 sec) root@localhost[(none)]> commit; Query OK, 0 rows affected (0.01 sec) --验证结果,表和文件里边存在通用的日志记录 root@localhost[(none)]> system tail /tmp/suse11b.log|grep robinson 141003 17:41:54 2 Query insert into tempdb.tb1 values(2,'robinson') root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log -> where argument like '%robinson%'; +-----------+--------------+------------------------------------------------------------------------+ | thread_id | command_type | argument | +-----------+--------------+------------------------------------------------------------------------+ | 2 | Query | insert into tempdb.tb1 values(2,'robinson') | | 2 | Query | select thread_id,command_type,argument from mysql.general_log | | | | where argument like ''robinson'' | +-----------+--------------+------------------------------------------------------------------------+ d、关闭通用查询日志 --可以通过设置系统变量general_log来关闭通用查询日志,此时日志输出设置为FILE,TABLE root@localhost[(none)]> show variables like 'log_output'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | log_output | FILE,TABLE | +---------------+------------+ root@localhost[(none)]> set global general_log=off; Query OK, 0 rows affected (0.01 sec) root@localhost[(none)]> show variables like '%gener%'; +------------------+------------------+ | Variable_name | Value | +------------------+------------------+ | general_log | OFF | | general_log_file | /tmp/suse11b.log | +------------------+------------------+ root@localhost[(none)]> delete from tempdb.tb1 where id=2; Query OK, 1 row affected (0.12 sec) root@localhost[(none)]> commit; Query OK, 0 rows affected (0.00 sec) root@localhost[(none)]> system tail -n 1 /tmp/suse11b.log 141003 17:45:13 2 Query set global general_log=off root@localhost[(none)]> select thread_id,command_type,argument from mysql.general_log -> where argument like '%delete%'; Empty set (0.00 sec) --从上面的演示可知,尽管我们设置了log_output为FILE,TABLE,但general_log为OFF,通用日志无任何记录产生 root@localhost[(none)]> set global log_output=none; Query OK, 0 rows affected (0.00 sec) root@localhost[(none)]> set global general_log=1; Query OK, 0 rows affected (0.00 sec) root@localhost[(none)]> truncate table tempdb.tb1; Query OK, 0 rows affected (0.01 sec) root@localhost[(none)]> system tail -n 1 /tmp/suse11b.log Time Id Command Argument --通过上面的演示,在log_output=none,general_log=on的清下下无任何通用日志输出。
위 내용은 MySQL General Query Log 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!