当前位置: 主页 > 天剑狂刀BT页游 >

数据库精选 60 道面试题(4)

时间:2022-03-13 18:56来源:8N.org.Cn 作者:天剑狂刀私服 点击:

做好备份。备份的话又分为两个点 (1)如果数据量比较大,用物理备份 xtrabackup。定期对数据库进行全量备份,也可以做增量备份。(2)如果数据量较少,用 mysqldump 或者 mysqldumper。再利用 binlog 来恢复或者搭建主从的方式来恢复数据。定期备份binlog 文件也是很有必要的

如果发生了数据删除的操作,又可以从以下几个点来恢复:

DML 误操作语句造成数据不完整或者丢失。可以通过 flashback,美团的 myflash,也是一个不错的工具,本质都差不多

都是先解析 binlog event,然后在进行反转。把 delete 反转为insert,insert 反转为 delete,update前后 image 对调。

所以必须设置binlog_format=row 和 binlog_row_image=full,切记恢复数据的时候,应该先恢复到临时的实例,然后在恢复回主库上。

DDL语句误操作(truncate和drop),由于DDL语句不管 binlog_format 是 row 还是 statement ,在 binlog 里都只记录语句,不记录 image 所以恢复起来相对要麻烦得多。

只能通过全量备份+应用 binlog 的方式来恢复数据。一旦数据量比较大,那么恢复时间就特别长

rm 删除:使用备份跨机房,或者最好是跨城市保存。

29、drop、truncate 和 delete 的区别

DELETE 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。

TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

drop语句将表所占用的空间全释放掉。

在速度上,一般来说,drop> truncate > delete。

如果想删除部分数据用 delete,注意带上 where 子句,回滚段要足够大;

如果想删除表,当然用 drop;如果想保留表而将所有数据删除,如果和事务无关,用 truncate 即可;

如果和事务有关,或者想触发 trigger,还是用 delete;如果是整理表内部的碎片,可以用 truncate 跟上 reuse stroage,再重新导入/插入数据。

30、在 MySQL 中有两个 kill 命令

一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句

一个是 kill connection + 线程 id,这里 connection 可缺省,表示断开这个线程的连接

kill 不掉的原因

kill命令被堵了,还没到位

kill命令到位了,但是没被立刻触发

kill命令被触发了,但执行完也需要时间

31、如何理解 MySQL 的边读边发

如果客户端接受慢,会导致 MySQL 服务端由于结果发不出去,这个事务的执行时间会很长。

服务端并不需要保存一个完整的结果集,取数据和发数据的流程都是通过一个 next_buffer 来操作的。

内存的数据页都是在 Buffer_Pool中操作的。

InnoDB 管理 Buffer_Pool 使用的是改进的 LRU 算法,使用链表实现,实现上,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。

32、MySQL 的大表查询为什么不会爆内存?

由于 MySQL 是边读变发,因此对于数据量很大的查询结果来说,不会再 server 端保存完整的结果集,所以,如果客户端读结果不及时,会堵住 MySQL 的查询过程,但是不会把内存打爆。

InnoDB 引擎内部,由于有淘汰策略,InnoDB 管理 Buffer_Pool 使用的是改进的 LRU 算法,使用链表实现,实现上,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。对冷数据的全扫描,影响也能做到可控制。

33、MySQL 临时表的用法和特性

只对当前session可见。

可以与普通表重名。

增删改查用的是临时表。

show tables 不显示普通表。

在实际应用中,临时表一般用于处理比较复杂的计算逻辑。

由于临时表是每个线程自己可见的,所以不需要考虑多个线程执行同一个处理时临时表的重名问题,在线程退出的时候,临时表会自动删除。

34、MySQL 存储引擎介绍(InnoDB、MyISAM、MEMORY)

InnoDB 是事务型数据库的首选引擎,支持事务安全表 (ACID),支持行锁定和外键。MySQL5.5.5 之后,InnoDB 作为默认存储引擎

MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在 Web、数据存储和其他应用环境下最常用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认存储引擎

MEMORY 存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。

35、都说 InnoDB 好,那还要不要使用 MEMORY 引擎?

内存表就是使用 memory 引擎创建的表

为什么我不建议你在生产环境上使用内存表。这里的原因主要包括两个方面:锁粒度问题;数据持久化问题。

由于重启会丢数据,如果一个备库重启,会导致主备同步线程停止;如果主库跟这个备库是双 M 架构,还可能导致主库的内存表数据被删掉。

36、如果数据库误操作, 如何执行数据恢复?

数据库在某个时候误操作,就可以找到距离误操作最近的时间节点的bin log,重放到临时数据库里,然后选择误删的数据节点,恢复到线上数据库。

主从备份相关37、MySQL 是如何保证主备同步?

主备关系的建立:

一开始创建主备关系的时候,是由备库指定的,比如基于位点的主备关系,备库说“我要从binlog文件A的位置P”开始同步,主库就从这个指定的位置开始往后发。

而主备关系搭建之后,是主库决定要发给数据给备库的,所以主库有新的日志也会发给备库。

MySQL 主备切换流程:

客户端读写都是直接访问A,而节点B是备库,只要将A的更新都同步过来,到本地执行就可以保证数据是相同的。

当需要切换的时候就把节点换一下,A的节点B的备库

一个事务完整的同步过程:

备库B和主库A建立来了长链接,主库A内部专门线程用于维护了这个长链接。

在备库B上通过changemaster命令设置主库A的IP端口用户名密码以及从哪个位置开始请求binlog包括文件名和日志偏移量

在备库B上执行start-slave命令备库会启动两个线程:io_thread和sql_thread分别负责建立连接和读取中转日志进行解析执行

备库读取主库传过来的binlog文件备库收到文件写到本地成为中转日志

后来由于多线程复制方案的引入,sql_thread演化成了多个线程。

38、什么是主备延迟

主库和备库在执行同一个事务的时候出现时间差的问题,主要原因有:

有些部署条件下,备库所在机器的性能要比主库性能差。

备库的压力较大。

大事务,一个主库上语句执行10分钟,那么这个事务可能会导致从库延迟10分钟。

39、为什么要有多线程复制策略?

因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库可能是一直追不上主库的,带来的现象就是备库上seconds_behind_master值越来越大。

在实际应用中,建议使用可靠性优先策略,减少主备延迟,提升系统可用性,尽量减少大事务操作,把大事务拆分小事务。

40、MySQL 的并行策略有哪些?

------分隔线----------------------------