2019年4月22日 星期一

【LINUX】SHELL編程的awk指令用法

範例文件1 名稱:awktest 正常檢視文件內容如下

[root@rosalie ~]# cat awktest
name tel
tina 0911111111
nono 0922222222
ken 0933333333
piggy 09444444

讀取第一欄內容:awk '{print $1}' 文件名
讀取第二欄內容:awk '{print $2}' 文件名

[root@rosalie ~]# awk '{print $1}' awktest
name
tina
nono
ken
piggy

去掉表頭讀取第二欄內容:awk 'NR!=1{print $2}' 文件名

[root@rosalie ~]# awk 'NR!=1{print $2}' awktest
0911111111
0922222222
0933333333
09444444

只列出含有091111111的列:awk '$0~/0911111111/{print}' 文件名

[root@rosalie ~]# awk '$0 ~ /0911111111/{print}' awktest
tina 0911111111

列出不含ken的列但含表頭:awk '$1 !~/ken/' 文件名

[root@rosalie ~]# awk '$1 !~ /ken/' awktest
name tel
tina 0911111111
nono 0922222222
piggy 09444444

列出不含ken的列,且不含表頭:awk '$1 !~/ken/' 文件名|grep -v "name"

[root@rosalie ~]# awk  '$1 !~ /ken/' awktest |grep -v "name"
tina 0911111111
nono 0922222222
piggy 09444444


範例文件2  名稱:passwd 文件內容如下

[root@rosalie ~]# cat /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mysql:x:500:500::/home/mysql:/bin/bash
rosalie:x:501:500::/home/rosalie:/bin/bash

取帳號欄位,以-F":"為區隔""內的符號可變,例如空白或是其他符號,此範例以:來分隔,
意思是取:之後的第一欄(第一種作法):awk -F":" '{print $1}'

[root@rosalie ~]# awk -F":" '{print $1}' /etc/passwd
nobody
vcsa
saslauth
postfix
sshd
ntp
tcpdump
mysql
rosalie

以":"為區隔取第一欄f1(第二種作法):cut -d ":" -f1 

[root@rosalie ~]# cut -d ":" -f1 /etc/passwd
nobody
vcsa
saslauth
postfix
sshd
ntp
tcpdump
mysql
rosalie

在取得的欄位上填加字串"NAME ": awk -F ":" '{print "NAME " $1}' 
 [root@rosalie ~]# awk -F ":" '{print "NAME " $1}' /etc/passwd
NAME nobody
NAME vcsa
NAME saslauth
NAME postfix
NAME sshd
NAME ntp
NAME tcpdump
NAME mysql
NAME rosalie

取第及四及欄:awk -F ":" '{print $4,$3}'  

[root@rosalie ~]# awk -F ":" '{print $4,$3}' /etc/passwd
99 99
69 69
76 499
89 89
74 74
38 38
72 72
500 500
500 501

取最後一欄:awk -F":" '{print $(NF)}'

[root@rosalie ~]# awk -F ":" '{print $(NF)}' /etc/passwd
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/bin/bash


2019年4月18日 星期四

【LINUX】SHELL編程的sed說明及範例

SED
選項與參數:
-n:打印。在一般sed的用法中,所有來自STDIN的數據一般都會被列出到終端上。但如果加上-n參數後,則只有經過sed特殊處理的那一行(或者動作)才會被列出來。
-e:直接在命令列模式上進行sed 的動作編輯;
-f:直接將sed的動作寫在一個文件內,-f 則可以運行filename內的sed 動作
-rsed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
-i:直接修改讀取的文件內容,而不是輸出到終端。
某文件sed.txt內容如下,共三行
my name is rosalie
hello
hihi
參數範例
[root@rosalie shell]# sed -n "/rosalie/p" sed.txt
my name is rosalie

說明:-n打印要搭配p打印文件sed.txt內的,有rosalie的行

[root@rosalie shell]# sed -n "2p" sed.txt
hello

說明:打印,1p第一行、2p即第二行以此類推

[root@rosalie shell]# sed -n "1,3p" sed.txt
my name is rosalie
hello
hihi

