MySQL数据库日志管理

  • 1、数据库中数据丢失或被破坏可能原因
  • 2、日志类型
    • 1)错误日志
    • 2)查询日志
    • 3)慢查询日志
    • 4)二进制日志(极其重要)

1、数据库中数据丢失或被破坏可能原因

  • 误删除数据库
  • 数据库工作时,意外断电或程序意外终止
  • 由于病毒造成的数据库损坏或丢失
  • 文件系统损坏后,系统进行自检操作
  • 升级数据库时,命令语句不严格
  • 设备故障等等
  • 自然灾害
  • 盗窃

2、日志类型

日志文件 记入文件中的信息类型
错误日志 记录启动、运行或停止时出现的问题
查询日志 记录建立的客户端连接和执行的语句
二进制日志(重要) 记录所有更改数据的语句。主要用于复制和即时点恢复
慢查询日志 记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询
事务日志 记录InnoDB等支持事务的存储引擎执行事务时产生的日志

1)错误日志

错误日志主要记录如下几种日志:

  1. 服务器启动和关闭过程中的信息
  2. 服务器运行过程中的错误信息
  3. 服务器运行过程中的错误信息
  4. 事件调度器运行一个时间是产生的信息
  5. 在从服务器上启动从服务器进程是产生的信息

错误日志定义:

  1. 如果–log-error没有给出,将错误日志写入控制台
    【注:如果服务器将错误日志写到控制台中,它会将log_error系统变量设置为stderr(标准输出)】
[root@localhost ~]# vim /etc/my.cnf     #修改MySQL配置文件,注释错误日志行
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0#log-error=/var/log/mysqld.log     #将此行注释
pid-file=/usr/local/mysql/data/mysqld.pid[root@localhost ~]# systemctl restart mysqld #重启MySQL服务
mysql> show variables like "%log_error%";
+---------------------+--------------+
| Variable_name       | Value        |
+---------------------+--------------+
| binlog_error_action | ABORT_SERVER |
| log_error           | stderr       |
| log_error_verbosity | 3            |
+---------------------+--------------+
3 rows in set (0.01 sec)
#可以看出“log_error=stderr”表示标准输出
  1. 如果只给出–log-error,其它文件路径、文件名都不写的情况下,系统会给定默认位置以及默认名
    【默认位置:/var/run/mysqld/ 默认名:mysqld.err】
[root@localhost ~]# vim /etc/my.cnf     #修改MySQL配置文件,只添加“log-error”
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0#log-error=/var/log/mysqld.log
log-error       #只添加“log-error”
pid-file=/usr/local/mysql/data/mysqld.pid[root@localhost ~]# systemctl restart mysqld #重启MySQL服务
mysql> show 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)
#可以看出“log_error=/var/run/mysqld/mysqld.err”表示为默认格式
  1. 如果–log-error给出时,只指定文件名,不指定路径,系统会在当前目录下创建该错误日志文件
    【注:此种情况,错误文件名仍为自定义文件名】
[root@localhost ~]# vim /etc/my.cnf     #修改MySQL配置文件,添加错误文件名为“mysqld.log”
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0#log-error=/var/log/mysqld.log
log-error=mysqld.log       #添加错误文件名为“mysqld.log”
pid-file=/usr/local/mysql/data/mysqld.pid[root@localhost ~]# systemctl restart mysqld #重启MySQL服务
mysql> show variables like "%log_error%";
+---------------------+--------------+
| Variable_name       | Value        |
+---------------------+--------------+
| binlog_error_action | ABORT_SERVER |
| log_error           | ./mysqld.log |
| log_error_verbosity | 3            |
+---------------------+--------------+
3 rows in set (0.00 sec)
#可以看出“log_error=./mysqld.log”表示放在当前目录下
  1. 如果–log-error给出时,文件名以及文件路径全部指定,系统会按照给定的文件名和文件路径创建错误日志
[root@localhost ~]# vim /etc/my.cnf
#修改MySQL配置文件,删除“#log-error=/var/log/mysqld.log”的注释,并删除“log-error=mysqld.log”
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0log-error=/var/log/mysqld.log      #删除“#log-error=/var/log/mysqld.log”的注释#删除“log-error=mysqld.log”
pid-file=/usr/local/mysql/data/mysqld.pid[root@localhost ~]# systemctl restart mysqld #重启MySQL服务
mysql> show 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.01 sec)
#可以看出“log_error/var/log/mysqld.log”表示按照指定的文件名和文件路径创建错误日志

2)查询日志

