【总结】日常遇到的一些问题相关知识

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: RAID卡:   bbu  force wb 内核: 1. io调度  deadline   noop 2. vm 管理 vm.swappiness = 0 文件系统  mount  nobarrier data=ordered writeback 1.
RAID卡:  
bbu  force wb

内核:
1. io调度  deadline   noop
2. vm 管理 vm.swappiness = 0

文件系统  mount  nobarrier data=ordered writeback
1. 加大队列  nr_requests
2. 关闭numa

CPU:
innodb_read_io_threads =  cpu核心数/2
innodb_write_io_threads = cpu核心数/2
read + write  = cpu核心数
可以根据读写比例调整上述值

磁盘:
innodb_io_capacity = 硬盘的iops

脏页刷新:
当超过innodb_max_dirty_pages_pct的设定值 , 会将innodb_buffer_pool刷新到磁盘
重做日志ib_logfile写满后
机器空闲的时候
当写操作很频繁的时候,重做日志ib_logfile切换次数就会很频繁,只要有一个写满了,就会将脏页大量的刷入磁盘,这会对系统系统有整体的影响。为了避免过大的磁盘io , innodb_adaptive_flushing会自适应刷新。参数默认开启。


innodb_buffer_pool:
1. innodb_buffer_poll有2个区域,sublist of new blocks(热数据) sublist of old blocks(不经常访问的数据)
用户访问数据,如果缓冲区中有相应的数据,则返回,如果没有,从磁盘空间读入sublist of old blocks区域,然后再移动到2. sublist of new blocks 区域,然后在根据LRU算法将最近最少使用的数据移除旧数据页
3. 但是这其中也有一些问题,假如有些语句做统计用全表扫描,或者做一次mysqldump,这时就会进入sublist of new blocks区域,把一些真正的热数据提走,这样会造成缓冲区的进进出出,导致磁盘io繁忙
4. innodb_old_block_pec参数可以控制进入缓冲区sublist of old blocks的数量,默认37,占整个缓冲区的3/8。当全表扫描一个大表或者做mysqldump可以将innodb_old_block_pec设置的小些使数据块少量的进入缓冲区,从而让更多的热数据不被踢出。


Old database pages 23600  在旧区域存放多少页
pages made young 411111, not young 2987612 移动到新区域多少页  /   没有移动的有多少页
1274 youngs/s  16521 non-youngs/s   
如果你没有全表扫描,发现youngs/s值很小,那么就该增大innodb_old_blocks_pec或者减少innodb_old_blocks_time 。如果进行了全表扫描,发现non-youngs/s的值很小,那么就应该增大innodb_old_blocks_time

innodb数据恢复时间:
依赖于 buffer poll ,脏页面比例,tps等因素


innodb_buffer_pool_instances = 10  innodb_buffer_poll实例的个数
最多支持64 。 innodb_buffer_pool_size  必须大于1G

innodb_buffer_pool_dump_at_shutdown = 1
关闭mysql时,把热数据dump到本地硬盘

innodb_buffer_pool_dump_now = 1
采用手工方式把数据dump到磁盘

innodb_buffer_pool_load_at_startup = 1
在启动时把热数据load到内存

innodb_buffer_pool_load_now = 1
采用手工方式把热数据load到内存


慢日志:

当数据库连接数很高时,此时需要注意,可以通过cacti监控软件观察时间点,然后把这一段时间点的慢日志截取出来
sed -n '/#Time:110720 16:17:20/,/end/p' mysql.slow > slow.log
然后用mysqldumpslow 命令取出最耗时的最长的10条慢sql进行分析
mysqldumpslow -s t -t 10 slow.log


主从同步 :
slave_exec_mode参数可自动处理同步复制错误
set global slave_exec_mode='IDEMPOTENT'
默认值是 STRICT 严格模式
设置完毕后,当出现1023(记录没有找到) , 1026(主键复制)时,会自动跳过错误,并且记录到错误日志中。

如果从库某几张表的数据和主库不一致,解决方法:
1. 停止slave
2. 在主库上导出这几张表,并记录下同步的binlog时间点和pos点
mysqldump -uroot -pxxx -q --single-transation --master-data=2 yourdb table1 table2 > xxxx.sql
3. 导入sql文件到从库。找出备份的sql文件中的binlog和pos点
4. change master
直到sql_thread线程为NO,这期间同步报错可以一律跳过
stop slave ; set global sql_slave_skip_counter=1 ; start slave;

