首页 > 代码库 > Linux运维(三)

Linux运维(三)

    好几天没复习了,脑壳已经反应不过来了,被问到自己研究过的,绝对SB,前功尽弃!希望明天接到电话啊,进入向往的电商公司!


1、一个sql语句查询很慢怎么办?

答:(1)登录到Mysql,show global status;和show processlist查看数据库系统状态

(2)查看慢查询日志,show variables like ‘%slow%‘,分析是那些SQL语句拖慢了系统

(3)vi /etc/my.cnf配置文件,对参数进行修改,比如最大连接数和表缓存

(4)合理添加索引


2、哪些字段适合当作索引,哪些字段不适合建立索引?内连接外连接的区别?

答:适合:外键字段、主键字段、在where子句中的字段。

不适合:更新频繁的数据不适合建立索引、全表扫描比建立索引快则不需要建立索引、like查询以%开头、有or语句的不适合建立索引

内连接:匹配左右两表某个列值的相同的记录行

外连接:又分为左外连接、右外连接、全外连接,返回某一个表相匹配的行,并在另一表不匹配的行为空值

左外连接就是以左表为准,去匹配右表,如果有匹配的则返回,如果不匹配,则对应的列为空值。左表有多少条数据,结果就是多少条数据 


3、事务隔离级别?

答:(1)未提交读,可以读取未提交事务的数据,也称为脏读

(2)提交读,只能读取已经提交事务的数据,也称为未重复读

(3)可重复读,这个事务在读取某一行的时候,另一个事务又对这行数据进行修改并提交,那么之前的事务就会看到新的行,也称为幻读

(4)串行化读,强制事务顺序,使之不可能冲突,从而解决幻读问题


4、mysql数据库cpu飙升到500%的话他怎么处理?

答:(1)多实例的服务器,先top查看是那一个进程,哪个端口占用CPU多;

(2)show processlist查看是否由于大量并发,锁引起的负载问题;

(3)否则,查看慢查询,找出执行时间长的sql;explain分析sql是否走索引,sql优化;

(4)再查看是否缓存失效引起,需要查看buffer命中率


5、bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)

I am oldboy teacher welcome to oldboy training class.
#!/bin/bash
for word in I am oldboy teacher welcome to oldboy training class
  do
     if [ `echo ${word}|wc -L` -le 6 ]   ## -L, --max-line-length显示最长行的长度
     then
        echo $word
     fi
  done

  

6、正则表达式匹配具有IP地址的行

答:grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" test.txt  ##事实上,这不是正确答案,还需要细分255等,但是这个好记,一般适用,还必须是扩展的


7、[1,15,4,6,29,22] 把他进行排序,并去掉中括号和逗号 (这要是笔试题遇到,跪了)