查询日志定义:
【注:查询日志默认关闭】

mysql> SHOW GLOBAL VARIABLES LIKE '%general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | OFF                          |
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
#可看出查询日志默认关闭

临时开启

mysql> set global general_log=ON;    //临时开启
Query OK, 0 rows affected (0.03 sec)mysql> SHOW GLOBAL VARIABLES LIKE '%general_log%';
+------------------+------------------------------+
| Variable_name    | Value                        |
+------------------+------------------------------+
| general_log      | ON                           |
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
#可看出查询日志已开启

永久开启需要通过修改配置文件(类似错误日志)

[root@localhost ~]# cat /var/lib/mysql/localhost.log
/usr/sbin/mysqld, Version: 5.7.37 (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
2022-04-22T02:10:38.618622Z     2 Query SHOW GLOBAL VARIABLES LIKE '%general_log%'
#开启之后可以看到记录了刚刚查询的语句(所有查询的语句都会记录:如查数据库、查表等等)

3)慢查询日志

慢查询日志定义:
如果查询时长超过long_query_time的定义值(默认10秒)即为慢查询

mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
#该默认时间可修改(自定义)
#一般大多数互联网企业都会定位3秒(超过3秒为慢查询)
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log      | OFF                               |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
2 rows in set (0.00 sec)
#默认没有开启慢查询日志,开启之后,超过界定时间的查询语句都会记录在慢查询日志中

只能通过修改配置文件开启慢查询日志

[root@localhost ~]# vim /etc/my.cnf
#修改MySQL配置文件,开启慢查询日志,指定慢查询日志文件名以及文件路径,修改慢查询界定时间为3s
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0log-error=/var/log/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pidslow_query_log=ON        #开启慢查询日志
slow_query_log_file=/var/lib/mysql/localhost-slow.log      #指定慢查询日志文件名以及文件路径
long_query_time=3      #修改慢查询界定时间为3s[root@localhost ~]# systemctl restart mysqld  #重启MySQL服务
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
+---------------------+-----------------------------------+
| Variable_name       | Value                             |
+---------------------+-----------------------------------+
| slow_query_log      | ON                                |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
2 rows in set (0.01 sec)
#可看出慢查询日志已开启,并且文件名和文件路径与所指定一致mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 3.000000 |
+-----------------+----------+
1 row in set (0.01 sec)
#可看出慢查询界定时间已修改为3s

查看慢查询日志

[root@localhost ~]# mysqldumpslow /var/lib/mysql/localhost-slow.log
#仅能通过此种方法查看慢查询日志,不然可能会出现乱码或其它情况导致难以查看

4)二进制日志(极其重要)

二进制日志的概念:
二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE语句)的所有语句。
语句以“事件”的形式保存,它描述数据更改。二进制日志还包含关于每个更新数据库的语句的执行时间信息,不包含没有修改任何数据的语句。

二进制日志主要目的:
在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。

二进制日志会分三种不同的情况进行记录(智能匹配):

  • 第一种情况:假如一个表有10万行数据,而现在要执行一个如下语句将amount字段的值全部在原来的基础上增加1000:
    UPDATE sales.january SET amount=amount+1000;
    【此时如果要记录执行后的结果数据的话,日志会非常大,因此在这种情况下应记录执行语句,这种方式就是基于语句的二进制日志
  • 第二种情况:如果向某个字段插入的是当前的时间:
    INSERT INTO tb SET Birthdate=CURRENT_TIME();
    【此时就不能记录语句了,因为不同时间执行的结果是不一样的,这时应该记录这一行的值,这种就是基于行(row)的二进制日志
  • 第三种情况:可能会结合两种方式来记录
    【这种叫做混合方式的二进制日志

二进制日志参数:

