linux12-mysql数据库-->12日志管理(代码片段)

FikL-09-19 FikL-09-19     2022-12-09     121

关键词:

mysql的日志

日志分类
日志种类作用
错误日志记录 MySQL 服务器启动、关闭及运行错误等信息
事务日志1、redo log重做日志 2、undo log回滚日志
查询日志记录查询的信息
慢查询日志记录执行时间超过指定时间的操作
二进制日志又称binlog日志,以二进制文件的方式记录数据库中除 SELECT 以外的操作
中继日志备库将主库的二进制日志复制到自己的中继日志中,从而在本地进行重放
通用日志审计哪个账号、在哪个时段、做了哪些事件

一、mysql错误日志

首次启动会提示错误日志位置
查询错误日志:
[root@db01 ~]# mysqladmin -uroot -p variables |grep -w log_error
| log_error                                                | /var/log/mysqld.log 

variables 其实就是查看mysql的配置文件,很多都是注释掉的,他就走默认的,其实我们可以把配置文件打开,一般都会配置
[root@db01 ~]# vim /etc/my.cnf 
[mysqld] 
#绝对路径 
log_error=/var/log/mysql.errlog 
#相对路径
log_error=mysql.errlog
[root@db01 ~]# touch /var/log/mysql.errlog
[root@db01 ~]# chmod 640 /var/log/mysql.errlog 
[root@db01 ~]# chown mysql.mysql /var/log/mysql.errlog 
[root@db01 ~]# systemctl restart mysqld 
#结论:
1.默认是开启的
2.路径在 $datadir/data/ 下面,以主机名.err来命名
3.可以修改我们指定的地址
[root@db01 ~]# vim /etc/my.cnf
log_error=/var/log/mysql.errlog 
4.查看错误日志方式
# 方式一
mysqladmin -uroot -p variables | grep -w log_error
# 方式二
mysql> show variables like '%log_error%';

1、配置错误日志(默认就是启用的)

[root@db01 ~]# vim /etc/my.cnf 
[mysqld] 
#绝对路径 
log_error=/var/log/mysql.errlog 
#相对路径
log_error=mysql.errlog
[root@db01 ~]# touch /var/log/mysql.errlog
[root@db01 ~]# chmod 640 /var/log/mysql.errlog 
[root@db01 ~]# chown mysql.mysql /var/log/mysql.errlog 
[root@db01 ~]# systemctl restart mysqld 

MySQL中,其中log_error定义是否启用错误日志的功能和错误日志的存储位置,此外还可以用参数控制

是否将告警信息(warning messages)也写入错误日志。在不同的版本中改控制参数有所不同

2、在MySQL 5.6中用log_warnings参数

# 1、log_warnings=0, 表示不记录告警信息。
# 2、log_warnings=1(默认值), 表示告警信息写入错误日志。 
# 3、log_warnings大于1,表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志。

3、mysql5.7新增的log_error_verbosity参数

# 它有三个可选值, 分别对应:
# 1、log_error_verbosity=1:错误信息;
# 2、log_error_verbosity=2:错误信息和告警信息;(推荐)
# 3、log_error_verbosity=3(默认值就是3):错误信息、告警信息和通知信息。

二、一般查询日志

1、一般查询日志

1.默认是关闭的 
一般不会开启,因为哪怕你开启事务一顿操作,最后不提交也会记录,生产上程序跑sql很多,会非常 非常占地方,从来都不启动,要看操作去binlog 
2.开启
[root@db01 ~]# vim /etc/my.cnf general_log=on
general_log_file=/var/log/select.log 
set global general_log=on
#可以使用set global general_log=on;设置 

[root@db01 ~]# touch /var/log/select.log 
[root@db01 ~]# chmod 640 /var/log/select.log 
[root@db01 ~]# chown mysql.mysql /var/log/select.log 
[root@db01 ~]# systemctl restart mysqld
3.查看一般查询日志 
# 方式一
[root@db01 ~]# mysqladmin -uroot -p'Mm2021@Ping' variables|grep general_log 
# 方式二
[root@db01 ~]# mysql -uroot -p'Mm2021@Ping' mysql> show variables like '%gen%';

