GVKun编程网logo

2020 最新版 MySQL 数据库面试题(二)(mysql数据库面试题及答案)

5

在本文中,我们将带你了解2020最新版MySQL数据库面试题在这篇文章中,我们将为您详细介绍2020最新版MySQL数据库面试题的方方面面,并解答二常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更

在本文中,我们将带你了解2020 最新版 MySQL 数据库面试题在这篇文章中,我们将为您详细介绍2020 最新版 MySQL 数据库面试题的方方面面,并解答常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的.NET面试题系列(十六)数据库面试题、2020 最新版 idea 激活教程、2020 最新版 Linux 面试题(一)、2020 最新版 Linux 面试题(二)

本文目录一览:

2020 最新版 MySQL 数据库面试题(二)(mysql数据库面试题及答案)

2020 最新版 MySQL 数据库面试题(二)(mysql数据库面试题及答案)

点击上方 “码农编程进阶笔记”,选择 “置顶或者星标

文末有干货,每天定时与您相约!

什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账 1000 元,这个转账会涉及到两个关键操作就是:将小明的余额减少 1000 元,将小红的余额增加 1000 元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

事物的四大特性 (ACID) 介绍一下?

关系性数据库需要遵循 ACID 规则,具体内容如下:

  1. 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;

  2. 一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

  3. 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

  4. 持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

什么是脏读?幻读?不可重复读?

  • 脏读 (Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个 RollBack 了操作,则后一个事务所读取的数据就会是不正确的。

  • 不可重复读 (Non-repeatable read): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

  • 幻读 (Phantom Read): 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列 (Row) 数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

什么是事务的隔离级别?MySQL 的默认隔离级别是什么?

为了达到事务的四大特性,数据库定义了 4 种不同的事务隔离级别,由低到高依次为 Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED (读取未提交)最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

  • READ-COMMITTED (读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

  • REPEATABLE-READ (可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

  • SERIALIZABLE (可串行化):最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

这里需要注意的是:Mysql 默认采用的 REPEATABLE_READ 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别

事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是 MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED (读取提交内容):,但是你要知道的是 InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)** 并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到 **SERIALIZABLE (可串行化)** 隔离级别。

对 MySQL 的锁了解吗

当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。

就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。

隔离级别与锁的关系

在 Read Uncommitted 级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突

在 Read Committed 级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;

在 Repeatable Read 级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。

SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。

按照锁的粒度分数据库锁有哪些?锁机制与 InnoDB 锁算法

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁 (INNODB 引擎)、表级锁 (MYISAM 引擎) 和页级锁 (BDB 引擎 )。

MyISAM 和 InnoDB 存储引擎使用的锁:

  • MyISAM 采用表级锁 (table-level locking)。

  • InnoDB 支持行级锁 (row-level locking) 和表级锁,默认为行级锁

行级锁,表级锁和页级锁对比

行级锁 行级锁是 Mysql 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

   特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁 表级锁是 MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 与 INNODB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

    特点开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁 页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

     特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

从锁的类别上分 MySQL 都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了

从锁的类别上来讲,有共享锁和排他锁。

共享锁: 又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。

排他锁: 又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。

用上面的例子来说就是用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的。一种是真正的入住一晚,在这期间,无论是想入住的还是想看房的都不可以。

锁的粒度取决于具体的存储引擎,InnoDB 实现了行级锁,页级锁,表级锁。

他们的加锁开销从大到小,并发能力也是从大到小。

MySQL 中 InnoDB 引擎的行锁是怎么实现的?

答:InnoDB 是基于索引来完成行锁

例: select * from tab_with_index where id = 1 for update;

for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么 InnoDB 将完成表锁,并发将无从谈起

InnoDB 存储引擎的锁的算法有三种

  • Record lock:单个行记录上的锁

  • Gap lock:间隙锁,锁定一个范围,不包括记录本身

  • Next-key lock:record+gap 锁定一个范围,包含记录本身

相关知识点:

  1. innodb 对于行的查询使用 next-key lock

  2. Next-locking keying 为了解决 Phantom Problem 幻读问题

  3. 当查询的索引含有唯一属性时,将 next-key lock 降级为 record key

  4. Gap 锁设计的目的是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生

  5. 有两种方式显式关闭 gap 锁:(除了外键约束和唯一性检查外,其余情况仅使用 record lock) A. 将事务隔离级别设置为 RC B. 将参数 innodb_locks_unsafe_for_binlog 设置为 1

什么是死锁?怎么解决?

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

常见的解决死锁的方法

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

如果业务处理不好可以用分布式事务锁或者使用乐观锁

数据库的乐观锁和悲观锁是什么?怎么实现的?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过 version 的方式来进行锁定。实现方式:乐一般会使用版本号机制或 CAS 算法实现。

两种锁的使用场景

从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行 retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

为什么要使用视图?什么是视图?

为了提高复杂 SQL 语句的复用性和表操作的安全性,MySQL 数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。

视图使开发者只关心感兴趣的某些特定数据和所负责的特定任务,只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。

视图有哪些特点?

视图的特点如下:

  • 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。

  • 视图是由基本表 (实表) 产生的表 (虚表)。

  • 视图的建立和删除不影响基本表。

  • 对视图内容的更新 (添加,删除和修改) 直接影响基本表。

  • 当视图来自多个基本表时,不允许添加和删除数据。

视图的操作包括创建视图,查看视图,删除视图和修改视图。

视图的使用场景有哪些?

视图根本用途:简化 sql 查询,提高开发效率。如果说还有另外一个用途那就是兼容老的表结构。

下面是视图的常见使用场景:

  • 重用 SQL 语句;

  • 简化复杂的 SQL 操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;

  • 使用表的组成部分而不是整个表;

  • 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;

  • 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

视图的优点

  1. 查询简单化。视图能简化用户的操作

  2. 数据安全性。视图使用户能以多种角度看待同一数据,能够对机密数据提供安全保护

  3. 逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性

视图的缺点

  1. 性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定的时间。

  2. 修改限制。当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的

这些视图有如下特征:

  1. 有 UNIQUE 等集合操作符的视图。

   2. 有 GROUP BY 子句的视图。

   3. 有诸如 AVG\SUM\MAX 等聚合函数的视图。

   4. 使用 DISTINCT 关键字的视图。

   5. 连接表的视图(其中有些例外)

什么是游标?

游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录并赋给主变量,交由主语言进一步处理。

什么是存储过程?有哪些优缺点?

存储过程是一个预编译的 SQL 语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次 SQL,使用存储过程比单纯 SQL 语句执行要快。

优点

1)存储过程是预编译过的,执行效率高。

2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。

3)安全性高,执行存储过程需要有一定权限的用户。

