【架构师面试-大厂内部面试题-4】-MySQL 运维基础知识面试题汇总50题

吃透这50道题,再也不用担心sql运维了,废话不多说,咱们直接上干货!!!

1. 请解释关系型数据库概念及主要特点?

概念:

关系型数据库是支持采用了关系模型的数据库,简单来说,关系模型就是指二维

表模型,而一个关系数据库就是由二维表及其之间的联系所组成的一个数据组织。

特点:

最大的特点就是事务的一致性。

优点:容易理解、使用方便、易于维护、支持 SQL。

缺点:

1. 高并发读写需求:网站的用户并发非常高,往往达到每秒上万次读写请求,对于

传统关系型数据库来说,硬盘 I/O 是一个很大的瓶颈。

2. 海量数据的高效读写:对于数据量巨大的网站来说,关系型数据库的查询效率非

常低。

3. 固定的表结构。

2.请说出关系型数据库的典型产品、特点及应用场景?

1.SQLserver

特点:真正的客户机/服务器体系结构

图形化用户界面

丰富的编程接口工具

与 Windows NT 完全集成

具有很好的伸缩性

应用场景:

主机为 Windows 系统,主要应用于 web 网站的建设,承载中小型 web 后台数据。

特点:体积小,总拥有成本低,开放源代码,可运行在多数系统平台上,轻量级易扩展。

应用场景:广泛的应用在 Internet 上的中小型网站中。

3.Oracle

特点:跨平台运行,安全性方面,性能最高。对硬件要求高,价格昂贵。

应用场景:大部分国企事业单位都用 Oracle,在电信行业占用最大的份额。

3. 请解释非关系型数据库概念及主要特点?

1. 使用键值对存储数据,且结构不固定

2. 一般不支持 ACID 特性。

3. 基于键值对,数据没有耦合性,容易扩展。

4. 不提供 SQL 支持,学习和使用成本较高。

4 请说出非关系型数据库的典型产品、特点及应用场景?

MongoDB

特点:1.高性能,易部署,易使用。

2.面向集合存储,易存储对象类型的数据。

3.模式自由

4.自动处理碎片,以支持云计算层次的扩展性。

应用场景:

网站数据:mongodb 非常适合实时的插入,更新与查询。

缓存:适合作为信息基础设施的缓存层

大尺寸、低价值的数据

高伸缩性的场景

Redis

特点:1.性能极高,能支持超过 100k+每秒的读写频率

2.丰富的数据类型

3.所有操作都是原子性的

使用场景:

少量的数据存储,高速读写访问

SQLlite

特点:

1.嵌入式的,零配置,无需安装和管理配置

2.ACID 事务

3.存储在单一磁盘文件中的一个完整的数据库。

应用场景:

1.需要数据库的小型桌面软件。

2.需要数据库的手机软件。

3.作为数据容器的应用场景。

5. 请详细描述 SQL 语句分类及对应代表性关键字。

(1)DDL(Data Definition Language)---数据库定义语言(create、alter、drop),管 理基础数据库,例如:库,表

(2)DCL(Data Control Language)---数据控制语言(grant、revoke、commit、roll back),用户授权,权限回收,数据提交回滚等

(3)DML(Data Manipulation Language)---数据操作语言(select、insert、delete、update),针对数据库里的表,记录

6. 请详细描述 char(4)和 varchar(4)的差别。

char(4)定义的是固定长度 4,存储时,如果字符数不够 4 位,会在后面用空格补全存入数据库。

varchar(4)定义的是变长长度,存储时,如果字符没有达到定义的位数 4 时,也不会在

后面补空格。

7. 如何授权 smallstudent 用户从 172.16.1.0/24 访问数据库。

grant all on *.* to smallstudent@'172.16.1.%' identified by '123456';

8. 什么是 MySQL 多实例,如何配置 MySQL 多实例?