mysql> SHOW GLOBAL VARIABLES LIKE '%binlog%';
+--------------------------------------------+----------------------+
| Variable_name                              | Value                |
+--------------------------------------------+----------------------+
| binlog_cache_size                          | 32768                |
| binlog_checksum                            | CRC32                |
| binlog_direct_non_transactional_updates    | OFF                  |
| binlog_error_action                        | ABORT_SERVER         |
| binlog_format                              | ROW                  |
| binlog_group_commit_sync_delay             | 0                    |
| binlog_group_commit_sync_no_delay_count    | 0                    |
| binlog_gtid_simple_recovery                | ON                   |
| binlog_max_flush_queue_time                | 0                    |
| binlog_order_commits                       | ON                   |
| binlog_row_image                           | FULL                 |
| binlog_rows_query_log_events               | OFF                  |
| binlog_stmt_cache_size                     | 32768                |
| binlog_transaction_dependency_history_size | 25000                |
| binlog_transaction_dependency_tracking     | COMMIT_ORDER         |
| innodb_api_enable_binlog                   | OFF                  |
| innodb_locks_unsafe_for_binlog             | OFF                  |
| log_statements_unsafe_for_binlog           | ON                   |
| max_binlog_cache_size                      | 18446744073709547520 |
| max_binlog_size                            | 1073741824           |
| max_binlog_stmt_cache_size                 | 18446744073709547520 |
| sync_binlog                                | 1                    |
+--------------------------------------------+----------------------+
22 rows in set (0.00 sec)
#需要注意的是“binlog_format=ROW”表示默认模式为“基于行(ROW)的二进制日志”#可以修改“binlog_format”的默认值
mysql> set global binlog_format = "STATEMENT";        #基于语句的二进制日志
mysql> set global binlog_format = "ROW";      #基于行(ROW)的二进制日志
mysql> set global binlog_format = "MIXED";        #混合方式的二进制日志”

二进制日志定义:

mysql> SHOW GLOBAL VARIABLES LIKE '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
+---------------------------------+-------+
5 rows in set (0.00 sec)

只能通过修改配置文件开启二进制日志

[root@localhost ~]# vim /etc/my.cnf
#修改MySQL配置文件,开启二进制日志,指定二进制日志文件名以及文件路径,指定“server_id”
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.socksymbolic-links=0log-error=/var/log/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pidslow_query_log=ON
slow_query_log_file=/var/lib/mysql/localhost-slow.log
long_query_time=3log_bin=/var/lib/mysql/mysql-bin     #bin_log指定文件名和文件路径
server_id=131      #MySQL5.5版本后要开启bin_log必须给定一个唯一的服务器id(一般为IP地址主机位)[root@localhost ~]# systemctl restart mysqld #重启MySQL服务
[root@localhost ~]# ll /var/lib/mysql       #查看二进制日志文件路径
total 122976
-rw-r-----. 1 mysql mysql       56 Mar 26 14:37 auto.cnf
-rw-------. 1 mysql mysql     1680 Mar 26 14:37 ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 Mar 26 14:37 ca.pem
-rw-r--r--. 1 mysql mysql     1112 Mar 26 14:37 client-cert.pem
-rw-------. 1 mysql mysql     1676 Mar 26 14:37 client-key.pem
-rw-r-----. 1 mysql mysql      291 Apr 22 11:00 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Apr 22 11:00 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Apr 22 11:00 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Mar 26 14:37 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Apr 22 11:00 ibtmp1
-rw-r-----. 1 mysql mysql      262 Apr 22 10:15 localhost.log
-rw-r-----. 1 mysql mysql      540 Apr 22 11:00 localhost-slow.log
drwxr-x---. 2 mysql mysql     4096 Mar 26 14:37 mysql
-rw-r-----. 1 mysql mysql      154 Apr 22 11:00 mysql-bin.000001    #二进制日志
-rw-r-----. 1 mysql mysql       32 Apr 22 11:00 mysql-bin.index     #二进制日志格式
-rw-r-----. 1 mysql mysql     7980 Apr 22 10:00 mysqld.log
srwxrwxrwx. 1 mysql mysql        0 Apr 22 11:00 mysql.sock
-rw-------. 1 mysql mysql        5 Apr 22 11:00 mysql.sock.lock
drwxr-x---. 2 mysql mysql     8192 Mar 26 14:37 performance_schema
-rw-------. 1 mysql mysql     1680 Mar 26 14:37 private_key.pem
-rw-r--r--. 1 mysql mysql      452 Mar 26 14:37 public_key.pem
-rw-r--r--. 1 mysql mysql     1112 Mar 26 14:37 server-cert.pem
-rw-------. 1 mysql mysql     1676 Mar 26 14:37 server-key.pem
drwxr-x---. 2 mysql mysql     8192 Mar 26 14:37 sys

二进制日志查看

#执行几条SQL语句
mysql> create database test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changed
mysql> create table test1(id int,name char(20));
Query OK, 0 rows affected (0.00 sec)mysql> insert into test1 values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0
#查看二进制日志
#此方法查看只能看到乱码,无法查看内容
[root@localhost ~]# cat /var/lib/mysql/mysql-bin.000001                             _þbinObbw{5.7.37-logObb8**4ڙUObb#												