說明:打印,1到3行,即1,3p

功能: s:取代,可以直接進行取代的工作哩!通常這個s的動作可以搭配正規表示法!例如s/old/new/g就是啦!
i:插入,i的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)
a:新增,a的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c:取代,c的後面可以接字串,這些字串可以取代n1,n2之間的行!
d:刪除,因為是刪除啊,所以d後面通常不接任何咚咚
p:列印,亦即將某個選擇的數據印出。通常p會與參數sed -n 一起運行~

範例:
[root@rosalie shell]# echo "my name is rosalie" | sed 's/^/& /g'
 my name is rosalie

說明:s/舊/新/g 取代 /^空白 /&添加  後面空一格,指加入空字串-(指在在my name is rosalie前加一個空格)
[root@rosalie shell]# echo "my name is rosalie" | sed '/rosalie/i######'
#######
my name is rosalie

說明:/i在目前的上一行插入-(指在字串rosalie的上一行插入#######)

[root@rosalie shell]# echo "my name is rosalie" | sed '/rosalie/a@@@@@@'
my name is rosalie
@@@@@@@

說明:/a在目前的下一行插入-(指在字串rosalie的上一行插入@@@@@@@)
其他範例:(需求是把文件內192字段全部更改為162)
文件test.txt內容如下:
[root@rosalie ~]# cat test.txt
192.168.1.1
192.168.1.2
192.168.2.22
若LINUX下用VI編輯修改的話 
[root@rosalie ~]# vi test.txt
192.168.1.1
192.168.1.2
192.168.2.22

:%s/168/162/          (按下ENTER)

[root@rosalie-mysql01 ~]# cat test.txt  (168都會變成162)

sed命令修改替換
sed -i 's/168/162/g' test.txt
也可以達到修改的效果
其他範例:
文件內容排序不一,想所有的字串以空格分開一行一行呈現
[root@rosalie shell]# cat sed.txt
my name is rosalie
hello
hihi  khkgs ojiowjoi kgjksss
aaghks kgjhks kkkll
gggg
sgsgs
hgsk

[root@rosalie-mysql01 shell]# cat sed.txt | sed "s/ /\n/g" |grep -v "^$"|sort
aaghks
gggg
hello
hgsk
hihi
is
kgjhks
kgjksss
khkgs
kkkll
my
name
ojiowjoi
rosalie
sgsgs
說明:例如s取代功能"s/ /\n/g" 黃色是搜尋到的字串即空白,取代\n紅色表示這是指換行的意思,grep -v "^$"是避免文件內還有空白符號,故篩選掉空白,sort是用來排序的(在sort後加 -nr則反排)

[root@rosalie shell]# cat sed.txt | sed "s/ /\n/g" |grep -v "^$"| sort | sed -n '1p;$p'
aaghks
sgsgs
說明:打印第一及$表示最後一列

2019年4月17日 星期三

【LINUX】screen指令安裝及簡易操作


增加操作時顯示畫面,方便在於可以一眼看出目前環境是在screen下或是一般環境下,
而screen的好處在於,執行一個龐大長時間的工作,不會因為斷線而中斷,例如還原或備份資料庫,或是執行大量的sql,若是在一般環境下執行,執行到一半斷線,可能導致資料不完整,萬一insert 或update,就更麻煩了,不知道資料執行到哪一個部份!

安裝screen
yum install screen

在screen下操作時,在最下列有顯示畫面
vi ~/.screenrc

加入
caption always "%{= kw}%-w%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+w %=%d %M %0c %{g}%H%{-}"

執行 screen
screen

執行後會顯示下圖紅色標示綠字的位置



列出目前所有執行中的 screen 工作環境
[root@rosalie-mysql02 ~]# screen -ls
There are screens on:
        18333.pts-3.rosalie-mysql02     (Attached)
        18692.pts-7.rosalie-mysql02     (Detached)
        18701.pts-6.rosalie-mysql02     (Detached)
        18710.pts-5.rosalie-mysql02     (Attached)
4 Sockets in /var/run/screen/S-root.


Detached => 表示沒有連接的 screen 
Attached => 表示你現在連接的 screen 
4 Sockets in /var/run/screen/S-root.  =>screen 的數量

登入到已開啟過的screen
不指定復原上次的screen
screen -r
或指定
screen -r 18333.pts-3.rosalie-mysql02
screen -r 18333

若(Attached)利用-r無法進入可用
screen -d -r  18333.pts-3.rosalie-mysql02



離開
exit;



【LINUX】SHELL中的數組

數組:就是相同數據類型,只用一個變量集合它們

範例 :


定義數組一般以括號的方式來定義
[root@rosalie ~]# A=(test1 test2 test3)  

${A[0]} 指取用單一取用,數字0表示test1、數字1表示test2 、數字2表示test3     
[root@rosalie ~]# echo ${A[0]}
test1

${A[@]} ,顯示所有參數即  test1 test2 test3
${A[@]:0},同上,但若要從第二個數據開始${A[@]:1}
[root@rosalie ~]# echo ${A[@]}
test1 test2 test3

${#A[@]} ,顯示數值個數即數量,3
[root@rosalie ~]# echo ${#A[@]}
4

${A[@]/test2/test5} ,替換表示將test2替換成test5
[root@rosalie ~]# echo ${A[@]/test2/test5}
test1 test5 test3

unset A[2];echo ${A[@]} ,刪除test3數組
[root@rosalie ~]# unset A[2];echo ${A[@]}
test1 test2
[root@rosalie ~]# echo ${A[@]}
test1 test2

A[3]=test3,增加第三組數組及第四組
[root@rosalie ~]# A[3]=test3
[root@rosalie ~]# A[4]=test4

${A[@]:0:3},顯示數組從第一組算起,取三個組數
[root@rosalie ~]# echo ${A[@]:0:3}
test1 test2 test3

${A[@]:(-2):2},顯示數組倒數二組算起,取二個組數,即從後面數二個
[root@rosalie ~]# echo ${A[@]:(-2):2}
test3 test4

【LINUX】利用while或for傳送檔案至多台服務器

利用while或for傳送檔案至多台服務器
服務器IP列表(檔名ip.txt)
192.168..1.1
192.168..1.3
192.168..1.4
192.168..1.11
192.168..1.66

while寫法,line名稱自訂,-r可以是文件或目錄,
傳送本機/tmp/test.sql的文件至其他台的/tmp下
#!/bin/bash

while read line

do
    scp -r /tmp/test.sql root@$line:/tmp

done < ip.txt

for寫法,line名稱自訂,-r可以是文件或目錄,傳送本機/tmp/test.sql的文件至其他台的/tmp下
#!/bin/bash

for line in cat ip.txt

do
    scp -r /tmp/test.sql root@$line:/tmp

done < ip.txt

執行效果如下
scp -r /tmp/test.sql root@192.168..1.1:/tmp
scp -r /tmp/test.sql root@192.168..1.3:/tmp
scp -r /tmp/test.sql root@192.168..1.4:/tmp
scp -r /tmp/test.sql root@192.168..1.11:/tmp
scp -r /tmp/test.sql root@192.168..1.16:/tmp

2019年4月16日 星期二

【MYSQL】Seconds_Behind_Master的數據問題

MySQL的同步是異步完成的,其中IO thread負責接收從主庫丟過來的binlog到從庫上生成relay log,然後SQL thead負責解析relay log後在從庫上進行重放來完成同步。這個2步是完全異步的,單獨停止其中一個,並不會影響另一個的正行工作。當這兩個thread都正常工作的時候,show slave status會顯示雙Yes狀態,表示同步正常。

一般主從複製都會show slave status \G 來查看數據
而Seconds_Behind_Master 就是裡面其實的一個數據,它的計算並不準確和可靠。並行複製下的Seconds_Behind_Master值比非並行複製時偏大。因此當我們判斷備庫是否延遲時,根據的Seconds_Behind_Master = 0不一定可靠。但是,當我們進行主備切換時,在主庫停寫的情況下,我們可以根據位點來判斷是否完全同步。
對此數據監控一段時間,發現會突然有很大的落差!
例如有時Seconds_Behind_Master=1866,然後隔30秒,數值又變成0
經測試發現,原來是MASTER與SLAVE的時間不一致導致,經調整後異常狀態就沒出現了!
因為校時壞掉了

測試 :實際時間 16 apr 2019 14:56:00
slave 時間:Tue Apr 16 15:13:32 CST 2019
master 時間:Tue Apr 16 14:56:59 CST 2019
相差約17分鐘


slave 更改時間往前
[root@rosalie slave~]# date -s "16 apr 2019 15:13:32"
Tue Apr 16 15:13:32 CST 2019

[root@rosalie slave~]# mysql -uroot -p

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.73.76
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000014
          Read_Master_Log_Pos: 194
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 407
        Relay_Master_Log_File: mysql-bin.000014
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 194
              Relay_Log_Space: 180267140
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: a57afe45-51e5-11e9-8c72-000c292c01ba
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: a57afe45-51e5-11e9-8c72-000c292c01ba:1-60
            Executed_Gtid_Set: a57afe45-51e5-11e9-8c72-000c292c01ba:1-60
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)


master創建一個table,並插入約二十萬的數據(測試用原有DB,COPY大量數據,才有長時間的執行,在slave監控時才能抓的到延遲的數據)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> CREATE TABLE test_table LIKE db_tlc.customer;
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT test_table SELECT * FROM db_tlc.customer;
Query OK, 251327 rows affected (20.00 sec)
Records: 251327  Duplicates: 0  Warnings: 0

master執行完後,進入salve 監控查看偵測的秒數,我是設定每30秒
2019/04/16_15:19:31 Seconds_Behind_Master=0
2019/04/16_15:20:01 Seconds_Behind_Master=0
2019/04/16_15:20:31 Seconds_Behind_Master=1018
2019/04/16_15:21:01 Seconds_Behind_Master=1048
2019/04/16_15:21:31 Seconds_Behind_Master=0
2019/04/16_15:22:01 Seconds_Behind_Master=0
2019/04/16_15:22:31 Seconds_Behind_Master=0
秒數瞬間從0變為1018,然後不到一分鐘就變0
1018/60=約17分鐘
與系統上的時間一致,因為SLAVE時間較快,導致時間計算出現問題,所以 Seconds_Behind_Master 秒差出現一下下就消失了!




【LINUX】IF判斷式

IF條件判斷句
if (表達式) ;then
   語句1
else
   語句2
fi

常用的判斷內容說明


-r file     確認使用者有 read 權限 (r--)
-w file     確認使用者有 write 權限 (-w-)
-x file     確認使用者有 execute 權限 (--x)
-f file     確認檔案存在
-d file     確認目錄存在
-s file     確認檔案大小不為0

if [ 1 -eq 9 ]
-eq    比較1和9是否【相等】----------數字標記意思1=9是或否
-ne    比較1和9是否【不相等】--------數字標記意思1≠9是或否
-lt    確認1是否小於9------------數字標記意思1<9是或否
-le    確認1是否小於等於9--------數字標記意思1<=9是或否
-gt    確認1是否大於9------------數字標記意思1>9是或否
-ge    確認1是否大於等於9--------數字標記意思1>=9是或否


範例1 :數字判斷(( 雙刮號用於比較)):vi if.sh
#!/bin/sh
NUM1=200
NUM2=400

if  (( $NUM1 > $NUM2 )) ; then
         echo "this $NUM1 greater $NUM2"
else
         echo "this $NUM2 greater $NUM1"
fi
說明:如果NUM1大於NUM2 是的話顯示語句1,不是的話顯示語句2
執行
[root@rosalie shell]# sh if.sh
this 400 greater 200

範例2 :判斷文件或資料夾存不存在
#!/bin/sh

if  [ ! -d /data/20190416 ]; then
         mkdir -p /data/20190416
         echo "建立/data/20190416目錄"
else
         echo "這個目錄已存在"
fi
說明:判斷如果目錄不在則創建目錄並顯示,如果存在顯示已存在
!為反義的意思
執行
[root@rosalie shell]# sh if.sh 
建立/data/20190416目錄

範例3 :多條件判斷
#!/bin/sh
scores=80
if  [[ $scores -gt 85 ]]; then
        echo "很棒!"
elif   [[ $scores -gt 70 ]]; then
        echo "還可以!"
elif   [[ $scores -gt 60 ]]; then
        echo "及格"
else
        echo "不及格!"
fi
說明:判斷分數如果大於85、如果大於70、如果大於60三個判斷,會順序判斷下來,若一直未符合就會執行else(否則)
執行
[root@rosalie shell]# sh if1.sh
還可以!



2019年4月10日 星期三

【MYSQL】從傳統主從複製模式轉由GTID複製模式不關機步驟

測試環境:MYSQL 5.7.22

1.在主庫與從庫上各自執行enforce_gtid_consistency=warn( 檢查 )
mysql> set global enforce_gtid_consistency=warn;
Query OK, 0 rows affected (0.00 sec)
enforce_gtid_consistency:此參數是保證GTID安全的參數

注意:執行完這條語句後,如果出現GTID不兼容的語句用法,在錯誤日誌會記錄相關信息,那麼需要調整應該程序避免不兼容的寫法,直到完全沒有產生不兼容的語句,可以通過應該程序去排查所有的sql,也可以設置後觀察錯誤日誌一段時間,這一步非常重要。

接著查看error.log有無警告信息
主庫:
2019-04-10T15:01:57.927932+08:00 29883 [Note] Changed ENFORCE_GTID_CONSISTENCY from OFF to WARN
從庫:
2019-04-10T07:02:03.502454Z 15 [Note] Changed ENFORCE_GTID_CONSISTENCY from OFF to WARN.
※確保在error log中不會出現警告信息。如果有,需要先修復,才能往後繼續執行。

2019年4月3日 星期三

【MYSQL】版本5.7.2日誌參數顯示時間不同

在MySQL 5.7.2 新增了log_timestamps 這個參數,該參數主要是控制error log、genera log,等等記錄日誌的顯示時間參數
2019-04-03T03:32:02.999731Z 1445 [Note] Access denied for user 'root'@'localhost' (using password: YES)
查看error.log,發現顯示時間03:32,但實際時間是上午11點32分

而版本默認安裝後error_log,slow_log 日誌時間戳為UTC,因此會造成與系統時間不一致,與台北時間相差8個小時
mysql> SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| log_timestamps | UTC   |
+----------------+-------+
1 row in set (0.01 sec)

因為log_timestamps   是一個GLOBAL的全局參數, 所以直接在登錄後去set全局參數,重啟後就會直接失效

2019年4月2日 星期二

【MYSQL】Percona XtraBackup 備份指令與還原





進行全量備份 (以日期來分,一天一個備份)
innobackupex [備份檔存放的路徑] --user=用戶名 --password=密碼 --socket=[sock路徑]
innobackupex /backup/20190402/ --user=root --password="1234" --socket=/tmp/mysql.sock
完成後會產出2019-04-02_14-01-36路徑在/backup/20190402/2019-04-02_14-01-36

進行增量備份
incremental-basedir路徑是第一次全備產出的檔案路徑,作為增量的基礎 
innobackupex --incremental /backup/20190402/ --incremental-basedir=/backup/20190402/2019-04-02_14-01-36/  --user=root --password="1234" --socket=/tmp/mysql.sock
完成後會產出2019-04-02_14-18-15路徑在/backup/20190402/2019-04-02_14-18-15


【MYSQL】DBA 常用語法


查詢processlist 排除sleep後排序時間大到小
select id, db, user, host, command, time, state, info from

information_schema.processlist  
where 
command <> 'Sleep' order by time desc;

主從設定,從更新主位置進行同步

change master to 
master_host='192.XX.XX.XX',
master_user='replication_userName',
master_password='replication_Passwrod',
master_log_file='log-bin.000001',
master_log_pos=10111;

只導出表結構-d
mysqldump -d DB_name -u'用戶名' -p'密碼' > data.sql