在一台服务器上,mysql 服务开启多个不同的端口,运行多个服务进程,这些 my sql 服务进程通过不同的 socket 来监听不同的数据端口,进而互不干涉的提供各自的服务。

9. 如何加强 MySQL 安全,请给出可行的具体措施?

1.避免直接从互联网访问 mysql 数据库,确保特定主机才拥有访问权限。

2.定期备份数据库

3.禁用或限制远程访问

在 my.cnf 文件里设置 bind-address 指定 ip

4.移除 test 数据库(默认匿名用户可以访问 test 数据库)

5.禁用 local infile

select load_file("/etc/passwd");

在 my.cnf 里[mysqld]下添加 set-variable=local-infile=0

6.移除匿名账户和废弃的账户

7.限制 mysql 数据库用户的权限

8.移除和禁用.mysql_history 文件

# cat ~/.mysql_history

# export MYSQL_HISTFILE=/dev/null

10. delete 和 truncate 删除数据的区别?

truncate table test 执行更快,清空物理文件,清空表中的所有内容

delete from test 是逻辑删除,按行删除,而且可以通过 where 语句选择要删除的行

11. MySQL Sleep 线程过多如何解决?

show processlist\G

# mysqladmin -uroot -p123456 processlist

修改 my.cnf 文件里的 wait_timeout 的值,让其更小一些,默认 wait_timeout =28800,

这里改为 100

set global wait_timeout=100;

show global variables like "wait_timeout";

12. sort_buffer_size 参数作用?如何在线修改生效?

mysql 执行排序使用的缓冲大小。如果想要增加 order by 的速度,首先看是否可以让

mysql 使用索引而不是额外的排序阶段,如果不能,可以尝试增加 sort_buffer_size 变

量的大小。

set global sort_buffer_size =131072; #单位为 B,即 128KB,默认 64K

13. 如何在线正确清理 MySQL binlog?

自动清除 set global expire_logs_days=30; #设置 binlog 过期时间为 30 天

手动清除 purge binary logs to "mysql-bin.000007"; #/删除 mysql-bin.000007 之前

的所有 binlog 日志

14. Binlog 工作模式有哪些?各什么特点,企业如何选择?

1.row level 行级模式

优点:记录数据详细(每行),主从一致

缺点:占用大量的磁盘空间,降低了磁盘的性能

2.statement level 模式(默认)

优点:记录的简单,内容少 ,节约了 IO,提高性能 缺点:导致主从不一致

3.MIXED 混合模式

结合了 statement 和 row 模式的优点,会根据执行的每一条具体的 SQL 语句来区

分对待记录的日志形式。对于函数,触发器,存储过程会自动使用 row level 模式

企业场景选择:

1.互联网公司使用 mysql 的功能较少(不用存储过程、触发器、函数),选择默认的

statement 模式。

2.用到 mysql 的特殊功能(存储过程、触发器、函数)则选则 MIXED 模式

3.用到 mysql 的特殊功能(存储过程、触发器、函数),有希望数据最大化一致则选

择 row 模式。

15. 误操作执行了一个 drop 库 SQL 语句,如何完整恢复?

如果条件允许,操作前最好禁止外面一切服务器访问 mysql 数据库,这里假设禁止外

面访问数据库,具体步骤如下:

1. 手动切割 binlog 日志并记好切割好的 binlog 日志文件位置,这里假设为 009,备

份全部 binlog 日志

2. 找到之前全备数据最后备份到的 binlog 文件位置并记好位置,这几假设为 005

3. 用 mysqladmin 命令将 005 到 008binlog 文件中的 SQL 语句分离出来,并找到 dr

4. 将之前全备数据导入 mysql 服务器

5. 将步骤 3 中分离出的 SQL 语句导入 mysql 服务器

6. 将 009binlog 文件删除,再次刷新 binlog 日志,到此数据库已恢复成功。

16. mysqldump 备份使用了-A -B 参数,如何实现恢复单表?

