Maatkit–Mysql的高级管理工具集

Maatkit是Mysql的一个高级管理工具集。 官方网站:http://www.maatkit.org/

参考:
http://www.bigheaddba.net/article/ytag/maatkit
http://code.google.com/p/maatkit/

#1安装一系列依赖软件

Perl

perl-DBI.x86_64 : A database access API for perl

perl-DBD-MySQL.x86_64 : A MySQL interface for perl

perl-TermReadKey

wget http://packages.sw.be/perl-TermReadKey/perl-TermReadKey-2.30-3.el5.rf.x86_64.rpm

rpm -ivh perl-TermReadKey-2.30-3.el5.rf.x86_64.rpm

#2安装maatkit

wget http://maatkit.googlecode.com/files/maatkit-6839-1.noarch.rpm

rpm -ivh maatkit-6839-1.noarch.rpm

#3maatkit所包含的常用工具

##########################################################################################

#01、mk-table-checksum检查主从表是否一致及有效的工具

#02、mk-table-sync使表一致的工具,不必重载从表而能够保证一致

#03、mk-visual-explainexlpain解释工具

#04、mk-heartbeat主从同步的监视工具,能够给出从落后于主多少

#05、mk-parallel-dump多线程的mysqldump工具

#06、mk-parallel-restore多线程的表修复工具

#07、mk-query-profiler查询检测分析工具

#08、mk-deadlock-logger死锁的记录工具

#09、mk-duplicate-key-checkerkey侦测工具

#10、mk-show-grants权限管理显示工具

#11、mk-slave-restart slave的检测和重启工具

#12、mk-slave-delay slave delay replication 的工具

##########################################################################################

#4使用 maatkit 的工具检查master和slave之间不一致的数据表

示例如下:

  1. [root@mysql-1 ~]# mk-table-checksum h=10.1.30.203,u=dba,p=dba,P=3306 h=10.1.30.204,u=dba,p=dba,P=3306 -d test
  2. DATABASE TABLE CHUNK HOST ENGINE COUNT CHECKSUM TIME WAIT STAT LAG
  3. test t 0 10.1.30.203 MyISAM NULL 1096324035 0 0 NULL NULL
  4. test t 0 10.1.30.204 MyISAM NULL 261265495 0 0 NULL NULL
  5. test t2 0 10.1.30.203 MyISAM NULL 3459908756 0 0 NULL NULL
  6. test t2 0 10.1.30.204 MyISAM NULL 3459908756 0 0 NULL NULL
  7. test t3 0 10.1.30.203 MyISAM NULL 0 0 0 NULL NULL
  8. test t3 0 10.1.30.204 MyISAM NULL 0 0 0 NULL NULL
  9. test t4 0 10.1.30.203 InnoDB NULL 2248149615 0 0 NULL NULL
  10. test t4 0 10.1.30.204 InnoDB NULL 1413091075 0 0 NULL NULL
  11. test t5 0 10.1.30.203 MyISAM NULL 0 0 0 NULL NULL
  12. test.t5 does not exist on slave 10.1.30.204:3306 at /usr/bin/mk-table-checksum line 6223.
  13. test t5 0 10.1.30.204 MyISAM NULL NULL 0 0 NULL NULL
  14. test t6 0 10.1.30.203 MyISAM NULL 0 0 0 NULL NULL
  15. test t6 0 10.1.30.204 MyISAM NULL 0 0 0 NULL NULL

