2019年4月17日 星期三

【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

【MYSQL】MYSQL的SYS表說明(版本8.0)

mysql> use sys Reading table information for completion of table and column names You can turn off this feature to get a quicker s...