本文和大家分享的主要是运维工作中常用的一些技巧,一起来看看吧,希望对大家
学习运维有所帮助。
很多人都说运维工作是苦逼的,不可否认,有时候我也这样觉的,但回头想想,又有哪
份工作不辛苦呢,看看那些在叙利亚前线的记者,在马路上的清洁工,在饭店不停颠勺的厨师,在理发店里两只胳膊永远呆在空中的理发师,不停授课讲话的老师们。。。。。
如果你现在做的这份工作是和运维、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';
来源:
公众账号