Percona Toolkit mysql輔助利器

1 PT介紹

Percona Toolkit簡稱pt工具—PT-Tools,是Percona公司開發用於管理MySQL的工具,功能包括檢查主從複製的數據一致性、檢查重複索引、定位IO佔用高的表文件、在線DDL等,DBA熟悉掌握後將極大提升工做效率。html

2 PT 安裝

 下載地址 :https://www.percona.com/downloads/percona-toolkit/mysql

下載完上傳到linux 服務器linux

安裝PTweb

[root@master01 ~]# yum -y install percona-toolkit-3.0.12-1.el7.x86_64.rpm

  

建立一個表生成10000000 條測試數據 
建立一個用戶表:
sql

create table uc_user (
user_id int NOT NULL auto_increment primary key , user_name varchar(32) ,
create_time datetime
)

  

隨機生成10000000 條測試數據數據庫

#建立存儲過程 
delimiter //
create procedure user_data()
begin
    declare i int default 1;
    set i = 1;
    while i<=10000000 do
        -- rymd 表示隨機年月日
        set @rymd = CONCAT(FLOOR(1990 + (RAND() * 28)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0));
        -- rhms 表示隨機分鐘小時秒
        set @rhms = CONCAT(LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0));
        -- rstring 生成4位隨機字符串
        set @rstring = substring(MD5(RAND()),1,4);
        insert into uc_user values (i,@rstring,concat(@rymd,' ',@rhms));
        set i=i+1;
    end while; 
end //
delimiter ;

  

生成10000000 條測試數據json

#開啓一個事務
mysql> start transaction;
#調用存儲過程
mysql> call user_data();

#結束事務,提交到硬盤
mysql> commit;

  

個人mysql 版本是5.7.22 安全

3 PT 經常使用的幾個工具

3.1 pt-archiver

pt-archive 是MySQL的在線歸檔,無影響生產數據bash

爲何要歸檔: 
若干年前的數據則不多再被使用.歸檔的意思就是將某些不常使用的數據 放置到其餘地方.
服務器

歸檔前提條件: 
pt-archive: —歸檔 用此操做的表必須有主鍵。通常的表設計的都會有主鍵的。

  1. 歸檔歷史數據;

  2. 在線刪除大批量數據;

  3. 數據導出和備份;

  4. 數據遠程歸檔

  5. 數據清理

pt-archiver –help 
pt-archiver 有不少參數,用這能夠help一下 
經常使用的一些選項說明:

--limit=1000 每次去1000行數據用pt-archiver處理
--txn-size 1000 設置1000行,爲一個事務提交一次
--where 'id<3000' 設置操做條件, id表示表的column
--progress 5000  每處理5000行輸出一次處理信息
--statistics  輸出執行過程及最後的操做統計。(只要不加上--quiet,默認狀況下pt-archiver都會輸出執行過程的)
--charset=UTF8 指定字符集爲UTF8 -- 這個最後加上否則可能出現亂碼
--bulk-delete  批量刪除source 上的舊數據(例如每次1000行的批量刪除操做)

選項不少不少 ,不會的多看help

  

注: 我這用的都是root 用戶, 在實際環境 最好創建相應的用戶賦予相應的權限進行歸檔。

3.1.1 用法示例

(1). 將uc_user表中create_time字段大於2017-01-01 00:00:00時間的數據進行歸檔,不刪除原表記錄

先看看大於create_time 大於2017-01-01 00:00:00 時間有多少數據

mysql> select count(*) from uc_user where create_time > "2017-01-01 00:00:00";
+----------+
| count(*) |
+----------+
|   356624 |
+----------+
1 row in set (2.23 sec)

  

語法以下:

pt-archiver \
--source h=源ip,P=端口號,u=用戶,p=密碼,D=庫名,t=表名 \ 
--dest h=目標ip,P=端口號,u=用戶,p=密碼,D=庫名,t=表名  \
--no-check-charset --where 'create_time>"2017-01-01 00:00:00"' \
--progress 5000 --no-delete --limit=10000 –statistics

  