4)存储过程可以重复使用,减少数据库开发人员的工作量。

缺点

1)调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

什么是触发器?触发器的使用场景有哪些?

触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。

使用场景

  1. 可以通过数据库中的相关表实现级联更改。

  2. 实时监控某张表中的某个字段的更改而需要做出相应的处理。

  3. 例如可以生成某些业务的编号。

  4. 注意不要滥用,否则会造成数据库及应用程序的维护困难。

  5. 大家需要牢记以上基础知识点,重点是理解数据类型 CHAR 和 VARCHAR 的差异,表存储引擎 InnoDB 和 MyISAM 的区别。

MySQL 中都有哪些触发器?

在 MySQL 数据库中有如下六种触发器:

  1. Before Insert

  2. After Insert

  3. Before Update

  4. After Update

  5. Before Delete

  6. After Delete

常用 SQL 语句

SQL 语句主要分为哪几类

数据定义语言 DDL(Data Ddefinition Language)CREATE,DROP,ALTER

主要为以上操作 即对逻辑结构等有操作的,其中包括表结构,视图和索引。

数据查询语言 DQL(Data Query Language)SELECT

这个较为好理解 即查询操作,以 select 关键字。各种简单查询,连接查询等 都属于 DQL。

数据操纵语言 DML(Data Manipulation Language)INSERT,UPDATE,DELETE

主要为以上操作 即对数据进行操作的,对应上面所说的查询操作 DQL 与 DML 共同构建了多数初级程序员常用的增删改查操作。而查询是较为特殊的一种 被划分到 DQL 中。

数据控制功能 DCL(Data Control Language)GRANT,REVOKE,COMMIT,ROLLBACK

主要为以上操作 即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。

超键、候选键、主键、外键分别是什么?

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

  • 候选键:是最小超键,即没有冗余元素的超键。

  • 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

  • 外键:在一个表中存在的另一个表的主键称此表的外键。

SQL 约束有哪几种?

  • NOT NULL: 用于控制字段的内容一定不能为空(NULL)。

  • UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。

  • PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。

  • FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

  • CHECK: 用于控制字段的值范围

后台回复【MySQL 面试指南】关键字免费获取视频教程

本文同步分享在 博客 “lxw1844912514”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

.NET面试题系列(十六)数据库面试题

.NET面试题系列(十六)数据库面试题

 数据库事务的四大特性

原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,

  这就是事务的一致性。

隔离性(Isolation) 

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉

  不到有其他事务在并发地执行。

持久性(Durability)

   持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

 不考虑事务的隔离性,会发生的几种问题

  以上介绍完事务的四大特性(简称ACID),现在重点来说明下事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,

以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:

脏读:一个事务读取到了另外一个事务没有提交的数据(读取了未提交的数据

  事务1:更新一条数据

  事务2:读取事务1更新的记录

  事务1:调用commit进行提交

  此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。

不可重复读:在同一事务中,两次读取同一数据,得到内容不同(读取了变化的数据

  事务1:查询一条记录

  事务2:更新事务1查询的记录

  事务2:调用commit进行提交

  事务1:再次查询上次的记录

  此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读

幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同(读取了新增的数据,导致前后数不一致) 

  事务1:查询表中所有记录

  事务2:插入一条记录

  事务2:调用commit进行提交

  事务1:再次查询表中所有记录

  此时事务1两次查询到的记录是不一样的,称为幻读

MySQL数据库为我们提供的四种隔离级别(由高到低)

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  ③ Read committed (读已提交):可避免脏读的发生。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

  以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,

就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。

  在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。

  在MySQL数据库中查看当前事务的隔离级别:

select @@tx_isolation;

  在MySQL数据库中设置事务的隔离级别:

set  [glogal | session]  transaction isolation level 隔离级别名称;

 set tx_isolation=’隔离级别名称;’

设置数据库的隔离级别一定要是在开启事务之前!

 https://www.cnblogs.com/fjdingsd/p/5273008.html

事务的4种隔离级别(隔离级别低到高)

读取未提交

   A说给B100元钱,B执行转账操作,该事务并未提交,此时A查看账户多了100元,此时B突然回滚了事务,最终A最后账户上并没有增加100元。

读取已提交

   事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

可重复读

   A去查B的信用卡刷卡记录,累计刷卡金额1000元,此时B又新增了500元的消费,A打印出B的纸质版消费记录,一看,我擦,怎么累计刷卡金额是1500元。

串行化

   Serializable 是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

https://blog.csdn.net/qq_33290787/article/details/51924963

 分布式事务的原理

 https://blog.csdn.net/a291382932/article/details/52567094

数据库的加锁吗?比如乐观锁,悲观锁?

快速理解聚集索引和非聚集索引

https://blog.csdn.net/zc474235918/article/details/50580639

资料

数据库事务  https://www.cnblogs.com/chengtian/p/9922736.html

2020 最新版 idea 激活教程

2020 最新版 idea 激活教程

windows 破解教程

  1. 首先下载 jar 包:(云盘链接发不上去,大家关注 gzh" 灰太狼学爪哇 " 回复 idea 获取)将其放到合适的文件夹(首选 IDEA 的同级目录)进行管理;
  2. 进入 C 盘 —> 用户 —> 用户名 —> .IntelliJIdea2019.2 或者.IntelliJIdea2019.3 —> config —> idea64.exe.vmoptions 文件,在文件的末尾加上 **-javaagent:jar 路径和 jar 包名字 **,例如 - javaagent:D:\Idea\jetbrainsCrack.jar,然后关闭打开的文件;(如果 C 盘没有 vmoptions 文件,试试去安装目录根目录下的 /bin 文件夹下找找试试)
  3. 打开 IDEA,这个时候因为是未激活,所以会弹出激活验证的窗口、选择 Activation Code,下方会让你填写密钥,填写下方密钥
A82DEE284F-eyJsaWNlbnNlSWQiOiJBODJERUUyODRGIiwibGljZW5zZWVOYW1lIjoiaHR0cHM6Ly96aGlsZS5pbyIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiJVbmxpbWl0ZWQgbGljZW5zZSB0aWxsIGVuZCBvZiB0aGUgY2VudHVyeS4iLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IklJIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiUlMwIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiV1MiLCJwYWlkVXBUbyI6IjIwODktMDctMDcifSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjA4OS0wNy0wNyJ9LHsiY29kZSI6IlJDIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwODktMDctMDcifSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjA4OS0wNy0wNyJ9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiRE0iLCJwYWlkVXBUbyI6IjIwODktMDctMDcifSx7ImNvZGUiOiJBQyIsInBhaWRVcFRvIjoiMjA4OS0wNy0wNyJ9LHsiY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjA4OS0wNy0wNyJ9LHsiY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwODktMDctMDcifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjA4OS0wNy0wNyJ9LHsiY29kZSI6IlBDIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDg5LTA3LTA3In1dLCJoYXNoIjoiODkwNzA3MC8wIiwiZ3JhY2VQZXJpb2REYXlzIjowLCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-5epo90Xs7KIIBb8ckoxnB/AZQ8Ev7rFrNqwFhBAsQYsQyhvqf1FcYdmlecFWJBHSWZU9b41kvsN4bwAHT5PiznOTmfvGv1MuOzMO0VOXZlc+edepemgpt+t3GUHvfGtzWFYeKeyCk+CLA9BqUzHRTgl2uBoIMNqh5izlDmejIwUHLl39QOyzHiTYNehnVN7GW5+QUeimTr/koVUgK8xofu59Tv8rcdiwIXwTo71LcU2z2P+T3R81fwKkt34evy7kRch4NIQUQUno//Pl3V0rInm3B2oFq9YBygPUdBUbdH/KHROyohZRD8SaZJO6kUT0BNvtDPKF4mCT1saWM38jkw==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5ndaik1GD0nyTdqkZgURQZGW+RGxCdBITPXIwpjhhaD0SXGa4XSZBEBoiPdY6XV6pOfUJeyfi9dXsY4MmT0D+sKoST3rSw96xaf9FXPvOjn4prMTdj3Ji3CyQrGWeQU2nzYqFrp1QYNLAbaViHRKuJrYHI6GCvqCbJe0LQ8qqUiVMA9wG/PQwScpNmTF9Kp2Iej+Z5OUxF33zzm+vg/nYV31HLF7fJUAplI/1nM+ZG8K+AXWgYKChtknl3sW9PCQa3a3imPL9GVToUNxc0wcuTil8mqveWcSQCHYxsIaUajWLpFzoO2AhK4mfYBSStAqEjoXRTuj17mo8Q6M2SHOcwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQBonMu8oa3vmNAa4RQP8gPGlX3SQaA3WCRUAj6Zrlk8AesKV1YSkh5D2l+yUk6njysgzfr1bIR5xF8eup5xXc4/G7NtVYRSMvrd6rfQcHOyK5UFJLm+8utmyMIDrZOzLQuTsT8NxFpbCVCfV5wNRu4rChrCuArYVGaKbmp9ymkw1PU6+HoO5i2wU3ikTmRv8IRjrlSStyNzXpnPTwt7bja19ousk56r40SmlmC04GdDHErr0ei2UbjUua5kw71Qn9g02tL9fERI2sSRjQrvPbn9INwRWl5+k05mlKekbtbu2ev2woJFZK4WEXAd/GaAdeZZdumv8T2idDFL7cAirJwcrbfpawPeXr52oKTPnXfi0l5+g9Gnt/wfiXCrPElX6ycTR6iL3GC2VR4jTz6YatT4Ntz59/THOT7NJQhr6AyLkhhJCdkzE2cob/KouVp4ivV7Q3Fc6HX7eepHAAF/DpxwgOrg9smX6coXLgfp0b1RU2u/tUNID04rpNxTMueTtrT8WSskqvaJd3RH8r7cnRj6Y2hltkja82HlpDURDxDTRvv+krbwMr26SB/40BjpMUrDRCeKuiBahC0DCoU/4+ze1l94wVUhdkCfL0GpJrMSCDEK+XEurU18Hb7WT+ThXbkdl6VpFdHsRvqAnhR2g4b+Qzgidmuky5NUZVfEaZqV/g==

检查是否激活:IDEA 界面 —> help —> About,一般是激活到期至 2089 年

有反馈说按照教程配置修改完后,填写注册码还是会报错失效,这里再教大家一个方法,就是通过选择 “License Server” 方式激活,填写如下链接:(当然,前面的步骤还是不能少)

http://jetbrains-license-server

img

MAC 系统激活教程

其实原理都一样,就是在 vmoptions 文件里面制定 - javaagent 路径就可以了,但是由于 mac 的特殊性,对应的目录不容易找到。

mac 中对应的要修改文件的名称是 idea.vmoptions,有些人很聪明,直接找到了 idea 的安装目录下的 idea.vmoptions 文件,比如我对应的目录是:

/Applications/IntelliJ IDEA.app/Contents/bin/idea.vmoptions

结果修改完成后,还是没有用。

在这里我要纠正一下,idea 启动读取的不是上面 /bin 目录下的文件,而是另外有一个文件,这个文件在一个叫做 “/Library” 资源库的隐藏文件夹下面,在我电脑上对应的路径是:

/Users/username/Library/Preferences/IntelliJIdea2019.3/idea.vmoptions

而进入到这个隐藏文件夹的方式就是:

1. 打开 finder

2. 点击上面菜单栏的 "前往",与此同时按住 “option” 按键,隐藏的 “资源库” 就出现了

3. 进入到我上面给的目录下面,找到 idea.vmoptions 就可以了

后面修改的过程,同 windows。

结果如下:

img

激活成功,可以用到 2089 年了

有帮助?点赞加评论,感谢各位老铁的支持~

如果大家觉得我写的不错、清晰易懂的话,可以关注我的公众号 “灰太狼学爪哇”,不定期分享原创技术文章,与君共勉。

2020 最新版 Linux 面试题(一)

2020 最新版 Linux 面试题(一)

Linux 概述

什么是 Linux

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。


Unix 和 Linux 有什么区别?

Linux 和 Unix 都是功能强大的操作系统,都是应用广泛的服务器操作系统,有很多相似之处,甚至有一部分人错误地认为 Unix 和 Linux 操作系统是一样的,然而,事实并非如此,以下是两者的区别。


  1. 开源性

    Linux 是一款开源操作系统,不需要付费,即可使用;Unix 是一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用。


  2. 跨平台性

    Linux 操作系统具有良好的跨平台性能,可运行在多种硬件平台上;Unix 操作系统跨平台性能较弱,大多需与硬件配套使用。


  3. 可视化界面

    Linux 除了进行命令行操作,还有窗体管理系统;Unix 只是命令行下的系统。


  4. 硬件环境

    Linux 操作系统对硬件的要求较低,安装方法更易掌握;Unix 对硬件要求比较苛刻,按照难度较大。


  5. 用户群体

    Linux 的用户群体很广泛,个人和企业均可使用;Unix 的用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者 Unix 硬件厂商使用,如 Sun 等。

    相比于 Unix 操作系统,Linux 操作系统更受广大计算机爱好者的喜爱,主要原因是 Linux 操作系统具有 Unix 操作系统的全部功能,并且能够在普通 PC 计算机上实现全部的 Unix 特性,开源免费的特性,更容易普及使用!


什么是 Linux 内核?

Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。

  1. 系统内存管理

  2. 应用程序管理

  3. 硬件设备管理

  4. 文件系统管理

Linux 的基本组件是什么?

就像任何其他典型的操作系统一样,Linux 拥有所有这些组件:内核,shell 和 GUI,系统实用程序和应用程序。Linux 比其他操作系统更具优势的是每个方面都附带其他功能,所有代码都可以免费下载。


Linux 的体系结构

从大的方面讲,Linux 体系结构可以分为两块:

  1. 用户空间 (User Space) :用户空间又包括用户的应用程序 (User Applications)、C 库 (C Library) 。

  2. 内核空间 (Kernel Space) :内核空间又包括系统调用接口 (System Call Interface)、内核 (Kernel)、平台架构相关的代码 (Architecture-Dependent Kernel Code) 。


为什么 Linux 体系结构要分为用户空间和内核空间的原因?

1、现代 CPU 实现了不同的工作模式,不同模式下 CPU 可以执行的指令和访问的寄存器不同。

2、Linux 从 CPU 的角度出发,为了保护内核的安全,把系统分成了两部分。

用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成用户空间到内核空间的转移:1)系统调用;2)硬件中断。


