首页 > 代码库 > 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运维(三)