mysql的好处就是编译完了不是一定得根据他编译的配置走,可以去配置自己想要的内容
# 一般不会开启,因为哪怕你开启事务一顿操作,最后不提交也会记录,生产上程序跑sql很多,会非常非常占地方,从来都不启动,要看操作去binlog

三、二进制日志

1、二进制日志简介

二进制日志即binlog日志,记录了mysql数据库所有的dml,ddl语句事件(不包含select)。
记录增删改,也可以记录SQL语句及行记录变化,还可以记录这些操作事件;总之会记录所有修改操作的SQL语句。

2、不要混淆以下三种日志:

# 1、general log:记录数据库里的所有SQL操作记录 
# 2、redo log:只记录innodb存储引擎的修改日志 
# 3、binlog:只记录server层面内部的修改情况。--select /show 不记录 

3、开启binlog日志的好处

1.记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
2.记录所有DDL、DCL等语句
3.总之,二进制日志会记录所有对数据库发生修改的操作
	
# 记录数据库,增,删,改的SQL语句
1.如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
2.mysql主从复制,通过binlog实现数据复制
3.数据恢复:可以基于时间点恢复,以及根据其进行增量与差异备份 

4、二进制日志工作模式

1、查看工作模式
#查看工作模式
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
2、语句模式

语句模式:binlog_format=statement(Mysql5.7.6之前的默认级别)

# 语句模式介绍 
记录对数据库做出修改的sql语句,不记录该sql的上下文信息 
#语句模式(MySQL5.6默认)STATEMENT:
	主要是记录增,删,改的SQL语句

# 例如
1、开启binlog日志后,我们在某个库下自定义函数,若想定义成功需要先设置配置项 
set global log_bin_trust_function_creators=TRUE; 
2、然后自定义函数
delimiter //
create function f1( 
    i1 int, 
    i2 int) 
returns int 
BEGIN
    declare num int; 
    set num = i1 + i2; 
    return(num);
END //
delimiter ;

3、最后执行一条插入语句 
insert into t1(name) values(concat("egon",f1(1,2))); 

如果使用statement模式,那么这条insert语句将会被记录到二进制日志中,而sql语句中依赖的f1 的定义是不会记录下来的,f1只存在于当前库。
# 优点 
不需要记录细到每一行数据的更改变化,只需要记录该条语句即可
因此,binlog日志量小,IO压力小,性能较高

例如:
一条语句修改了100万行,该模式下只需要记录下该条语句即可 

# 缺点
日志中记录的sql语句可能有上下文依赖,此时脱离了当前数据库环就无法运行了,因此该模式下容易 出现主从不一致的问题。
例如:
    主库记录的某条sql语句引用了主库中的函数、触发器、存储过程等特殊功能 
    在从库上接收了该sql之后,可能就无法正确运行,从而主从库数据不一致的问题。
    
ps:row模式是基于每一行来记录变化的,所以不会出现类似的问题。 

# 应用场景
sql语句对mysql内置功能依赖比较少:不使用存储过程/触发器/函数,可以使用该模式,否则还是推 荐行级模式

====================================================================================
#查看binlog,看看有没有记录,二进制文件我们看不了,有专门的命令
[root@db01 data]# mysqlbinlog mysql-bin.000001

#注意:
  binlog 默认多大?120	(系统占用的一部分)
  binlog起始位置点是哪里?show master status
  binlog位置点是跟着大小走的

#binlog可以用来恢复数据
#修改数据
  mysql> begin;
  mysql> update binlog set id=200 where id=2;
  mysql> commit;
#发现自己修改错了
  mysql> select  from binlog;
#回滚,回滚不了,已经提交了
   mysql> rollback;
   mysql> select  from binlog;
#一怒之下删表
   mysql> drop table binlog;
#恢复数据
查看binlog到底应该恢复到哪个位置点,到处成SQL
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=549 /service/mysql/data/mysql-bin.000001  > /tmp/binlog.sql
导入SQL
[root@db01 data]# mysql -uroot -p123 < /tmp/binlog.sql