源服務器的表結構和目標服務器的表結構以下: 
注:它們之間沒有主從關係,只是單純的兩臺數據庫實例:

 

源服務器 ip 歸檔服務器ip
10.0.0.201 10.0.0.202

 

原服務器的表結構:

 

 歸檔服務器的表結構

 

 

 歸檔語句以下:

[root@master01 ~]# pt-archiver \
--source h=10.0.0.201,P=3306,u=root,p=123456,D=course,t=uc_user \
--dest h=10.0.0.202,P=3306,u=root,D=course,t=uc_user_history \
--no-check-charset --where 'create_time>"2017-01-01 00:00:00"' \
--progress 5000 --no-delete --limit=10000 --statistics

  

 

 

歸檔完成,看看歸檔的服務器數據是否有356624條

 

 (2).將表中CREATE_DATE字段小於1991-01-01 00:00:00時間的數據進行歸檔, 刪除原表記錄(不用加no-delete) 
看看小於1991-01-01 00:00:00 有多少條數據,在進行歸檔

 

 歸檔刪除原表記錄

[root@master01 ~]# pt-archiver \
--source h=10.0.0.201,P=3306,u=root,p=123456,D=course,t=uc_user \
--dest h=10.0.0.202,P=3306,u=root,p=123456,D=course,t=uc_user_history \
--no-check-charset --where 'create_time < "1991-01-01 00:00:00"' \
--progress 5000   --limit=10000 --statistics

 

 

看看原表的數據少了,少了357115

 

 (3).歸檔時加上字符集 --charset

 

 

[root@master01 ~]# pt-archiver  \
--charset 'utf8'  \
--source h=10.0.0.201,P=3306,u=root,p=123456,D=course,t=uc_user  \
--dest h=10.0.0.202,P=3306,u=root,p=123456,D=course,t=uc_user_history \
--no-check-charset --where 'create_time < "1992-02-01 00:00:00"' \
--progress 5000   --limit=10000 --statistics

  通常歸檔的最好仍是指定好原表字符集和歸檔數據的字符集一致。

歸檔途中就會顯示以下: 
每一個Limit 執行的時間,pt-arvhive的開始時間及結束時間 ,源服務器,目標服務器。最後操做的insert ,delete, commit 的數量

 

3.2 pt-kill

pt-kill 是一個優秀的kill MySQL鏈接的一個工具,是percona toolkit的一部分,這個工具能夠kill掉你想Kill的任何語句,特別出現大量的阻塞,死鎖,某個有問題的sql致使mysql負載很高黑客攻擊。當有不少語句時你不可能用show processlist去查看,當QPS很高時,你根本找不到你找的語句或ID,這時就能夠用pt-kill來幫你幫完成。他能夠根據運行時間,開源IP,用戶名,數據庫名。SQL語句,sleep,running 等狀態進行匹配而後kill. 能匹配的太多了一一舉例確定不現實,拿幾個案例看看。。能夠用pt-kill –help 進行查看幫助

pt-kill 一些經常使用參數 

--daemonize  放在後臺以守護進程的形式運行;
--interval       多久運行一次,單位能夠是s,m,h,d等默認是s  ,不加這個默認是5秒
--victims         默認是oldest,只殺最古老的查詢。這是防止被查殺是否是真的長時間運行的查詢,他們只是長期等待 這種種匹配按時間查詢,殺死一個時間最高值。
 --all               殺掉全部知足的線程
 --kill-query      只殺掉鏈接執行的語句,可是線程不會被終止
 --print              打印知足條件的語句
 --busy-time      批次查詢已運行的時間超過這個時間的線程;
 --idle-time      殺掉sleep 空閒了多少時間的鏈接線程,必須在
 --match-command sleep時纔有效—也就是匹配使用
--match-command    匹配相關的語句。
--ignore-command   忽略相關的匹配。
這兩個搭配使用必定是ignore-commandd在前 match-command在後,
--match-db cdelzone  匹配哪一個庫
 command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump

  

3.2.1 pt-kill 舉例

例如以下例子

  1. 殺掉空閒連接sleep 5秒的 SQL 並把日誌放到/home/pt-kill.log文件中