BASH 和 DOS 之间的基本区别是什么?

BASH 和 DOS 控制台之间的主要区别在于 3 个方面:

  1. BASH 命令区分大小写,而 DOS 命令则不区分;

  2. 在 BASH 下,/character 是目录分隔符,\ 作为转义字符。在 DOS 下,/ 用作命令参数分隔符,\ 是目录分隔符

  3. DOS 遵循命名文件中的约定,即 8 个字符的文件名后跟一个点,扩展名为 3 个字符。BASH 没有遵循这样的惯例。


Linux 开机启动过程?

了解即可

1、主机加电自检,加载 BIOS 硬件信息。

2、读取 MBR 的引导文件 (GRUB、LILO)。

3、引导 Linux 内核。

4、运行第一个进程 init (进程号永远为 1)。

5、进入相应的运行级别。

6、运行终端,输入用户名和密码。


Linux 系统缺省的运行级别?

  • 关机。

  • 单机用户模式。

  • 字符界面的多用户模式 (不支持网络)。

  • 字符界面的多用户模式。

  • 未分配使用。

  • 图形界面的多用户模式。

  • 重启。


Linux 使用的进程间通信方式?

了解即可,不需要太深入。


1、管道 (pipe)、流管道 (s_pipe)、有名管道 (FIFO)。

