日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql运维工具-----percona-toolkit

發布時間:2023/12/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql运维工具-----percona-toolkit 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今兒給大家分享一篇,關于MySQL DBA必備工具的使用。可以方便幫助我們管理我們的數據庫,讓我們的工作更高效。


這款工具是 MySQL 一個重要分支 percona 的,名稱叫做 percona-toolkit(一把鋒利的瑞士軍刀),它呢是一組命令的集合。今兒給大家介紹幾個我們在生產環境中最長用到的。


工具包的下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/


安裝過程很簡單,先解壓:

tar -zxvf percona-toolkit-3.0.3_x86_64.tar.gz


由于是二進制的包,解壓完可以直接進到percona-toolkit-3.0.3/bin目錄下使用。


錦囊妙計一:

pt-online-schema-change

功能可以在線整理表結構,收集碎片,給大表添加字段和索引。避免出現鎖表導致阻塞讀寫的操作。針對 MySQL 5.7 版本,就可以不需要使用這個命令,直接在線 online DDL 就可以了。


展現過程如下:

由于是測試環境,就不創建一張數據量特大的表,主要讓大家理解這個過程。


這是表里面數據的情況和表結構

mysql> select count(*) from su; +----------+ | count(*) | +----------+ | 100000 | +----------+ 1 row in set (0.03 sec) mysql> desc su; +-------+------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+-------------------+-----------------------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | c1 | int(11) | NO | | 0 | | | c2 | int(11) | NO | | 0 | | | c3 | int(11) | NO | | 0 | | | c4 | int(11) | NO | | 0 | | | c5 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | c6 | varchar(200) | NO | | | |


在線增加字段的過程:

[root@node3 bin]# ./pt-online-schema-change --user=root --password=root123 --host=localhost --alter="ADD COLUMN city_id INT" D=test,t=su --execute

No slaves found. See --recursion-method if host node3 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering </span><span class="token function">test</span><span class="token variable">.</span><span class="token function">su</span><span class="token variable">.
Creating new table.
Created new table test._su_new OK.
Altering new table.
Altered </span><span class="token function">test</span><span class="token variable">.</span>_su_new<span class="token variable"> OK.
2017-08-10T14:53:59 Creating triggers.
2017-08-10T14:53:59 Created triggers OK.
2017-08-10T14:53:59 Copying approximately 100163 rows.
2017-08-10T14:54:00 Copied rows OK.
2017-08-10T14:54:00 Analyzing new table.
2017-08-10T14:54:00 Swapping tables.
2017-08-10T14:54:00 Swapped original and new tables OK.
2017-08-10T14:54:00 Dropping old table.
2017-08-10T14:54:00 Dropped old table </span><span class="token function">test</span><span class="token variable">.</span>_su_old<span class="token variable"> OK.
2017-08-10T14:54:00 Dropping triggers.
2017-08-10T14:54:00 Dropped triggers OK.
Successfully altered </span><span class="token function">test</span><span class="token variable">.</span><span class="token function">su</span><span class="token variable">.


查看結果新增了一個 city_id 的字段:

mysql> desc su;
±--------±-----------------±-----±----±------------------±----------------------------+
| Field | Type | Null | Key | Default | Extra |
±--------±-----------------±-----±----±------------------±----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| c1 | int(11) | NO | | 0 | |
| c2 | int(11) | NO | | 0 | |
| c3 | int(11) | NO | | 0 | |
| c4 | int(11) | NO | | 0 | |
| c5 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| c6 | varchar(200) | NO | | | |
| city_id | int(11) | YES | | NULL | |
±--------±-----------------±-----±----±------------------±----------------------------+


錦囊妙計二:

pt-query-digest

功能:現在捕獲線上TOP 10 慢 sql 語句。


大家都知道數據庫大多數的性能問題是 sql 語句造成的,所以我們要抓住它們這些犯罪分子。及時做相關的優化處理。


展現過程如下:

可以根據時間間隔,來采樣慢 sql 語句。since 是可以調整的 sql 語句

[root@node3 bin]# ./pt-query-digest --since=24h /data/mysql/slow.log > 1.log

查看 sql 報告,總結慢語句有哪些,并可以看針對時間的消耗。


如下只是部分報告過程

cat 1.log
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============= ===== ======= ===== ==============
# 1 0x040ADBE3A1EED0A2 16.8901 87.2% 1 16.8901 0.00 CALL insert_su
# 2 0x8E44F4ED46297D4C 1.3013 6.7% 3 0.4338 0.18 INSERT SELECT test._su_new test.su
# 3 0x12E7CAFEA3145EEF 0.7431 3.8% 1 0.7431 0.00 DELETE su
# MISC 0xMISC 0.4434 2.3% 3 0.1478 0.0 <3ITEMS>

# Query 1: 0 QPS, 0x concurrency, ID 0x040ADBE3A1EED0A2 at byte 19060 ____
# Scores: V/M = 0.00
# Time range: all events occurred at 2017-08-02 12:12:07
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 2 1
# Exec time 47 18s 18s 18s 18s 18s 0 18s
# Lock time 0 103us 103us 103us 103us 103us 0 103us
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0 0
# Query size 0 21 21 21 21 21 0 21
# String:
# Databases test
# Hosts localhost
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s
# 10s+ ################################################################
call insert_su(50000)\G

