wjunxi 发表于 2017-3-3 21:11:16

从事运维工作,你应该知道这些技巧

本文和大家分享的主要是运维工作中常用的一些技巧,一起来看看吧,希望对大家学习运维有所帮助。  很多人都说运维工作是苦逼的,不可否认,有时候我也这样觉的,但回头想想,又有哪份工作不辛苦呢,看看那些在叙利亚前线的记者,在马路上的清洁工,在饭店不停颠勺的厨师,在理发店里两只胳膊永远呆在空中的理发师,不停授课讲话的老师们。。。。。  如果你现在做的这份工作是和运维、DBA相关,不管现状如何,是不是应该往好的方向发展呢,在苦逼,乏味,忙碌的工作中寻找乐趣,才能感受到这其中的不一样。有句话说的好, 当你做真正自己喜欢的事情时,你才会很少感觉到疲倦。  扯多了。下面是我整理的日常运维工作中常用的 技巧 , 说是技巧 ,其实无非是帮助你提高效率,简化操作。只整理了 一部分,分享给大家。  Linux  1. screen  screen是一个可以统一管理多个会话,并可在会话之间切换,共享会话的工作,更是 DBA在执行DDL,大事务性工作 的利器。  示例:  ##新建一个screen  $ screen -R lufei##查看所有screen  $ screen -lsThere is a screen on:14919.lufei(Attached)1 Socket in /var/run/screen/S-lufei.##将指定的screen离线  $ screen -D 14919  ##恢复一个screen  $ screen -R 14919  2.Ctrl-Z/fg/bg/jobs  如果你正在前台正运行一个执行时间很长的任务,但又需要做其他的事情,这个时候你可以使用Ctrl-Z,将前台任务挂到后台。  常用:  ·CTRL+Z挂起进程并放入后台。  ·jobs       显示当前暂停的进程。  ·bg %N   使第N个任务在后台运行,默认表示对最后一个进程操作。  ·fg   %N使第N个任务在前台运行,默认表示对最后一个进程操作。  示例:  ##使用Ctrl-Z 将cp任务挂到后台  $ cp dump.gz dump.gz2016  ^Z+Stoppedcp -i dump.gz dump.gz2016  ##jobs 查看后台任务  $ jobs  +Stoppedcp -i dump.gz dump.gz2016  ## fg 将最后一个后台任务拉到前台  $ fg  cp -i dump.gz dump.gz2016  ##可以再次使用Ctrl-Z 将cp任务挂到后台  ^Z+Stopped cp -i dump.gz dump.gz2016  ##使用bg,将最后一个任务放到后台执行  $ bg  + cp -i dump.gz dump.gz2016 &  ##使用jobs 可以看到cp在后台执行  $ jobs  +Runningcp -i dump.gz dump.gz2016 &  3. shell set 命令  set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值, [+ -]分别为打开和关闭这个参数,set 有很多参数,而set -x是我最常用的。 set -x ,显示shell脚本运行的冗余输出,每一条命令以及加载命令行中的任何参数都会显示出来, 调试shell脚步非常方便 。  $ cat set.sh #!/bin/bash  set -x  echo -n "your name?"  read name  if [ $name = "lufei" ]then  echo "hello"else  echo "haha"  fi  $ bash set.sh  + echo -n 'your name?'your name?  + read name  lufei  + '[' lufei = lufei ']'+ echo hello  hello  另一中方式sh -x  $ cat set.sh #!/bin/bash  echo -n "your name?"  read name  if [ $name = "lufei" ]  then  echo "hello"  else  echo "haha"  fi    $ sh -x set.sh  + echo -n 'your name?'your name?  + read name  lufei  + '[' lufei = lufei ']'  + echo hello  hello  4. shell 日志记录  运维工作的同学编写shell脚步应该是硬技能,将一些复杂的操作编写成shell脚步,可以提高不少效率,shell脚步记录日志是必不可少的,日志可以用来排错,追溯等用途,下面提供一个记录shell脚步日志的方法。  LOGFILE=${BASEDIR}/logs/${DTTIME}.log  exec 3>&1 4>&2 1>>${LOGFILE} 2>&1  5. shell 并发  上面刚说到运维同学会使用shell是硬性要求,那么如何在shell中使用并发呢,见下面代码。  #!/bin/bash  cat ip.txt|while read info;do  zn=`echo ${info}|awk '{print $1}'`;  IP=`echo ${info}|awk '{print $2}'`;  joblist=($(jobs -p)); --还可以根据ps -ef|grep 当前脚步名称|wc -lwhile(( ${#joblist} >= 10 ))--控制并发数,可以做为参数do  sleep 40joblist=($(jobs -p));done  scp ${IP}:/home/databak/*${zn}*2016050603* /home/lufei/dump/ &done;  6. crt显示主机名  有时候在crt中打开多个窗口,太多了后,自己都分不清哪个是哪个,使用下面的方法,可以在打开crt时显示主机名  ## 在/etc/profile 中增加以下,然后crt选择Xtermecho -ne "\e]2;$(hostname)\a"  还有一些常用命令如下:  ·Ctrl+a 光标移动到命令行开始  ·Ctrl+e 光标移动到到命令行末尾  ·Ctrl+u 清除剪切光标之前的内容  ·Ctrl+w 清除光标前的一个单词  ·Ctrl+r 查找历史命令  ·Ctrl+l 清屏  MySQL  1.MySQL与shell交互  有些时候我们需要从MySQL中读出数据,然后传给shell,去做一些逻辑判断,下面是一个实例,目前我们使用beego框架开发了一套SQL上线平台,这个web平台主要控制审批流程,然后将审批过的信息存到MySQL中,后台我们使用以下脚本远程执行。  #!/bin/bashwhile read id dbname dbip sqlfile; do echo $id $dbname $dbip $sqlfile##mysql -h$dbip -utest -p'test'  -D $dbname --default-character-set=utf8 -vvv < ${SQLDIR}/$sqlfiledone < <(/usr/bin/mysql -utest -p"test"  -s --skip-column-names-e "use enndb;select id,n,d,e from aw where s='3'")  还有一个经典的交互案例就是备份,我们都知道mysqldump备份是串行的,多个database,一个一个备份,同database中一个一个table去备份,如何可以并行使用mysqldump备份呢,写多个mysqldump,太low了吧。下面代码可以做到。  for db in $(mysql -e "show databases" -s --skip-column-names);do echo $db;  mysqldump ........ &done  2.MySQL 解压恢复  使用mysqldump备份的时候,一般我们为了节省磁盘空间会使用以下方法进行压缩,  mysqldump -hlocalhost --default-character-set=utf8  --master-data=2 --single-transaction  -B a   | gzip > 'a'`date +%Y%m%d%H%M`.sql.gz  在进行恢复/搭建从库时需要先解压,再去导入,需要两条命令,简洁的方法如下:  gunzip < a201612071131.sql.gz |mysql  3.MySQL loose_  当你在不同的MySQL版本中,或是不同的MySQL分支中切换my.conf配置文件时(少数),可能有些参数会不兼容,使用 loose_ 参数,如果没有这个参数,将会忽略。  [root@dodba ~]# grep dodba /etc/my.cnf  dodba=1  [root@dodba ~]# /etc/init.d/mysql startStarting MySQL (Percona Server)......  ERROR! The server quit without updating PID file (/home/mysql/dodba.com.pid).  [root@dodba ~]# tail -f error.log2016-12-19T10:08:31.875314Z 0 [ERROR] unknown variable 'dodba=1'2016-12-19T10:08:31.875371Z 0 [ERROR] Aborting  ##增加loose_前缀  [root@dodba ~]# grep dodba /etc/my.cnf  loose_dodba=1  [root@dodba ~]# /etc/init.d/mysql start  Starting MySQL (Percona Server).. SUCCESS!  4.MySQL 帮助  众多的MySQL命令,除了常用的,应该有很多都记不住,其实不用查文档,直接使用 ?+命令就会有很详细的帮助。  mysql> ? purge  Name: 'PURGE BINARY LOGS'Description:Syntax:  PURGE { BINARY | MASTER } LOGS  { TO 'log_name' | BEFORE datetime_expr }  Examples:  PURGE BINARY LOGS TO 'mysql-bin.010';  PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';  5.MySQL --initialize-insecure  相信大家都知道MySQL5.7版本的安装最重要的一个变化就是不在使用mysql_install_db,而是使用mysqld --initialize,其实还有一个参数是 --initialize-insecure 。  两个参数的区别就是前者生成一个临时密码在日志中,对于自动化安装脚步来讲还得处理,而直接使用后者,会生成一个空密码的账号,安装脚步就不需要再处理,但是登陆后为安全起见还是希望你能修改密码。  6.MySQL -vv  在mysql中使用 -vv 参数,可以返回更详细的信息,有详细的信息就会更容易排错。  ##什么都不返回  # mysql-e "use tdb;update t set name=444;"     ##-v 显示语句本身  # mysql-v -e "use tdb;update t set name=444;"  --------------update t set name=444--------------    ##-vv 显示执行时间,结果  #mysql-vv -e "use tdb;update t set name=444;"  --------------update t set name=444--------------  Query OK, 0 rows affected (0.02 sec)  Rows matched: 2Changed: 0Warnings: 0  Bye  7.MySQL 类型转换  有些时候,有同学在SQL的where条件中会直接写 key=1278 类似(值不加引号)的谓词条件,但如果这个key是varchar类型,就会发生隐式类型转换,导致全表扫描。其实你只需要记住一条,谓词条件中的值,都加 引号 就可以了。 下面是个实例:  mysql> desc t;  +-------+-------------+------+-----+---------+-------+  | Field | Type      | Null | Key | Default | Extra |  +-------+-------------+------+-----+---------+-------+  | id    | int(11)   | YES|   | NULL    |       |  | name| varchar(20) | YES|   | NULL    |       |  +-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)  mysql> alter table t add index ind_id(id);  Query OK, 0 rows affected (0.19 sec)  Records: 0Duplicates: 0Warnings: 0  mysql> alter table t add index ind_name(name);  Query OK, 0 rows affected (0.09 sec)  Records: 0Duplicates: 0Warnings: 0  ##隐式转换,全表扫描select * from t where name=222;  ##不会发生隐式类型转换,索引扫描select * from t where name='222';select * from t where id=1;select * from t where id='1';

来源:公众账号
页: [1]
查看完整版本: 从事运维工作,你应该知道这些技巧