2、信号 (signal) 。

3、消息队列。

4、共享内存。

5、信号量。

6、套接字 (socket) 。


Linux 有哪些系统日志文件?

比较重要的是 /var/log/messages 日志文件。


该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。

另外,如果胖友的系统里有 ELK 日志集中收集,它也会被收集进去。


Linux 系统安装多个桌面环境有帮助吗?

通常,一个桌面环境,如 KDE 或 Gnome,足以在没有问题的情况下运行。尽管系统允许从一个环境切换到另一个环境,但这对用户来说都是优先考虑的问题。有些程序在一个环境中工作而在另一个环境中无法工作,因此它也可以被视为选择使用哪个环境的一个因素。


什么是交换空间?

交换空间是 Linux 使用的一定空间,用于临时保存一些并发运行的程序。当 RAM 没有足够的内存来容纳正在执行的所有程序时,就会发生这种情况。


什么是 root 帐户

root 帐户就像一个系统管理员帐户,允许你完全控制系统。你可以在此处创建和维护用户帐户,为每个帐户分配不同的权限。每次安装 Linux 时都是默认帐户。


什么是 LILO?

LILO 是 Linux 的引导加载程序。它主要用于将 Linux 操作系统加载到主内存中,以便它可以开始运行。


什么是 BASH?

BASH 是 Bourne Again SHell 的缩写。它由 Steve Bourne 编写,作为原始 Bourne Shell(由 /bin/sh 表示)的替代品。它结合了原始版本的 Bourne Shell 的所有功能,以及其他功能,使其更容易使用。从那以后,它已被改编为运行 Linux 的大多数系统的默认 shell。


什么是 CLI?

命令行界面(英语 **:command-line interface**,缩写]:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。


通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。


什么是 GUI?

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。


图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。


开源的优势是什么?

开源允许你将软件(包括源代码)免费分发给任何感兴趣的人。然后,人们可以添加功能,甚至可以调试和更正源代码中的错误。它们甚至可以让它运行得更好,然后再次自由地重新分配这些增强的源代码。这最终使社区中的每个人受益。


GNU 项目的重要性是什么?

这种所谓的自由软件运动具有多种优势,例如可以自由地运行程序以及根据你的需要自由学习和修改程序。它还允许你将软件副本重新分发给其他人,以及自由改进软件并将其发布给公众。


磁盘、目录、文件

简单 Linux 文件系统?

在 Linux 操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。


也就是说在 Linux 系统中有一个重要的概念 **:一切都是文件 **。其实这是 Unix 哲学的一个体现,而 Linux 是重写 Unix 而来,所以这个概念也就传承了下来。在 Unix 系统中,把一切资源都看作是文件,包括硬件设备。UNIX 系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。


Linux 支持 5 种文件类型,如下图所示:

Linux 的目录结构是怎样的?

这个问题,一般不会问。更多是实际使用时,需要知道


Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:


常见目录说明:


  • /bin:存放二进制可执行文件 (ls,cat,mkdir 等),常用命令一般都在这里;

  • /etc:存放系统管理和配置文件;

  • /home:存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是 /home/user,可以用~user 表示;

  • **/usr **:用于存放系统应用程序;

  • /opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里;

  • /proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;

  • /root:超级用户(系统管理员)的主目录(特权阶级 o);

  • /sbin: 存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等;

  • /dev:用于存放设备文件;

  • /mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;

  • /boot:存放用于系统引导时使用的各种文件;

  • **/lib **:存放着和系统运行相关的库文件 ;

  • /tmp:用于存放各种临时文件,是公用的临时文件存储点;

  • /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;

  • /lost+found:这个目录平时是空的,系统非正常关机而留下 “无家可归” 的文件(windows 下叫什么.chk)就在这里。



本文分享自微信公众号 - 码农编程进阶笔记(lxw1844912514)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

2020 最新版 Linux 面试题(二)

2020 最新版 Linux 面试题(二)

什么是 inode ?

一般来说,面试不会问 inode 。但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础。

