1.日志(上)
MySQL 的日志种类非常多,包括通用查询日志,慢查询日志,错误日志,二进制日志,中继日志,重做日志和回滚日志
1.1通用查询日志
通用查询日志记录了所有用户的连接开始时间和截止时间,以及发给 MySQL 数据库服务器的所有 SQL 指令
查看通用查询日志是否开启
show variables likes '%general%'
Variable_name | Value | |
---|
general_log | OFF | – 通用查询日志处于关闭状态(默认关闭) | general_log_file | GJTECH-PC.log | – 通用查询日志文件的名称是GJTECH-PC.log |
开启通用查询日志
set global general_log ='on'
set] @@global.general_log_file='H:\mytest.log'
通用日志格式
2021-04-05T06:39:53.621980Z 28 Connect zhangsan@localhost on using SSL/TLS
2021-04-05T06:39:53.622085Z 28 Connect Access denied for user 'zhangsan'@'localhost' (using password: NO)
2021-04-05T06:40:02.522303Z 29 Connect zhangsan@localhost on using SSL/TLS
2021-04-05T06:40:02.522913Z 29 Query select @@version_comment limit 1
2021-04-05T06:40:14.211511Z 29 Query SELECT *
FROM demo.invcount
2021-04-05T06:40:37.647625Z 29 Query UPDATE demo.invcount
SET plquant = - 5
WHERE itemnumber = 1
2021-04-05T06:41:15.047067Z 29 Query SELECT *
FROM demo.goodsmaster
1.2 慢查询日志
慢查询日志用来记录执行时间超过指定时长的查询
系统变量
show variables like 'min%'
my.ini
变量名 | 含义 |
---|
slow-query-log=1 | 表示开启慢查询日志,系统将会对慢查询进行记录 | slow_query_log_file=“GJTECH-PC-slow.log” | 表示慢查询日志的名称是"GJTECH-PC-slow.log"。这里没有指定文件夹,默认就是数据目录:“C:\ProgramData\MySQL\MySQL Server 8.0\Data” | long_query_time=10 | 表示慢查询的标准是查询执行时间超过10秒 |
注意
1.如果查询扫描过的记录数大于等于min_examined_row_limit的值,并且查询执行时间超过 long_query_time 的值,那么,这个查询就被记录到慢查询日志中
2.修改了my.ini就需要重启服务
慢日志格式
C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe, Version: 8.0.23 (MySQL Community Server - GPL). started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
use demo;
SET timestamp=1616656823;
1.3 错误日志
错误日志记录了 MySQL 服务器启动,停止运行的时间,以及系统启动,运行和停止过程中的诊断信息,包括错误,警告和提示
my.ini
log-error="GJTECH-PC.err"
注意
1.错误日志默认是开启的
2.默认就是数据目录:“C:\ProgramData\MySQL\MySQL Server 8.0\Data”
错误日志格式
2021-02-28T08:07:07.228880Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.23) starting as process 7652
2021-02-28T08:07:07.270982Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-02-28T08:07:08.116433Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
1.4思考题
1.请你思考一下:怎么设置开启慢查询日志,并且把慢查询日志的指定时长设置为 5 秒,最少扫描记录数为 1?
2.日志(下)
2.1二进制日志
二进制日志主要记录数据库的更新事件,比如创建数据表,更新表中的数据,数据更新所花费的时长等信息
基本操作
查看二进制日志
show master status
show binlog events in 二进制文件
刷新二进制日志
flush binary logs
用二进制日主恢复数据
mysqlbinlog –start-positon=xxx
删除二进制日志
RESET MASTER
案例
步骤一:数据库备份
mysqldump -u root -p demo > mybackup.sql
步骤二:刷新日志
flush binary logs
步骤三:插入一条记录
INSERT INTO demo.goodsmaster
(
itemnumber,
barcode,
goodsname,
salesprice
)
VALUES
(
2,
'0002',
'笔',
3
);
查看表数据
SELECT * FROM demo.goodsmaster;
第五步:从备份恢复数据
mysql -u 用户 -p 密码 数据库名称 < 备份文件
第六步
从保存增量信息的二进制日志文件“GJTECH-PC-bin.000012”中恢复增量数据
mysqlbinlog
注意
1.用二进制日志文件找回数据时经常会遇到问题 不容易找准起始位置或者截止位置, 找早了,会导致数据冲突重复, 找晚了又会丢失数据, 建议你在数据备份结束之后,把当前的二进制日志位置记录下来,存放在一个安全的地方,这关系到数据恢复的完整性,一定不要怕麻烦
2.2中继日志
中继日志只在主从服务器架构的从服务器上存在, 从服务器为了与主服务器保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入本地的日志文件中,这个从服务器本地的日志文件就叫中继日志
SET TIMESTAMP=1618558728;
BEGIN
;
BINLOG '
CD95YBMBAAAAMgAAAEADAAAAAFsAAAAAAAEABGRlbW8ABHRlc3QAAQMAAQEBAFHWFsw=
CD95YCABAAAAKAAAAGgDAAAAAFsAAAAAAAEAAgAB/wABAAAAfATkBw==
';
中继日志包含从服务器名字,如果从服务器宕机导致重装系统,在恢复数据时需要将名称改回之前的名称
2.3回滚日志
回滚日志的作用是进行事务回滚 , 回滚日志中记录了事务中每次数据更新前的状态, 当事务需要回滚的时候,可以通过读取回滚日志,恢复到指定的位置, 另一方面,回滚日志也可以让其他的事务读取到这个事务对数据更改之前的值,从而确保了其他事务可以不受这个事务修改数据的影响
SHOW VARIABLES LIKE '%innodb_max_undo_log_size%';
Variable_name | Value |
---|
innodb_max_undo_log_size | 1073741824 |
单个回滚日志最大可占用 1G 字节存储空间
SHOW VARIABLES LIKE '%innodb_undo%';
Variable_name | Value | 含义 |
---|
innodb_undo_directory | .\ | 表示回滚日志的存储目录是数据目录,数据目录的位置可以通过查询变量“datadir”来查看 | innodb_undo_log_encrypt | OFF | 表示回滚日志不加密 | innodb_undo_log_truncate | ON | 表示回滚日志是否自动截断回收,这个变量有效的前提是设置了独立表空间 | innodb_undo_tablespaces | 2 | 示回滚日志有自己的独立表空间,而不是在共享表空间 ibdata 文件中 |
2.4重做日志
作用
1.在系统遇到故障的恢复过程中,可以修复被未完成的事务修改的数据
2.MySQL 为了提高数据存取的效率,减少磁盘操作的频率,对数据的更新操作不会立即写到磁盘上,而是把数据更新先保存在内存中,积累到一定程度,再集中进行磁盘读写操作。这样就存在一个问题:一旦出现宕机或者停电等异常情况,内存中保存的数据更新操作可能会丢失。这个时候就可以通过读取重做日志中记录的数据更新操作,把没来得及写到磁盘上的数据更新写到磁盘上,确保数据的完整性
show variables like '%innodb_log_files_in_group%';
Variable_name | Value |
---|
innodb_log_files_in_group | 2 |
2.5思考题
SHOW BINLOG EVENTS IN 'GJTECH-PC-bin.000013';
观察一下,其中包括了哪几个 SQL 数据操作呢?为了从二进制日志中恢复这些操作,我们应该如何设置起始位置和截止位置呢?
这段二进制日志包括了2个SQL操作,第一个是从数据表demo.goodsmaster中删除一条记录,第二个是向数据表demo.goodsmaster中插入一条记录。起始位置:627,截止位置:1125
3.数据备份
3.1 如何进行数据备份
1.数据备份
mysqldump -h 服务器 -u 用户 -p 密码 数据库名称 [表名称 … ] > 备份文件名称
mysqldump -u root -p demo goodsmaster membermaster > test.sql
mysqldump -h 服务器 -u 用户 -p 密码
2.如何进行数据恢复
方式一
mysql -u root -p demo < test.sql
方式二
use 数据库名
source 备份文件名
3.2 表数据的导出导入
1.导出表数据
select 字段列表 into outfile 文件名
fields terminated by 字符
lines terminated by 字符
from 表名;
注意
1.服务器的“secure-file-priv”参数选项,不允许把文件写入到 H:\goodsmaster.txt
检查配置文件my.ini, 看一下“secure-file-priv”参数的设定,并且按照这个参数设定的要求准备导入文件
# Secure File Priv.
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
2.表数据的导入
load data infile 文件名
into table 表名
fields terminated by 字符
lines terminated by 字符;
注意
一个 400 万条数据的文件,用“LOAD DATA”语句,只需要几分钟就可以完成,而其他的方法,比如使用 Workbench 来导入数据,就需要花费好几个小时
|