MySQL主從複製結構下,如何斷定是異步複製仍是半同步複製?

目錄python

  • MySQL的slow log中Query_time包含了lock_wait_time嗎?
  • 爲何MySQL的data目錄下有不少innodb_status.xxx文件
  • MySQL參數eqrange index dive limit的做用以及如何理解index dive?
  • 用python轉換
  • 你平時在作SQL優化的時候一般會用到哪些簡單有效的手段呢?
  • MySQL主從複製結構下,如何斷定是異步複製仍是半同步複製?
  • MySQL半同步退化成異步複製之後,網絡恢復後還會自動切換爲半同步複製嗎?

1、MySQL的slow log中Query_time包含了lock_wait_time嗎?mysql

首先給一個slow log的頭部示例:sql

Time: 2019-10-08T08:46:34.635823Z
User@Host: root[root] @ localhost [] Id: 16
Query_time: 0.064742 Lock_time: 0.000460 Rows_sent: 1 Rows_examined: 9997

其中:
一、Query_time爲SQL的消耗時間,包括了Lock_time
二、Lock_time爲鎖等待的時間,包括行鎖、MDL鎖等
三、是否記錄slow log的斷定條件爲SQL的實際執行時間(Query_time - Lock_time)是否超過long_query_time,或者是否開啓log_queries_not_using_indexes微信

2、爲何MySQL的data目錄下有不少innodb_status.xxx文件?網絡

一、當MySQL啓動時添加選項--innodb-status-file或my.cnf設置innodb_status_file = 1,會在data目錄下生成innodb_status.xxx文件session

二、當打開選項innodb_status_output選項後,每隔約15秒即會刷新innodb status信息到文件中(手動show engine innodb status數據也會寫入文件),並可能影響性能異步

三、當打開選項innodb_status_output選項後,innodb status信息及innodb row lock/deadlock信息(打開innodb_status_output_locks選項)也會以追加的方式寫入到error log,可能致使error log文件過大,請務必注意這一點性能

四、innodb_status.xxx的xxx是當前mysqld的pid,即innodb_status.pid學習

五、正常關閉時MySQL會自動刪除innodb_status.pid文件,當異常關閉mysqld時,會留下上次啓動的innodb_status.pid文件,當屢次異常關閉後data目錄下就會產生不少innodb_status.pid文件優化

3、MySQL參數eqrange index dive limit的做用以及如何理解index dive?
首先解釋一下什麼是index dive:

在MySQL裏只要存在範圍查找方法,就能夠經過索引下潛來估計範圍內的行數,方法是找出範圍的開始和結束,並計算出他們之間的行數。這項技術更精確,因此也是制定良好執行計劃的一個基礎。

而參數eq_range_index_dive_limit限定了進行索引下潛的等值條件的最大值+1,

一、當等值條件個數大於或等於eq_range_index_dive_limit,那麼優化器將直接使用統計信息

二、當eq_range_index_dive_limit設置爲0時,優化器將始終進行索引下潛,而不用索引統計信息

例若有以下SQL:

select * from t where col_name IN(val1, ..., valN),當eq_range_index_dive_limit爲N+1,優化器就會使用index dive來計算執行計劃costindex dive適用條件有如下形式

(1) col_name IN(val1, ..., valN)

(2) col_name = val1 OR ... OR col_name = valN

col_name爲非惟一索引8.0之後優化器在知足如下條件可能會跳過index dive,而8.0之前沒法避免index dive:

  • 查詢時只訪問一張表,而不是多表關聯
  • force index(某個索引)
  • 沒有子查詢
  • 沒有涉及全文索引
  • 沒有GROUP-BY or DISTINCT
  • 沒有ORDER-BY

4、請用python一條語句將:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9],[11,12,13]] 轉換爲

[[1, 4, 7, 11], [2, 5, 8, 12], [3, 6, 9, 13]]

(一)第三方庫numpy

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

import numpy as np

np.mat(a).T

matrix([[1, 4, 7],

[2, 5, 8],

    [3, 6, 9]])

(二)列表推導式

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

[[row[i] for row in a] for i in range(len(a[0]))]

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

5、你平時在作SQL優化的時候一般會用到哪些簡單有效的手段呢?

(一)SELECT

掌握範式跟JOIN的關係 就能區分單表查詢和JOIN的關係

一、單表SELECT

(1)查詢列是否含有沒有用的部分

(2)查看執行計劃是否使用了索引

(3)含有ORDER BY LIMIT 能夠考慮延遲JOIN

二、多表JOIN 查詢

(1)肯定好驅動表

(2)被驅動表必須含有索引

(3)減小JOIN次數 ,尤爲是含有GROUP BY的SQL中能夠考慮先聚合後JOIN

(二)INSERT

一、跟磁盤IO關係很大

二、INSERT SELECT 結構 若是慢首先要查看SELECT

(三)UPDATE

一、不要進行大事物更新,適當分批進行

二、查看是否含有鎖競爭

三、不要使用WHERE條件的子查詢,改爲JOIN

(四)DELETE

一、大量刪除能夠考慮,建立表結構以後的改名

二、不要進行大事物更新,適當分批進行

三、查看是否含有鎖競爭

四、不要使用WHERE條件的子查詢,改爲JOIN

詳情:視頻回放⎜《資深DBA帶你學習SQL開發和優化》

6、MySQL主從複製結構下,如何斷定是異步複製仍是半同步複製?

對於半同步的監控能夠採用以下方式:

mysql> show global status like '%Rpl_semi%';
+--------------------------------------------+----------+
| Variable_name | Value |
+--------------------------------------------+----------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | OFF |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 38391398 |
| Rpl_semi_sync_master_tx_wait_time | 76782796 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
| Rpl_semi_sync_slave_status | OFF |
+--------------------------------------------+----------+

一、Rplsemisyncmasterstatus表示主庫是否啓用半同步
二、Rplsemisyncslavestatus表示從庫是否啓用加強半同步
三、Rplsemisyncmastertxavgwaittime表示等待slave響應的事務平均等待時間,若是該值比較大的話能夠檢查一下網絡狀況了
四、Rplsemisyncmastertxwaits表示slave響應的事務數,該值若是增加較快的話也須要檢查準備之間的網絡狀況
五、Rplsemisyncmasteryestx表示加強半同步複製下的事務數
六、Rplsemisyncmasternotx表示異步複製的事務數,該值若是變化了,那麼也須要檢查半同步複製是否已經退化爲異步複製,在退化時從error log也能夠看到
七、Rplsemisyncmasterstatus表示當前節點是不是半同步master

7、MySQL半同步退化成異步複製之後,網絡恢復後還會自動切換爲半同步複製嗎?

首先公佈答案:是

一、即使會自動恢復,可是仍然須要作好監控,避免因爲異步複製下的主從切換而致使數據丟失

二、金融支付環境建議將rpl_semi_sync_master_timeout設置爲較大值,避免退化爲異步複製


對文章感興趣的朋友們能夠加我哦,這裏有一個樂於交友的人鴨!

微信:lvqingshan_
微信碼.jpg

相關文章
相關標籤/搜索