理解 inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做 "扇区"(Sector)。每个扇区储存 512 字节(相当于 0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个 "块"(block)。这种由多个扇区组成的 "块",是文件存取的最小单位。"块" 的大小,最常见的是 4KB,即连续八个 sector 组成一个 block。

文件数据都储存在 "块" 中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做 inode,中文译名为 "索引节点"。

每一个文件都有对应的 inode,里面包含了与该文件有关的一些信息。

简述 Linux 文件系统通过 i 节点把文件的逻辑结构和物理结构转换的工作过程?

如果看的一脸懵逼,也没关系。一般来说,面试官不太会问这个题目。

Linux 通过 inode 节点表将文件的逻辑结构和物理结构进行转换。

inode 节点是一个 64 字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在 inode 节点表中最重要的内容是磁盘地址表。在磁盘地址表中有 13 个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。

Linux 文件系统通过把 inode 节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的 inode 节点号,通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。

什么是硬链接和软链接?

1)硬链接

由于 Linux 下的文件是通过索引节点 (inode) 来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。

不足:1)不可以在不同文件系统的文件间建立链接;2)只有超级用户才可以为目录创建硬链接。

2)软链接

软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

实际场景下,基本是使用软链接。总结区别如下:

  • 硬链接不可以跨分区,软件链可以跨分区。

  • 硬链接指向一个 inode 节点,而软链接则是创建一个新的 inode 节点。

  • 删除硬链接文件,不会删除原文件,删除软链接文件,会把原文件删除。

RAID 是什么?

RAID 全称为独立磁盘冗余阵列 (Redundant Array of Independent Disks),基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、 容量巨大的硬盘。RAID 通常被用在服务器电脑上,使用完全相同的硬盘组成一个逻辑扇区,因此操作系统只会把它当做一个硬盘。

RAID 分为不同的等级,各个不同的等级均在数据可靠性及读写性能上做了不同的权衡。在实际应用中,可以依据自己的实际需求选择不同的 RAID 方案。

当然,因为很多公司都使用云服务,大家很难接触到 RAID 这个概念,更多的可能是普通云盘、SSD 云盘酱紫的概念。

安全

一台 Linux 系统初始化环境后需要做一些什么安全工作?

1、添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号。

修改 SSH 端口不一定绝对哈。当然,如果要暴露在外网,建议改下。l

2、服务器使用密钥登陆,禁止密码登陆。

3、开启防火墙,关闭 SElinux ,根据业务需求设置相应的防火墙规则。

4、装 fail2ban 这种防止 SSH 暴力破击的软件。

5、设置只允许公司办公网出口 IP 能登陆服务器 (看公司实际需要)

也可以安装 VPN 等软件,只允许连接 VPN 到服务器上。

6、修改历史命令记录的条数为 10 条。

7、只允许有需要的服务器可以访问外网,其它全部禁止。

8、做好软件层面的防护。

8.1 设置 nginx_waf 模块防止 SQL 注入。

8.2 把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。

什么叫 CC 攻击?什么叫 DDOS 攻击?

  • CC 攻击,主要是用来攻击页面的,模拟多个用户不停的对你的页面进行访问,从而使你的系统资源消耗殆尽。

  • DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。

攻击,即是通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。

怎么预防 CC 攻击和 DDOS 攻击?

防 CC、DDOS 攻击,这些只能是用硬件防火墙做流量清洗,将攻击流量引入黑洞。

流量清洗这一块,主要是买 ISP 服务商的防攻击的服务就可以,机房一般有空余流量,我们一般是买服务,毕竟攻击不会是持续长时间。

什么是网站数据库注入?

  • 由于程序员的水平及经验参差不齐,大部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断。

  • 应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL 注入。

  • SQL 注入,是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,如果管理员没查看日志的习惯,可能被入侵很长时间都不会发觉。

如何过滤与预防?

数据库网页端注入这种,可以考虑使用 nginx_waf 做过滤与预防。

Shell

本小节为选读。我也不太会写 Shell 脚本,都是写的时候,在网络上拼拼凑凑。。。

Shell 脚本是什么?

一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件 (Shell 脚本) 来完成这些日常工作任务。

什么是默认登录 Shell ?

在 Linux 操作系统,"/bin/bash" 是默认登录 Shell,是在创建用户时分配的。

使用 chsh 命令可以改变默认的 Shell 。示例如下所示:

## chsh <用户名> -s <新shell>
## chsh ThinkWon -s /bin/sh

在 Shell 脚本中,如何写入注释?

注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以 # 开头。例子如下:

#!/bin/bash
## This is a command
echo “I am logged in as $USER

语法级

可以在 Shell 脚本中使用哪些类型的变量?

在 Shell 脚本,我们可以使用两种类型的变量:

  • 系统定义变量

    系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过 set 命令查看。

  • 用户定义变量

用户变量由系统用户来生成和定义,变量的值可以通过命令 "echo $<变量名>" 查看。

Shell 脚本中 $? 标记的用途是什么?

在写一个 Shell 脚本时,如果你想要检查前一命令是否执行成功,在 if 条件中使用 $? 可以来检查前一命令的结束状态。

  • 如果结束状态是 0 ,说明前一个命令执行成功。例如:

    root@localhost:~## ls /usr/bin/shar
    /usr/bin/shar
    root@localhost:~## echo $?
    
  • 如果结束状态不是 0,说明命令执行失败。例如:

root@localhost:~## ls /usr/bin/share
ls: cannot access /usr/bin/share: No such file or directory
root@localhost:~## echo $?
2

Bourne Shell (bash) 中有哪些特殊的变量?

下面的表列出了 Bourne Shell 为命令行设置的特殊变量。

