很多人都說(shuō)運(yùn)維工作是苦逼的,不可否認(rèn),有時(shí)候我也這樣覺(jué)的,但回頭想想,又有哪
份工作不辛苦呢,看看那些在敘利亞前線(xiàn)的記者,在馬路上的清潔工,在飯店不停顛勺的廚師,在理發(fā)店里兩只胳膊永遠(yuǎn)呆在空中的理發(fā)師,不停授課講話(huà)的老師們。。。。。
如果你現(xiàn)在做的這份工作是和運(yùn)維、DBA
相關(guān),不管現(xiàn)狀如何,是不是應(yīng)該往好的方向發(fā)展呢,在苦逼,乏味,忙碌的工作中尋找樂(lè)趣,才能感受到這其中的不一樣。有句話(huà)說(shuō)的好,
當(dāng)你做真正自己喜歡的事情時(shí),你才會(huì)很少感覺(jué)到疲倦。
扯多了。下面是我整理的日常運(yùn)維工作中常用的
技巧
,
說(shuō)是技巧
,其實(shí)無(wú)非是幫助你提高效率,簡(jiǎn)化操作。只整理了
一部分,分享給大家。
Linux
1. screen
screen
是一個(gè)可以統(tǒng)一管理多個(gè)會(huì)話(huà),并可在會(huì)話(huà)之間切換,共享會(huì)話(huà)的工作,更是
DBA在執(zhí)行DDL,大事務(wù)性工作
的利器。
示例:
##
新建一個(gè)
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
離線(xiàn)
[lufei@dodba ~]$ screen -D 14919
[14919.lufei power detached.]##
恢復(fù)一個(gè)
screen
[lufei@dodba ~]$ screen -R 14919
2.Ctrl-Z/fg/bg/jobs
如果你正在前臺(tái)正運(yùn)行一個(gè)執(zhí)行時(shí)間很長(zhǎng)的任務(wù),但又需要做其他的事情,這個(gè)時(shí)候你可以使用Ctrl-Z
,將前臺(tái)任務(wù)掛到后臺(tái)。
常用:
·CTRL+Z
掛起進(jìn)程并放入后臺(tái)。
·jobs
顯示當(dāng)前暫停的進(jìn)程。
·bg %N
使第
N
個(gè)任務(wù)在后臺(tái)運(yùn)行,默認(rèn)表示對(duì)最后一個(gè)進(jìn)程操作。
·fg %N
使第
N
個(gè)任務(wù)在前臺(tái)運(yùn)行,默認(rèn)表示對(duì)最后一個(gè)進(jìn)程操作。
示例:
##
使用
Ctrl-Z
將
cp
任務(wù)掛到后臺(tái)
[lufei@dodba ~]$ cp dump.gz dump.gz2016
^Z[1]+ Stopped cp -i dump.gz dump.gz2016
##jobs
查看后臺(tái)任務(wù)
[lufei@dodba ~]$ jobs
[1]+ Stopped cp -i dump.gz dump.gz2016
## fg
將最后一個(gè)后臺(tái)任務(wù)拉到前臺(tái)
[lufei@dodba ~]$ fg
cp -i dump.gz dump.gz2016
##
可以再次使用
Ctrl-Z
將
cp
任務(wù)掛到后臺(tái)
^Z[1]+ Stopped cp -i dump.gz dump.gz2016
##
使用
bg
,將最后一個(gè)任務(wù)放到后臺(tái)執(zhí)行
[lufei@dodba ~]$ bg
[1]+ cp -i dump.gz dump.gz2016 &
##
使用
jobs
可以看到
cp
在后臺(tái)執(zhí)行
[lufei@dodba ~]$ jobs
[1]+ Running cp -i dump.gz dump.gz2016 &
3. shell set
命令
set
命令作用主要是顯示系統(tǒng)中已經(jīng)存在的
shell
變量,以及設(shè)置
shell
變量的新變量值,
[+ -]
分別為打開(kāi)和關(guān)閉這個(gè)參數(shù),
set
有很多參數(shù),而
set -x
是我最常用的。
set -x
,顯示shell
腳本運(yùn)行的冗余輸出,每一條命令以及加載命令行中的任何參數(shù)都會(huì)顯示出來(lái),
調(diào)試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
日志記錄
運(yùn)維工作的同學(xué)編寫(xiě)shell
腳步應(yīng)該是硬技能,將一些復(fù)雜的操作編寫(xiě)成
shell
腳步,可以提高不少效率,
shell
腳步記錄日志是必不可少的,日志可以用來(lái)排錯(cuò),追溯等用途,下面提供一個(gè)記錄
shell
腳步日志的方法。
LOGFILE=${BASEDIR}/logs/${DTTIME}.log
exec 3>&1 4>&2 1>>${LOGFILE} 2>&1
5. shell
并發(fā)
上面剛說(shuō)到運(yùn)維同學(xué)會(huì)使用shell
是硬性要求,那么如何在
shell
中使用并發(fā)呢,見(jiàn)下面代碼。
#!/bin/bash
cat ip.txt|
while read info;
do
zn=`echo ${info}|awk '{print $1}'`;
IP=`echo ${info}|awk '{print $2}'`;
joblist=($(jobs -p)); --
還可以根據(jù)
ps -ef|grep
當(dāng)前腳步名稱(chēng)
|wc -l
while(( ${#joblist} >= 10 ))--
控制并發(fā)數(shù),可以做為參數(shù)
do
sleep 40joblist=($(jobs -p));
done
scp ${IP}:/home/databak/*${zn}*2016050603* /home/lufei/dump/ &
done;
6. crt
顯示主機(jī)名
有時(shí)候在crt
中打開(kāi)多個(gè)窗口,太多了后,自己都分不清哪個(gè)是哪個(gè),使用下面的方法,可以在打開(kāi)
crt
時(shí)顯示主機(jī)名
##
在
/etc/profile
中增加以下,然后
crt
選擇
Xtermecho -ne "\e]2;$(hostname)\a"
還有一些常用命令如下:
·Ctrl+a
光標(biāo)移動(dòng)到命令行開(kāi)始
·Ctrl+e
光標(biāo)移動(dòng)到到命令行末尾
·Ctrl+u
清除剪切光標(biāo)之前的內(nèi)容
·Ctrl+w
清除光標(biāo)前的一個(gè)單詞
·Ctrl+r
查找歷史命令
·Ctrl+l
清屏
MySQL
1.MySQL
與
shell
交互
有些時(shí)候我們需要從MySQL
中讀出數(shù)據(jù),然后傳給
shell
,去做一些邏輯判斷,下面是一個(gè)實(shí)例,目前我們使用
beego
框架開(kāi)發(fā)了一套
SQL
上線(xiàn)平臺(tái),這個(gè)
web
平臺(tái)主要控制審批流程,然后將審批過(guò)的信息存到
MySQL
中,后臺(tái)我們使用以下腳本遠(yuǎn)程執(zhí)行。
#!/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'")
還有一個(gè)經(jīng)典的交互案例就是備份,我們都知道mysqldump
備份是串行的,多個(gè)
database
,一個(gè)一個(gè)備份,同
database
中一個(gè)一個(gè)
table
去備份,如何可以并行使用
mysqldump
備份呢,寫(xiě)多個(gè)
mysqldump
,太
low
了吧。下面代碼可以做到。
for db
in $(mysql -e "show databases" -s --skip-column-names);
do echo $db;
mysqldump ........ &
done
2.MySQL
解壓恢復(fù)
使用mysqldump
備份的時(shí)候,一般我們?yōu)榱斯?jié)省磁盤(pán)空間會(huì)使用以下方法進(jìn)行壓縮,
mysqldump -hlocalhost --default-character-set=utf8
--master-data=2 --single-transaction
-B a | gzip > 'a'`date +%Y%m%d%H%M`.sql.gz
在進(jìn)行恢復(fù)/
搭建從庫(kù)時(shí)需要先解壓,再去導(dǎo)入,需要兩條命令,簡(jiǎn)潔的方法如下
:
gunzip < a201612071131.sql.gz |mysql
3.MySQL loose_
當(dāng)你在不同的MySQL
版本中,或是不同的
MySQL
分支中切換
my.conf
配置文件時(shí)(少數(shù)),可能有些參數(shù)會(huì)不兼容,使用
loose_
參數(shù),如果沒(méi)有這個(gè)參數(shù),將會(huì)忽略。
[
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
命令,除了常用的,應(yīng)該有很多都記不住,其實(shí)不用查文檔,直接使用
?+命令
就會(huì)有很詳細(xì)的幫助。
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
版本的安裝最重要的一個(gè)變化就是不在使用
mysql_install_db
,而是使用
mysqld --initialize
,其實(shí)還有一個(gè)參數(shù)是
--initialize-insecure
。
兩個(gè)參數(shù)的區(qū)別就是前者生成一個(gè)臨時(shí)密碼在日志中,對(duì)于自動(dòng)化安裝腳步來(lái)講還得處理,而直接使用后者,會(huì)生成一個(gè)空密碼的賬號(hào),安裝腳步就不需要再處理,但是登陸后為安全起見(jiàn)還是希望你能修改密碼。
6.MySQL -vv
在mysql
中使用
-vv
參數(shù),可以返回更詳細(xì)的信息,有詳細(xì)的信息就會(huì)更容易排錯(cuò)。
##什么都不返回
[root@dodba ~]# mysql -e "use tdb;update t set name=444;"
##-v 顯示語(yǔ)句本身
[root@dodba ~]# mysql -v -e "use tdb;update t set name=444;"
--------------update t set name=444--------------
##-vv 顯示執(zhí)行時(shí)間,結(jié)果
[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
類(lèi)型轉(zhuǎn)換
有些時(shí)候,有同學(xué)在SQL
的
where
條件中會(huì)直接寫(xiě)
key=1278
類(lèi)似(值不加引號(hào))的謂詞條件,但如果這個(gè)
key
是
varchar
類(lèi)型,就會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換,導(dǎo)致全表掃描。其實(shí)你只需要記住一條,謂詞條件中的值,都加 引號(hào) 就可以了。 下面是個(gè)實(shí)例:
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
##
隱式轉(zhuǎn)換,全表掃描
select *
from t
where name=222;
##
不會(huì)發(fā)生隱式類(lèi)型轉(zhuǎn)換,索引掃描
select *
from t
where name='222';
select *
from t
where id=1;
select *
from t
where id='1';
來(lái)源:
公眾賬號(hào)