• 九、Mysql - 错误日志 - 慢日志 - 通用日志 - 二进制日志 - undolog - redolog - 事务的执行过程


    目录

    知识点1:为什么需要日志信息?

     知识点2:错误日志  error

    示例:查看mysql里面的日志变量信息。

    错误日志的位置:

     如果不知道错误日志的位置可以登录mysql服务查找错误日志变量

     错误日志记录了什么内容?

    示例:mysql登录失败会记录错误日志。

    知识点3:慢日志  slow_query_log

    慢日志有什么作用?

     sql语句执行时间多长算慢日志?

     在配置文件里面开启慢日志

    知识点4:通用日志 general log

     知识点5:二进制日志 binary log

    二进制日志的作用?

    示例:在配置文件里面开启二进制日志

    localhost-bin.index 文件:记录了累计共有多少个二进制文件

    查看当前使用的是哪个二进制文件  show master status

     查看所有二进制文件和大小 show binary logs

    一个二进制文件是否记录了整个mysqld进程里所有的库的操作?

    知识点6:哪些行为会产生新的二进制文件?

    1、service mysqld restart

    2、flush logs;

    3、当日志达到最大值1G的时候,也会产生新的日志

     知识点7:查看二进制文件 mysqlbinlog

     知识点8:Innodb存储引擎架构

     redo log

    redo log可以简单分为以下两个部分:

    redo的整体流程 

    undo log

    知识点9:事务的执行过程


    知识点1:为什么需要日志信息?

    日志用来做什么事?

            1、用来排错。

            2、用来做数据分析,提升数据库性能等

            3、了解程序的运行情况,是否健康,了解mysql性能,运行情况

    ########################################################################## 

     知识点2:错误日志  error

    一般错误日志的名字是  : 主机名.err

    错误日志是Mysq里面默认开启的日志。

    示例:查看mysql里面的日志变量信息。

    1. root@(none) 10:28 mysql>show variables like "%log%";
    2. +--------------------------------------------+---------------------------------------+
    3. | Variable_name | Value |
    4. +--------------------------------------------+---------------------------------------+
    5. | back_log | 80 |
    6. | binlog_cache_size | 32768 |
    7. | binlog_checksum | CRC32 |
    8. | binlog_direct_non_transactional_updates | OFF |
    9. | binlog_error_action | ABORT_SERVER |
    10. | binlog_format | ROW |
    11. | binlog_group_commit_sync_delay | 0 |
    12. | binlog_group_commit_sync_no_delay_count | 0 |
    13. | binlog_gtid_simple_recovery | ON |
    14. | binlog_max_flush_queue_time | 0 |
    15. | binlog_order_commits | ON |
    16. | binlog_row_image | FULL |
    17. | binlog_rows_query_log_events | OFF |
    18. | binlog_stmt_cache_size | 32768 |
    19. | binlog_transaction_dependency_history_size | 25000 |
    20. | binlog_transaction_dependency_tracking | COMMIT_ORDER |
    21. | expire_logs_days | 0 |
    22. | general_log | OFF |
    23. | general_log_file | /data/mysql/localhost.log |
    24. | innodb_api_enable_binlog | OFF |
    25. | innodb_flush_log_at_timeout | 1 |
    26. | innodb_flush_log_at_trx_commit | 1 |
    27. | innodb_locks_unsafe_for_binlog | OFF |
    28. | innodb_log_buffer_size | 16777216 |
    29. | innodb_log_checksums | ON |
    30. | innodb_log_compressed_pages | ON |
    31. | innodb_log_file_size | 50331648 |
    32. | innodb_log_files_in_group | 2 |
    33. | innodb_log_group_home_dir | ./ |
    34. | innodb_log_write_ahead_size | 8192 |
    35. | innodb_max_undo_log_size | 1073741824 |
    36. | innodb_online_alter_log_max_size | 134217728 |
    37. | innodb_undo_log_truncate | OFF |
    38. | innodb_undo_logs | 128 |
    39. | log_bin | OFF |
    40. | log_bin_basename | |
    41. | log_bin_index | |
    42. | log_bin_trust_function_creators | OFF |
    43. | log_bin_use_v1_row_events | OFF |
    44. | log_builtin_as_identified_by_password | OFF |
    45. | log_error | ./localhost.localdomain.err |
    46. | log_error_verbosity | 3 |
    47. | log_output | FILE |
    48. | log_queries_not_using_indexes | OFF |
    49. | log_slave_updates | OFF |
    50. | log_slow_admin_statements | OFF |
    51. | log_slow_slave_statements | OFF |
    52. | log_statements_unsafe_for_binlog | ON |
    53. | log_syslog | OFF |
    54. | log_syslog_facility | daemon |
    55. | log_syslog_include_pid | ON |
    56. | log_syslog_tag | |
    57. | log_throttle_queries_not_using_indexes | 0 |
    58. | log_timestamps | UTC |
    59. | log_warnings | 2 |
    60. | max_binlog_cache_size | 18446744073709547520 |
    61. | max_binlog_size | 1073741824 |
    62. | max_binlog_stmt_cache_size | 18446744073709547520 |
    63. | max_relay_log_size | 0 |
    64. | relay_log | |
    65. | relay_log_basename | /data/mysql/localhost-relay-bin |
    66. | relay_log_index | /data/mysql/localhost-relay-bin.index |
    67. | relay_log_info_file | relay-log.info |
    68. | relay_log_info_repository | FILE |
    69. | relay_log_purge | ON |
    70. | relay_log_recovery | OFF |
    71. | relay_log_space_limit | 0 |
    72. | slow_query_log | OFF |
    73. | slow_query_log_file | /data/mysql/localhost-slow.log |
    74. | sql_log_bin | ON |
    75. | sql_log_off | OFF |
    76. | sync_binlog | 1 |
    77. | sync_relay_log | 10000 |
    78. | sync_relay_log_info | 10000 |
    79. +--------------------------------------------+---------------------------------------+
    80. 74 rows in set (0.00 sec)

    错误日志的位置:

            因为我的mysql服务是二进制安装的,我们指定了数据目录,错误日志会放在数据目录里面。

    1. [root@localhost mysql]# ls
    2. auto.cnf ibdata1 mysql sanchuang ucar_cloud
    3. ca-key.pem ib_logfile0 mysql.sock server-cert.pem wangsh
    4. ca.pem ib_logfile1 mysql.sock.lock server-key.pem
    5. client-cert.pem ibtmp1 performance_schema student
    6. client-key.pem localhost.localdomain.err private_key.pem sys
    7. ib_buffer_pool localhost.localdomain.pid public_key.pem test
    8. [root@localhost mysql]#

     如果不知道错误日志的位置可以登录mysql服务查找错误日志变量

    1. root@(none) 10:34 mysql>show variables like "log_error";
    2. +---------------+-----------------------------+
    3. | Variable_name | Value |
    4. +---------------+-----------------------------+
    5. | log_error | ./localhost.localdomain.err |
    6. +---------------+-----------------------------+
    7. 1 row in set (0.01 sec)

     错误日志记录了什么内容?

        登录失败会记录到错误日志
        配置文件出错也会记录
        启动过程出问题也会记录

    示例:mysql登录失败会记录错误日志。

    使用tail -f 监控日志文件

    [root@localhost mysql]# tail -f localhost.localdomain.err 
    

     错误输入密码:

     生成错误日志:

     日志文件配置错误:

     生成警告

    ########################################################################## 

    知识点3:慢日志  slow_query_log

    慢日志有什么作用?

    作用:记录消耗时间比较长的SQL语句,为数据库性能提升提供了线索

    最近数据库压力(负载特别高),客户反应网站或者应用使用特别慢,领导要求你查明原因?
    1.SQL语句需要优化,在数据库里启用慢日志,找出执行时间比较长的SQL
    2.业务量太大了,硬件已经达到极限了  ,top、glances、dstat

    慢日志默认是关闭的

    如果打开慢日志会将慢日志放在我们定义的数据目录下面。名字是主机名 + slow.log

    1. root@(none) 10:57 mysql>show variables like "%slow_query%";
    2. +---------------------+--------------------------------+
    3. | Variable_name | Value |
    4. +---------------------+--------------------------------+
    5. | slow_query_log | OFF |
    6. | slow_query_log_file | /data/mysql/localhost-slow.log |
    7. +---------------------+--------------------------------+
    8. 2 rows in set (0.00 sec)

     sql语句执行时间多长算慢日志?

     

    默认sql语句超过10秒就是慢sql,会记录到慢日志

    1. root@(none) 10:45 mysql>show variables like "%long_query%";
    2. +-----------------+-----------+
    3. | Variable_name | Value |
    4. +-----------------+-----------+
    5. | long_query_time | 10.000000 |
    6. +-----------------+-----------+
    7. 1 row in set (0.00 sec)

     在配置文件里面开启慢日志

    1. # slow log
    2. slow_query_log = 1
    3. long_query_time = 0.001 # 标准
    4. # 在写入慢日志中包含慢管理语句。
    5. log_slow_admin_statements = 1

    重启配置文件以后就会出现慢日志文件

    1. root@(none) 11:34 mysql>show variables like "%slow%";
    2. +---------------------------+--------------------------------+
    3. | Variable_name | Value |
    4. +---------------------------+--------------------------------+
    5. | log_slow_admin_statements | ON |
    6. | log_slow_slave_statements | OFF |
    7. | slow_launch_time | 2 |
    8. | slow_query_log | ON |
    9. | slow_query_log_file | /data/mysql/localhost-slow.log |
    10. +---------------------------+--------------------------------+
    11. 5 rows in set (0.01 sec)
    12. root@(none) 11:35 mysql>

    我们设置了慢日志标准为0.001秒,如果有sql语句超过这个时间的话就会记录到 慢日志里面

    1. root@(none) 11:52 mysql>show variables like "%slow%";
    2. +---------------------------+--------------------------------+
    3. | Variable_name | Value |
    4. +---------------------------+--------------------------------+
    5. | log_slow_admin_statements | ON |
    6. | log_slow_slave_statements | OFF |
    7. | slow_launch_time | 2 |
    8. | slow_query_log | ON |
    9. | slow_query_log_file | /data/mysql/localhost-slow.log |
    10. +---------------------------+--------------------------------+
    11. 5 rows in set (0.01 sec)
    12. root@(none) 11:52 mysql>

    ########################################################################## 

    知识点4:通用日志 general log

    general 日志,会记录所有的sql操作

    缺点:会消耗大量的磁盘空间,消耗cpu,内存,磁盘资源

    通用日志名字为 主机名 + .log

    1. root@(none) 12:13 mysql>show variables like "%general%";
    2. +------------------+---------------------------+
    3. | Variable_name | Value |
    4. +------------------+---------------------------+
    5. | general_log | OFF |
    6. | general_log_file | /data/mysql/localhost.log |
    7. +------------------+---------------------------+
    8. 2 rows in set (0.00 sec)

    通用日志默认是关闭的,我们可以在配置文件里面打开通用日志。

    1. # general 日志
    2. general_log
    1. root@(none) 12:15 mysql>show variables like "%general%"
    2. -> ;
    3. +------------------+---------------------------+
    4. | Variable_name | Value |
    5. +------------------+---------------------------+
    6. | general_log | ON |
    7. | general_log_file | /data/mysql/localhost.log |
    8. +------------------+---------------------------+
    9. 2 rows in set (0.00 sec)
    10. root@(none) 12:15 mysql>

    可以看到,开启general通用日志以后,所有使用过的sql语句都会记录在 localhost.log文件里面

    1. root@(none) 14:40 mysql>use wangsh;
    2. Reading table information for completion of table and column names
    3. You can turn off this feature to get a quicker startup with -A
    4. Database changed
    5. root@wangsh 14:40 mysql>show tables;
    6. +------------------+
    7. | Tables_in_wangsh |
    8. +------------------+
    9. | shirts |
    10. | tran_demo |
    11. +------------------+
    12. 2 rows in set (0.00 sec)
    13. root@wangsh 14:40 mysql>desc tran_demo;
    14. +-------+-------------+------+-----+---------+-------+
    15. | Field | Type | Null | Key | Default | Extra |
    16. +-------+-------------+------+-----+---------+-------+
    17. | id | int(11) | YES | | NULL | |
    18. | name | varchar(20) | YES | | NULL | |
    19. +-------+-------------+------+-----+---------+-------+
    20. 2 rows in set (0.00 sec)
    21. root@wangsh 14:40 mysql>

    ########################################################################## 

     知识点5:二进制日志 binary log

    二进制日志的作用?

            可以用来做数据恢复

            主从复制 

    二进制日志默认也是没有开启的。

    1. root@wangsh 14:51 mysql>show variables like "%log_bin%";
    2. +---------------------------------+-------+
    3. | Variable_name | Value |
    4. +---------------------------------+-------+
    5. | log_bin | OFF |
    6. | log_bin_basename | |
    7. | log_bin_index | |
    8. | log_bin_trust_function_creators | OFF |
    9. | log_bin_use_v1_row_events | OFF |
    10. | sql_log_bin | ON |
    11. +---------------------------------+-------+
    12. 6 rows in set (0.00 sec)

    示例:在配置文件里面开启二进制日志

    1. # binary log
    2. log_bin
    3. server_id = 1
    1. root@(none) 14:54 mysql>show variables like "%log_bin%";
    2. +---------------------------------+---------------------------------+
    3. | Variable_name | Value |
    4. +---------------------------------+---------------------------------+
    5. | log_bin | ON |
    6. | log_bin_basename | /data/mysql/localhost-bin |
    7. | log_bin_index | /data/mysql/localhost-bin.index |
    8. | log_bin_trust_function_creators | OFF |
    9. | log_bin_use_v1_row_events | OFF |
    10. | sql_log_bin | ON |
    11. +---------------------------------+---------------------------------+
    12. 6 rows in set (0.00 sec)
    13. root@(none) 14:56 mysql>
    1. [root@localhost mysql]# ls
    2. auto.cnf ib_logfile1 mysql server-key.pem
    3. ca-key.pem ibtmp1 mysql.sock student
    4. ca.pem localhost-bin.000001 mysql.sock.lock sys
    5. client-cert.pem localhost-bin.index performance_schema test
    6. client-key.pem localhost.localdomain.err private_key.pem ucar_cloud
    7. ib_buffer_pool localhost.localdomain.pid public_key.pem wangsh
    8. ibdata1 localhost.log sanchuang
    9. ib_logfile0 localhost-slow.log server-cert.pem
    10. [root@localhost mysql]#

    localhost-bin.index 文件:记录了累计共有多少个二进制文件

    mysqld服务每刷新一次,二进制文件就会增加一个,index文件里面也会新加一个

    1. [root@localhost mysql]# ls
    2. auto.cnf ib_logfile1 mysql server-key.pem
    3. ca-key.pem ibtmp1 mysql.sock student
    4. ca.pem localhost-bin.000001 mysql.sock.lock sys
    5. client-cert.pem localhost-bin.index performance_schema test
    6. client-key.pem localhost.localdomain.err private_key.pem ucar_cloud
    7. ib_buffer_pool localhost.localdomain.pid public_key.pem wangsh
    8. ibdata1 localhost.log sanchuang
    9. ib_logfile0 localhost-slow.log server-cert.pem
    10. [root@localhost mysql]# cat localhost-bin.index
    11. ./localhost-bin.000001
    12. [root@localhost mysql]# service mysqld restart
    13. Shutting down MySQL.... SUCCESS!
    14. Starting MySQL. SUCCESS!
    15. [root@localhost mysql]# ls
    16. auto.cnf ib_logfile1 localhost-slow.log server-cert.pem
    17. ca-key.pem ibtmp1 mysql server-key.pem
    18. ca.pem localhost-bin.000001 mysql.sock student
    19. client-cert.pem localhost-bin.000002 mysql.sock.lock sys
    20. client-key.pem localhost-bin.index performance_schema test
    21. ib_buffer_pool localhost.localdomain.err private_key.pem ucar_cloud
    22. ibdata1 localhost.localdomain.pid public_key.pem wangsh
    23. ib_logfile0 localhost.log sanchuang
    24. [root@localhost mysql]# cat localhost-bin.index
    25. ./localhost-bin.000001
    26. ./localhost-bin.000002

    查看当前使用的是哪个二进制文件  show master status

    1. root@(none) 15:00 mysql>show master status;
    2. +----------------------+----------+--------------+------------------+-------------------+
    3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +----------------------+----------+--------------+------------------+-------------------+
    5. | localhost-bin.000002 | 154 | | | |
    6. +----------------------+----------+--------------+------------------+-------------------+
    7. 1 row in set (0.00 sec)
    8. root@(none) 15:00 mysql>

     查看所有二进制文件和大小 show binary logs

    1. root@(none) 15:03 mysql>show binary logs;
    2. +----------------------+-----------+
    3. | Log_name | File_size |
    4. +----------------------+-----------+
    5. | localhost-bin.000001 | 177 |
    6. | localhost-bin.000002 | 205 |
    7. | localhost-bin.000003 | 154 |
    8. +----------------------+-----------+
    9. 3 rows in set (0.00 sec)
    10. root@(none) 15:07 mysql>

    一个二进制文件是否记录了整个mysqld进程里所有的库的操作?

    是的,对所有库的操作都会记录到一个二进制文件里面,如果需要记录到不同的日志文件里面,可以采用多实例

     mysq实例:

            正在运行的一个mysql进程,这个进程里面有哪些库可以操作,二进制日志就记录哪些库的操作

    多实例:

            多启动几个mysqld的进程,一个mysqld的进程对应一个库

            隔离应用,避免一个库使用特别频繁,影响其他的库

            多实例任然受到整个机器整体系统资源的限制

    ########################################################################## 

    知识点6:哪些行为会产生新的二进制文件?


    1、service mysqld restart

    2、flush logs;

    1. root@(none) 15:00 mysql>flush logs;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@(none) 15:03 mysql>show master status;
    4. +----------------------+----------+--------------+------------------+-------------------+
    5. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    6. +----------------------+----------+--------------+------------------+-------------------+
    7. | localhost-bin.000003 | 154 | | | |
    8. +----------------------+----------+--------------+------------------+-------------------+
    9. 1 row in set (0.00 sec)
    10. root@(none) 15:03 mysql>
    1. [root@localhost mysql]# ls
    2. auto.cnf ib_logfile1 localhost.log sanchuang
    3. ca-key.pem ibtmp1 localhost-slow.log server-cert.pem
    4. ca.pem localhost-bin.000001 mysql server-key.pem
    5. client-cert.pem localhost-bin.000002 mysql.sock student
    6. client-key.pem localhost-bin.000003 mysql.sock.lock sys
    7. ib_buffer_pool localhost-bin.index performance_schema test
    8. ibdata1 localhost.localdomain.err private_key.pem ucar_cloud
    9. ib_logfile0 localhost.localdomain.pid public_key.pem wangsh
    10. [root@localhost mysql]#

    3、当日志达到最大值1G的时候,也会产生新的日志

    1. root@(none) 15:07 mysql>show variables like "max_binlog_size";
    2. +-----------------+------------+
    3. | Variable_name | Value |
    4. +-----------------+------------+
    5. | max_binlog_size | 1073741824 |
    6. +-----------------+------------+
    7. 1 row in set (0.00 sec)
    8. root@(none) 15:15 mysql>
    1. root@(none) 15:15 mysql>select 1073741824/1024/1024;
    2. +----------------------+
    3. | 1073741824/1024/1024 |
    4. +----------------------+
    5. | 1024.00000000 |
    6. +----------------------+
    7. 1 row in set (0.00 sec)
    8. root@(none) 15:17 mysql>

     ########################################################################## 

     知识点7:查看二进制文件 mysqlbinlog

    此时我们使用的二进制文件是 Localhost-bin.000003

    对数据库进行操作

    1. root@ucar_cloud 15:33 mysql>use student;
    2. Database changed
    3. root@student 15:34 mysql>shwo tables;
    4. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'shwo tables' at line 1
    5. root@student 15:34 mysql>show tables;
    6. Empty set (0.00 sec)
    7. root@student 15:34 mysql>create table test(id int, name varchar(20));
    8. Query OK, 0 rows affected (0.01 sec)
    9. root@student 15:35 mysql>insert into test(id,name) values(1,'wang');
    10. Query OK, 1 row affected (0.00 sec)
    1. [root@localhost mysql]# mysqlbinlog -v localhost-bin.000003
    2. # at 535
    3. #220812 15:35:34 server id 1 end_log_pos 580 CRC32 0xdd2e8bd1 Write_rows: table id 113 flags: STMT_END_F
    4. BINLOG '
    5. xgL2YhMBAAAANQAAABcCAAAAAHEAAAAAAAEAB3N0dWRlbnQABHRlc3QAAgMPAjwAA5EKdrY=
    6. xgL2Yh4BAAAALQAAAEQCAAAAAHEAAAAAAAEAAgAC//wBAAAABHdhbmfRiy7d
    7. '/*!*/;
    8. ### INSERT INTO `student`.`test`
    9. ### SET
    10. ### @1=1
    11. ### @2='wang'

    at 535    从535位置号开始

    220812 15:35:34    时间

    end_log_pos 580   到 580位置号结束

    ##########################################################################  

     知识点8:Innodb存储引擎架构

     

     redo log

    redo log的作用:

            redo log的主要作用是用于数据库的崩溃恢复

            就是当数据从内存刷到磁盘的时候,突然停电,导致刷盘失败,然后Mysql服务器重启后就会首先看redolog的日志,重新再做一遍,保障数据一致性,不丢失

    redo log可以简单分为以下两个部分:

            一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中

            二是重做日志文件 (redo log file),是持久的,保存在磁盘中

    redo的整体流程 

    redo日志是比数据页先写入磁盘的。 

    第一步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝

    第二步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值

    第三步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式

    第四步:定期将内存中修改的数据刷新到磁盘中

    undo log

    undolog的作用

            undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

            服务器运行时的回滚rollback、MVCC(多版本控制)就是基于此log

     ########################################################################## 

    知识点9:事务的执行过程

    示例:状态1:A:10,B:10,状态2:A:0,B:20

     

    过程:

            1、从磁盘中读取数据A到内存中

            2、记录数据到undo.log

            3、修改A的值为0

            4、记录修改后的数据到redo.log buffer 里面

            5、从磁盘中读取数据B到内存中

            6、记录数据到undo.log

            7、修改B的值为20

            8、记录修改后的数据到redo.log buffer 里面,server层标记prepare,准备提交

            9、bin_log 写入磁盘中

            10、事务提交,redo.log 在server层标记 commit,数据刷入磁盘中,提交成功,

            如果中途失败的话,会根据undo.log回滚。

                   

     参考资料:

            https://www.jianshu.com/p/20e10ed721d0

           mysql之事务执行过程和ACID分析;一文读懂undolog、redolog、binlog刷盘时机和意义 - 知乎

  • 相关阅读:
    3000帧动画图解MySQL为什么需要binlog、redo log和undo log
    rocketmq各类问题
    linux提权秘籍
    CDN加速解决VSCode下载速度慢的问题
    局部变量,全局变量与内存
    【网络安全小课堂】网络安全相关名词解释
    4个视频教你正确使用华为云代码托管服务CodeArts Repo!
    SWM32系列教程4-端口映射及串口应用
    【Java】反射
    Function of several real variables
  • 原文地址:https://blog.csdn.net/qq_48391148/article/details/126298985