[root@master01 ~]# /usr/bin/pt-kill \
--match-command Sleep \
--idle-time 5 \
--victim all \
--interval 5 \
--kill --daemonize -S /tmp/mysql.sock \
--user=root --password=123456 --port=3306 \
--pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log  &

  

我這沒什麼Sleep 因此沒什麼日誌輸出

   2. KILL 掉 查詢SELECT 超過20秒的語句

[root@master01 ~]# /usr/bin/pt-kill  --user=root --password=123456 --port=3306 \
--busy-time 20 --match-info "SELECT|select" \
--victim all --interval 5  \
--kill --daemonize -S /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

注: 必定要看服務這個後臺服務啓動沒有 ,上面pt-kill 進程的pid 也是放在/tmp/ptkill.pid,因此必定的上面的那個進程給kill 掉, 而後開啓新的進程

 模擬測試超過查詢20s

 

超過了20s pt-kill 設置的規則 ,會終止這個select ,看下日誌以下:

 

   3. Kill掉 select ifnull*語句開頭的SQL,

 

[root@master01 ~]# ps aux | grep pt-kill | grep -v grep  | awk -F' ' '{print $2}' | xargs kill -9
[root@master01 ~]# pt-kill --user=root --password=123456 --port=3306 \
--victims all --busy-time=0 --match-info="select ifnull*"  \
--interval 1 -S /tmp/mysql.sock  \
--kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill123.log &

  

 

  4. kill掉state Locked

[root@master01 ~]# ps aux | grep pt-kill | grep -v grep  | awk -F' ' '{print $2}' | xargs kill -9
[root@master01 ~]# /usr/bin/pt-kill --user=root --password=123456 --port=3306 \
--victims all --match-state='Locked'  --victim all --interval 5 \
--kill --daemonize -S /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill-Locked.log &

  

  5. kill掉 qz_business_server 庫,web爲110.59.2.37的連接

pt-kill  --user=root --password=123456 --port=3306 \
--victims all --match-db='qz_business_service' \
--match-host='10.59.2.37' --kill --daemonize \
--interval 10 -S /tmp/mysql.sock \
--pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

  

  6. 指定哪一個用戶kill

pt-kill --user=root --password=123456 --port=3306 \
--victims all --match-user='root' --kill --daemonize --interval 10 -S /tmp/mysql.sock \
--pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

  

  7. kill掉 command query | Execute

/usr/bin/pt-kill --user=root --password=123456 --port=3306 \
--victims all --match-command= "query|Execute" --interval 5 \
--kill --daemonize -S /tmp/mysql.sock \
--pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

  

3.2.2 pt-kill 使用注意事項

每臺主服務器部署pt-kill進程後臺跑着。根據業務狀況設置間隔時間,多久檢測一次(建議只設置SELECT )update 、DELETE不建議

pt-kill --log-dsn D=dba,t=killed_sql_table \
--create-log-table --host=127.0.0.1 --user=root --password='密碼' --port=6006 \
--busy-time=300 --print --kill-query --ignore-info "into|INTO|update|UPDATE|delete|DELETE" \
--match-info "SELECT|select" --victims all &

  

上面的語句會把大於5分鐘的SELECT 語句insert 到本機的dba庫裏的killed_sql_table表裏。注意:區分大小寫的。

記錄到本機是由於kill 到哪些語句,記錄下來,方便好查詢。

 

3.4 pt-online-schema-change

3.4.1 pt-osc 介紹

業界簡稱 pt-osc 在線更改表結構 
MySQL 大字段的DDL操做:加減字段、索引、修改字段屬性等,在5.1以前都是很是耗時耗力的,特別是會對MySQL服務產生影響。在5.1以後隨着Plugin Innodb的出如今線加索引的提升了不少,可是還會影響(時間縮短了),主要是出現了MDL鎖(MySQL爲了保護數據字典元數據,使用了metadata lock)。不過5.6能夠避免上面的狀況,但目前大部分在用的版本都是5.6以前的,因此DDL操做一直是數據庫管理人員「頭疼」的事。那如何在不鎖表的狀況下安全快速地更新表結構?