#优缺点:
1.易读
2.占用磁盘空间小
3.不严谨
3、行级模式

行级模式:binlog_format=row,(mysql5.7.6之后+8.0的默认级别)

# 行级模式介绍
记录每一行数据修改的细节,即哪一条记录被修改了,修改成什么样了

例如:执行语句(f1参照上例,此处略)
insert into t1(name) values(concat("egon",f1(1,2)));

如果使用row模式,那么日志中会记录插入了一条新记录,记录中的name字段值为'egon3' 
# 优点
相当于把上下文依赖都记录了下来,可以更方便查看每一条数据修改的细节,并且不会出现某些特定 情况下的存储过程或function以及trigger的调用和触发无法被正确复制的问题,即该模式下主从复 制强一致,数据最安全。

# 缺点
日志量大 例如 一条语句修改了100万行,语句模式下只需要记录一条语句即可 而行级模式却修改记录下100万行的修改记录,binlog日志的量可能会大得惊人。 
# 应用 
sql语句对mysql内置功能依赖比较多,希望数据最安全,复制强一致的场景推荐行级模式

#行级模式(MySQL5.7默认)ROW:
	主要是记录SQL语句,修改数据变化过程	
===================================================================================
#修改binlog为行级模式
[root@db01 data]# vim /etc/my.cnf
[mysqld]
binlog_format=row
[root@db01 data]# /etc/init.d/mysqld restart

#验证:
	#建表、插入数据、修改数据
	use test;
	create table binlog(id int);
	begin;
	insert into binlog values(1),(2),(3);
	update binlog set id=10 where id=1;
	commit;

#再次查看binlog
[root@db01 data]# mysqlbinlog mysql-bin.000002
#这个时候我们是看不懂他写的内容的,因为行模式就是这样子的,需要加上参数
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002
#优缺点:企业喜欢使用这个模式
	1.严谨,不容易丢失数据
	2.日志文件会越来越大,占用磁盘空间
	3.不易读
#修改错误数据
mysql> update test22 set id=100;
#修复数据前最好将表删除,否则会报已存在,或者把起始位置点修改成建表之后
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=518 /service/mysql/data/mysql-bin.000002  > /tmp/test22.sql
[root@db01 data]# mysql -uroot -p123 < /tmp/test22.sql
4、混合模式

混合模式:binlog_format=mixed,一般不用

语句模式和行级模式混合使用,一般不适用,只使用行级模式

# 混合模式介绍 
row level 与statement level的优点 
混合(mixed-based)模式默认采用语句模式记录日志,在一些特定的情况下会将记录模式切换为行 级模式记录,这些特殊情况包含但不限于以下情况。
•当函数中包含UUID()时。
•当表中有自增列(AUTO_INCREMENT)被更新时。
•当执行触发器(trigger)或者存储过程(stored function)等特殊功能时。
•当FOUND_ROWS()、ROW_COUNT()、USER()、CURRENT_USER()、CURRENT_USER等执行时。
# 应用场景 
看上去这种方式似乎比较美好,但是在生产环境中,为了保险起见,一般会使用row模式。

5、结合实例升级数据库

#1.提出方案升级数据库
#2.准备一台新机器,搭建mysql 5.6.48版本
#3.在旧数据库上备份所有数据(除了系统库)
	mysqldump -uroot -p123 -R --trigers -B world --master-data=2 > /tmp/123.sql
	--master-data=2 参数会在导出的数据加一行 位置点的记录
#4.将备份的数据传到新的数据库上
	scp  rsync  NFS  物理
#5.模拟旧的库有数据写入
	insert into test22 values(5),(6)
	update test22 set id=500 where id=3;
#6.将修改的数据导入数据库
	mysql -uroot -p123 < /tmp/123.sql
#7.将测试环境连接到新的数据库测试功能,业务
#8.测试没有问题切换生产环境数据库配置
#9.停止生产旧的数据库,使用binlog截取数据传输时新的数据
  通过sql里面的位置点截取binlog找到新增数据,导出sql语句
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000002
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=518 /service/mysql/data/mysql-bin.000002  > /tmp/test22.sql
#10.将新增数据导入新的数据库
#11.完成