MySQL数据库备份恢复(日志管理)相关推荐

  1. mysql备份数据库语句6_13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复...

    扩展 : SQL语句教程 什么是事务?事务的特性有哪些? 根据binlog恢复指定时间段的数据 mysql字符集调整 使用xtrabackup备份innodb引擎的数据库  innobackupex  ...

  2. mysql用户管理,常用sql语句,mysql数据库备份恢复

    2019独角兽企业重金招聘Python工程师标准>>> mysql用户管理 grant all on . to 'user1' identified by 'passwd'; gra ...

  3. MySQL用户管理、常用SQL语句、MySQL数据库备份恢复

    mysql用户管理 1.创建一个普通用户并授权 [root@gary-tao ~]# mysql -uroot -p'szyino-123' Warning: Using a password on ...

  4. 13.4 MySQL用户管理;13.5 常用sql语句;13.6 MySQL数据库备份恢复

    扩展 : SQL语句教程 http://www.runoob.com/sql/sql-tutorial.html 什么是事务?事务的特性有哪些? http://blog.csdn.net/yenang ...

  5. 13.4 mysql用户管理 13.5 常用sql语句 13.6 mysql数据库备份恢复

    mysql用户管理 1.创建一个普通用户并授权 [root@gary-tao ~]# mysql -uroot -p'szyino-123' Warning: Using a password on ...

  6. 52次课(mysql用户管理、常用sql语句、 mysql数据库备份恢复)

    MySQL创建用户以及授权 默认用户是root用户,不可能所有人员都用root用户,创建用户防止误删除,因为mysql里边有多个库每个库里有很多表,所以需要给单独的用户做一些授权我只需要它对某一个数据 ...

  7. 2.5.1 MySQL数据库备份恢复基础讲解

    MySQL数据库备份恢复基础 MySQL常见的故障类型 对于用户来说,数据库中保存的数据通常至关重要,所以要采取各种手段来防止各种可能的数据损失和数据故障. DBA主要任务就是维持数据库的高可靠性运行 ...

  8. mysql 恢复数据库乱码了_再谈MySQL数据库备份恢复和乱码问题

    在我转到wordpress之后第一个考虑的是它的数据库备份恢复问题,因为写bloger都知道,自己的blog记录的都是自己需要的宝贵的资料和文字,如果因为各种未知因素导致数据库崩溃或者空间商出了问题, ...

  9. mysql 数据库备份 乱码_再谈 MySQL 数据库备份恢复和乱码问题

    在我转到wordpress之后第一个考虑的是它的数据库备份恢复问题,因为写bloger都知道,自己的blog记录的都是自己需要的宝贵的资料和文字,如果因为各种未知因素导致数据库崩溃或者空间商出了问题, ...

最新文章

  1. Verilog中生成语句(generate)的用法
  2. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解
  3. 一切为了孩子——一位IT麻麻的新西兰移民记录
  4. python二维列表排序_使用Python按顺时针方向排序二维坐标列表?
  5. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
  6. Javascript IE 内存释放
  7. 【Unity开源项目精选】AssetStudio:提取Unity游戏的资源
  8. 动态规划之背包问题 - 01背包+完全背包+多重背包
  9. arduino烧录_如何给AVR单片机烧录程序
  10. 分布式任务定时框架elasticjob详解
  11. linux如何查找下一个
  12. 获取post请求的几种常见方式
  13. javaSocket基础
  14. PT 基于Multi Voltage的Physical Aware
  15. (Java实现)洛谷 P1164 小A点菜
  16. 美国餐饮连锁集团【CAVA Group】申请纽交所IPO上市
  17. 以太坊转账二维码 iban 生成
  18. 东芝计算机配置,东芝R系列配置价格分析
  19. day01第一章_Linux_基础讲义
  20. 《王者荣耀》手游感想

热门文章

  1. linux 没有权限访问共享文件夹的问题
  2. 2021年电工(初级)考试题及电工(初级)新版试题
  3. java oracle 流复制_Oracle流复制技术
  4. Python 爬取百度图片的高清原图
  5. boost 库 applyvisitor使用
  6. 【毕业N年系列】 毕业第四年
  7. linux启动jar后回到根目录,SpringBoot 打包 Jar 启动后,获得jar包所在目录,SpringBoot获取根目录...
  8. python和心理学_心理学研究人员的最佳Python库
  9. 逻辑漏洞学习-身份验证漏洞
  10. 如何用python编一个扫雷游戏_用 Python 做一个 Windows 扫雷游戏