内建变量    解释
$0    命令行中的脚本名字
$1    第一个命令行参数
$2    第二个命令行参数
…..    …….
$9    第九个命令行参数
$##    命令行参数的数量
$*    所有命令行参数,以空格隔开

如何取消变量或取消变量赋值?

unset 命令用于取消变量或取消变量赋值。语法如下所示:

## unset <变量名>

Shell 脚本中 if 语法如何嵌套?

if [ 条件 ]
then
命令1
命令2
…..
else
if [ 条件 ]
then
命令1
命令2
….
else
命令1
命令2
…..
fi
fi

在 Shell 脚本中如何比较两个数字?

在 if-then 中使用测试命令( -gt 等)来比较两个数字。例如:

#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi

Shell 脚本中 case 语句的语法?

基础语法如下:

case 变量 in
值1)
命令1
命令2
…..
最后命令
!!
值2)
命令1
命令2
……
最后命令
;;
esac

Shell 脚本中 for 循环语法?

基础语法如下:

for 变量 in 循环列表
do
命令1
命令2
….
最后命令
done

Shell 脚本中 while 循环语法?

如同 for 循环,while 循环只要条件成立就重复它的命令块。

不同于 for 循环,while 循环会不断迭代,直到它的条件不为真。

基础语法:

while [ 条件 ]
do
命令…
done

do-while 语句的基本格式?

do-while 语句类似于 while 语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用 do-while 语句的语法:

do
{
命令
} while (条件)

Shell 脚本中 break 命令的作用?

break 命令一个简单的用途是退出执行中的循环。我们可以在 while 和 until 循环中使用 break 命令跳出循环。

Shell 脚本中 continue 命令的作用?

continue 命令不同于 break 命令,它只跳出当前循环的迭代,而不是整个循环。continue 命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。

如何使脚本可执行?

使用 chmod 命令来使脚本可执行。例子如下:chmod a+x myscript.sh 。

#!/bin/bash 的作用?

#!/bin/bash 是 Shell 脚本的第一行,称为释伴(shebang)行。

  • 这里 # 符号叫做 hash ,而!叫做 bang。

  • 它的意思是命令通过 /bin/bash 来执行。

如何调试 Shell 脚本?

  • 使用 -x'' 数(sh -x myscript.sh)可以调试 Shell 脚本。

  • 另一个种方法是使用 -nv 参数 (sh -nv myscript.sh)。