四、二进制日志的管理操作

1、binlog日志相关概念

事件介绍
1)在binlog中最小的记录单元为event
2)一个事务会被拆分成多个事件(event)

# 1、事件(event)特性
1)每个event都有一个开始位置(start position)和结束位置(stop position)。
2)所谓的位置就是event对整个二进制的文件的相对位置。
3)对于一个二进制日志中,前120个position是文件格式信息预留空间。
4)MySQL第一个记录的事件,都是从120开始的。
# 2、位置position

2、二进制日志相关参数

# (1) server_id
服务ID,主从库必须不一样,建议数字为:ip+端口,5.7.3以后版本,必须指定
# (2) log-bin
此变量用于控制是否开启二进制日志,而且这是一个只读变量,默认值为OFF
示例: 
log-bin=/var/lib/mysql/mybinlog #绝对路径 
# log-bin=mybinlog #也可以用相对路径, 会在$datadir下产生mysqlbinlog-00000N 1234567
# (3) log_bin_index
不设置的话,会根据log_bin值名称自动生成mybinlog.index log_bin_index=var/lib/mysql/mybinlog.index
# (4) sql_log_bin
此变量用于标识当前会话中的操作是否会被记录于二进制日志,此变量值设置为ON #临时开启和关闭
# (5) binlog_format
此变量的值决定了二进制日志的记录方式,此变量的值可以设置为 statement、row、mixed,分别表示以语句的形式记录二进制日志,以数据修改的形式记录二进制日 志,以混合的方式记录二进制日志,安全保险起见,推荐使用row的方式记录。
# (6) max_binlog_size
设置单个二进制日志文件的最大大小
# (7) sync_binlog
在存储引擎章节中我们提过: innodb_flush_log_at_trx_commit控制redo日志的刷盘策略,建议值为1 sync_binlog控制binlog日志的刷盘策略,建议值为1
# (8) 其他参数
#打开才能查看详细记录,默认为off 
binlog_rows_query_log_events=on 

#表示自动删除10天以前的日志
expire_logs_days=10 
# full,minimal,noblob分别表示binlog中内容全记录,只记录被操作的,和不记录二进制 
binlog_row_image=full #(full,minimal,noblob),

3、查看binlog配置项

show variables like '%log_bin%';
show variables like '%binlog%'; 
show variables like '%binlog_format%';
show variables like '%server%'; 
show variables like 'expire_logs_days'; -- 过期日志天数
# 或者 
[root@db01 ~]# mysqladmin -uroot -pEgon@123 variables |grep -w log_bin

4、开启二进制日志

1.默认是关闭的 
2.配置开启binlog 
vim /etc/my.cnf 
[mysqld] 
server_id=1 
log-bin=/var/lib/mysql/mybinlog 
binlog_format='row' #(row,statement,mixed),不建议随意去修改binlog工作模式 
binlog_rows_query_log_events=on
max_binlog_size=100M

#5.7中必须配置server_id
[root@db01 data]# vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format=row
server_id=1

5、二进制日志的操作

1、查看日志日志名、状态、事件
# 查看日志日志名
show binary logs;  
show master logs;    
# 查看状态
show master status; 
# 查看细部的状态和事件
show binlog events in 'mybinlog.000002'; 
show binlog events in 'mybinlog.000002' limit 3;
2、查看日志内容
# 1、执行下述sql 
create database if not exists test; 
use test; 
create table user(name varchar(10));
begin; 
insert into user values("egon1"),("egon2"),("egon3"); 
update user set name="EGON" where name="egon1"; 
commit;
show master status; -- binlog的当前position 

查看binlog
# 看看有没有记录,二进制文件我们看不了,有专门的命令 
# show master status;
查看全部:
# mysqlbinlog mybinlog.000002
按时间:
# mysqlbinlog mybinlog.000002 --start-datetime="2022-11-05 10:02:56" 
# mysqlbinlog mybinlog.000002 --stop-datetime="2022-11-05 11:02:54
按字节数:
# mysqlbinlog mybinlog.000002 --start-position=337 
# mysqlbinlog mybinlog.000002 --stop-position=662 
# mysqlbinlog mybinlog.000002 --start-position=337 --stop-position=662 

