曾经我以为会了增删改查,会了 DML,DDL 就是会了 MySQL。直到现在我才知道,只会 select、update、insert、delete 只是学 MySQL 的一个开始。
只会这些你在面试中根本都拿不出手!今天我们一起来看看,下面这些 MySQL 面试题,你会多少?
1、MySQL 中全局锁 FTWRL 的作用和副作用是什么?
MySQL 的全局锁加锁命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令。但是这个命令会造成以下语句会被阻塞(副作用):数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
2、MySQL 的 InnoDB 中获得一个一致性视图的方法有多少种?分别是什么?
有多种方法。第一种是加全局锁;Flush tables with read lock (FTWRL)。第二种是在可重复读隔离级别下开启一个事务。第三种就是官方自带的逻辑备份工具是 mysqldump;当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。第四种是使用 set global readonly=true 的方式。
3、FTWRL 和 lock tables … read/write 的相同点是什么?
lock tables … read/write 与 FTWRL 类似,可以用 unlock tables 主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables 语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。
4、对于 InnoDB 引擎的数据库,逻辑备份一般采用哪种方式?为什么?
逻辑备份一般会采用全局锁,限制整库为只读。对于全部是 InnoDB 引擎的库,建议你选择使用 –single-transaction 参数,对应用会更友好。
因为 set global readonly=true 的方式有时候会被用作其他逻辑,比如用来判断一个库是主库还是备库。另外整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。
而 FTWRL 在执行前有读写的话,FTWRL 都会等待,直到读写执行完毕后才会执行。FTWRL 执行的时候要刷脏页的数据到磁盘,因为要保持数据的一致性。FTWRL 更适合不支持事务的存储引擎。
而 InnoDB 是支持事务的。当使用 mysqldump 并且带上参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
5、全库只读,为什么不使用 set global readonly=true 的方式?
这个问题,上面第四题已有解答。
set global readonly=true 确实可以让全库进入只读状态,但还是不建议你使用,主要有两个原因。
一是,在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改 global 变量的方式影响面更大,因此不建议你使用。
二是,在异常处理机制上有差异。将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。
更多关于 MySQL 的高级面试题请打开下面的小程序进行阅读。或者你也可以通过购买极客时间的《MySQL实战45讲》进行学习。扫描下方海报上的二维码,购买后加我微信号:xttblog,备注“返现”。我返你微信 24 元红包。
: » 这些 MySQL 面试题你会多少?
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/252421.html