可以看到報告中,列舉出了一些sql語句響應時間占比情況,和sql語句的執行時間情況。方便我們可以很直觀的觀察哪些語句有問題。(這里只列舉了一條sql)


錦囊妙計三:

pt-heartbeat

功能監控主從延遲。監控從庫落后主庫大概多少時間。

環境介紹:192.168.56.132主庫,192.168.56.133從庫


操作如下:

在主庫上執行:

[root@node3 bin]# ./pt-heartbeat --database test --update
–create-table --daemonize -uroot -proot123

test為我監控同步的庫,在該庫下創建一張監控表heartbeat,后臺進程會時時更新這張表。


在從庫上執行監控主從同步延遲時間的語句:

master-server-id是主庫的server-id, -h(主庫ip)

[root@node4 bin]# ./pt-heartbeat --master-server-id=1323306
–monitor --database test -uzs -p123456 -h 192.168.56.132
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]

時間是0s,目前沒有延遲的出現。


錦囊妙計四:

pt-table-checksum

功能檢查主從復制一致性

原理:在主上執行檢查語句去檢查 mysql主從復制的一致性,生成 replace 語句,然后通過復制傳遞到從庫,再通過update 更新 master_src 的值。最后通過檢測從上 this_src 和 master_src 的
值從而判斷復制是否一致。

比較test庫的差異情況,在主庫上面執行:

[root@node3 bin]# ./pt-table-checksum --no-check-binlog-format --nocheck-replication-filters
–databases=test --replicate=test.checksums --host=192.168.56.132 -uzs -p123456
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
08-10T16:01:02 0 0 1 1 0 0.013 test.heartbeat
08-10T16:01:02 0 0 0 1 0 0.015 test.su
08-10T16:01:02 0 0 0 1 0 0.011 test.t

可見diff都為0,證明主從的test庫沒有差異情況。


比較test庫哪些表有差異(需要添加replicate-check-only),在主庫上面執行:

[root@node3 bin]# ./pt-table-checksum --no-check-binlog-format
–nocheck-replication-filters --databases=test --replicate=test.checksums
–replicate-check-only --host=192.168.56.132 -uzs -p123456
Differences on node4
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t 1 1 1

可見test庫下面t這張表主從數據不一致。


錦囊妙計五:

pt-slave-restart

功能:監控主從錯誤,并嘗試重啟MySQL主從

注意事項:跳過錯誤這個命令,解決從庫多數據的現象(錯誤代碼1062)。如果從庫少數據,還跳過錯誤,就不能從根兒上解決主從同步的問題了(錯誤代碼1032),就需要先找到缺少的數據是什么了,如果缺少的特別多,建議重新搭建主從環境。


從庫出現1062的錯誤:

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Could not execute Write_rows event on table test.t;
Duplicate entry ‘1’ for key ‘PRIMARY’,
Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;
the event’s master log mysql-bin.000006, end_log_pos 757482


需要在從庫上面執行:

[root@node4 bin]# ./pt-slave-restart -uroot -proot123 --error-numbers=1062
2017-08-10T16:28:12 p=.,u=root node4-relay-bin.000002 751437 1062


跳過錯誤之后,檢查主從結果:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

同步狀態又恢復一致了。


錦囊妙計六:

pt-ioprofile

功能:方便定位IO問題,可通過IO吞吐量來定位。

[root@node3 bin]# ./pt-ioprofile
Thu Aug 10 16:33:47 CST 2017
Tracing process ID 3907
total read pwrite write fsync filename
13.949355 0.839006 0.000000 0.286556 12.823793 /data/mysql/mysql-bin.000006
7.454844 0.000000 2.913702 0.000000 4.541142 /data/mysql/ib_logfile0
0.000193 0.000000 0.000000 0.000193 0.000000 /data/mysql/slow.log

read:從文件中讀出數據。要讀取的文件用文件描述符標識,數據讀入一個事先定義好的緩沖區。

write:把緩沖區的數據寫入文件中。

pread:由于lseek和read調用之間,內核可能會臨時掛起進程,所以對同步問題造成了問題,
調用pread相當于順序調用了lseek和read,這兩個操作相當于一個捆綁的原子操作。

pwrite:由于lseek和write調用之間,內核可能會臨時掛起進程,所以對同步問題造成了問題,
調用pwrite相當于順序調用了lseek 和write,這兩個操作相當于一個捆綁的原子操作。

fsync:確保文件所有已修改的內容已經正確同步到硬盤上,該調用會阻塞等待直到設備報告IO完成。

filename:與磁盤交互的文件名稱

通過這個報告我們可以看到,哪個文件占用IO的時間比較多,跟磁盤交互最為繁忙,便于鎖定IO問題。


因為這個工具集命令很多,今兒先給大家介紹這些比較常用的,其他的一些大家感興趣可以私下去研究下。

官方地址:https://www.percona.com/doc/percona-toolkit/LATEST/index.html
原文鏈接:http://blog.51cto.com/sumongodb/1955184



總結

以上是生活随笔為你收集整理的mysql运维工具-----percona-toolkit的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。