如果是行级模式,想要看懂详细内容则需要加上额外参数,但是仅用于看懂内容,如果要用于还原数 据,还是应该去掉额外的参数并将内容定位到文件中 
# mysqlbinlog --base64-output=decode-rows -vvv mybinlog.000002 # 仅用于查看,不 能用于日后的数据恢复 
#mysqlbinlog mybinlog.000002 --start-position=100 > /tmp/1.sql # /tmp/1.sql 可用于日后的数据恢复

=================================================================================
[root@db01 mysql]# mysqlbinlog mysql-bin.000001 
mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'
# 如果直接用mysqlbinlog回复数据  =========失败  ================= utf8mb4注释就好
[root@db01 mysql]# vim /etc/my.cnf
[mysql]
# default-character-set=utf8mb4
[root@db01 mysql]# ystemctl restart mysqld

# 注: 字符问题
查看全部:
#   mysqlbinlog --no-defaults mysql-bin.000001
3、binlolg可以用来恢复数据
#修改数据 
begin;
update user set name="XXX" where name="egon2";
commit;
#发现自己修改错了 
select  from user; 
#回滚,回滚不了,已经提交了
rollback; select  from user; 
#一怒之下删表 
drop table user;
#恢复数据:查看binlog数据的起始点与要恢复到的位置点,导出成SQL 
mysqlbinlog mybinlog.000002 --stop-position=772 > /tmp/binlog.sql
mysql -uroot -pEgon@123 < /tmp/binlog.sql

6、 刷新与清除二进制日志

1、刷新binlog
#刷新binlog:关闭当前的二进制日志文件并创建一个新文件 
1)手动执行命令刷新
flush logs;
或者
mysqladmin -uroot -p flush-logs;
或者
mysql -uroot -pEgon@123 -e 'flush logs'

2)重启数据库时会刷新
3)二进制日志上限(max_binlog_size);当binlog达到1G,自动刷新
2、删除binlog
#删除二进制日志原则
在存储能力范围内,能多保留则多保留
基于上一次全备前的可以选择删除

# 1) 删除所有binlog,相当于重置
reset master; 
# 2) 删除指定binlog名之前的所有binlog(保留指定的binlog) 
purge binary logs to 'mybinlog.00003';-- mybinlog.00003之前的都删除掉
# 3)删除日期之前的日志:手动执行
PURGE MASTER | BINARY LOGS BEFORE 'date' --用于删除日期之前的日志,BEFORE变量的 
date自变量可以为'YYYY-MM-DD hh:mm:ss'格式
如:(MASTER 和BINARY 在这里都是等效的)
PURGE MASTER LOGS TO 'mybinlog.00003'; 
purge binary logs before '2021-07-13 19:11:00'; 
还可以做减法:如只保留3天的 
PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day; 
# 4)删除日期之前的日志:修改配置参数,让mysql自动执行
删除7天前的binlog 
#临时生效 
SET GLOBAL expire_logs_days = 7; 
#永久生效 
[root@db01 data]# vim /etc/my.cnf
[mysqld] 
expire_logs_days = 7

ansible做主从的时候有的人因为名字和位置点不好获取,他每次都会reset,如果先同步了所有数据那没问题,如果没同步问题就大了;

五、实战演练使用binlog恢复数据

1.对数据库一顿操作

#查看binlog信息
mysql> show master status;
#创建一个binlog库
mysql> create database binlog;
#使用binlog库
mysql> use binlog
#创建binglog_table表
mysql> create table binlog_table(id int);
#查看binlog信息
mysql> show master status;
#插入数据1
mysql> insert into binlog_table values(1);
#查看binlog信息
mysql> show master status;
#提交
mysql> commit;
#查看binlog信息
mysql> show master status;
#插入数据2
mysql> insert into binlog_table values(2);
#插入数据3
mysql> insert into binlog_table values(3);
#查看binlog信息
mysql> show master status;
#提交
mysql> commit;
#删除数据1
mysql> delete from binlog_table where id=1;
#查看binlog信息
mysql> show master status;
#提交
mysql> commit;
#更改数据2为22
mysql> update binlog_table set id=22 where id=2;
#查看binlog
mysql> show master status;
#提交
mysql> commit;
#查看binlog信息
mysql> show master status;
#查看数据
mysql> select  from binlog_table;
#删表
mysql> drop table binlog_table;
#删库
mysql> drop database binlog;