答:(1)sed -i ‘s/,/ /g ;s/\[//g ;s/\]//g ‘ test.txt  ##把逗号变为空格,并删除中括号,-i改变原文件,但是-i不会输出该文件

(2)sed -i ‘s/ /\n/g‘ test.txt |sort -nr ##把空格变为换行,并进行逆向排序

(3)sed -i ‘s/\n/ /g‘ test.txt  ##已经排完序,但是需要改为横行输出


8、设置网卡MTU为1K的命令是

答:临时生效:ifconfig eth0 mtu 1024 

永久生效:echo "MTU=1024" >>/etc/sysconfig/network-scripts/ifcfg-eth0


9:将当期Linux终端的系统环境变量改为GB2312; 

答:export LANG=zh_CN.GB2312


10、建立一个用户组(group)group1,该组只能对目录/opt/dir1进行读取; 

答:groupadd group1;setfacl -m g:group1:r-- /opt/dir1


11、如果每天3:00时,需要将进程myproc自动强行终止掉(使用kill停止),之后并重新启动(执行 myproc命令即可),则应该执行的脚本命令分别是:

0 3 * * * /bin/pkill -18 myproc 


12、用awk实现如下结果?(如果不知道paste命令,很难做出来)

cat 1.txt

1 2 3

1 2 3

cat 2.txt

a b c 

a b c

实现:2 a c

 2 a c 

答:paste 1.txt 2.txt |awk ‘{print $2,$4,$6}‘


13、MySQL的锁类型,何时会触发锁?

答:页级:引擎 BDB。

表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行

行级:引擎 INNODB , 单独的一行记录加锁

用索引字段做为条件进行修改时, 是否表锁的取决于这个索引字段能否确定记录唯一,当索引值对应记录不唯一,会进行锁表,相反则行锁。

读锁应该是第一个sql就释放,写锁在整个事务结束时释放


14、session和cookie的区别

答:(1)cookie数据存放在客户的浏览器上,session数据放在服务器上。

(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session,因为它不会任意读取客户存储的信息。

(3)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。


15、MySQL的索引的实现方式?索引类型?

答:方式:B+树、散列索引、位图索引   类型:普通索引、主键索引、唯一索引、聚集索引

参考文档:http://www.cnblogs.com/barrywxx/p/4351901.html


16、session原理和共享方式。

答:(1)定义:session是由服务器维持的一个存储空间,用户连接服务器时,会由服务端生成一个唯一的session_ID,该session_ID被称为标识符来存取服务端的session存储空间。

(2)原理:sessionID这一数据是保存在cookie中的,用户提交页面时,会将这一sessionID提交到服务端,用于存取session数据。但是不会完全依赖于cookie,可以通过服务端自动URL重写方式来传递sessionID的,并且整个过程对程序员透明。

(3)方式:基于cookie的共享,基于数据库的共享,基于memcached的共享

参考文档:http://blog.csdn.net/zhuanshenweiliu/article/details/38844741


17、取出/etc/passwd中shell出现的次数?(awk数组解决)

答:awk -F ":" ‘{arr[$NF]++}END{for (shell in arr){print shell,arr[shell]}}‘ /etc/passwd


18、合并文件问题(这题比上面更难一些,主要是排序问题和大小变换问题)

a.txt

100 $5,000 

200 $500 

300 $3,000 

400 $1,250


b.txt

100 Json Smith 

200 John Doe 

300 Sanjay Gupta 

400 Ashok Sharma

要求结果

400 ashok sharma $1,250

200 john doe $500

100 json smith $5,000

300 sanjay gupta $3,000


答:paste b a|awk ‘{print $1,$2,$3,$5}‘|tr [:upper:] [:lower:]|sort -k 2 >c.txt

##tr命令将大写转为小写,sort -k根据关键字排序,2表示第二列


19、打印本机交换分区大小,输出如下:(这题是很难的,如果不是上机,很难做出来)

Swap: 2016M

答:free -m|grep -i swap|awk ‘{print $1,$2"M"}‘或者下面第二种方法

top -n 1|grep Swap|sed ‘s/k.*//g‘|awk ‘{print $1,$2/1024"M"}‘

##top 命令显示系统资源占用情况,-n 1表示只调用1次,Swap: 16779884k total 将k以及后面的字符串替换为空,这样这剩下Swap: 16779884,除以1024即可



20、测试输出本机创建20000个目录所用的时间?(我日,这题要是没见过以为是世纪难题!)

time for i in `seq 1 20000`; do mkdir "$i" &>/dev/null; done

输出;

real0m0.065s

user0m0.015s

sys0m0.024s

##值得注意的是do后面没有分号,另外/dev/null只是把屏幕产生的结果放在黑洞中,但是依然会产生这些目录


21、求root用户登陆了多少时间。

答:用现在的时间减去登陆时间,一步做不了用脚本

#!/bin/bash
login=`who am i | awk ‘{print $4}‘`
logintime=`date -d $login +%s`   ##%s是取到秒的意思,因为上面只有小时:分钟
now=`date +%s`  ##-d显示指定字符串所描述的时间,而非当前时间
let last=now-logintime   ##用let命令进行计算操作时不需要用$符号
let lasttime=last/3600
echo "logged on for $lasttime hours"


22、Nagios监控linux服务器的通信过程?

答:当Nagios需要监控某个远程linux主机的服务或者资源情况时:

1)nagios会运行check_nrpe插件,我们要在nagios配置文件中告诉它要检查什么(/usr/local/nagios/etc/objects/commands.cfg)

2)check_nrpe插件会通过SSL连接到远程的NRPE daemon