如何干净的清除slave的同步信息
stop slave ; reset slave 不行。 要使用 reset slave all;

主从切换:
事件调度器在主从切换出现的问题:
set global event_scheduler = 1;

在主从架构中 event只能在主上触发,在slave上不能被触发,如果再slave上触发了,同步就会坏掉。
show event 
status :slaveside_disabled
需要执行 alter event 'insert' enable


人工误删除innodb ibdata 数据文件,如何恢复:
先找到mysqld进程的pid   netstat -nlp | grep mysqld   这里是30246
执行 ll /proc/30426/fd | grep 'ib_|ibdata'
关闭前端业务 ,执行 flush tables with read lock
set global innodb_max_dirty_pages_pct=0; 让脏页尽快刷新到磁盘 
show engine innodb status\G;查看innodb状态信息,确保脏页已经刷新到磁盘 。
复制文件到mysql的数据目录 。重启mysql


where 从句中的in 子查询 :
select * from tables1 where filed in (select filed from table2 where cacheld='xxxx')
工作原理:mysql先要为内层的查询语句查询结果建立一个临时表,然后外层查询语句才能在临时表中查询记录,查询完成后,还需要撤销这些临时表。


sql优化案例分析 :
1. not in 子查询优化
在生产环境中 ,尽量避免子查询,可以用表连接取代。 (select update delete )

2. 模糊匹配 like '%xxx%'优化
不要使用select *  , select * 无法覆盖索引。
select 字段必须存在索引。

3. limit 分页优化
select xx,xx,xx from logdb order by id limit 9999,10;
select xx,xx,xx from logdb where id >=10000 order by id limit 10 

4. count(*) 统计如何加快速度
count(*)如果数据量大一般都是比较慢的
select count(*) from L_user;
走聚集索引,innodb聚集索引就是数据,需要全表扫描统计。
select count(*) from L_user where Sid >=0;
如果加条件,走where后的Sid辅助索引,辅助索引不存放数据,而是由一个指针指向对应的数据块。统计时消耗的资源少,速度也更快。
虽然上述方法加快了速度,类似统计的sql语句 select count(*) select sum() 。这不建议在主库执行,会导致锁表。不走索引,表锁。

5. or 条件优化
select * from USER where name='bob' or age='30';
这条语句是不会走索引的。全表扫描。
select * from USER where name='bob' union all select * from USER where age='30'






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

6. 不必要的排序
select count(1) as rs_count from 
(
select a.id,a.title,a.content,b.log_time,b.name
from a b
where a.content like 'rc_%' and a.id=b.id
order by a.title desc
)
as rs_table;


select count(1) as rs_count from
(
select a.id from a join b
on a.id = b.id and a.content like 'rc_%'
)
as rs_table


7. 不必要的嵌套 select 子查询
select count(1) as rs_count from 
(
select a.id,a.title,a.content,b.log_time,b.name
from a b
where a.content like 'rc_%' and a.id=b.id
order by a.title desc
)
as rs_table;


select a.id,a.title,a.content,b.log_time,b.name
from a join b
on a.id = b.id and a.content like 'rc_%'
order by a.title

#########################################################################################################
10.用where代替having
这个简单,就不举例子了
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1701 14
|
5月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(2)
MySQL8 中文参考(二十四)
81 1
|
7月前
|
存储 关系型数据库 MySQL
XtraBackup支持哪些MySQL数据库版本?
【5月更文挑战第13天】XtraBackup支持哪些MySQL数据库版本?
721 0
|
7月前
|
运维 监控 NoSQL
RedisShake的基本原理
RedisShake的基本原理
436 0
|
SQL 算法 关系型数据库
MySQL参数优化之join_buffer_size
MySQL参数优化之join_buffer_size
525 0
MySQL参数优化之join_buffer_size
|
存储 NoSQL Redis
Redis系列(一):深入了解Redis数据类型和底层数据结构
Redis系列(一):深入了解Redis数据类型和底层数据结构
Redis系列(一):深入了解Redis数据类型和底层数据结构
|
SQL 监控 关系型数据库
MySQL主从复制详解
在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。
1296 0
MySQL主从复制详解
|
SQL NoSQL MongoDB
MongoDB数据库入门
MongoDB数据库入门实验。
MongoDB数据库入门
|
SQL 网络安全 PHP
渗透测试-SQL注入之堆叠注入-攻防世界supersqli实战
渗透测试-SQL注入之堆叠注入-攻防世界supersqli实战
渗透测试-SQL注入之堆叠注入-攻防世界supersqli实战