2.恢复数据

#查看binlog事件
mysql> show binlog events in 'mysql-bin.000013';
#使用mysqlbinlog来查看
[root@db01 data]# mysqlbinlog /application/mysql/data/mysql-bin.000013
[root@db01 data]# mysqlbinlog /application/mysql/data/mysql-bin.000013|grep -v SET
[root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000013
### UPDATE `binlog`.`binlog_table`
### WHERE
###   @1=2 / INT meta=0 nullable=1 is_null=0 /
### SET
###   @1=22 / INT meta=0 nullable=1 is_null=0 /
#分析
update binlog.binlog_table
set
@1=22 --------->@1表示binlog_table中的第一列,集合表结构就是id=22
where
@1=2  --------->@1表示binlog_table中的第一列,集合表结构就是id=2
#结果
update binlog.binlog_table set id=22 where id=2;
#截取二进制日志
查看二进制日志后,发现delete语句开始位置是858
[root@db01 data]# mysqlbinlog --start-position=120 --stop-position=858 /application/mysql/data/mysql-bin.000013
#临时关闭binlog
mysql> set sql_log_bin=0;
#执行sql文件
mysql> source /tmp/binlog.sql
#查看删除的库
mysql> show databases;
#进binlog库
mysql> use binlog
#查看删除的表
mysql> show tables;
#查看表中内容
mysql> select  from binlog_table;

3、问题:

数据库或表被误删除的是很久之前创建的(一年前,生成了上百个binlog)
如果基于binlog全量恢复,成本很高
1)可以用备份恢复+短时间内二进制日志,恢复到故障之前
2)非官方方法,binlog2sql,binlog取反,类似于Oracle的flushback
3)延时从库 如果同一时间内和故障库无关的数据库都有操作,在截取binlog时都会被截取到

#都是废话,数据库出了有binlog可以恢复数据以外,还有全备,每天或者每周全被一次,全备之后,那个位置点之前的binlog全都可以删除,不可能一年有上百个binlog

生产中很多库,只有一个库的表被删除,我不可能把所有的库都导出来筛选,想一个办法过滤出来?

1、grep?
其他过滤方案?
2、-d 参数接库名
mysqlbinlog -d database --base64-output=decode-rows -vvv mysql-bin.000002
--base64-output  显示模式
-vvv			显示详细信息

六、慢查询日志

1、慢日志作用

1)是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件(不论是什么语句,增删改查)
2)通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的

2.配置慢日志

#默认慢日志是不开启的
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
#指定是否开启慢查询日志
slow_query_log = 1
#指定慢日志文件存放位置(默认在data)
slow_query_log_file=/var/log/slow.log
#设定慢查询的阀值(默认10s)
long_query_time=0.05
#不使用索引的慢查询日志是否记录到日志
log_queries_not_using_indexes
#查询检查返回少于该参数指定行的SQL不被记录到慢查询日志,少于100行的sql语句查询慢的话不记录,一般不使用
min_examined_row_limit=100(鸡肋)
执行下述命令
touch /var/log/slow.log
chmod 640 /var/log/slow.log
chown mysql.mysql /var/log/slow.log 
systemctl restart mysqld

3.测试慢日志

# 测试方式一
测试:BENCHMARK(count,expr) 
SELECT BENCHMARK(50000000,23); 
#执行卡死,查看执行的sql执行时间,如果停不下来 可以 kill id
show processlist;
kill 3;
# 测试方式二
insert city_new select  from city;
insert city_new select  from city_new;
insert city_new select  from city_new;
insert city_new select  from city_new;
... ...

