Linux运维工程师面试题(6)

Linux运维工程师面试题(6)
最新回答
敲击岁月

2026-10-23 20:06:27

Linux运维工程师面试题(6)详细解答1. 数据库事务的四个特性及含义
  • 原子性:整个事务中的所有操作要么全部完成,要么全部都不完成。如果在事务中操作出现异常,那么事务将会进行回滚,就像这个事务从来没有执行过一样。
  • 持久性:在事务完成后,该事务所有的操作都将持久化在数据库中,不会被回滚。
  • 一致性:在事务开始之前和事务结束之后,数据库的完整性约束并没有被破坏。
  • 隔离性:确保在同一时间内只有一个事务处理某个数据,避免并发事务之间的干扰。
2. MySQL的SQL语句怎么优化
  • 避免使用不必要的操作符:尽量避免使用or、in、not in和在where语句后面使用!=、<>操作符以及对NULL值的判断,这些操作可能导致数据库引擎放弃索引而使用全表扫描。
  • 使用exists替换in:在某些情况下,使用exists可以替代in,提高查询效率。
  • 避免使用select *:返回无用的字段会降低查询效率,应该只取出需要的数据。
  • 使用join代替子查询:在可能的情况下,使用join代替子查询可以提高查询效率。
  • 设置合适的字段属性:例如尽量把字段设置为NOT NULL,避免对NULL值的比较。
  • 建立索引:优先考虑在where、group by使用到的字段上建立索引。
  • 避免模糊查询:尽量避免在字段开头进行模糊查询,这会导致数据库引擎放弃索引进行全表扫描。
3. varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符?
  • 区别:char是固定长度,varchar是可变长度。char存储时会用空格补全到指定长度,而varchar则只存储实际字符串长度加上一个记录字符串长度的字节。
  • 大小限制:varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同。char最多可以存放255个字符,不同的编码最大可用字节数不同。
  • utf8字符集下varchar的最大字符数:在utf8字符集下,每个字符最多占3个字节,因此varchar的最大长度不能超过21845个字符。
4. 索引有什么用?
  • 提高查询效率:对于建立索引的列,MySQL的查询效率会提高很多。
  • 降低扫描数据量:索引可以降低服务需要扫描的数据量,减少I/O次数。
  • 避免排序和使用临时表:索引可以帮助服务器避免排序和使用临时表。
  • 将随机I/O转为顺序I/O:索引可以帮助将随机I/O转为顺序I/O,提高查询效率。
5. SQL注入是怎么产生的,如何防止?
  • 产生原因:因为在程序开发过程中没有对SQL语句进行检查或未进行关键字检查,导致客户端可以提交SQL语句到服务器运行。
  • 防止措施:

    对SQL语句进行检查和过滤。

    不要使用SQL拼接的方式来拼接SQL语句,对常用的方法进行封装避免暴露SQL语句(使用ORM)。

6. CSRF是什么?如何防范?
  • CSRF:跨站伪造请求,利用用户信任过的网站去执行一些恶意的操作。
  • 防范措施:

    检查Referer字段,严格要求该字段只来自于信任的URL。

    添加校验token,将token值附加在表单中,攻击者无法获取这个值,服务端进行检查发现该值为空时将会拒绝服务。

7. 如何加强MySQL安全,请给出可行的具体措施?
  • 避免直接访问:避免直接从互联网访问MySQL数据库,确保特定主机才拥有访问权限。
  • 定期备份:定期备份数据库,以防数据丢失。
  • 禁用或限制远程访问:在my.cnf文件里设置bind-address指定IP。
  • 移除test数据库:默认匿名用户可以访问test数据库,应移除。
  • 禁用local infile:在my.cnf里[mysqld]下添加set-variable=local-infile=0,禁用local infile功能。
  • 移除匿名账户:移除匿名账户和废弃的账户。
  • 限制权限:限制MySQL数据库用户的权限,避免权限过大。
  • 禁用.mysql_history文件:移除和禁用.mysql_history文件,防止历史记录泄露。
8. 如是数据库慢导致网站打开慢,如何排查并解决?
  • 查看占用时间长的SQL:登录MySQL查看有哪些SQL语句占用时间过长,使用SHOW PROCESSLIST命令。
  • 分析执行计划:使用EXPLAIN查看消耗时间过长的SQL语句是否走了索引。
  • 优化SQL语句:对SQL语句进行优化,建立索引或调整查询方式。
9. MySQL有多少种日志
  • 错误日志(error log):记录出错信息,也记录一些警告信息或者正确的信息。
  • 通用日志(general log):记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
  • 慢查询日志(slow query log):设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
  • 二进制日志(binary log):记录对数据库执行更改的所有操作。
  • 中继日志(relay log):在主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件。
  • 事务日志(transaction log):记录事务的详细信息,通常也被称为预写式日志(write ahead logging)。
10. MySQL数据库CPU飙升到500%的话怎么处理?
  • 观察占用情况:先用操作系统命令(如top)观察是不是mysqld占用导致的,如果不是,找出占用高的进程并进行相关处理。
  • 查看session情况:如果是mysqld造成的,使用SHOW PROCESSLIST查看里面跑的session情况,找出消耗资源的SQL。
  • 优化SQL:分析消耗高的SQL,看看执行计划是否准确,index是否缺失,或者数据量是否过大。
  • kill线程:一般来说,需要kill掉这些线程(同时观察CPU使用率是否下降),等进行相应的调整(如加索引、改SQL、改内存参数)之后,再重新跑这些SQL。
  • 分析连接数:如果每个SQL消耗资源并不多,但突然有大量session连进来导致CPU飙升,需要跟应用一起分析为何连接数会激增,再做出相应的调整,如限制连接数等。