mk-table-checksum的过滤工具mk-checksum-filter,例如我只想知道上面的例子中,test库中哪些表不是一致的。只需要加一个管道符。

  1. [root@mysql-1 ~]# mk-table-checksum h=10.1.30.203,u=dba,p=dba,P=3306 h=10.1.30.204,u=dba,p=dba,P=3306 -d test |mk-checksum-filter
  2. test t 0 10.1.30.203 MyISAM NULL 1096324035 0 0 NULL NULL
  3. test t 0 10.1.30.204 MyISAM NULL 261265495 0 0 NULL NULL
  4. test t4 0 10.1.30.203 InnoDB NULL 2248149615 0 0 NULL NULL
  5. test t4 0 10.1.30.204 InnoDB NULL 1413091075 0 0 NULL NULL
  6. test.t5 does not exist on slave 10.1.30.204:3306 at /usr/bin/mk-table-checksum line 6223.
  7. test t5 0 10.1.30.203 MyISAM NULL 0 0 0 NULL NULL
  8. test t5 0 10.1.30.204 MyISAM NULL NULL 0 0 NULL NULL

需要注意的是,mk-table-checksum工具在检查的时候会对表加一个表级锁,应该放在系统不繁忙的时候执行。

#5继续使用maatkit的表同步工具mk-table-sync使从库的表跟主库保持一致

master :h=10.1.30.203,P=3306

slave :h=10.1.30.204,P=3306

master:

  1. mysql> SELECT * FROM test.t;
  2. +——+
  3. | id |
  4. +——+
  5. | 5 |
  6. +——+
  7. 1 row INSET (0.00 sec)

slave:

  1. mysql> SELECT * FROM test.t;
  2. +——+
  3. | id |
  4. +——+
  5. | 5 |
  6. | 1 |
  7. +——+
  8. 2 rowsINSET (0.00 sec)

二者数据不一致,从刚才mk-table-checksum已经检查出来了,这里使用sync工具生成修正sql:

  1. [root@mysql-1 mysql-5.1.40]# mk-table-sync h=10.1.30.203,u=dba,p=dba,P=3306 h=10.1.30.204,u=dba,p=dba,P=3306 <strong>–print</strong> <strong>–no-check-slave</strong> -d test -t t
  2. DELETE FROM `test`.`t` WHERE `id`=’1′ LIMIT 1 /*maatkit src_db:test src_tbl:t src_dsn:P=3306,h=10.1.30.203,p=…,u=dba dst_db:test dst_tbl:t dst_dsn:P=3306,h=10.1.30.204,p=…,u=dba lock:0 transaction:0 changing_src:0 replicate:0 bidirectional:0 pid:25072 user:root host:mysql-1*/;

复制环境中,若是slave是不允许直接进行修正的,除非添加–no-check-slave这个参数;

–print表示把修正的语句打印出来

–execute表示直接执行修正操作

再举个例子:

master:

  1. mysql> SELECT * FROM test.t;
  2. +——+
  3. | id |
  4. +——+
  5. | 5 |
  6. | 2 |
  7. +——+
  8. 2 row INSET (0.00 sec)

slave:

  1. mysql> SELECT * FROM test.t;
  2. +——+
  3. | id |
  4. +——+
  5. | 5 |
  6. +——+
  7. 1 rowsINSET (0.00 sec)
  1. [root@mysql-1 mysql-5.1.40]# mk-table-sync h=10.1.30.203,u=dba,p=dba,P=3306 h=10.1.30.204,u=dba,p=dba,P=3306 –print –execute –no-check-slave -d test -t t
  2. INSERT INTO `test`.`t`(`id`) VALUES (‘2’) /*maatkit src_db:test src_tbl:t src_dsn:P=3306,h=10.1.30.203,p=…,u=dba dst_db:test dst_tbl:t dst_dsn:P=3306,h=10.1.30.204,p=…,u=dba lock:0 transaction:0 changing_src:0 replicate:0 bidirectional:0 pid:25091 user:root host:mysql-1*/;

需要注意的是,若是在主从环境中,想把slave中数据不一致的表跟master保持一致(拿master的数据更新slave),那么这部分【h=10.1.30.203,u=dba,p=dba,P=3306 h=10.1.30.204,u=dba,p=dba,P=3306】的顺序,master应该在前。因为这里的顺序 source-db target-db,代表拿source-db的数据更新target-db。

发表评论