pt-osc模仿MySQL內部的改表方式進行改表,但整個改表過程是經過對原始表的拷貝來完成的,即在改表過程當中原始表不會被鎖定,並不影響對該表的讀寫操做。

首先,osc建立與原始表相同的不包含數據的新表(下劃線開頭)並按照需求進行表結構的修改,而後將原始表中的數據按逐步拷貝到新表中,當拷貝完成後,會自動同時修改原始表和新表的名字並默認將原始表刪除

有兩個注意點:被操做的表若是有 觸發器,或外鍵用不了。要特別注意(標準規範MySQL是不建議用外鍵與觸發器的)若是有,要把外鍵與觸發器去掉再操做

注:1. 雖然有工具能夠修改,可是修改的時候最好是在業務低峯期進行操做
2 還需瞭解官方的online-ddl ,作好安全措施,哪些能夠改都要了解清楚 https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html

 

3.4.2 pt-osc 簡單使用說明

pt-online-schema-change —- 
在線DDL操做,對上億的大表加索引加字段且對生產無影響 
主要工做原理: 
1.建立一個和要執行 alter 操做的表同樣的新的空表結構(是alter以前的結構) 
2.在新表執行alter table 語句(速度應該很快) 
3.在原表中建立觸發器3個觸發器分別對應insert,update,delete操做 
4.以必定塊大小從原表拷貝數據到臨時表,拷貝過程當中經過原表上的觸發器在原表進行的寫操做都會更新到新建的臨時表 
5.Rename 原表到old表中,在把臨時表Rename爲原表 
6.若是有參考該表的外鍵,根據alter-foreign-keys-method參數的值,檢測外鍵相關的表,作相應設置的處理

7. 默認最後將舊原表刪除 

若是執行失敗了,或手動中止了,須要手動刪除下劃線開頭的表(_表名)及三個觸發器

主要幾個參數: 
--max-load
默認爲Threads_running=25。每一個chunk拷貝完後,會檢查SHOW GLOBAL STATUS的內容,檢查指標是否超過了指定的閾值。若是超過,則先暫停。這裏能夠用逗號分隔,指定多個條件,每一個條件格式: status指標=MAX_VALUE或者status指標:MAX_VALUE。若是不指定MAX_VALUE,那麼工具會這隻其爲當前值的120%。

 

 --critical-load 默認爲Threads_running=50。用法基本與–max-load相似,若是不指定MAX_VALUE,那麼工具會這隻其爲當前值的200%。若是超過指定值,則工具直接退出,而不是暫停。

--user: -u,鏈接的用戶名
--password: -p,鏈接的密碼 
--database: -D,鏈接的數據庫
 --port -P,鏈接數據庫的端口 
--host: -h,鏈接的主機地址 
--socket: -S,鏈接mysql套接字文件
--statistics 打印出內部事件的數目,能夠看到複製數據插入的數目。 
--dry-run 建立和修改新表,但不會建立觸發器、複製數據、和替換原表。並不真正執行,能夠看到生成的執行語句,瞭解其執行步驟與細節。--dry-run與--execute必須指定一個,兩者相互排斥。和--print配合最佳。
--execute 肯定修改表,則指定該參數。真正執行。--dry-run與--execute必須指定一個,兩者相互排斥。
--print  打印SQL語句到標準輸出。指定此選項可讓你看到該工具所執行的語句,和--dry-run配合最佳。 --progress 複製數據的時候打印進度報告,二部分組成:第一部分是百分比,第二部分是時間。 
--quiet -q,不把信息標準輸出。

  

3.4.3 pt-osc 案例

1 . 添加索引的案例 
對t=uc_user ,對uc_user表的user_name 列添加索引,索引名爲index_uname。

pt-online-schema-change \
--user=root --password='123456'  --port=3306 --host=127.0.0.1 --critical-load Threads_running=100  \
--alter "ADD INDEX index_uname (user_name)" D=course,t=uc_user --print --execute

  

 

修改過程當中

 

 查看uc_user表的結構