1. 先用 sed 或 awk 将全库中的需要的表结构过滤出来

sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `SC`/!d;q' /opt/bak_2017-12-07.sql

2. 再用 grep 将全库中相应的表内容过滤出来

grep 'INSERT INTO `SC`' /opt/bak_2017-12-07.sql

3. 将 1 和 2 中过滤出来的 SQL 语句导入数据库即可

17. 详述 MySQL 主从复制原理及配置主从的完整步骤。

画图。

1. 主:binlog 线程,记录所有改变了数据库数据的语句,放进 master 上的 binlog 中

2. 从:IO 线程,在使用 start slave 之后,负责从 master 上拉取 binlog 内容,放进

自己的 relay log 中

3. 从:SQL 执行线程,执行 relay log 中的语句。

配置步骤:

1. 主库开启 binlog 日志功能

2. 全备数据库,记录好 binlog 文件和相应的位置

3. 从库上配置和主库的连接信息

4. 将全备数据导入从库

5. 从库启动 slave

6. 在从库上查看同步状态,确认是否同步成功

18. 如何开启从库的 binlog 功能?

在 my.cnf 文件中写入 log-bin=mysql-bin

19. MySQL 如何实现双向互为主从复制,并说明应用场景?

两台数据库都开启 binlog 功能,相互为主从配置。

双主的实现方式主要有两种:

1. 让表的 ID 自增,然后主 1 写 1、3、5,主 2 写 2、4、6

2. 不让表的 ID 自增,然后通过 web 端程序去 seq 服务器取 ID,写入双主。

双主工作场景为高并发写的场景,慎用。

20. MySQL 如何实现级联同步,并说明应用场景?

第一台数据库开启 binlog 功能设为主服务器,第二台数据库也开启 binlog 功能,设为

第一台服务器的从服务器,设为其他数据库的主服务器

21. MySQL 主从复制故障如何解决?

解决办法 1:

登陆从库上操作:

1. stop slave 临时停止同步开关

2. set global sql_slave_skip_counter=1,将同步指针向下移动一个,也可以多个,

如果多次不同步,可以重复操作。

3. start slave,重启主从复制开关

解决办法 2:

在 my.cnf 配置文件中加入参数

slave-skip-errors=1032,1062,1007

22. 如何监控主从复制是否故障?

查看 slave 端的 IO 和 SQL 进程状态是否 OK,同步延迟时间是否小于 1 分钟

show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

23. MySQL 数据库如何实现读写分离?