3)NRPE daemon会运行相应的nagios插件来执行检查本地资源或服务

4)NRPE daemon将检查的结果返回给check_nrpe插件,插件将其递交给nagios程序做处理

5)CGI图形显示展现给用户

注意:NRPE daemon需要nagios插件安装在远程被监控linux主机上,否则,daemon不能做任何的监控


23、有商品表, 有主键goods_id, 栏目列cat_id, 价格price,在价格列上已经加了索引,但按价格查询还是很慢,可能是什么原因。

答:在实际场景中,一个电商网站的商品分类很多,直接在所有商品中,按价格查商品,是极少的,一般客户都来到分类下,然后再查.

改正: 去掉单独的Price列的索引, 加 (cat_id,price)复合索引再查询


24、解释varchar(30)中的30、int(20)中20的涵义?为什么这么设计?int(20)存储的数字的上限和下限是多少?

答:20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;varchar(30)中30的涵义最大存储30个字符,它是可变长度。

设计原因:实际业务有这样的需求。4个字节是32位,可能是第一位为0,则正数是2^32,可能第一位是1,则负数是-(2^32-1)


25、MySQL主从复制binlog 日志格式

答:row:只需要记录哪一条记录被修改了,修改成什么样了

statment:每一条会修改数据的SQL语句都会记录到 master 的bin-log中

mixed:就是前两种模式的结合


26、如何将本地80端口的请求转发到9000端口,当前主机IP为192.168.2.1(这题经常搞混)

答:iptables -A PREROUTING  -d 192.168.2.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.18:9000


27、处理以下oldboy.log,将域名取出并进行计数排序

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

答:awk -F "/" ‘{print $3}‘ oldboy.log |sort|uniq -c


28、如何提高MySql的安全性?

答:(1)如果MYSQL客户端和服务器端的连接需要跨越并通过不可信任的网络,那么需要使用ssh隧道来加密该连接的通信。

(2)使用set password语句来修改用户的密码,先“mysql -u root”登陆数据库系统,然后“mysql> update mysql.user set password=password(’newpwd’)”,最后执行“flush privileges”就可以了。

Mysql需要提防的攻击有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于acl即访问控制列表的安全措施来完成。也有一些对ssl连接的支持。

(3)设置除了root用户外的其他任何用户不允许访问mysql主数据库中的user表;加密后存放在user表中的加密后的用户密码一旦泄露,其他人可以随意用该用户名/密码相应的数据库;

(4)使用grant和revoke语句来进行用户访问控制的工作;

采用防火墙可以去掉50%的外部危险,让数据库系统躲在防火墙后面工作,或放置在dmz区域中;

(5)为了防止被恶意传入非法参数,例如where id=234,别人却输入where id=234 or 1=1导致全部显示,所以在web的表单中使用”或”"来用字符串,在动态url中加入%22代表双引号、%23代表井号、%27代表单引号;传递未检查过的值给mysql数据库是非常危险的;

(6)确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限;


29、线程通信、以及线程同步机制?

答:通信:跟进程一样,消息队列、共享内存、套接字、信号、信号量、管道通信

同步:(1)、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。 

(2)、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 

(3)、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 

(4)、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作


30、mysql优化?

答:(1)表的设计合理(符合3NF)(2)添加适当索引(3)分表技术(4)读写【update/insert/delete】分离(5)存储过程【模块化编程】(6)mysql配置文件优化【配置最大并发数、缓存大小】(7)硬件升级(固态硬盘或RAID阵列)(8)定时清除不需要的数据,定时碎片整理




Linux运维(三)