ok

  1. 對uc_user 添加periodID列

pt-online-schema-change \
--user=root --password='123456' --port=3306 --host=127.0.0.1 \
--critical-load Threads_running=200 --alter "ADD COLUMN periodID int(11)" \
D=course,t=uc_user --print --execute

  

 ok

 

  3. 刪除列 periodID 
刪除過程當中,中斷這個語句會發生什麼,看看建立的_uc_user_new 觸發器等,試一下。

看看數據庫是否還有_uc_user_new 還有這個表沒有

 

還有這個表, 那數據是否是還有,若是_uc_user_new 有數據,原表是否還有這個數據

 

數據也都有,對原來這個表的數據沒影響。

上面說過: 
若是執行失敗了,或手動中止了,須要手動刪除下劃線開頭的表(_表名)及三個觸發器

DROP TABLE IF EXISTS `course`.`_uc_user_new`;
DROP TRIGGER IF EXISTS `course`.`pt_osc_course_uc_user_del`;
DROP TRIGGER IF EXISTS `course`.`pt_osc_course_uc_user_upd`;
DROP TRIGGER IF EXISTS `course`.`pt_osc_course_uc_user_ins`;

  

 

 如今刪除列 periodID

pt-online-schema-change \
--user=root --password='123456' --port=3306 --host=127.0.0.1 \
--critical-load Threads_running=200 --alter "drop column periodID" D=course,t=uc_user --print --execute

  

驗證:

3.5 pt-query-digest

慢查詢Log的分析—此對DBA抓取慢查詢頗有幫助:

使用這個的前提必須開啓了MySQL慢查詢. 
雖然能夠cat 慢查詢的日誌文件,但慢查詢文件特別大了, 哪個sql 執行是最慢的了,哪個執行次數最多了。 
用pt-query-digest 查詢就很方便

 

3.5.1 pt-query-digest 經常使用參數
--create-review-table  當使用--review參數把分析結果輸出到表中時,若是沒有表就自動建立。
--create-history-table  當使用--history參數把分析結果輸出到表中時,若是沒有表就自動建立。
--filter  對輸入的慢查詢按指定的字符串進行匹配過濾後再進行分析
--limit限制輸出結果百分比或數量,默認值是20,即將最慢的20條語句輸出,若是是50%則按總響應時間佔比從大到小排序,輸出到總和達到50%位置截止。
--host  mysql服務器地址
--user  mysql用戶名
--password  mysql用戶密碼
--history 將分析結果保存到表中,分析結果比較詳細,下次再使用--history時,若是存在相同的語句,且查詢所在的時間區間和歷史表中的不一樣,則會記錄到數據表中,能夠經過查詢同一CHECKSUM來比較某類型查詢的歷史變化。
--review 將分析結果保存到表中,這個分析只是對查詢條件進行參數化,一個類型的查詢一條記錄,比較簡單。當下次使用--review時,若是存在相同的語句分析,就不會記錄到數據表中。
--output 分析結果輸出類型,值能夠是report(標準分析報告)、slowlog(Mysql slow log)、json、json-anon,通常使用report,以便於閱讀。
--since 從什麼時間開始分析,值爲字符串,能夠是指定的某個」yyyy-mm-dd [hh:mm:ss]」格式的時間點,也能夠是簡單的一個時間值:s(秒)、h(小時)、m(分鐘)、d(天),如12h就表示從12小時前開始統計。
--until 截止時間,配合—since能夠分析一段時間內的慢查詢。

  

3.5.2 pt-query-digst 案例
  1. 分析指定時間段的慢查詢

分析2018-09-07 00:00:00 到 2018-12-24 15:50:00

pt-query-digest /usr/local/mysql/data/master01-slow.log  --since '2018-09-07 00:00:00' --until '2018-12-24 15:50:00'

  

分析指定時間的慢查詢日誌 ,這樣出的數據直接打印到屏幕上,能夠輸入到一個文件裏 後面加上 > 就能夠了 

展現圖以下:靠前的都是比較慢的SQL ,須要優先處理

 

