您好,登錄后才能下訂單哦!
本文主要給大家簡單講講percona-toolkit工具的pt-table-checksum實際運用簡析,相關專業術語大家可以上網查查或者找一些相關書籍補充一下,這里就不涉獵了,直奔主題,希望可以給大家帶來一些實際幫助。
在mysql工作中接觸最多的就是mysql replication,mysql在復制方面還是會有一些常規問題,比如主庫宕機或者從庫宕機有可能會導致復制中斷,通常需要進行人為修復,或者很多時候需要把一個從庫提升為主庫,但對從庫和主庫的數據一致性不能保證一樣。這種情況下就需要使用percona-toolkit工具的pt-table-checksum組件來檢查主從數據的一致性;如果發現不一致的數據,可以通過pt-table-sync修復;還可以通過pt-heartbeat監控主從復制延遲。當然如果數據量小,slave只是當做一個備份使用,那么出現數據不一致完全可以重做,或者通過其他方法解決。如果數據量非常大,重做就是非常蛋碎的一件事情了。比如說,線上數據庫做了主從同步環境,數據庫在進行了遷移后,需要對mysql遷移(Replication)后的數據一致性進行校驗,但又不能對生產環境使用造成影響,pt-table-checksum成為了絕佳也是唯一的檢查工具。
percona-toolkit介紹
percona-toolkit是一組高級命令行工具的集合,用來執行各種通過手工執行非常復雜和麻煩的mysql和系統任務,這些任務包括:
1)檢查master和slave數據的一致性
2)有效地對記錄進行歸檔
3)查找重復的索引
4)對云服務器信息進行匯總
5)分析來自日志和tcpdump的查詢
6)當系統出問題的時候收集重要的系統信息
percona-toolkit源自Maatkit和Aspersa工具,這兩個工具是管理mysql的最有名的工具。不過,現在Maatkit工具已經不維護了,所以以后推薦還是使用percona-toolkit工具!
這些工具主要包括開發、性能、配置、監控、復制、系統、實用六大類,作為一個優秀的DBA,里面有的工具非常有用,如果能掌握并加以靈活應用,將能極大的提高工作效率。
percona-toolkit工具中最主要的三個組件分別是:
1)pt-table-checksum 負責監測mysql主從數據一致性
2)pt-table-sync 負責當主從數據不一致時修復數據,讓它們保存數據的一致性
3)pt-heartbeat 負責監控mysql主從同步延遲
下面就對這三個組件的使用做一記錄,當然percona-toolkit工具也有很多其他組件,后面會一一說明。
percona-toolkit工具安裝(建議主庫和從庫服務器上都安裝)
軟件下載并在主庫服務器上安裝 [百度云盤下載地址:https://pan.baidu.com/s/1bp1OOgf (提取密碼:y462)]
[root@master-server src]# wget https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm
[root@master-server src]# rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm //安裝后,percona-toolkit工具的各個組件命令就有有了(輸入ht-,按TAB鍵就會顯示)
安裝該工具依賴的軟件包
[root@master-server src]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
具體安裝方法參考官網地址: https://www.percona.com/doc/percona-toolkit/LATEST/installation.html
下邊是直接yum安裝:
sudo yum install percona-toolkit
安裝參考地址:
https://blog.csdn.net/stevendbaguo/article/details/73122074
https://www.cnblogs.com/piperck/p/5131289.html
https://blog.csdn.net/zengxuewen2045/article/details/52029093
https://blog.csdn.net/u010587433/article/details/46708563
https://blog.csdn.net/zjq1985/article/details/79816242?utm_source=blogxgwz2
一、pt-table-checksum使用梳理
pt-table-checksum 是 Percona-Toolkit的組件之一,用于檢測MySQL主、從庫的數據是否一致。其原理是在主庫執行基于statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫執行,并在從庫上計算相同數據塊的checksum,最后,比較主從庫上相同數據塊的checksum值,由此判斷主從數據是否一致。檢測過程根據唯一索引將表按row切分為塊(chunk),以為單位計算,可以避免鎖表。檢測時會自動判斷復制延遲、 master的負載, 超過閥值后會自動將檢測暫停,減小對線上服務的影響。
pt-table-checksum 默認情況下可以應對絕大部分場景,官方說,即使上千個庫、上萬億的行,它依然可以很好的工作,這源自于設計很簡單,一次檢查一個表,不需要太多的內存和多余的操作;必要時,pt-table-checksum 會根據服務器負載動態改變 chunk 大小,減少從庫的延遲。
為了減少對數據庫的干預,pt-table-checksum還會自動偵測并連接到從庫,當然如果失敗,可以指定--recursion-method選項來告訴從庫在哪里。它的易用性還體現在,復制若有延遲,在從庫 checksum 會暫停直到趕上主庫的計算時間點(也通過選項--設定一個可容忍的延遲最大值,超過這個值也認為不一致)。
為了保證主數據庫服務的安全,該工具實現了許多保護措施:
1)自動設置 innodb_lock_wait_timeout 為1s,避免引起
2)默認當數據庫有25個以上的并發查詢時,pt-table-checksum會暫停。可以設置 --max-load 選項來設置這個閥值
3)當用 Ctrl+C 停止任務后,工具會正常的完成當前 chunk 檢測,下次使用 --resume 選項啟動可以恢復繼續下一個 chunk
pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:在主(master)上通過執行校驗的查詢對復制的一致性進行檢查,對比主從的校驗值,從而產生結果。DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤。注意:第一次運行的時候需要加上--create-replicate-table參數,生成checksums表!!如果不加這個參數,那么就需要在對應庫下手工添加這張表了,表結構SQL如下:
CREATE
TABLE
checksums (
db
char
(64)
NOT
NULL
,
tbl
char
(64)
NOT
NULL
,
chunk
int
NOT
NULL
,
chunk_time
float
NULL
,
chunk_index
varchar
(200)
NULL
,
lower_boundary text
NULL
,
upper_boundary text
NULL
,
this_crc
char
(40)
NOT
NULL
,
this_cnt
int
NOT
NULL
,
master_crc
char
(40)
NULL
,
master_cnt
int
NULL
,
ts
timestamp
NOT
NULL
,
PRIMARY
KEY
(db, tbl, chunk),
INDEX
ts_db_tbl (ts, db, tbl)
) ENGINE=InnoDB;
最重要的一點就是:常用參數解釋:
--nocheck-replication-filters :不檢查復制過濾器,建議啟用。后面可以用--databases來指定需要檢查的數據庫。
--no-check-binlog-format : 不檢查復制的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不同步的信息。
--replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
--databases= :指定需要被檢查的數據庫,多個則用逗號隔開。
--tables= :指定需要被檢查的表,多個用逗號隔開
h= :Master的地址
u= :用戶名
p=:密碼
P= :端口
要在主庫上授權,能讓主庫ip訪問。這一點不能忘記!(實驗證明從庫上可以不授權,但最好還是從庫也授權)
注意:
1)根據測試,需要一個即能登錄主庫,也能登錄從庫的賬號;
2)只能指定一個host,必須為主庫的IP;
3)在檢查時會向表加S鎖;
4)運行之前需要從庫的同步IO和SQL進程是YES狀態。
例如:(本文例子中:192.168.1.101是主庫ip,192.168.1.102是從庫ip)
在主庫執行授權(一定要對主庫ip授權,授權的用戶名和密碼可以自行定義,不過要保證這個權限能同時登陸主庫和從庫)
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'root'@'192.168.1.101' identified by '123456';
mysql> flush privileges;
在從庫上執行授權
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.101' IDENTIFIED BY '123456';
mysql> flush privileges;
如下,在主庫上執行的一個檢查主從數據一致性的命令(別忘了第一次運行的時候需要添加--create-replicate-table參數,后續再運行時就不需要加了):
下面命令中的192.168.1.101是主庫ip
檢查的是huanqiu庫下的haha表的數據(當然,命令中也可以不跟表,直接檢查某整個庫的數據;如下去掉--tables=haha表,直接檢查huanqiu庫的數據)
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --create-replicate-table --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306
Diffs cannot be detected because
no
slaves were found. Please
read
the
--recursion-method documentation for information.
TS ERRORS DIFFS
ROWS
CHUNKS SKIPPED
TIME
TABLE
01-08T04:04:54 0 0 4 1 0 0.009 huanqiu.haha
發現沒有slave在運行。上面有報錯:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information
上面的提示信息很清楚,因為找不到從,所以執行失敗,提示用參數--recursion-method 可以指定模式解決。
其實是因為從庫的slave關閉了。
在主庫上執行:
mysql> show processlist;
+
----+------+-----------+------+---------+------+-------+------------------+
| Id |
User
| Host | db | Command |
Time
| State | Info |
+
----+------+-----------+------+---------+------+-------+------------------+
| 10 | root | localhost |
NULL
| Query | 0 | init | show processlist |
+
----+------+-----------+------+---------+------+-------+------------------+
在從庫上開啟slave
mysql> start slave;
mysql> show slave status\G;
再在主庫上執行:
mysql> show processlist;
+
----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id |
User
| Host | db | Command |
Time
| State | Info |
+
----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| 10 | root | localhost |
NULL
| Query | 0 | init | show processlist |
| 18 | slave | 192.168.1.102:37115 |
NULL
| Binlog Dump | 5 | Master has sent
all
binlog
to
slave; waiting
for
binlog
to
be updated |
NULL
|
+
----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
再次執行檢查命令:發現已有slave在運行。
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306
TS ERRORS DIFFS
ROWS
CHUNKS SKIPPED
TIME
TABLE
01-08T04:11:03 0 0 4 1 0 1.422 huanqiu.haha
二、pt-table-sync用法梳理解釋:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直為0,當指定--replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :由于錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
如果通過pt-table-checksum 檢查找到了不一致的數據表,那么如何同步數據呢?即如何修復MySQL主從不一致的數據,讓他們保持一致性呢?
這時候可以利用另外一個工具pt-table-sync。
使用方法:
pt-table-sync: 高效的同步MySQL表之間的數據,他可以做單向和雙向同步的表數據。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修復一致性之前需要保證他們表存在。
假如上面檢查數據時發現主從不一致
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306
TS ERRORS DIFFS
ROWS
CHUNKS SKIPPED
TIME
TABLE
01-08T04:18:07 0 1 4 1 0 0.843 huanqiu.haha
現在需要DIFFS為1可知主從數據不一致,需要修復!修復命令如下:
先master的ip,用戶,密碼,然后是slave的ip,用戶,密碼
[root@master-server ~]# pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
REPLACE
INTO
`huanqiu`.`haha`(`id`, `
name
`)
VALUES
(
'1'
,
'wangshibo'
)
/*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/
;
REPLACE
INTO
`huanqiu`.`haha`(`id`, `
name
`)
VALUES
(
'2'
,
'wangshikui'
)
/*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/
;
REPLACE
INTO
`huanqiu`.`haha`(`id`, `
name
`)
VALUES
(
'3'
,
'limeng'
)
/*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/
;
REPLACE
INTO
`huanqiu`.`haha`(`id`, `
name
`)
VALUES
(
'4'
,
'wanghi'
)
/*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/
;
參數解釋:
--replicate= :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
--databases= : 指定執行同步的數據庫。
--tables= :指定執行同步的表,多個用逗號隔開。
--sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
h= :服務器地址,命令里有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
u= :帳號。
p= :密碼。
--print :打印,但不執行命令。
--execute :執行命令。
上面命令介紹完了,接下來開始執行修復:
通過(--print)打印出來了修復數據的sql語句,可以手動的在slave從庫上執行,讓他們數據保持一致性,這樣比較麻煩!
可以直接在master主庫上執行修復操作,通過--execute參數,如下:
[root@master-server ~]# pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
如上修復后,再次檢查,發現主從庫數據已經一致了!
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306
TS ERRORS DIFFS
ROWS
CHUNKS SKIPPED
TIME
TABLE
01-08T04:36:43 0 0 4 1 0 0.040 huanqiu.haha
注意:要是表中沒有唯一索引或則主鍵則會報錯:-----------------------------------------------------------------------------------------------------------------------
建議:
修復數據的時候,最好還是用--print打印出來的好,這樣就可以知道那些數據有問題,可以人為的干預下。
不然直接執行了,出現問題之后更不好處理。總之還是在處理之前做好數據的備份工作。
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
-----------------------------------------------------------------------------------------------------------------------
為了確保主從數據的一致性,可以編寫監控腳本,定時檢查。當檢查到主從數據不一致時,強制修復數據。
[root@master-server ~]# cat /root/pt_huanqiu.sh
#!/bin/bash
NUM=$(
/usr/bin/pt-table-checksum
--nocheck-replication-filters --no-check-binlog-
format
--replicate=huanqiu.checksums --databases=huanqiu h=192.168.1.101,u=root,p=123456,P=3306|
awk
-F
" "
'{print $3}'
|
sed
-n
'2p'
)
if
[ $NUM -
eq
1 ];
then
/usr/bin/pt-table-sync
--replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
/usr/bin/pt-table-sync
--replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
echo
"data is ok"
fi
[root@master-server ~]# crontab -l[root@master-server ~]# cat /root/pt_huanpc.sh
#!/bin/bash
NUM=$(
/usr/bin/pt-table-checksum
--nocheck-replication-filters --no-check-binlog-
format
--replicate=huanpc.checksums --databases=huanpc h=192.168.1.101,u=root,p=123456,P=3306|
awk
-F
" "
'{print $3}'
|
sed
-n
'2p'
)
if
[ $NUM -
eq
1 ];
then
/usr/bin/pt-table-sync
--replicate=huanpc.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
/usr/bin/pt-table-sync
--replicate=huanpc.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
echo
"data is ok"
fi
[root@master-server ~]# crontab -l
#檢查主從huanqiu庫數據一致性
* * * * * /bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 10;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 30;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 50;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
#檢查主從huanpc庫數據一致性
* * * * * /bin/bash -x /root/root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 10;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 30;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 50;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
-----------------------------------------------------------------------------------------------------------------------
最后總結:
pt-table-checksum和pt-table-sync工具很給力,工作中常常在使用。注意使用該工具需要授權,一般SELECT, PROCESS, SUPER, REPLICATION SLAVE等權限就已經足夠了。
-----------------------------------------------------------------------------------------------------------------------
另外說一個問題:
在上面的操作中,在主庫里添加pt-table-checksum檢查的權限(從庫可以不授權)后,進行數據一致性檢查操作,會在操作的庫(實例中是huanqiu、huanpc)下產生一個checksums表!
這張checksums表是pt-table-checksum檢查過程中產生的。這張表一旦產生了,默認是刪除不了的,并且這張表所在的庫也默認刪除不了,刪除后過一會兒就又會出來。
mysql> use huanqiu;
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> show tables;
+
-------------------+
| Tables_in_huanqiu |
+
-------------------+
| checksums |
| haha |
+
-------------------+
2
rows
in
set
(0.00 sec)
mysql>
drop
table
checksums;
Query OK, 0
rows
affected (0.01 sec)
mysql> show tables;
+
-------------------+
| Tables_in_huanqiu |
+
-------------------+
| haha |
+
-------------------+
1 row
in
set
(0.00 sec)
mysql> show tables; //過一段時間再次查看,發現checksums表還在
+
-------------------+
| Tables_in_huanqiu |
+
-------------------+
| checksums |
| haha |
+
-------------------+
2
rows
in
set
(0.00 sec)
不僅這張表刪除不了,這張表所在的庫也刪除不了,刪除后過一會兒就是自動生成。
mysql>
drop
database
huanqiu;
Query OK, 1 row affected (0.01 sec)
mysql>
drop
database
huanpc;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+
--------------------+
|
Database
|
+
--------------------+
| information_schema |
| huanqiu |
| mysql |
| performance_schema |
| test |
+
--------------------+
5
rows
in
set
(0.00 sec)
mysql>
drop
database
huanqiu;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+
--------------------+
|
Database
|
+
--------------------+
| information_schema |
| huanpc |
| huanqiu |
| mysql |
| performance_schema |
| test |
+
--------------------+
6
rows
in
set
(0.00 sec)
要想刪除的話,一定要先把pt-table-checksum檢查前添加的權限收回!
mysql> show grants
for
'root'
@
'192.168.1.101'
;
+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants
for
root@192.168.1.101 |
+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
GRANT
SELECT
,
INSERT
,
UPDATE
,
DELETE
,
CREATE
, PROCESS, SUPER, REPLICATION SLAVE
ON
*.*
TO
'root'
@
'192.168.1.101'
IDENTIFIED
BY
PASSWORD
'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
|
+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
in
set
(0.00 sec)
mysql>
revoke
SELECT
,
INSERT
,
UPDATE
,
DELETE
,
CREATE
, PROCESS, SUPER, REPLICATION SLAVE
ON
*.*
FROM
'root'
@
'192.168.1.101'
;
Query OK, 0
rows
affected (0.01 sec)
mysql> show grants
for
'root'
@
'192.168.1.101'
;
+
-----------------------------------------------------------------------------------------------------------------+
| Grants
for
root@192.168.1.101 |
+
-----------------------------------------------------------------------------------------------------------------+
|
GRANT
USAGE
ON
*.*
TO
'root'
@
'192.168.1.101'
IDENTIFIED
BY
PASSWORD
'*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
|
+
-----------------------------------------------------------------------------------------------------------------+
1 row
in
set
(0.00 sec)
mysql>
select
user
,host,
password
from
mysql.
user
;
+
-------+---------------+-------------------------------------------+
|
user
| host |
password
|
+
-------+---------------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | master-server | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | master-server | |
| root | 192.168.1.101 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| slave | 192.168.1.102 | *4F0FF134CC4C1A2872D972373A6AA86CA0A81872 |
+
-------+---------------+-------------------------------------------+
8
rows
in
set
(0.00 sec)
mysql>
delete
from
mysql.
user
where
user
=
"root"
and
host=
"192.168.1.101"
; //這一步其實不必操作,此步刪除操作不能在上面
revoke
執行前進行,否則
revoke
回收權限失敗!
Query OK, 1 row affected (0.00 sec)
mysql>
select
user
,host,
password
from
mysql.
user
;
+
-------+---------------+-------------------------------------------+
|
user
| host |
password
|
+
-------+---------------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | master-server | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | master-server | |
| slave | 192.168.1.102 | *4F0FF134CC4C1A2872D972373A6AA86CA0A81872 |
+
-------+---------------+-------------------------------------------+
7
rows
in
set
(0.00 sec)
權限刪除后,就能成功刪除checksums這張表和它所在的庫了!
主庫的checksums刪除了,從庫的這張表也會跟著刪除
mysql> use huanpc;
Database
changed
mysql> show tables;
+
------------------+
| Tables_in_huanpc |
+
------------------+
| checksums |
| heihei |
+
------------------+
2
rows
in
set
(0.00 sec)
mysql>
drop
table
checksums;
Query OK, 0
rows
affected (0.01 sec)
mysql> show tables;
+
------------------+
| Tables_in_huanpc |
+
------------------+
| heihei |
+
------------------+
1 row
in
set
(0.01 sec)
mysql> use huanqiu;
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> show tables;
+
-------------------+
| Tables_in_huanqiu |
+
-------------------+
| checksums |
| haha |
+
-------------------+
2
rows
in
set
(0.00 sec)
mysql>
drop
table
checksums;
Query OK, 0
rows
affected (0.00 sec)
mysql> show tables;
+
-------------------+
| Tables_in_huanqiu |
+
-------------------+
| haha |
+
-------------------+
1 row
in
set
(0.00 sec)
也就是說,checksums表一旦產生,不僅這張表默認刪除不了,連同它所在的庫,要是想刪除它們,只能如上操作先撤銷權限
三、pt-heartbeat監控mysql主從復制延遲梳理
對于MySQL數據庫主從復制延遲的監控,可以借助percona的有力武器pt-heartbeat來實現。
pt-heartbeat的工作原理通過使用時間戳方式在主庫上更新特定表,然后在從庫上讀取被更新的時間戳然后與本地系統時間對比來得出其延遲。具體流程:
1)在主上創建一張heartbeat表,按照一定的時間頻率更新該表的字段(把時間更新進去)。監控操作運行后,heartbeat表能促使主從同步!
2)連接到從庫上檢查復制的時間記錄,和從庫的當前系統時間進行比較,得出時間的差異。
使用方法(主從和從庫上都可以執行監控操作):
pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
注意:需要指定的參數至少有 --stop,--update,--monitor,--check。
其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。
--ask-pass 隱式輸入MySQL密碼
--charset 字符集設置
--check 檢查從的延遲,檢查一次就退出,除非指定了--recurse會遞歸的檢查所有的從服務器。
--check-
read
-only 如果從服務器開啟了只讀模式,該工具會跳過任何插入。
--create-table 在主上創建心跳監控的表,如果該表不存在,可以自己手動建立,建議存儲引擎改成memory。通過更新該表知道主從延遲的差距。
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file
varchar(255) DEFAULT NULL,
position bigint unsigned DEFAULT NULL,
relay_master_log_file varchar(255) DEFAULT NULL,
exec_master_log_pos bigint unsigned DEFAULT NULL
);
heratbeat 表一直在更改ts和position,而ts是我們檢查復制延遲的關鍵。
--daemonize 執行時,放入到后臺執行
--user=-u, 連接數據庫的帳號
--database=-D, 連接數據庫的名稱
--host=-h, 連接的數據庫地址
--password=-p, 連接數據庫的密碼
--port=-P, 連接數據庫的端口
--socket=-S, 連接數據庫的套接字文件
--
file
【--
file
=output.txt】 打印--monitor最新的記錄到指定的文件,很好的防止滿屏幕都是數據的煩惱。
--frames 【--frames=1m,2m,3m】 在--monitor里輸出的[]里的記錄段,默認是1m,5m,15m。可以指定1個,如:--frames=1s,多個用逗號隔開。可用單位有秒(s)、分鐘(m)、小時(h)、天(d)。
--interval 檢查、更新的間隔時間。默認是見是1s。最小的單位是0.01s,最大精度為小數點后兩位,因此0.015將調整至0.02。
--log 開啟daemonized模式的所有日志將會被打印到制定的文件中。
--monitor 持續監控從的延遲情況。通過--interval指定的間隔時間,打印出從的延遲信息,通過--
file
則可以把這些信息打印到指定的文件。
--master-server-
id
指定主的server_id,若沒有指定則該工具會連到主上查找其server_id。
--print-master-server-
id
在--monitor和--check 模式下,指定該參數則打印出主的server_id。
--recurse 多級復制的檢查深度。模式M-S-S...不是最后的一個從都需要開啟log_slave_updates,這樣才能檢查到。
--recursion-method 指定復制檢查的方式,默認為processlist,hosts。
--update 更新主上的心跳表。
--replace 使用--replace代替--update模式更新心跳表里的時間字段,這樣的好處是不用管表里是否有行。
--stop 停止運行該工具(--daemonize),在
/tmp/
目錄下創建一個“pt-heartbeat-sentinel” 文件。后面想重新開啟則需要把該臨時文件刪除,才能開啟(--daemonize)。
--table 指定心跳表名,默認heartbeat。
實例說明:
master:192.168.1.101
slave:192.168.1.102
同步的庫:huanqiu、huanpc
主從庫都能使用root賬號、密碼123456登錄
先操作針對huanqiu庫的檢查,其他同步的庫的檢查操作類似!
mysql> use huanqiu;
Database changed
mysql> CREATE TABLE heartbeat (
//
主庫上的對應庫下創建heartbeat表,一般創建后從庫會同步這張表(不同步的話,就在從庫那邊手動也手動創建)
-> ts varchar(26) NOT NULL,
-> server_id int unsigned NOT NULL PRIMARY KEY,
->
file
varchar(255) DEFAULT NULL,
-> position bigint unsigned DEFAULT NULL,
-> relay_master_log_file varchar(255) DEFAULT NULL,
-> exec_master_log_pos bigint unsigned DEFAULT NULL
-> );
Query OK, 0 rows affected (0.02 sec)
更新主庫上的heartbeat,--interval=1表示1秒鐘更新一次(注意這個啟動操作要在主庫服務器上執行)
[root@master-server ~]# pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
Enter password:
[root@master-server ~]#
[root@master-server ~]# ps -ef|grep pt-heartbeat
root 15152 1 0 19:49 ? 00:00:00 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15154 14170 0 19:49 pts/3 00:00:00 grep pt-heartbeat
在主庫運行監測同步延遲:
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456
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 ]
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表示從沒有延遲。 [ 0.00s, 0.00s, 0.00s ] 表示1m,5m,15m的平均值。可以通過--frames去設置。
或者加上--master-server-id參數(主庫my.cnf里配置的server-id值)
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --master-server-id=101
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 ]
.........
也可以將主庫的server-id打印出來(--print-master-server-id)
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monit --host=192.168.1.102 --user=root --password=123456 --print-master-server-id
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
.........
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --check --host=192.168.1.102 --user=root --password=123456 --print-master-server-id
0.00 101
上面的監測命令會一直在運行狀態中,可以使用--check監測一次就退出
注意:使用了--check,就不能使用--monit
--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --check --host=192.168.1.102 --user=root --password=123456
0.00
[root@master-server ~]#
注意:
如果想把這個輸出結果加入自動化監控,那么可以使用如下命令使監控輸出寫到文件,然后使用腳本定期過濾文件中的最大值作為預警即可:
注意--log選項必須在有--daemonize參數的時候才會打印到文件中,且這個文件的路徑最好在/tmp下,否則可能因為權限問題無法創建
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
[root@master-server ~]# tail -f /opt/master-slave.txt //可以測試,在主庫上更新數據時,從庫上是否及時同步,如不同步,可以在這里看到監控的延遲數據
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 ]
.......
下面是編寫的主從同步延遲監控腳本,就是定期過濾--log文件中最大值(此腳本運行的前提是:啟動更新主庫heartbeat命令以及帶上--log的同步延遲檢測命令)。如果發生延遲,發送報警郵件。sendemail郵件發送環境部署參考:http://www.cnblogs.com/kevingrace/p/5961861.html
[root@master-server ~]# cat /root/check-slave-monit.sh
#!/bin/bash
cat
/opt/master-slave
.txt >
/opt/master_slave
.txt
echo
>
/opt/master-slave
.txt
max_time=`
cat
/opt/master_slave
.txt |
grep
-
v
'^$'
|
awk
'{print $1}'
|
sort
-k1nr |
head
-1`
NUM=$(
echo
"$max_time"
|
cut
-d
"s"
-f1)
if
[ $NUM ==
"0.00"
];
then
echo
"Mysql主從數據一致"
else
/usr/local/bin/sendEmail
-f ops@huanqiu.cn -t wangshibo@huanqiu.cn -s smtp.huanqiu.cn -u
"Mysql主從同步延遲"
-o message-content-
type
=html -o message-charset=utf8 -xu ops@huanqiu.cn -xp WEE78@12l$ -m
"Mysql主從數據同步有延遲"
fi
[root@master-server ~]# chmod /root/check-slave-monit.sh
[root@master-server ~]# sh /root/check-slave-monit.sh
Mysql主從數據一致
結合crontab,每隔一分鐘檢查一次
[root@master-server ~]
# crontab -e
#mysql主從同步延遲檢查
* * * * *
/bin/bash
-x
/root/check-slave-monit
.sh >
/dev/null
2>&1
在從庫上運行監測同步延遲(也可以在命令后加上--master-server-id=101或--print-master-server-id,同上操作)
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --user=root --password=123456
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
........
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --user=root --password=123456 --check
0.00
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
[root@slave-server src]# tail -f /opt/master-slave.txt
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 ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
如何關閉上面在主庫上執行的heartbeat更新進程呢?
方法一:可以用參數--stop去關閉
[root@master-server ~]# ps -ef|grep heartbeat
root 15152 1 0 19:49 ? 00:00:02 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15310 1 0 19:59 ? 00:00:01 perl /usr/bin/pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
root 15555 31932 0 20:13 pts/2 00:00:00 grep heartbeat
[root@master-server ~]# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
[root@master-server ~]# ps -ef|grep heartbeat
root 15558 31932 0 20:14 pts/2 00:00:00 grep heartbeat
[root@master-server ~]#
這樣就把在主上開啟的進程殺掉了。
但是后續要繼續開啟后臺進行的話,記住一定要先把/tmp/pt-heartbeat-sentinel 文件刪除,否則啟動不了
方法二:直接kill掉進程pid(推薦這種方法)
[root@master-server ~]# ps -ef|grep heartbeat
root 15152 1 0 19:49 ? 00:00:02 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15310 1 0 19:59 ? 00:00:01 perl /usr/bin/pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
root 15555 31932 0 20:13 pts/2 00:00:00 grep heartbeat
[root@master-server ~]# kill -9 15152
[root@master-server ~]# ps -ef|grep heartbeat
root 15558 31932 0 20:14 pts/2 00:00:00 grep heartbeat
最后總結:
通過pt-heartbeart工具可以很好的彌補默認主從延遲的問題,但需要搞清楚該工具的原理。
默認的Seconds_Behind_Master值是通過將服務器當前的時間戳與二進制日志中的事件時間戳相對比得到的,所以只有在執行事件時才能報告延時。備庫復制線程沒有運行,也會報延遲null。
還有一種情況:大事務,一個事務更新數據長達一個小時,最后提交。這條更新將比它實際發生時間要晚一個小時才記錄到二進制日志中。當備庫執行這條語句時,會臨時地報告備庫延遲為一個小時,執行完后又很快變成0。
---------------------------------------percona-toolkit其他組件命令用法----------------------------------
下面這些工具最好不要直接在線上使用,應該作為上線輔助或故障后離線分析的工具,也可以做性能測試的時候配合著使用。
1)pt-online-schema-change
功能介紹:
功能為:在alter操作更改表結構的時候不用鎖定表,也就是說執行alter的時候不會阻塞寫和讀取操作,注意執行這個工具的時候必須做好備份,操作之前最好要充分了解它的原理。
工作原理是:創建一個和你要執行alter操作的表一樣的空表結構,執行表結構修改,然后從原表中copy原始數據到表結構修改后的表,當數據copy完成以后就會將原表移走,用新表代替原表,默認動作是將原表drop掉。在copy數據的過程中,任何在原表的更新操作都會更新到新表,因為這個工具在會在原表上創建觸發器,觸發器會將在原表上更新的內容更新到新表。如果表中已經定義了觸發器這個工具就不能工作了。
用法介紹:
pt-online-schema-change [OPTIONS] DSN
options可以自行查看help(或加--help查看有哪些選項),DNS為你要操作的數據庫和表。
有兩個參數需要注意一下:
--dry-run 這個參數不建立觸發器,不拷貝數據,也不會替換原表。只是創建和更改新表。
--execute 這個參數的作用和前面工作原理的介紹的一樣,會建立觸發器,來保證最新變更的數據會影響至新表。注意:如果不加這個參數,這個工具會在執行一些檢查后退出。這一舉措是為了讓使用這充分了解了這個工具的原理。
使用示例:
在線更改表的的引擎,這個尤其在整理innodb表的時候非常有用,如下huanqiu庫的haha表默認是Myisam存儲引擎,現需要在線修改成Innodb類型。
mysql> show create table huanqiu.haha;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| haha | CREATE TABLE `haha` (
`
id
` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`
id
`)
) ENGINE=MyISAM AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
in
set
(0.00 sec)
修改操作如下:
[root@master-server ~]
# pt-online-schema-change --user=root --password=123456 --host=localhost --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute --check-replication-filters
Found 1 slaves:
slave-server
Will check slave lag on:
slave-server
Replication filters are
set
on these hosts:
slave-server
slave_skip_errors = ALL
replicate_ignore_db = mysql
replicate_do_db = huanqiu,huanpc
Please
read
the --check-replication-filters documentation to learn how to solve this problem. at
/usr/bin/pt-online-schema-change
line 8083.
如上命令就是在主庫上操作的,會提示它有從庫,需要添加參數--nocheck-replication-filters,即不檢查從庫。(注意:下面命令中可以將localhost換成主庫ip。另外:該命令只能針對某張表進行修改,因為它是針對alter操作的,而alter是針對表的操作命令。所以不能省略命令中"t=表名"的選項)
[root@master-server ~]
# pt-online-schema-change --user=root --password=123456 --host=localhost --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute --nocheck-replication-filters
Found 1 slaves:
slave-server
.......
2017-01-16T10:36:33 Dropped old table `huanqiu`.`_haha_old` OK.
2017-01-16T10:36:33 Dropping triggers...
2017-01-16T10:36:33 Dropped triggers OK.
Successfully altered `huanqiu`.`haha`.
然后再次查看huanqiu.haha表的存儲引擎,發現已是Innodb類型的了。
mysql> show create table huanqiu.haha;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| haha | CREATE TABLE `haha` (
`
id
` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`
id
`)
) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row
in
set
(0.00 sec)
若是在從庫上,則可以直接執行(也可以將下面從庫ip替換成localhost)
[root@slave-server ~]
# pt-online-schema-change --user=root --password=123456 --host=192.168.1.102 --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute
No slaves found. See --recursion-method
if
host slave-server has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
.......
2017-01-15T21:40:35 Swapped original and new tables OK.
2017-01-15T21:40:35 Dropping old table...
2017-01-15T21:40:35 Dropped old table `huanqiu`.`_haha_old` OK.
2017-01-15T21:40:35 Dropping triggers...
2017-01-15T21:40:35 Dropped triggers OK.
Successfully altered `huanqiu`.`haha`.
2)pt-duplicate-key-checker
功能介紹:
功能為從mysql表中找出重復的索引和外鍵,這個工具會將重復的索引和外鍵都列出來,并生成了刪除重復索引的語句,非常方便
用法介紹:
pt-duplicate-key-checker [OPTION...] [DSN]
包含比較多的選項,具體的可以通過命令pt-duplicate-key-checker --help來查看具體支持那些選項,我這里就不一一列舉了。DNS為數據庫或者表。
使用示例:
查看huanqiu庫或huanqiu.haha表的重復索引和外鍵使用情況使用,如下命令:
[root@master-server ~]
# pt-duplicate-key-checker --host=localhost --user=root --password=123456 --databases=huanqiu
# ########################################################################
# Summary of indexes
# ########################################################################
# Total Indexes 6
# [root@master-server ~]# pt-duplicate-key-checker --host=localhost --user=root --password=123456 --databases=huanqiu --table=haha
# ########################################################################
# Summary of indexes
# ########################################################################
# Total Indexes 1
3)pt-slave-find
功能介紹:
查找和打印mysql所有從服務器復制層級關系
用法介紹:
pt-slave-find [OPTION...] MASTER-HOST
原理:連接mysql主服務器并查找其所有的從,然后打印出所有從服務器的層級關系。
使用示例:
查找主服務器為192.168.1.101的mysql有所有從的層級關系(將下面的192.168.1.101改成localhost,就是查詢本機mysql的從關系):
[root@master-server ~]
# pt-slave-find --user=root --password=123456 --host=192.168.1.101
192.168.1.101
Version 5.6.33-log
Server ID 101
Uptime 5+02:59:42 (started 2017-01-11T10:44:14)
Replication Is not a slave, has 1 slaves connected, is not read_only
Filters
Binary logging MIXED
Slave status
Slave mode STRICT
Auto-increment increment 1, offset 1
InnoDB version 5.6.33
+- 192.168.1.102
Version 5.6.34-log
Server ID 102
Uptime 4+22:22:18 (started 2017-01-11T15:21:38)
Replication Is a slave, has 0 slaves connected, is not read_only
Filters slave_skip_errors=ALL; replicate_ignore_db=mysql; replicate_do_db=huanqiu,huanpc
Binary logging MIXED
Slave status 265831 seconds behind, running, no errors
Slave mode STRICT
Auto-increment increment 1, offset 1
InnoDB version 5.6.34
4)pt-show-grants
功能介紹:
規范化和打印mysql權限,讓你在復制、比較mysql權限以及進行版本控制的時候更有效率!
用法介紹:
pt-show-grants [OPTION...] [DSN]
選項自行用help查看,DSN選項也請查看help,選項區分大小寫。
使用示例:
查看指定mysql的所有用戶權限:
[root@master-server ~]
# pt-show-grants --host='localhost' --user='root' --password='123456'
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:22:12
-- Grants
for
''
@
'localhost'
GRANT USAGE ON *.* TO
''
@
'localhost'
;
-- Grants
for
'data_check'
@
'%'
.......
查看執行數據庫的權限:
[root@master-server ~]
# pt-show-grants --host='localhost' --user='root' --password='123456' --database='huanqiu'
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:23:16
-- Grants
for
''
@
'localhost'
GRANT USAGE ON *.* TO
''
@
'localhost'
;
-- Grants
for
'data_check'
@
'%'
GRANT SELECT ON *.* TO
'data_check'
@
'%'
IDENTIFIED BY PASSWORD
'*36B94ABF70E8D5E025CF9C059E66445CBB05B54F'
;
-- Grants
for
'mksync'
@
'%'
GRANT ALL PRIVILEGES ON *.* TO
'mksync'
@
'%'
IDENTIFIED BY PASSWORD
'*B5E7409B1A22D47C6F1D8A693C6146CEB6570475'
;
........
查看每個用戶權限生成revoke收回權限的語句:
[root@master-server ~]
# pt-show-grants --host='localhost' --user='root' --password='123456' --revoke
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:24:58
-- Revoke statements
for
''
@
'localhost'
REVOKE USAGE ON *.* FROM
''
@
'localhost'
;
-- Grants
for
''
@
'localhost'
..........
5)pt-upgrade
功能介紹:
這個工具用來檢查在新版本中運行的SQL是否與老版本一樣,返回相同的結果,最好的應用場景就是數據遷移的時候。這在升級服務器的時候非常有用,可以先安裝并導數據到新的服務器上,然后使用這個工具跑一下sql看看有什么不同,可以找出不同版本之間的差異。
用法介紹:
pt-upgrade [OPTION...] DSN [DSN...] [FILE]
比較文件中每一個查詢語句在每臺服務器上執行的結果(主要是針對不同版本的執行結果)。(--help查看選項)
使用示例:
查看某個sql文件在兩個服務器的運行結果范例:
[root@master-server ~]
# pt-upgrade h=192.168.1.101 h=192.168.1.102 --user=root --password=123456 /root/test.sql
#-----------------------------------------------------------------------
# Logs
#-----------------------------------------------------------------------
.......
host1:
DSN: h=192.168.1.101
hostname
: master-server
MySQL: Source distribution 5.6.33
host2:
DSN: h=192.168.1.102
hostname
: slave-server
MySQL: Source distribution 5.6.34
......
queries_read 1
queries_with_diffs 0
queries_with_errors 0
查看慢查詢中的對應的查詢SQL在兩個服務器的運行結果范例:
[root@master-server ~]
# pt-upgrade h=192.168.1.101 h=192.168.1.102 --user=root --password=123456 /data/mysql/data/mysql-slow.log
.......
6)pt-index-usage
功能介紹:
這個工具主要是用來分析慢查詢的索引使用情況。從log文件中讀取插敘語句,并用explain分析他們是如何利用索引。完成分析之后會生成一份關于索引沒有被查詢使用過的報告。
用法介紹:
pt-index-usage [OPTION...] [FILE...]
可以直接從慢查詢中獲取sql,FILE文件中的sql格式必須和慢查詢中個是一致,如果不是一直需要用pt-query-digest轉換一下。也可以不生成報告直接保存到數據庫中,具體的見后面的示例
注意:使用這個工具需要MySQL必須要有密碼,另外運行時可能報找不到/var/lib/mysql/mysql.sock的錯,簡單的從mysql啟動后的sock文件做一個軟鏈接即可。
重點要說明的是pt-index-usage只能分析慢查詢日志,所以如果想全面分析所有查詢的索引使用情況就得將slow_launch_time設置為0,因此請謹慎使用該工具,線上使用的話最好在凌晨進行分析,尤其分析大量日志的時候是很耗CPU的。
整體來說這個工具是不推薦使用的,要想實現類似的分析可以考慮一些其他第三方的工具,比如:mysqlidxchx, userstat和check-unused-keys。網上比較推薦的是userstat,一個Google貢獻的patch。
使用示例:
從滿查詢中的sql查看索引使用情況范例:
[root@master-server ~]
# pt-index-usage --host=localhost --user=root --password=123456 /data/mysql/data/mysql-slow.log
將分析結果保存到數據庫范例:
[root@master-server ~]
# pt-index-usage --host=localhost --user=root --password=123456 /data/mysql/data/mysql-slow.log --no-report --create-save-results-database
7)pt-visual-explain
功能介紹:
格式化explain出來的執行計劃按照tree方式輸出,方便閱讀。
用法介紹:
pt-visual-explain [OPTION...] [FILE...]
通過管道直接查看explain輸出結果的范例:
mysql>
select
* from huanqiu.haha;
+----+-------------+
|
id
| name |
+----+-------------+
| 1 | wangshibo |
| 2 | wangshihuan |
| 3 | 王世博 |
| 10 | wangshiman |
+----+-------------+
4 rows
in
set
(0.00 sec)
[root@master-server ~]
# mysql -uroot -p123456 -e "explain select * from huanqiu.haha" |pt-visual-explain
Warning: Using a password on the
command
line interface can be insecure.
Table scan
rows 4
+- Table
table haha
[root@master-server ~]
# mysql -uroot -p123456 -e "explain select * from huanqiu.haha where id=3" |pt-visual-explain
Warning: Using a password on the
command
line interface can be insecure.
Bookmark lookup
+- Table
| table haha
| possible_keys PRIMARY
+- Constant index lookup
key haha->PRIMARY
possible_keys PRIMARY
key_len 4
ref const
rows 1
查看包含查詢語句的test.sql文件的范例:
[root@master-server ~]
# pt-visual-explain --connect /root/test.sql --user=root --password=123456
范例2:比較本地配置文件和遠程服務器的差異:
8)pt-config-diff
功能介紹:
比較mysql配置文件和服務器參數
用法介紹:
pt-config-diff [OPTION...] CONFIG CONFIG [CONFIG...]
CONFIG可以是文件也可以是數據源名稱,最少必須指定兩個配置文件源,就像unix下面的diff命令一樣,如果配置完全一樣就不會輸出任何東西。
使用示例:
范例1:查看本地和遠程服務器的配置文件差異:
root@master-server ~]
# pt-config-diff h=localhost h=192.168.1.102 --user=root --password=123456
18 config differences
Variable master-server slave-server
========================= ========================= =========================
binlog_checksum NONE CRC32
general_log_file
/data/mysql/data/maste
...
/data/mysql/data/slave
...
hostname
master-server slave-server
innodb_version 5.6.33 5.6.34
log_bin_index
/data/mysql/data/maste
...
/data/mysql/data/slave
...
log_slave_updates OFF ON
relay_log_recovery OFF ON
secure_file_priv NULL
server_id 101 102
server_uuid d8497104-d7a7-11e6-911... d8773e51-d7a7-11e6-911...
slave_net_timeout 3600 5
slave_skip_errors OFF ALL
sync_binlog 1 0
sync_master_info 10000 1
sync_relay_log 10000 1
sync_relay_log_info 10000 1
system_time_zone CST EST
version 5.6.33-log 5.6.34-log
范例2:比較本地配置文件和遠程服務器的差異:
[root@master-server ~]
# pt-config-diff /usr/local/mysql/my.cnf h=localhost h=192.168.1.102 --user=root --password=123456
6 config differences
Variable
/usr/local/mysql/my
.cnf master-server slave-ser
========================= ================= ================== ===============
binlog_checksum none NONE CRC32
innodb_read_io_threads 1000 64 64
innodb_write_io_threads 1000 64 64
log_bin_index master-bin.index
/data/mysql/dat
...
/data/mysql/
...
server_id 101 101 102
sync_binlog 1 1 0
9)pt-mysql-summary
功能介紹:
精細地對mysql的配置和sataus信息進行匯總,匯總后你直接看一眼就能看明白。
工作原理:連接mysql后查詢出status和配置信息保存到臨時目錄中,然后用awk和其他的腳本工具進行格式化。OPTIONS可以查閱官網的相關頁面。
用法介紹:
pt-mysql-summary [OPTIONS] [-- MYSQL OPTIONS]
使用示例:
匯總本地mysql服務器的status和配置信息:
[root@master-server ~]
# pt-mysql-summary -- --user=root --password=123456 --host=localhost
10)pt-deadlock-logger
功能介紹:
提取和記錄mysql死鎖的相關信息
用法介紹:
pt-deadlock-logger [OPTION...] SOURCE_DSN
收集和保存mysql上最近的死鎖信息,可以直接打印死鎖信息和存儲死鎖信息到數據庫中,死鎖信息包括發生死鎖的服務器、最近發生死鎖的時間、死鎖線程id、死鎖的事務id、發生死鎖時事務執行了多長時間等等非常多的信息。
使用示例:
查看本地mysql的死鎖信息
[root@master-server ~]
# pt-deadlock-logger --user=root --password=123456 h=localhost D=test,t=deadlocks
server ts thread txn_id txn_time user
hostname
ip db tbl idx lock_type lock_mode wait_hold victim query
localhost 2017-01-11T11:00:33 188 0 0 root 192.168.1.101 huanpc checksums PRIMARY RECORD X w 1 REPLACE INTO `huanpc`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT
'huanpc'
,
'heihei'
,
'1'
, NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS(
'#'
, `member`, `city`)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `huanpc`.`heihei` /*checksum table*/
localhost 2017-01-11T11:00:33 198 0 0 root 192.168.1.101 huanpc checksums PRIMARY RECORD X w 0 REPLACE INTO `huanpc`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT
'huanpc'
,
'heihei'
,
'1'
, NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS(
'#'
, `member`, `city`)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `huanpc`.`heihei` /*checksum table*/
11)pt-mext
功能介紹:
并行查看SHOW GLOBAL STATUS的多個樣本的信息。
用法介紹:
pt-mext [OPTIONS] -- COMMAND
原理:pt-mext執行你指定的COMMAND,并每次讀取一行結果,把空行分割的內容保存到一個一個的臨時文件中,最后結合這些臨時文件并行查看結果。
使用示例:
每隔10s執行一次SHOW GLOBAL STATUS,并將結果合并到一起查看
[root@master-server ~]
# pt-mext -- mysqladmin ext -uroot -p123456 -i10 -c3
12)pt-query-digest
功能介紹:
分析查詢執行日志,并產生一個查詢報告,為MySQL、PostgreSQL、 memcached過濾、重放或者轉換語句。
pt-query-digest可以從普通MySQL日志,慢查詢日志以及二進制日志中分析查詢,甚至可以從SHOW PROCESSLIST和MySQL協議的tcpdump中進行分析,如果沒有指定文件,它從標準輸入流(STDIN)中讀取數據。
用法介紹:
pt-query-digest [OPTION...] [FILE]
解析和分析mysql日志文件
使用示例:(建議:當log很大的時候最好還是將日志文件移到其他機器上進行分析,以免過多耗費本機性能)
范例1:分析本地的慢查詢日志文件(本例是慢查詢日志,也可以是mysql的其他日志)
[root@master-server ~]
# pt-query-digest --user=root --password=123456 /data/mysql/data/mysql-slow.log
# 260ms user time, 30ms system time, 24.85M rss, 204.71M vsz
# Current date: Mon Jan 16 13:20:39 2017
# Hostname: master-server
# Files: /data/mysql/data/mysql-slow.log
# Overall: 18 total, 2 unique, 0 QPS, 0x concurrency _____________________
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 812s 2s 92s 45s 80s 27s 52s
# Lock time 0 0 0 0 0 0 0
# Rows sent 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0
# Query size 1.10k 62 63 62.56 62.76 0.50 62.76
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============== ===== ======= ===== =============
# 1 0x50B84661D4CCF34B 467.9075 57.6% 10 46.7907 16.48 CREATE DATABASE `huanqiu`
# 2 0x9CC34439A4FB17E3 344.2984 42.4% 8 43.0373 16.22 CREATE DATABASE `huanpc`
# Query 1: 0 QPS, 0x concurrency, ID 0x50B84661D4CCF34B at byte 2642 _____
# This item is included in the report because it matches --limit.
# Scores: V/M = 16.48
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 55 10
# Exec time 57 468s 2s 92s 47s 80s 28s 52s
# Lock time 0 0 0 0 0 0 0 0
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0 0
# Query size 55 630 63 63 63 63 0 63
# String:
# Hosts
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s #######
# 10s+ ################################################################
CREATE DATABASE IF NOT EXISTS `huanqiu` /* pt-table-checksum */\G
# Query 2: 0 QPS, 0x concurrency, ID 0x9CC34439A4FB17E3 at byte 3083 _____
# This item is included in the report because it matches --limit.
# Scores: V/M = 16.22
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 44 8
# Exec time 42 344s 2s 82s 43s 80s 26s 56s
# Lock time 0 0 0 0 0 0 0 0
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0 0
# Query size 44 496 62 62 62 62 0 62
# String:
# Hosts
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s #########
# 10s+ ################################################################
CREATE DATABASE IF NOT EXISTS `huanpc` /* pt-table-checksum */\G
整個輸出分為三大部分:
1)整體概要(Overall)
這個部分是一個大致的概要信息(類似loadrunner給出的概要信息),通過它可以對當前MySQL的查詢性能做一個初步的評估,比如各個指標的最大值(max),平均值(min),95%分布值,中位數(median),標準偏差(stddev)。
這些指標有查詢的執行時間(Exec
time
),鎖占用的時間(Lock
time
),MySQL執行器需要檢查的行數(Rows examine),最后返回給客戶端的行數(Rows sent),查詢的大小。
2)查詢的匯總信息(Profile)
這個部分對所有“重要”的查詢(通常是比較慢的查詢)做了個一覽表。
每個查詢都有一個Query ID,這個ID通過Hash計算出來的。pt-query-digest是根據這個所謂的Fingerprint來group by的。
Rank整個分析中該“語句”的排名,一般也就是性能最常的。
Response
time
“語句”的響應時間以及整體占比情況。
Calls 該“語句”的執行次數。
R
/Call
每次執行的平均響應時間。
V
/M
響應時間的差異平均對比率。
在尾部有一行輸出,顯示了其他2個占比較低而不值得單獨顯示的查詢的統計數據。
3)詳細信息
這個部分會列出Profile表中每個查詢的詳細信息:
包括Overall中有的信息、查詢響應時間的分布情況以及該查詢”入榜”的理由。
pt-query-digest還有很多復雜的操作,這里就不一一介紹了。比如:從PROCESSLIST中查詢某個MySQL中最慢的查詢:
范例2:重新回顧滿查詢日志,并將結果保存到query_review中,注意query_review表的表結構必須先建好,表結構如下:
mysql> use
test
;
Database changed
mysql> CREATE TABLE query_review (
-> checksum BIGINT UNSIGNED NOT NULL PRIMARY KEY,
-> fingerprint TEXT NOT NULL,
-> sample TEXT NOT NULL,
-> first_seen DATETIME,
-> last_seen DATETIME,
-> reviewed_by VARCHAR(20),
-> reviewed_on DATETIME,
-> comments TEXT
-> );
Query OK, 0 rows affected (0.02 sec)
mysql>
select
* from query_review;
Empty
set
(0.00 sec)
[root@master-server ~]
# pt-query-digest --user=root --password=123456 --review h=localhost,D=test,t=query_review /data/mysql/data/mysql-slow.log
mysql>
select
* from query_review;
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
| checksum | fingerprint | sample | first_see
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
| 5816476304744969035 | create database
if
not exists `huanqiu` | CREATE DATABASE IF NOT EXISTS `huanqiu` /* pt-table-checksum */ | 2017-01-1
| 11295947304747079651 | create database
if
not exists `huanpc` | CREATE DATABASE IF NOT EXISTS `huanpc` /* pt-table-checksum */ | 2017-01-1
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
2 rows
in
set
(0.00 sec)
從tcpdump中分析:
[root@master-server ~]
# tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
tcpdump: verbose output suppressed, use -
v
or -vv
for
full protocol decode
listening on any, link-
type
LINUX_SLL (Linux cooked), capture size 65535 bytes
然后打開另一個終端窗口:
[root@master-server ~]
# pt-query-digest --type tcpdump mysql.tcp.txt
Pipeline process 3 (TcpdumpParser) caused an error: substr outside of string at
/usr/bin/pt-query-digest
line 3628, <> chunk 93.
Will retry pipeline process 2 (TcpdumpParser) 100
more
times
.
# 320ms user time, 20ms system time, 24.93M rss, 204.84M vsz
# Current date: Mon Jan 16 13:24:50 2017
# Hostname: master-server
# Files: mysql.tcp.txt
# Overall: 31 total, 4 unique, 4.43 QPS, 0.00x concurrency _______________
# Time range: 2017-01-16 13:24:43.000380 to 13:24:50.001205
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 30ms 79us 5ms 967us 4ms 1ms 159us
# Rows affecte 14 0 2 0.45 1.96 0.82 0
# Query size 1.85k 17 200 61.16 192.76 72.25 17.65
.........
13)pt-slave-delay
功能介紹:
設置從服務器落后于主服務器指定時間。
用法介紹:
pt-slave-delay [OPTION...] SLAVE-HOST [MASTER-HOST]
原理:通過啟動和停止復制sql線程來設置從落后于主指定時間。默認是基于從上relay日志的二進制日志的位置來判斷,因此不需要連接到主服務器,如果IO進程不落后主服務器太多的話,這個檢查方式工作很好,如果網絡通暢的話,一般IO線程落后主通常都是毫秒級別。一般是通過--delay and --delay"+"--interval來控制。--interval是指定檢查是否啟動或者停止從上sql線程的頻繁度,默認的是1分鐘檢查一次。
使用示例:
范例1:使從落后主1分鐘,并每隔1分鐘檢測一次,運行10分鐘
[root@master-server ~]
# pt-slave-delay --user=root --password=123456 --delay 1m --run-time 10m --host=192.168.1.102
2017-01-16T13:32:31 slave running 0 seconds behind
2017-01-16T13:32:31 STOP SLAVE
until
2017-01-16T13:33:31 at master position mysql-bin.000005
/102554361
范例2:使從落后主1分鐘,并每隔15秒鐘檢測一次,運行10分鐘:
[root@master-server ~]
# pt-slave-delay --user=root --password=123456 --delay 1m --interval 15s --run-time 10m --host=192.168.1.102
2017-01-16T13:38:22 slave running 0 seconds behind
2017-01-16T13:38:22 STOP SLAVE
until
2017-01-16T13:39:22 at master position mysql-bin.000005
/102689359
14)pt-slave-restart
功能介紹:
監視mysql復制錯誤,并嘗試重啟mysql復制當復制停止的時候
用法介紹:
pt-slave-restart [OPTION...] [DSN]
監視一個或者多個mysql復制錯誤,當從停止的時候嘗試重新啟動復制。你可以指定跳過的錯誤并運行從到指定的日志位置。
使用示例:
范例1:監視192.168.1.101的從,跳過1個錯誤
[root@master-server ~]
# pt-slave-restart --user=root --password=123456 --host=192.168.1.101 --skip-count=1
范例2:監視192.168.1.101的從,跳過錯誤代碼為1062的錯誤。
[root@master-server ~]
# pt-slave-restart --user=root --password=123456 --host=192.168.1.101 --error-numbers=1062
15)pt-diskstats
功能介紹:
是一個對GUN/LINUX的交互式監控工具
用法介紹:
pt-diskstats [OPTION...] [FILES]
為GUN/LINUX打印磁盤io統計信息,和iostat有點像,但是這個工具是交互式并且比iostat更詳細。可以分析從遠程機器收集的數據。
使用示例:
范例1:查看本機所有的磁盤的狀態情況:
[root@master-server ~]# pt-diskstats
范例2:只查看本機sdc1磁盤的狀態情況:
[root@master-server ~]# pt-diskstats
--devices-regex vdc1
#ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime
0.9 vdc1 0.0 0.0 0.0 0% 0.0 0.0 5.9 4.0 0.0 0% 0.0 1.0 0% 0 5.9 0.6 0.4
1.0 vdc1 0.0 0.0 0.0 0% 0.0 0.0 2.0 6.0 0.0 33% 0.0 0.7 0% 0 2.0 0.0 0.7
16)pt-summary
功能介紹:
友好地收集和顯示系統信息概況,此工具并不是一個調優或者診斷工具,這個工具會產生一個很容易進行比較和發送郵件的報告。
用法介紹:
pt-summary
原理:此工具會運行和多命令去收集系統狀態和配置信息,先保存到臨時目錄的文件中去,然后運行一些unix命令對這些結果做格式化,最好是用root用戶或者有權限的用戶運行此命令。
使用示例:
查看本地系統信息概況
[root@master-server ~]# pt-summary
17)pt-stalk
功能介紹:
出現問題的時候收集mysql的用于診斷的數據
用法介紹:
pt-stalk [OPTIONS] [-- MYSQL OPTIONS]
pt-stalk等待觸發條件觸發,然后收集數據幫助錯誤診斷,它被設計成使用root權限運行的守護進程,因此你可以診斷那些你不能直接觀察的間歇性問題。默認的診斷觸發條件為SHOW GLOBAL STATUS。也可以指定processlist為診斷觸發條件 ,使用--function參數指定。
使用示例:
范例1:指定診斷觸發條件為status,同時運行語句超過20的時候觸發,收集的數據存放在目標目錄/tmp/test下:
[root@master-server ~]# pt-stalk
--function status --variable Threads_running --threshold 20 --dest /tmp/test -- -uroot -p123456 -h292.168.1.101
范例2:指定診斷觸發條件為processlist,超過20個狀態為statistics觸發,收集的數據存放在/tmp/test目錄下:
[root@master-server ~]# pt-stalk
--function processlist --variable State --match statistics --threshold 20 --dest /tmp/test -- -uroot -p123456 -h292.168.1.101
.......
2017_01_15_17_31_49-hostname
2017_01_15_17_31_49-innodbstatus1
2017_01_15_17_31_49-innodbstatus2
2017_01_15_17_31_49-interrupts
2017_01_15_17_31_49-log_error
2017_01_15_17_31_49-lsof
2017_01_15_17_31_49-meminfo
18)pt-archiver
功能介紹:
將mysql數據庫中表的記錄歸檔到另外一個表或者文件
用法介紹:
pt-archiver [OPTION...] --source DSN --where WHERE
這個工具只是歸檔舊的數據,不會對線上數據的OLTP查詢造成太大影響,你可以將數據插入另外一臺服務器的其他表中,也可以寫入到一個文件中,方便使用source命令導入數據。另外你還可以用它來執行delete操作。特別注意:這個工具默認的會刪除源中的數據!!
使用示例:
范例1:將192.168.1.101上的huanqiu庫的haha表id小于10的記錄轉移到192.168.1.102上的wangshibo庫下的wang_test表內,并歸檔到/var/log/haha_archive_20170115.log文件中(注意:轉移前后,兩張表對應轉移字段要相同,字段屬性最好也要相同;)
源數據庫機器192.168.1.101的huanqiu庫下的haha表在轉移前的信息:
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 1 | changbo |
| 2 | wangpengde |
| 4 | guocongcong |
| 5 | kevin |
| 8 | mamin |
| 9 | shihonge |
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
8
rows
in
set
(0.01 sec)
目標數據庫機器192.168.1.102的wangshibo庫下的wang_test表在轉移前的信息:
mysql>
select
*
from
wangshibo.wang_test;
+
------+-----------+
| id |
name
|
+
------+-----------+
| 20 | guominmin |
| 21 | gaofei |
| 22 | 李夢楠 |
+
------+-----------+
3
rows
in
set
(0.00 sec)
接著在192.168.1.101機器上執行轉移命令:
[root@master-server ~]# pt-archiver
--source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --dest h=192.168.1.102,D=wangshibo,t=wang_test --file '/var/log/haha_archive_20170115.log' --where "id<=10" --commit-each
上面命令執行成功后,再次觀察轉移前后信息
發現源數據庫機器192.168.1.101的huanqiu.haha表數據在轉移后,源數據也刪除了!
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
2
rows
in
set
(0.00 sec)
查看歸檔日志:
[root@master-server ~]# tail -f /var/log/haha_archive_20170115.log
1 changbo
2 wangpengde
4 guocongcong
5 kevin
8 mamin
9 shihonge
目標數據庫192.168.1.102的wangshibo.wang_test表內已經移轉到了新數據
mysql>
select
*
from
wangshibo.wang_test;
+
------+-------------+
| id |
name
|
+
------+-------------+
| 20 | guominmin |
| 21 | gaofei |
| 22 | 李夢楠 |
| 1 | changbo |
| 2 | wangpengde |
| 4 | guocongcong |
| 5 | kevin |
| 8 | mamin |
| 9 | shihonge |
+
------+-------------+
9
rows
in
set
(0.00 sec)
范例2:將192.168.1.101上的huanqiu庫的haha表里id小于10的記錄歸檔到haha_log_archive_2017.10.10.log文件中:
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 1 | changbo |
| 2 | wangpengde |
| 4 | guocongcong |
| 5 | kevin |
| 8 | mamin |
| 9 | shihonge |
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
8
rows
in
set
(0.00 sec)
[root@master-server ~]# pt-archiver
--source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --file 'haha_log_archive_2017.10.10.log' --where "id<=10" --commit-each
轉移后的源數據已被刪除
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
2
rows
in
set
(0.00 sec)
查看歸檔文件
[root@master-server ~]# cat haha_log_archive_2017.10.10.log
1 changbo
2 wangpengde
4 guocongcong
5 kevin
8 mamin
9 shihonge
范例3:刪除192.168.1.101上的huanqiu庫的haha表中id小于10的記錄:
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 1 | changbo |
| 2 | wangpengde |
| 4 | guocongcong |
| 5 | kevin |
| 8 | mamin |
| 9 | shihonge |
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
8
rows
in
set
(0.00 sec)
[root@master-server ~]# pt-archiver
--source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --purge --where 'id<=10' --no-check-charset
<br>再次查看,發現數據已成功刪除!
mysql>
select
*
from
huanqiu.haha;
+
----+---------------+
| id |
name
|
+
----+---------------+
| 11 | zhanglei |
| 15 | zhanghongmiao |
+
----+---------------+
2
rows
in
set
(0.00 sec)
19)pt-find
功能介紹:
查找mysql表并執行指定的命令,和gnu的find命令類似。
用法介紹:
pt-find [OPTION...] [DATABASE...]
默認動作是打印數據庫名和表名
使用示例:
查找192.168.1.101中1天以前創建的InnoDB的表 ,并打印。
[root@master-server ~]
# pt-find --ctime +1 --host=192.168.1.101 --engine InnoDB --user=root --password=123456
`huanpc`.`_heihei_new`
`huanpc`.`checksums`
`huanqiu`.`_haha_new`
`huanqiu`.`checksums`
`huanqiu`.`heartbeat`
`mysql`.`innodb_index_stats`
`mysql`.`innodb_table_stats`
`mysql`.`slave_master_info`
`mysql`.`slave_relay_log_info`
`mysql`.`slave_worker_info`
范例2:查找192.168.1.101中1天以前更改過的數據庫名字匹配%huanqiu%的并且引擎為Myisam的表,并將表的引擎更改為Innodb引擎。
先查找出192.168.1.101上1天以前更改過的數據庫名字匹配%huanqiu%的并且引擎為Myisam的表
[root@master-server ~]
# pt-find --ctime +2 --dblike huanqiu --host=192.168.1.101 --engine Myisam --user=root --password=123456
`huanqiu`.`_haha_new`
`huanqiu`.`checksums`
`huanqiu`.`heartbeat`
[root@master-server ~]
# pt-find --ctime +2 --dblike huanpc --host=192.168.1.101 --engine Myisam --user=root --password=123456
`huanpc`.`_heihei_new`
`huanpc`.`checksums`
再將查找出的表的引擎改為Innodb
[root@master-server ~]
# pt-find --ctime +2 --dblike huanqiu --host=192.168.1.101 --engine Myisam --user=root --password=123456 --exec "ALTER TABLE %D.%N ENGINE=InnoDB"
[root@master-server ~]
# pt-find --ctime +2 --dblike huanpc --host=192.168.1.101 --engine Myisam --user=root --password=123456 --exec "ALTER TABLE %D.%N ENGINE=InnoDB"
最后再檢查對應數據表的引擎
范例3:查找192.168.1.101中huanqiu庫和huanpc庫中的空表,并刪除。
[root@master-server ~]
# pt-find --empty huanqiu huanpc --host=192.168.1.101 --user=root --password=123456 --exec-plus "DROP TABLE %s"
范例4:查找192.168.1.101中超過100M的表
[root@master-server ~]
# pt-find --tablesize +100M --host=192.168.1.101 --user=root --password=123456
20)pt-kill
功能介紹:
Kill掉符合指定條件mysql語句
用法介紹:
pt-kill [OPTIONS]
加入沒有指定文件的話pt-kill連接到mysql并通過SHOW PROCESSLIST找到指定的語句,反之pt-kill從包含SHOW PROCESSLIST結果的文件中讀取mysql語句
使用示例:
范例1:查找192.168.1.101數據庫服務器運行時間超過60s的語句,并打印
[root@master-server ~]
# pt-kill --busy-time 60 --print --host=192.168.1.101 --user=root --password=123456
范例2:查找192.168.1.101數據庫服務器運行時間超過60s的語句,并kill
[root@master-server ~]
# pt-kill --busy-time 60 --kill --host=192.168.3.135 --user=root --password=123456
范例3:從proccesslist文件中查找執行時間超過60s的語句
[root@master-server ~]
# mysql -uroot -p123456 -h292.168.1.101 -e "show processlist" > processlist.txt
Warning: Using a password on the
command
line interface can be insecure.
[root@master-server ~]
# pt-kill --test-matching processlist.txt --busy-time 60 --print
percona-toolkit工具的pt-table-checksum實際運用簡析就先給大家講到這里,對于其它相關問題大家想要了解的可以持續關注億速云的行業資訊。我們的板塊內容每天都會捕捉一些行業新聞及專業知識分享給大家的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。