mysql数据库面试常问的几个问题(面试官:如果 MySQL 数据库中的

生活常识 2023-05-15 14:02生活常识www.xinxueguanw.cn

数据库中的数据被删除后还能恢复吗面试官如果MySQL数据库中的数据丢失了,有什么补救措施?

以前去企业面试,经常被问到一些关于MySQL数据库的问题,最典型的就是MySQL数据库的数据安全问题。

比如如何保证MySQL数据库的数据安全?MySQL数据库可能的数据丢失在哪里?如何拯救MySQL数据库免于数据丢失?

问这些问题的主要目的是测试求职者的生产经验;但就我的面试过程来看,能完整回答的求职者寥寥无几。

这种情况主要是因为大多数求职者不 对MySQL数据库底层数据存储的运行机制了解不够清楚,所以针对以上问题,今天我们就和大家详细探讨一下MySQL数据库底层数据存储的运行机制。

MySQL 数据库在什么情况下可能会发生数据丢失

在介绍MySQL数据库可能丢失数据的情况之前,让 回顾一下将数据写入MySQL数据库的模块,如下所示。

之一个模块将修改后的数据逻辑保存在修改缓冲区中。第二个模块将修改后的数据保存在binlog缓存中。第三模块将修改后的数据保存在重做日志中。在这三个模块中,用change buffer保存修改数据的逻辑,修改后通过merge写入磁盘。

在这个模块中有可能丢失数据吗?其实很小,主要是MySQL数据库中加入了模块重做日志来防止数据丢失,其主要作用是防止数据丢失。所以,让我们 让我们谈谈重做日志是如何保存数据的。

重做日志主要分为两部分,即重做日志和重做日志缓冲区。重做日志和重做日志缓冲区的功能之前已经提过很多次了,所以我赢了 这里不再赘述。下面我们主要介绍重做日志是如何保存数据的。

在将一条数据写入数据库之前,为了防止数据丢失,会先将其保存在重做日志缓冲区中,然后再保存在重做日志中,用于数据库宕机时的数据恢复。

那么这个时候我们就要问了,重做日志有没有可能在这个过程中丢失数据呢?

It 这是可能的。如果一个事务在执行过程中突然在MySQL数据库中宕机,此时重做日志缓冲区中的所有数据都会丢失,但一般这种情况只会在事务未提交时发生,所有数据丢失影响不大。

此时,相信你会问,如果MySQL数据库恰好在事务提交的时候宕机,会不会丢失数据?

显然,这也是可能的。让 s根据MySQL数据库中重做日志缓冲区存储的数据,分析数据丢失的可能性。

在MySQL数据库中,重做日志缓冲区有三种保存数据的状态,即

重做日志缓冲区将数据保存在MySQL数据库的内存中,这是InnoDB存储引擎的缓冲池。这其实和上面的情况是一致的,保存了未提交的数据。此时如果MySQL宕机,丢失未提交的事务信息,对MySQL数据库整体没有太大影响。重做日志缓冲区将数据保存在页面缓存中,即磁盘缓存中。此时,MySQL中的事务已经提交。假设此时运行MySQL数据库的服务器恰好宕机,显然提交的事务数据会丢失。在这种情况下,数据丢失无法恢复。重做日志缓冲区将数据保存在磁盘中。这种情况下,只有磁盘没有异常,才不会发生数据丢失。注意系统盘也是缓存的,通常叫做page cacge。

MySQL为重做日志缓冲区保存数据的三种状态提供了一个名为innodb_flush_log_at_trx_commit的参数。该参数有三个值,主要作用是告诉MySQL重做日志缓冲区的数据保存位置,如下

当该参数的值设置为0时,重做日志缓冲区将保存缓冲池中的所有数据;即全部存储在内存中,此时性能更佳。,一旦数据库重新启动,重做日志缓冲区中的所有数据都将丢失。当该参数的值设置为1时,重做日志缓冲区会将所有数据直接保存在磁盘中。这个时候数据是最安全的,性能是最差的。当该参数的值设置为2时,重做日志缓冲区将保存页面缓存中的所有数据;也就是说,所有的数据都会存储在磁盘缓存中,此时的性能和设置为0时几乎一样,但如果此时部署MySQL数据库的服务器宕机,数据会立即丢失。注意在实际应用中,并不是只有事务提交时,数据才会保存到磁盘。还有两种情况。

之一种情况如果有多个并行事务,所有已经保存在重做日志缓冲区中的数据都将被持久化。第二种情况如果重做日志缓冲区占用了InnoDB存储引擎。

的 buffer pool 内存空间的一半,MySQL 也会将数据持久化。

上面我们介绍了 redo log 可能会发生数据丢失的场景,下面我们再来了解一下 binlog 中可能发生数据丢失的情况。

相对于 redo log 来说,binlog 写数据相对简单。

需要说明的是,binlog 每一次写入都是将整个事务写入 binlog 文件中,这主要是因为 MySQL 数据库中的事务具有原子性,所以在一个事务未执行完成之前,MySQL 数据库是将其写入 binlog cache 之中。

其中 binlog cache 是 MySQL 中的一块内存空间,那么此时就带来了一个新的问题,就是如果 binlog cache 的空间不足以承载某一个事务所包含的所有数据时,MySQL 会将该事务中所有的数据全部暂存到磁盘中(此时就会不得已而产生磁盘IO,随即就会导致一定的性能问题)。

为了解决这个问题,MySQL 数据库为我们提供了一个 binlog_cache_size 参数,这个参数主要是用来设置 binlog cache 的空间大小的。如果当 binlog cache 中的数据大小超过了 binlog_cache_size 设置的大小时,MySQL 会将该事务中所有的数据全部暂存到磁盘中。

与 redo log 相同的是,binlog cache 也有保存数据的三种状态,并且 MySQL 提供了 sync_binlog 这个参数来控制这种状态。这三种状态分别是

当该值等于 0 时,每次事务提交之后,保存在 page cache;当该值等于 1 时,每次事务提交之后,保存到磁盘之中;当该值等于 N(N gt 1) 时,每次事务提交之后,都会保存在 page cache 之中,并且累计 N 次之后写入磁盘。

于是,我们不难看出,当 N 越大时,相关的性能就会越好;相反,如果在数据提交期间发生了数据库宕机,随即带来的后果就是会丢失保存在 binlog cache 中的数据。

今天,我们主要介绍了在 MySQL 数据库运行过程中可能会发生数据丢失的几种情况。

是 redo log,在 redo log 中最可能丢失数据的情况就是当 redo log buffer 中的数据保存在 MySQL 内存之中,也就是当 innodb_flush_log_at_trx_commit 设置成 0 时;所以,为了安全和性能两个方面考虑,建议将其设置成 2, 一般 MySQL 重启,而部署 MySQL 的服务器不会重启。

是 binlog,与 redo log相同的是 binlog 也有三种保存数据的状态,同样为了安全和性能两个方面考虑,我建议你将 sync_binlog 设置成 N。

在日常的生产环境之中,一般会将 sync_binlog 设置为100 ~ 1000 之间,具体要看服务器性能,如果服务器的内存有空余,可以将其按需调大。

作者Mche链接https://juejin.cn/post/7188423924894400569来源稀土掘金

面试官谈谈postgresql 与mysql 的区别 mysql数据库在面试中的作用

Copyright@2015-2025 www.xinxueguanw.cn 心血管健康网版板所有