# 查看方式一
查看慢日志可以使用
cat /service/mysql/data/slow.log
#看起来太费劲,我们使用以下命令
# 查看方式二
mysqldumpslow -s r -t 10 /service/mysql/data/slow.log
得到按照时间排序的前10条里面含有左连接的查询语句
	参数说明:
	-s:
	是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
	-t:
	是top n的意思,即为返回前面多少条的数据;
	-g:
	后边可以写一个正则匹配模式,大小写不敏感的;
# 查看方式三
# 第三方工具查看慢日志
yum provides pt-query-digest

# 查看慢查询日志中
mysql> select * from t1;  #全局扫描会记录慢查询日志
+----+------+
| id | name |
+----+------+
|  1 | mm   |
|  2 | kk   |
|  3 | mdm  |
|  4 | fg   |
+----+------+
4 rows in set (0.00 sec)

mysql> select * from t1 where id=4; #不会记录慢查询日志
+----+------+
| id | name |
+----+------+
|  4 | fg   |
+----+------+

4、慢查询日志优化

如何定位运行速度慢的sql:# 开启慢查询

如何分析sql:# explain工具
如何优化sql:
   1、逻辑(能链表就不要子查询)====》rows是否变低
   2、对查询范围大的sql建议:分段取、缓存
   3、建立索引
     尽量给占用空间小,标签重复度低
     不要让索引字段参与运算
     尽量减少范围(能分段取就不要一下全取)
     能覆盖索引就不要回表(尽量主键字段作为查询条件)
     多条sql语句用的是and连接的多个条件,而条件中都出现某一个字段,可以创建联合索引

linux12-mysql数据库-->14mha高可用

文章目录MHA高可用简介一、MHA工作原理(详解):二、MHA架构三、MHA工具介绍1.manager相关工具2.node相关工具四、MHA优点总结五、基于GTID的主从复制1.什么是GTID2.GTID优缺点3.GTID主从复制1)准备三台MySQL机器(一主两从)2)所有机器统... 查看详情

linux12-mysql数据库-->18数据库的优化

文章目录数据库优化一、数据库硬件优化(选型)1.一般数据库选择2.数据库类型3.硬件选型1)CPU选型2)内存选择3)磁盘选择4)存储选择(一般大型企业)5)网络选择4.操作系统优化1)Swap调整2)IO调度策略5.应用端优化二、创... 查看详情

linux12-mysql数据库-->17数据库面试(代码片段)

文章目录数据库面试1、基础2、扩展3、重点4、重中之重5、索引6、事务7、锁数据库面试1、基础1、关系型和非关系型#关系型: mysql、oracle、db2、sqlservermariadb#1、数据之间彼此有关系或者约束#2、存储数据的编写形式通常是以... 查看详情

linux12-mysql数据库-->14.2mha高可用

文章目录MHA高可用一、MHA背景介绍二、MHA简介三、MHA工作原理3.1MHA的组成3.2MHA自动故障切换的步骤3.3.manager相关工具3.4node相关工具四、MHA的优点总结五、GTID主从复制5.1什么是GTID5.2GTID主从的原理(1)一个GTID的生命周期(2)架构... 查看详情

linux12-mysql数据库-->17数据库的备份策略

文章目录1.运维在数据库备份恢复方面的职责1.1设计备份策略1.2日常备份检查1.3定期恢复演练(测试库)1.4故障恢复1.5迁移2.备份类型2.1热备2.2温备2.3冷备3.备份方式及工具介绍3.1逻辑备份工具3.2物理备份工具4.逻辑备份和物理备份... 查看详情

linux12-mysql数据库-->11事务和锁机制(代码片段)

文章目录一、innodb核心特性事务1、什么是事务2、如何使用事务3、事务演示4、事务通俗理解5、一个成功事务的生命周期6、一个失败事务的生命周期7、事务的特性ACID8、事务的控制语句1)自动提交2)事务的隐式提交3ÿ... 查看详情

linux12-mysql数据库-->13.1数据的快速导出和导入(代码片段)