Overall: 總共有多少條查詢,上例爲總共14個查詢(這是個人測試機器)。 
Time range: 查詢執行的時間範圍。 
unique: 惟一查詢數量,即對查詢條件進行參數化之後,總共有多少個不一樣的查詢,該例爲64。 

total: 總計 
min : 最小 
max : 最大 
avg : 平均 95%: 把全部值從小到大排列,位置位於95%的那個數,這個數通常最具備參考價值。 
median : 中位數,把全部值從小到大排列,位置位於中間那個數。

  2. 分析指含有select語句的慢查詢

 

pt-query-digest  --filter '$event->{fingerprint} =~ m/^select/i'  /usr/local/mysql/data/master01-slow.log  > slow_report4.log

  

  3. 針對某個用戶的慢查詢

pt-query-digest  --filter '($event->{user} || "") =~ m/^root/i'  /usr/local/mysql/data/master01-slow.log  > slow_report5.log

  

3.6 pt-slave-delay

--pt-slave-delay ---就是指定從庫比主庫延遲多長時間,從庫上執行

MySQL 5.6 以後就有自帶的延遲配置 
延遲複製配置,經過設置Slave上的MASTER TO MASTER_DELAY 
參數實現:

 CHANGE MASTER TO MASTER_DELAY = N;

  

做用: 
MySQL在作主從同步時,能夠指定從庫從主庫延遲多長時間,這樣有一個好處,當主庫上勿刪數據時,能夠到延遲從庫上stop slave 上,而後能夠從從庫上恢復一些數據

原理: 
經過啓動和中止從服務器的sql線程來設置從落後於主。它是經過slave的relay log(中繼日誌)的position(偏移量),不斷啓動,關閉replication SQL thread來保持主從一直延時固定長的時間來實現。所以不須要鏈接到主服務器。若是IO進程不落後主服務器太多的話,這個檢查方式仍是有效的,若是IO線程延時過大,pt-slave-delay也能夠鏈接到主庫來獲取binlog的位置信息。

 

例如:

pt-slave-delay --delay=1m --interval=15s --run-time=10m u=root,p=123456,h=127.0.0.1,P=3306

  

--delay :從庫延遲主庫的時間,上面爲1分鐘。
--interval :檢查的間隔時間,上面爲15s檢查一次。(可選),不選則1分鐘檢查一次(默認)。 
--run-time :該命令運行時間,上面爲該命令運行10分鐘關閉。(可選),不選則永遠運行。--一搬不加此參數 

  

注意:延遲的時間實際爲 delay+interval,即該命令的讓從延遲主75s。

3.7 pt-table-checksum & pt-table-sync

3.7.1 檢查 pt-table-checksum

pt-table-checksum & pt-table-sync—–檢查主從是否一致性—–檢查主從不一致以後用這個工具進行處理 

這兩個一搬是搭配使用(一搬主從不同確定要查一下,不能直接修復就完事了。) 
–參數講解: 

 

 

replicate=test.checksum:主從不一致的結果放到哪一張表中,通常我放在一個既有的數據庫中,這個checksum表由pt-table-checksum工具自行創建。 
databases=testdb :咱們要檢測的數據庫有哪些,這裏是testdb數據庫,若是想檢測全部數據庫那麼就不要寫這個參數了,若是有多個數據庫,咱們用逗號鏈接就能夠了。 
host=’127.0.0.1’ :主庫的IP地址或者主機名。 
user=dba :主機用戶名。 —肯定此用戶能夠訪問主從數據庫 
port=6006:主庫端口號。 
recursion-method=hosts :主庫探測從庫的方式。 
empty-replicate-table:清理上一次的檢測結果後開始新的檢測。 
no-check-bin-log-format:不檢查二進制日誌格式,鑑於目前大多數生產數據庫都將二進制日誌設置爲「ROW」格式,而咱們的pt-table-checksum會話會自行設定用「STATEMENT」格式,
因此這個選項請務必加上。(具體什麼格式,在服務器最好查一下show variables like ‘binlog_format’;)

  

pt-table-checksum的使用

