Swift51.com
麦子学院 头像
麦子学院  2017-03-03 21:12

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

回复:0  查看:2065  
本文和大家分享的主要是运维工作中常用的一些技巧,一起来看看吧,希望对大家 学习运维有所帮助。
  很多人都说运维工作是苦逼的,不可否认,有时候我也这样觉的,但回头想想,又有份工作不辛苦呢,看看那些在叙利亚前线的记者,在马路上的清洁工,在饭店不停颠勺的厨师,在理发店里两只胳膊永远呆在空中的理发师,不停授课讲话的老师们。。。。。
  如果你现在做的这份工作是和运维、DBA 相关,不管现状如何,是不是应该往好的方向发展呢,在苦逼,乏味,忙碌的工作中寻找乐趣,才能感受到这其中的不一样。有句话说的好,  当你做真正自己喜欢的事情时,你才会很少感觉到疲倦。
  扯多了。下面是我整理的日常运维工作中常用的  技巧    说是技巧  ,其实无非是帮助你提高效率,简化操作。只整理了  一部分,分享给大家。
  Linux
  1. screen
  screen 是一个可以统一管理多个会话,并可在会话之间切换,共享会话的工作,更是  DBA在执行DDL,大事务性工作  的利器。
  示例:
  ## 新建一个 screen
  [lufei@dodba ~]$ screen -R lufei## 查看所有 screen
  [lufei@dodba ~]$ screen -lsThere is a screen on:14919.lufei(Attached)1 Socket  in /var/run/screen/S-lufei.## 将指定的 screen 离线
  [lufei@dodba ~]$ screen -D 14919
  [14919.lufei power detached.]## 恢复一个 screen
  [lufei@dodba ~]$ screen -R 14919
  2.Ctrl-Z/fg/bg/jobs
  如果你正在前台正运行一个执行时间很长的任务,但又需要做其他的事情,这个时候你可以使用Ctrl-Z ,将前台任务挂到后台。
  常用:
  ·CTRL+Z   挂起进程并放入后台。
  ·jobs        显示当前暂停的进程。
  ·bg %N    使第 N 个任务在后台运行,默认表示对最后一个进程操作。
  ·fg   %N   使第 N 个任务在前台运行,默认表示对最后一个进程操作。
  示例:
  ## 使用 Ctrl-Z  cp 任务挂到后台
  [lufei@dodba ~]$ cp dump.gz dump.gz2016
  ^Z[1]+  Stopped  cp -i dump.gz dump.gz2016
  ##jobs  查看后台任务
  [lufei@dodba ~]$ jobs
  [1]+  Stopped  cp -i dump.gz dump.gz2016
  ## fg  将最后一个后台任务拉到前台
  [lufei@dodba ~]$ fg
  cp -i dump.gz dump.gz2016
  ## 可以再次使用 Ctrl-Z  cp 任务挂到后台
  ^Z[1]+  Stopped cp -i dump.gz dump.gz2016
  ## 使用 bg ,将最后一个任务放到后台执行
  [lufei@dodba ~]$ bg
  [1]+ cp -i dump.gz dump.gz2016 &
  ## 使用 jobs  可以看到 cp 在后台执行
  [lufei@dodba ~]$ jobs
  [1]+  Running  cp -i dump.gz dump.gz2016 &
  3. shell set  命令
  set 命令作用主要是显示系统中已经存在的 shell 变量,以及设置 shell 变量的新变量值,  [+ -] 分别为打开和关闭这个参数, set  有很多参数,而 set -x 是我最常用的。  set -x  ,显示shell 脚本运行的冗余输出,每一条命令以及加载命令行中的任何参数都会显示出来,  调试shell脚步非常方便 
  [lufei@dodba ]$  cat  set. sh  #!/bin/bash
   set -x
  echo -n "your name?"
   read name
   if [ $name = "lufei" ] then
   echo "hello" else
   echo "haha"
   fi
  [lufei@dodba ]$ bash  set. sh
  echo -n 'your name?'your name?
  read name
  lufei
  + '[' lufei = lufei ']'+  echo hello
  hello
  另一中方式sh -x
  [lufei@dodba]$  cat  set. sh  #!/bin/bash
  echo -n "your name?"
   read name
   if [ $name = "lufei" ]
   then
   echo "hello"
   else
   echo "haha"
   fi
  
  [lufei@dodba]$  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 -l while(( ${#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/bash while 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}/$sqlfile done < <(/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  参数,可以返回更详细的信息,有详细的信息就会更容易排错。
   ##什么都不返回
   [root@dodba ~]# mysql  -e "use tdb;update t set name=444;"   
   ##-v 显示语句本身
   [root@dodba ~]# mysql  -v -e "use tdb;update t set name=444;"
   --------------update t set name=444--------------
  
   ##-vv 显示执行时间,结果
   [root@dodba ~]#  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: 2   Changed: 0   Warnings: 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: 0  Duplicates: 0  Warnings: 0
  mysql> alter table t  add index  ind_name(name);
  Query OK, 0 rows  affected (0.09 sec)
  Records: 0  Duplicates: 0  Warnings: 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';


来源: 公众账号