...设置安全目录为/tmp,并重启3、快速导出4、导入四、数据库迁移1、为何要迁移数据库2、MySQL迁移数据库的方案通常有三种方案1、数据库直接导出,拷贝文件到新服务器,在新服务器上导入。2、使用第三方迁移工具。... 查看详情

12mysql数据库配置

MySQL系统数据库MySQL系统数据库主要包括以下几个:mysql数据库:用于存储MySQL的权限信息和系统变量等,包括user表、db表、host表等,这些表是管理MySQL权限的重要基础。information_schema数据库:用于存储关于MySQL数据库对象的元数... 查看详情

2022-09-12mysql语法分析实现

...,进行语法解析。完成语法解析后,会将解析结果生成的数据结构保存在structLEX中,该结构体在sql/sql_lex.h文件中定义。structLEX:publicQuery_tables_lis 查看详情

在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)

】在数据库视图中应用动态where条件(oracle-12c,mysql5+)【英文标题】:Applydynamicwhereconditioninthedatabaseview(oracle-12c,mysql5+)【发布时间】:2020-05-1211:16:59【问题描述】:我可以使用动态“WHERE”子句创建视图吗?这个where子句将根据... 查看详情

linux系统日志分为哪几种类型?

参考技术A  在Linux系统中,拥有非常灵活和强大的日志功能,它几乎可以保存所有的操作记录,还可以检索出我们需要的信息;不仅如此,Linux系统日志还可以帮助我们解决各种各样的问题。那么Linux系统日志分为哪几种类型? ... 查看详情

linux日志管理(代码片段)

日志管理日志管理日志进程rsyslogd常见的日志文件配置rsyslogd主配置文件RULESFACILITY&LEVELfacility设备level级别日志轮转logrotate按照配置进行轮转日志管理日志进程rsyslogdrsyslogd:系统专职日志程序,处理大部分日志记录,系... 查看详情

linux日志管理(代码片段)

日志管理日志管理日志进程rsyslogd常见的日志文件配置rsyslogd主配置文件RULESFACILITY&LEVELfacility设备level级别日志轮转logrotate按照配置进行轮转日志管理日志进程rsyslogdrsyslogd:系统专职日志程序,处理大部分日志记录,系... 查看详情

(4.12)mysql备份还原——mysql逻辑备份之mysqldump(代码片段)

...介绍,mysqldump1、mysql逻辑备份介绍  【1.1】备份内容:数据库的结构定义语句+数据内容的插入语句,备份出来的文件可以编辑  【1.2】使用场景:数据量较少的库,比较适合100G数据量以内的  逻辑备份的特点    (1... 查看详情

linux学习第十周总结(代码片段)

linux学习第十周总结接着上周的mysql,重点终结日志管理,备份还原,主从复制和mysql集群一、mysql日志管理事务日志transactionlog错误日志errorlog通用日志generallog慢查询日志slowquerylog二进制日志binarylog中继日志releylog1.事务日志事务... 查看详情

27-linux日志管理

linux日志管理官网:​​https://www.rsyslog.com/​​rsyslog特性多线程UDP,TCP,SSL,TLS,RELPMySQL,PGSQL,Oracle实现日志存储强大的过滤器,可实现过滤记录日志信息中任意部分自定义输出格式适用于企业级中继链多线程UDP,TCP,SSL,TLS,RELPMySQL,PGSQL,Or... 查看详情

linux系统的日志管理(代码片段)

Linux系统的日志管理一、systemd-journald服务1.systemd-journald介绍2.系统日志默认保存路径3.systemd-journald的配置文件修改①配置文件目录②配置文件修改4.检索日志消息①journalctl命令的相关选项②示例二、rsyslog服务1.日志保存相关路径2... 查看详情

linux实操篇——日志管理(代码片段)

目录1.日志介绍2.日志管理服务 rsyslogd3.配置文件/etc/rsyslog.conf4.查看日志文件中的日志5.自定义日志6.日志轮替什么是日志轮替日志轮替配置文件配置文件中各代码段参数含义为自己的日志单独指定轮替规则日志轮替机制查看内存... 查看详情