pt-table-checksum --nocheck-replication-filters  \
--no-check-binlog-format --replicate=test.checksums --recursion-method=hosts --databases=log_manage  \
h=localhost,u=sys_dba,p='密碼',P=6006

  

注:主與從庫必定要有一個公用賬號。權限大一些,也就是從主庫能登陸到從庫上的。否則會有以下報錯。提示找不到,由於會自動找從庫比對

下面加上正確的權限以後:

 

TS :完成檢查的時間。 
ERRORS :檢查時候發生錯誤和警告的數量。 
DIFFS :0表示一致,1表示不一致。當指定–no-replicate-check時,會一直爲0,當指定–replicate-check-only會顯示不一樣的信息。 
ROWS :表的行數。 
CHUNKS :被劃分到表中的塊的數目。 
SKIPPED :因爲錯誤或警告或過大,則跳過塊的數目。 
TIME :執行的時間。 
TABLE :被檢查的表名 

 

 

 

檢測DIFF有異常時,馬上到從庫去看:記住了是從庫:this_crc.這是本機。 
上面這個是正常沒有差別的

SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
FROM test.checksums
WHERE (
master_cnt <> this_cnt
OR master_crc <> this_crc
OR ISNULL(master_crc) <> ISNULL(this_crc))
GROUP BY db, tbl;

 

  

3.7.2 修復pt-table-sync

檢測有差別以後到從庫上執行一下修復: 
用這個前提是此表必需要有主鍵或惟一索引

 

 

pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p=‘密碼’ --print

  

只打印不執行—看詳細

執行

pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p='密碼' --execute

  

開始執行就修復了,再看一下就OK了 
再檢測就沒有了

3.8 pt-find

  1. 找出大於10G的表

/usr/bin/pt-find --socket=/mysql-socket的文件 --user=root --password='密碼' --port=6006 --tablesize +10G

  

  2. 25分鐘之修改過的表

/usr/bin/pt-find --socket=/mysql-socket的文件 --user=root --password='密碼' --port=6006 --mmin -25

  

   3. 空表沒有數據的表

/usr/bin/pt-find --socket=/mysql-socket的文件 --user=root --password='密碼' --port=6006 --empty

  

3.9 pt-slave-restart

pt-slave-restart —–主從報錯,跳過報錯 ,在從庫執行

經常使用參數:

--always        :永不中止slave線程,手工中止也不行
--ask-pass      :替換-p命令,防止密碼輸入被身後的開發窺屏
--error-numbers :指定跳過哪些錯誤,可用,進行分隔
--error-text    :根據錯誤信息進行匹配跳過
--log           :輸出到文件
--recurse       :在主端執行,監控從端
--runtime       :工具執行多長時間後退出:默認秒, m=minute,h=hours,d=days
--slave-user --slave-password :從庫的帳號密碼,從主端運行時使用
--skip-count    :一次跳過錯誤的個數,膽大的能夠設置大些,不指定默認1個
--master-uuid   :級聯複製的時候,指定跳過上級或者上上級事務的錯誤
--until-master  :到達指定的master_log_pos,file位置後中止,
                              格式:」file:pos「
--until-relay   :和上面同樣,可是時根據relay_log的位置來中止

  

自動跳過主從同步1032的報錯 建議在從庫上以下這個就能夠了,多個以逗號隔開就能夠了

例:

/usr/bin/pt-slave-restart --user=root --password='密碼' --port=6006 --host=127.0.0.1 --error-numbers=1032

  

3.10 pt-mysql-summary

pt-mysql-summary —MySQL的描述信息,包括配置文件的描述

show processlist 查看MySQL的鏈接, 
pt-find打印出來的信息包括:版本信息、數據目錄、命令的統計、用戶,數據庫以及複製等信息還包括各個變量(status、variables)信息和各個變量的比例信息,還有配置文件等信息。

pt-mysql-summary  --user=root --password='password' --host=127.0.0.1 --port=6007

  

 

工具不少 能夠看看官方文檔:https://www.percona.com/doc/percona-toolkit/LATEST/index.html

相關文章
相關標籤/搜索