MySQL教程学习之面试题14_MySQL数据库综合型面试题汇总1
1、500台db,在最快时间之内重启
可以使用批量 ssh 工具 pssh 来对需要重启的机器执行重启命令。 也可以使用 salt(前提是客户端有安装 salt)或者 ansible( ansible 只需要 ssh 免登通了就行)等多线程工具同时操作多台服务器
2、你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?
监控的工具有很多,例如zabbix,lepus,风哥的mysql教程里面就讲了这两种。
3、你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做?
主从一致性校验有多种工具 例如checksum、mysqldiff、pt-table-checksum等,风哥的mysql教程里面就讲了这些技术。
4、表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问您是选择拆成子表,还是继续放一起?写出您这样选择的理由
风哥MySQL教程提示:拆带来的问题:连接消耗 + 存储拆分空间;不拆可能带来的问题:查询性能;
如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗
如果能容忍不拆分带来的查询性能损失的话:上面的方案在某个极致条件下肯定会出现问题,那么不拆就是最好的选择
5、MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?
答:InnoDB是基于索引来完成行锁
例: select * from tab_with_index where id = 1 for update;
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,
如果 id 不是索引键那么InnoDB将完成表锁,,并发将无从谈起
6、如何从mysqldump产生的全库备份中只恢复某一个库、某一张表?
全库备份
[root@fgedu ~]# mysqldump -uroot -p --single-transaction -A --master-data=2 >fgdump.sql
只还原erp库的内容
[root@fgedu ~]# mysql -uroot -pMANAGER erp --one-database <fgdump.sql
可以看出这里主要用到的参数是--one-database简写-o的参数,极大方便了我们的恢复灵活性
那么如何从全库备份中抽取某张表呢,全库恢复,再恢复某张表小库还可以,大库就很麻烦了,那我们可以利用正则表达式来进行快速抽取,具体实现方法如下:
从全库备份中抽取出t表的表结构
[root@fgedu ~]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `t`/!d;q' fgdump.sql
DROP TABLE IF EXISTS`t`;/*!40101 SET@saved_cs_client =@@character_set_client */;/*!40101 SETcharacter_set_client = utf8 */;
CREATE TABLE `t` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`age` tinyint(4) NOT NULL DEFAULT '0',
`name` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDBAUTO_INCREMENT=4 DEFAULT CHARSET=utf8;/*!40101 SETcharacter_set_client = @saved_cs_client */;
从全库备份中抽取出t表的内容
[root@fgedu ~]# grep'INSERT INTO `t`' fgdump.sql
INSERT INTO `t`VALUES (0,0,''),(1,0,'aa'),(2,0,'bbb'),(3,25,'fgedu');
6、在当前的工作中,你碰到到的最大的 mysql db 问题以及如何解决的?
7、mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert....value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?
--skip-extended-insert
[root@fgedu-itpux ~]# mysqldump -uroot -p fgedu --skip-extended-insert
Enter password:
KEY `idx_c1` (`c1`),
KEY `idx_c2` (`c2`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `fgedu`--
LOCK TABLES `fgedu` WRITE;/*!40000 ALTER TABLE `fgedu` DISABLE KEYS */;
INSERT INTO `fgedu` VALUES (1,32,37,38,'2018-10-18 06:19:24','itpuxitpuxitpuxitpuxitpuxitpux');
INSERT INTO `fgedu` VALUES (2,37,46,21,'2018-10-18 06:19:24','itpuxitpuxitpux');
INSERT INTO `fgedu` VALUES (3,21,5,14,'2018-10-18 06:19:24','itpux');
8、请简洁地描述下 MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
风哥MySQL学习提示
(1)、事物的4种隔离级别
读未提交(read uncommitted)
读已提交(read committed)
可重复读(repeatable read)
串行(serializable)
(2)、不同级别的现象
Read Uncommitted:可以读取其他 session 未提交的脏数据。
Read Committed:允许不可重复读取,但不允许脏读取。提交后,其他会话可以看到提交的数据。
Repeatable Read: 禁止不可重复读取和脏读取、以及幻读(innodb 独有)。
Serializable: 事务只能一个接着一个地执行,但不能并发执行。事务隔离级别最高。
不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差。