1. 通过程序实现读写分离(性能,效率最佳,推荐

PHP 和 Java 程序都可以通过设置多个连接文件轻松的实现对数据库的读写分离,即

当 select 时,就去连接读库的连接文件,当 update、insert、delete 是就去连接写库

的连接文件。

2. 通过软件实现读写分离

MySQL-proxy,Amoeba 等代理软件也可以实现读写分离功能,但最常用最好用的还是

程序实现读写分离。

3. 开发 dbproxy

24. 生产一主多从从库宕机,如何手工恢复?

处理方法:重做 slave

1. 停止 slave

2. 导入备份数据

3. 配置 master.info 信息

4. 启动 slave

5. 检查从库状态

25. 生产一主多从主库宕机,如何手工恢复?

主库宕机分为数据库宕机和服务器宕机 2 种,不管哪种都要进行主从切换。

1.登陆从库检查 IO 线程和 SQL 线程状态 show processlist\G,确认 SQL 线程已读完所有 relay-log

2.登陆所有从库检查 master.info 信息,查看哪个从库的 binlog 文件和位置是最新的, \选择最新的从库切换为主库(或利用半同步功能,直接选择做了实时同步的从库为主库)

3.如果主库只是数据库宕了,服务器还在运行,则可以把 binlog 拉取到提升为主库的从库应用。

4.登陆要切换为主库的从库,进行切换操作。

stop slave;reset master;quit

5.进入要切换的从库数据目录,删除 master.info 和 relay-log.info 文件,并检查授权表,

read_only 等参数

6.修改 my.cnf 配置文件,开启 binlog,注释从库参数 log-bin=/data/3307/mysql-bin #log-slave-updates #read-only

7. 对同步用户进行提权,保证权限与主库用户权限一样

8. 重启数据库提生为主库

9. 其他从库操作

(1) 检查运行环境和用户

(2) 停止从库,修改 master 信息

(3) 启动从库同步,检查同步状态

10. 修改 web 程序的连接配置,从原主库指向新主库

11. 维护损坏的主库,完成后作为从库使用,或切换回来

12. 如果主库没有宕机,只是想按计划切换一下主库,就非常简单

(1) 主库锁表

(2) 登陆所有从库检查同步状态,查看是否完成同步。

(3) 其他按上面步骤进行切换

26. MySQL 出现复制延迟有哪些原因?如何解决?

1. 一个主库的从库太多,导致复制延迟

建议从库数量 3-5 个为宜,要复制的从节点数量过多,会导致复制延迟

2. 从库硬件比主库差,导致复制延迟

查看 master 和 slave 的系统配置,可能会因为机器配置问题,包括磁盘 IO、CPU、

内存等各方面因素造成复制的延迟,一般发生在高并发大数据量的写入场景。

3. 慢 SQL 语句过多

假如一条 SQL 语句执行时间是 20 秒,那么执行完毕到从库上能查到数据也至少是 20 秒,可以修改后分多次写入,通过查看慢查询日志或 show full processlist 命令找出执行时间长的查询语句或者大的事务。

4. 主从复制设计问题

主从复制单线程,如果主库写并发太大,来不及传送到从库就会导致延迟。更高版本的mysql 可以支持多线程复制,门户网站则会自己开发多线程同步功能。

5. 主从库之间网络延迟

主从库的网卡,网线,连接的交换机等网络设备都可能成为复制的瓶颈,导致复制延迟,另外,跨公网主从复制很容易导致主从复制延迟。

6. 主库读写压力大,导致复制延迟

主库硬件要搞好一点,架构的前端要加 buffer。

27. 给出企业生产大型 MySQL 集群架构可行备份方案?

1. 利用 mysqldump 做定时备份,根据情况可按天或按周做全库备份。

2. 用 rsync+inotify 对主库 binlog 做实时备份

28. 什么是数据库事务,事务有哪些特性?企业如何选择?

事务就是指逻辑上的一组 SQL 语句操作,组成这组操作的各个 SQL 语句,执行时要么全成功要么全失败。

事务的四大特性(ACID):

1. 原子性(atomicity)

整个事务的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

2. 一致性(consistency)

事务发生前和发生后,数据的完整性必须保持一致

3. 隔离性(isolation)

当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的。

4. 持久性(durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的,如果出了错误,事务也不允许撤销。

29. 请解释全备、增备、冷备、热备概念及企业实践经验?

全备:备份数据库所有数据

增备:一次性备份所有数据,然后再增量备份。

冷备:需要关闭 mysql 服务,读写请求均不允许状态下进行。

温备:服务在线,但仅支持读请求,不允许写请求的情况下备份。

热备:备份的同时,业务不受影响。

30. MySQL 的 SQL 语句如何优化?

1. 在表中建立索引,优先考虑 where、group by 使用到的字段

2. 尽量避免使用 select *,返回无用的字段会降低查询效率

3. 尽量避免使用 in 和 not in,会导致数据库引擎放弃索引进行全表扫描

4. 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描

5. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描

31. MySQL 中 MyISAM 与 InnoDB 的区别,至少 5 点 (1) 问 5 点不同

a. InnoDB 支持事务,而 MyISAM 不支持事务。

b. InnoDB 支持行级锁,而 MyISAM 支持表级锁

c. InnoDB 支持 MVCC,而 MyISAM 不支持

d. InnoDB 支持外键,而 MyISAM 不支持

e. InnoDB 不支持全文索引,而 MyISAM 支持

(2) InnoDB 引擎的 3 大特性

插入缓存(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)

(3)二者 select count(*)哪个更快,为什么?

MyISAM 更快,因为 MyISAM 内部维护了一个计数器,可以直接调取。

32. 如何调整生产线中 MySQL 数据库的字符集。

1. 修改 my.cnf 文件中的字符集配置

2. 查看当前字符集设置

show global variables like "character%";

3. 用 set 分别设置字符集变量值

set global character_set_client=utf8;

set global character_set_connection=utf8;

set global character_set_results=utf8;

set global character_set_database;

set global character_set_server;

set global character_set_system;

33. 请描述 MySQL 里中文数据乱码原理,如何防止乱码?

mysql 客户端 mysql 服务端 操作系统等字符集不一致导致的乱码,将上述字符集调成一致。

34. 企业生产 MySQL 如何优化(请多角度描述)?

1. 硬件优化

CPU、内存、磁盘、网卡

2. 软件优化

(1) 操作系统:64 位,内核优化

(2) MySQL 编译安装、优化

3. my.cnf 里的参数优化

35. MySQL 高可用方案有哪些,各自特点,企业如何选择?

1. 主从复制+读写分离

优点:成本低、架构简单、易实施、维护方便

缺点:master 出现问题后不能自动到 slave 上,需要人工干涉。

2. MySQL Cluster

优点:安全性高,稳定性高。可以在线增加节点

缺点:架构复杂,至少三个节点,对于引擎只能用 ndb,不支持外键,管理复杂,部署费时而且是收费的。

3. Heartbeat /keepalived+双主从复制

优点:安全性、稳定性高,出现故障系统将自动切换,从而保证服务的连续性。

缺点:可能会发生脑裂

4. HeartBeat+DRBD+MySQL

优点:安全性、稳定性、出现故障系统将自动切换,从而保证服务的连续性。

缺点:只用一台服务器提供服务,成本高,可能发生脑裂

36. 如何分表分库备份及批量恢复(口述脚本实现过程)?

备份库: mysqldump -u 用户名 -p 密码 数据库名 >备份的文件名

备份表 mysqldump -u 用户名 -p 密码 数据库名 表名 >备份的文件名

37:如何批量更改数据库表的引擎?

#!/bin/sh

cmd="mysql -uroot -pabc123 -e"

$cmd "use 库名;show tables;"|grep -v Tables >/file.txt #将表名存到file.txt文件里

tables=/file.txt

for n in `cat $tables` #让变量 n 分别取 file.txt 文件里的表名

do

$cmd "use 库名;alter table $n engine=myisam"

done

38. 如何批量更改数据库字符集?

#!/bin/sh

cmd="mysql -uroot -pabc123 -e"

$cmd "show databases;"|grep -v Database >/file.txt databases=/file.txt

for n in `cat $databases`

do

$cmd "alter database $n default character set utf8;"

done

39. 网站打开慢,请给出排查方法,如是数据库慢导致,如何排查并解决,请分析并

举例?

1. 检查操作系统是否负载过高

2. 登陆 mysql 查看有哪些 sql 语句占用时间过长,show processlist;

3. 用 explain 查看消耗时间过长的 SQL 语句是否走了索引

4. 对 SQL 语句优化,建立索引

40. xtranbackup 的备份、增量备份及恢复的工作原理?

XtraBackup 基于 InnoDB 的 crash-recovery 功能,它会复制 InnoDB 的 data file,

由于不锁表,复制出来的数据是不一致的,在恢复的时候使用 crash-recovery,使得

数据恢复一致。

InnoDB 维护了一个 redo log,又称为 transaction log(事务日志),它包含了 InnoDB 数据的所有改动情况。当 InnoDB 启动的时候,它会先去检查 data file 和 transaction log

,并且会做两步操作:

XtraBackup 在备份的时候,一页一页的复制 InnoDB 的数据,而且不锁定表,与此同时,XtraBackup 还有另外一个线程监视着 transaction log,一旦 log 发生变化,

就把变化过的 log pages 复制走。为什么要着急复制走呢?因为 transaction log 文件

大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。

在 prepare 过程中,XtraBackup 使用复制到的 transaction log 对备份出来的 InnoDB

data file 进行 crash recovery

41. 误执行 drop 数据,如何通过 xtrabackup 恢复?

1. 关闭 mysql 服务

2. 移除 mysql 的 data 目录及数据

3. 将备份的数据恢复到 mysql 的 data 目录

4. 启动 mysql 服务

42. 如何做主从数据一致性校验?

主从一致性校验有多种工具 例如 checksum、mysqldiff、pt-table-checksum 等

43. 如何监控 MySQL 的增删改查次数?

show global status where variable_name in('com_select','com_insert','com_delete','com_update');

| Com_delete | 0 |

| Com_insert | 0 |

| Com_select | 31897 |

| Com_update | 0 |

4 rows in set (0.00 sec)

44. MySQL 索引的种类及工作原理。

普通索引:最基本的索引,没有任何限制。

唯一索引:与普通索引类似,不同的是,索引列的值必须唯一,但允许有空值。

主键索引:它是一种特殊的唯一索引,不允许有空值。

一张表只能有一个主键。

组合索引:就是将多个字段建到一个索引里。

45. 如何自定义脚本启动 MySQL(说出关键命令)

mysqld_safe --defaults-file=/data/3306/my.cnf &

46. 如何自定义脚本平滑关闭 MySQL(说出关键命令)

mysqladmin -u root-p123456 -S /data/3306/mysql.sock shutdown

47. 你们的公司如何实现数据库读写分离的?

通过程序实现的读写分离 insert、update、delete、alter 等走主库,select 等走从库

48. mysqldump 导入导出默认把所有数据都缩减在一行里面,为了查看和修改方便,如何将数据以多行插入的形式导出。

用--skip-extend-insert 选项

49. 你是如何监控你能数据库的?

开源监控工具有很多,如 zabbix,nagios Lepus(天兔):简洁、直观、强大的开源数据库监控系统,MySQL/Oracle/MongoDB/ Redis 一站式性能监控,让数据库监控更简单

50. 公司现有的数据库架构,总共有几组 mysql 库?

我们公司现在有两组 MySQL。其中一套是生产库,一套是测试库。

生产库和测试库都是用的 mha +半同步复制做的高可用。

我们所有的项目 web 前端量(大概有 10 个项目)指向的都是一个机器上的 mysql 实例。因为我们是传统行业,并发访问量并不是很大,所以目前我们的生产 mysql数据库未出现性能问题。

51. mysql 的权限怎么管理?

只给 insert,update,select 和 delete 四个权限即可。有时候 delete 都不给。

52. 如果发现 CPU,或者 IO 压力很大,怎么定位问题?

1、首先我会用 top 命令和 iostat 命令,定位是什么进程在占用 cpu 和磁盘 io;

2、如果是 mysql 的问题,我会登录到数据库,通过 show full processlist 命令,看现在数

据库在执行什么 sql 语句,是否有语句长时间执行使数据库卡住;

3、执行 show engine innodb status\G 命令,查看数据库是否有锁资源争用;

4、查看 mysql 慢查询日志,看是否有慢 sql;

5、找到引起数据库占用资源高的语句,进行优化,该建索引的建索引,索引不合适的删索

引,或者根据情况 kill 掉耗费资源的 sql 语句等

如果您觉得文章有帮助,欢迎点赞收藏加关注,一连三击呀,感谢!!☺☻

你可能感兴趣的:(架构师面试,面试,mysql,运维,架构师)