如何将标准输出和错误输出同时重定向到同一位置?

  • 方法一:2>&1 (如 ## ls /usr/share/doc> out.txt 2>&1 ) 。

  • 方法二:&> (如 ## ls /usr/share/doc &> out.txt ) 。

在 Shell 脚本中,如何测试文件?

test 命令可以用来测试文件。基础用法如下表格:

Test         用法
-d 文件名    如果文件存在并且是目录,返回true
-e 文件名    如果文件存在,返回true
-f 文件名    如果文件存在并且是普通文件,返回true
-r 文件名    如果文件存在并可读,返回true
-s 文件名    如果文件存在并且不为空,返回true
-w 文件名    如果文件存在并可写,返回true
-x 文件名    如果文件存在并可执行,返回true

在 Shell 脚本如何定义函数呢?

函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:

$ diskusage () { df -h ; }
译注:下面是我给的shell函数语法,原文没有
[ function ] 函数名 [()]
{
命令;
[return int;]
}

如何让 Shell 就脚本得到来自终端的输入?

read 命令可以读取来自终端(使用键盘)的数据。read 命令得到用户的输入并置于你给出的变量中。例子如下:

## vi /tmp/test.sh
#!/bin/bash
echo ‘Please enter your name’
read name
echo “My Name is $name## ./test.sh
Please enter your name
ThinkWon
My Name is ThinkWon

如何执行算术运算?

有两种方法来执行算术运算:

  • 1、使用 expr 命令:## expr 5 + 2 。

  • 2、用一个美元符号和方括号($[表达式]):test=$[16 + 4] ; test=$[16 + 4] 。

编程题

判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?

#!/bin/bash
read -p "Input file name: " FILENAME
if [ -c "$FILENAME" ];then
  cp $FILENAME /dev
fi

添加一个新组为 class1 ,然后添加属于这个组的 30 个用户,用户名的形式为 stdxx ,其中 xx 从 01 到 30 ?

#!/bin/bash
groupadd class1
for((i=1;i<31;i++))
do
        if [ $i -le 10 ];then
                useradd -g class1 std0$i
        else
                useradd -g class1 std$i
        fi
done

编写 Shell 程序,实现自动删除 50 个账号的功能,账号名为 stud1 至 stud50 ?

#!/bin/bash
for((i=1;i<51;i++))
do
                userdel -r stud$i
done

写一个 sed 命令,修改 /tmp/input.txt 文件的内容?

要求:

  • 删除所有空行。

  • 一行中,如果包含 “11111”,则在 “11111” 前面插入 “AAA”,在 “11111” 后面插入 “BBB” 。比如:将内容为 0000111112222 的一行改为 0000AAA11111BBB2222 。

[root@~]## cat -n /tmp/input.txt
     1  000011111222
     2
     3  000011111222222
     4  11111000000222
     5
     6
     7  111111111111122222222222
     8  2211111111
     9  112222222
    10  1122
    11




## 删除所有空行命令
[root@~]## sed ''/^$/d'' /tmp/input.txt
000011111222
000011111222222
11111000000222
111111111111122222222222
2211111111
112222222
1122




## 插入指定的字符
[root@~]## sed ''s#\(11111\)#AAA\1BBB#g'' /tmp/input.txt
0000AAA11111BBB222
0000AAA11111BBB222222
AAA11111BBB000000222
AAA11111BBBAAA11111BBB11122222222222
22AAA11111BBB111
112222222
1122

实战

如何选择 Linux 操作系统版本?

一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。

根据具体要求:

  • 安全性要求较高,则选择 Debian 或者 FreeBSD 。

  • 需要使用数据库高级服务和电子邮件网络应用的用户可以选择 SUSE 。

  • 想要新技术新功能可以选择 Feddora ,Feddora 是 RHEL 和 CentOS 的一个测试版和预发布版本。

【重点】根据现有状况,绝大多数互联网公司选择 CentOS 。现在比较常用的是 6 系列,现在市场占有大概一半左右。另外的原因是 CentOS 更侧重服务器领域,并且无版权约束。

CentOS 7 系列,也慢慢使用的会比较多了。

如何规划一台 Linux 主机,步骤是怎样?

  • 1、确定机器是做什么用的,比如是做 WEB 、DB、还是游戏服务器。

    不同的用途,机器的配置会有所不同。

  • 2、确定好之后,就要定系统需要怎么安装,默认安装哪些系统、分区怎么做。

  • 3、需要优化系统的哪些参数,需要创建哪些用户等等的。

请问当用户反馈网站访问慢,你会如何处理?

有哪些方面的因素会导致网站网站访问慢?

  • 1、服务器出口带宽不够用

    本身服务器购买的出口带宽比较小。一旦并发量大的话,就会造成分给每个用户的出口带宽就小,访问速度自然就会慢。

    跨运营商网络导致带宽缩减。例如,公司网站放在电信的网络上,那么客户这边对接是长城宽带或联通,这也可能导致带宽的缩减。

  • 2、服务器负载过大,导致响应不过来

    可以从两个方面入手分析:

    分析系统负载,使用 w 命令或者 uptime 命令查看系统负载。如果负载很高,则使用 top 命令查看 CPU ,MEM 等占用情况,要么是 CPU 繁忙,要么是内存不够。

    如果这二者都正常,再去使用 sar 命令分析网卡流量,分析是不是遭到了攻击。一旦分析出问题的原因,采取对应的措施解决,如决定要不要杀死一些进程,或者禁止一些访问等。

  • 3、数据库瓶颈

    如果慢查询比较多。那么就要开发人员或 DBA 协助进行 SQL 语句的优化。

    如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等。然后,也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。

  • 4、网站开发代码没有优化好

例如 SQL 语句没有优化,导致数据库读写相当耗时。

针对网站访问慢,怎么去排查?

  • 1、首先要确定是用户端还是服务端的问题。当接到用户反馈访问慢,那边自己立即访问网站看看,如果自己这边访问快,基本断定是用户端问题,就需要耐心跟客户解释,协助客户解决问题。

    不要上来就看服务端的问题。一定要从源头开始,逐步逐步往下。

  • 2、如果访问也慢,那么可以利用浏览器的调试功能,看看加载那一项数据消耗时间过多,是图片加载慢,还是某些数据加载慢。

  • 3、针对服务器负载情况。查看服务器硬件 (网络、CPU、内存) 的消耗情况。如果是购买的云主机,比如阿里云,可以登录阿里云平台提供各方面的监控,比如 CPU、内存、带宽的使用情况。

  • 4、如果发现硬件资源消耗都不高,那么就需要通过查日志,比如看看 MySQL 慢查询的日志,看看是不是某条 SQL 语句查询慢,导致网站访问慢。

怎么去解决?

  • 1、如果是出口带宽问题,那么久申请加大出口带宽。

  • 2、如果慢查询比较多,那么就要开发人员或 DBA 协助进行 SQL 语句的优化。

  • 3、如果数据库响应慢,考虑可以加一个数据库缓存,如 Redis 等等。然后也可以搭建 MySQL 主从,一台 MySQL 服务器负责写,其他几台从数据库负责读。

  • 4、申请购买 CDN 服务,加载用户的访问。

  • 5、如果访问还比较慢,那就需要从整体架构上进行优化咯。做到专角色专用,多台服务器提供同一个服务。

Linux 性能调优都有哪几种方法?

1、Disabling daemons (关闭 daemons)。

2、Shutting down the GUI (关闭 GUI)。

3、Changing kernel parameters (改变内核参数)。

4、Kernel parameters (内核参数)。

5、Tuning the processor subsystem (处理器子系统调优)。

6、Tuning the memory subsystem (内存子系统调优)。

7、Tuning the file system (文件系统子系统调优)。

8、Tuning the network subsystem(网络子系统调优)。

本文同步分享在 博客 “lxw1844912514”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于2020 最新版 MySQL 数据库面试题的分享就到这里,希望大家有所收获,若想了解更多关于.NET面试题系列(十六)数据库面试题、2020 最新版 idea 激活教程、2020 最新版 Linux 面试题(一)、2020 最新版 Linux 面试题(二)等相关知识,可以在本站进行查询。

本文标签:

上一篇MySql 主键返回使用(mysql中主键)

下一篇MySql 先排序后分组实现方法(mysql先排序再分组)