标签:检测 本地 其他 复制 erro nlog font 环境 sum
percona-toolkit 是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的 mysql 任务和系统任务,这些任务包括:
环境架构: Centos 5.5 64 BIT
1、rpm 安装方式
rpm -ivh perl-TermReadKey-2.30-1.el5.rf.x86_64.rpm rpm -ivh percona-toolkit-2.1.1-1.noarch.rpm
tar xzvf percona-toolkit-2.1.1.tar.gz cd percona-toolkit-2.1.1 perl Makefile.PL make make test make install
pt-duplicate-key-checker --host=localhost --user=root --password=zhang@123 --databases=test
pt-online-schema-change
# 在线更改表的的引擎 pt-online-schema-change --user=root --password=zhang@123 --host=localhost --lock-wait-time=120 --alter="ENGINE=InnoDB" D=test,t=oss_pvinfo2 --execute # 大表添加字段的 pt-online-schema-change --user=root --password=zhang@123 --host=localhost --lock-wait-time=120 --alter="ADD COLUMN domain_id INT" D=test,t=oss_pvinfo2 --execute
# 分析一个语句的例子 pt-query-advisor --query "select * from aaa" #分析 general log 中的查询语句的例子 pt-query-advisor /data/dbdata/general.log #分析慢查询(slow,log)中的查询语句的例子 pt-query-advisor /data/dbdata/localhost-slow.log
# 查看指定 mysql 的所有用户权限 pt-show-grants --host=‘localhost‘ --user=‘root‘ --password=‘zhang@123‘ #查看执行数据库的权限 pt-show-grants --host=‘localhost‘ --user=‘root‘ --password=‘zhang@123‘ --database=‘hostsops‘ #查看每个用户权限生成 revoke 收回权限的语句 pt-show-grants --host=‘localhost‘ --user=‘root‘ --password=‘zhang@123‘ --revoke
pt-upgrade
# 只查看某个sql 在两个服务器的运行结果 pt-upgrade h=‘localhost‘ h=192.168.3.92 --user=root --password=zhang@123 --query="select * from user_data.collect_data limit 5" # 查看文件中的对应sql 在两个服务器的运行结果 pt-upgrade h=‘localhost‘ h=192.168.3.92 --user=root --password=zhang@123 aaa.sql #查看慢查询、compare的类型—主要包含三个query_times,results,warnings pt-upgrade h=‘localhost‘ h=192.168.3.92 --user=root --password=zhang@123 slow.log pt-upgrade h=192.168.3.91 h=192.168.3.92 --user=root --password=zhang@123 --query="select * from user_data.collect_data" --compare query_times
# 从满查询中的sql 查看索引使用情况 pt-index-usage /data/dbdata/localhost-slow.log --host=localhost --user=root --password=zhang@123 # 并将分析结构保存到数据库(使用--create-save-results-database会自动生成数据库和表来保存结果) pt-index-usage /data/dbdata/localhost-slow.log --host=localhost --user=root --password=zhang@123 --no-report --create-save-results-database
pt-pmp -p 21933 pt-pmp -b /usr/local/mysql/bin/mysqld_safe
# 查看包含explain 结果的aaa 文件 pt-visual-explain aaa # 查看包含查询语句的aaa 文件 pt-visual-explain --connect aaa --user=root --password=zhang@123 # 通过管道直接查看explain 输出结果 mysql -uroot -pzhang@123 -e "explain select email from test.collect_data where id=101992419" | pt-visual-explain
# 查看本地和远程服务器的配置文件差异 pt-config-diff h=localhost h=192.168.3.92 --user=root --password=zhang@123 #比较本地配置文件和远程服务器 pt-config-diff /etc/my.cnf h=192.168.3.92 --user=root --password=zhang@123 #比较本地两个配置文件 pt-config-diff /usr/local/mysql/share/mysql/my-large.cnf /usr/local/mysql/share/mysql/my-medium.cnf
# 汇总本地 mysql 服务器的 status 和配置信息 pt-mysql-summary -- --user=root --password=zhang@123 --host=localhost # 汇总服务器 192.168.3.92的 status 和配置信息 pt-mysql-summary -- --user=root --password=zhang@123 --host=192.168.3.92
pt-variable-advisor
# 从 localhost 获取变量值 pt-variable-advisor --user=root --password=zhang@123 localhost # 从指定的文件中读取配置,这个有格式要求 pt-variable-advisor --user=root --password=zhang@123 --source-of-variables my.cnf
# 打印本地 mysql 的死锁信息 pt-deadlock-logger --user=root --password=zhang@123 h=localhost –print # 将本地的 mysql 死锁信息记录到数据库的表中,也打印出来 pt-deadlock-logger --user=root --password=zhang@123 h=localhost --print D=test,t=deadlocks
# 我在服务器上运行的时候一直报如下错误 Use of uninitialized value in concatenation (.) or string at /usr/bin/pt-fk-error-logger line 2045
# 每隔 10s 执行一次 SHOW GLOBAL STATUS,并将结果合并到一起查看 pt-mext -- mysqladmin ext -uroot -pzhang@123 -i10 -c3
# 分析本地的慢查询文件 pt-query-digest --user=root --password=zhang@123 /data/dbdata/localhost-slow.log # 重新回顾满查询日志,并将结果保存到 query_review 中,注意 query_review 表的表结构必须先建好 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 ); pt-query-digest --user=root --password=zhang@123 --review h=localhost,D=test,t=query_review /data/dbdata/localhost-slow.log
# Column Meaning # Rank The query‘s rank within the entire set of queries analyzed # Query ID The query‘s fingerprint # Response time The total response time, and percentage of overall total # Calls The number of times this query was executed # R/Call The mean response time per execution # V/M The Variance-to-mean ratio of response time # Item The distilled query
# 读取本地慢查询日志并输出统计信息 pt-trend /data/dbdata/localhost-slow.log
# MEMORY表结构 CREATE TABLE heartbeat ( ts varchar(26) NOT NULL, server_id int unsigned NOT NULL PRIMARY KEY, file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS );
# 创建一个后台进程定期更新主上的 test 库的 heartbeat 表()默认是 1s,可以--interval 指定,执行后会成一个 heartbeat 表,test库为我监控的同步库 pt-heartbeat -D test --update --user=root --password=zhang@123 -h192.168.3.135 --create-table –daemonize # 监控复制在 slave 上的落后程度(会一直监控) pt-heartbeat -D test --monitor --user=root --password=zhang@123 -h192.168.3.92 # 监控复制在 slave 上的落后程度(监控一次退出) pt-heartbeat -D test --check --user=root --password=zhang@123 -h192.168.3.92 # 监控 PostgreSQL 需要添加--dbi-driver Pg pt-heartbeat -D test --check --user=root --password=zhang@123 -h192.168.3.92 --dbi-driver Pg
设置从服务器落后于主服务器指定时间
# 使从落后主 1 分钟,并每隔 1 分钟检测一次,运行 10 分钟 # 如果不加--run-time 参数会一直执行 pt-slave-delay --user=root --password=zhang@123 --delay 1m --run-time 10m --host=192.168.3.92 # 使从落后主 1 分钟,并每隔 15 秒钟检测一次,运行 10 分钟 pt-slave-delay --user=root --password=zhang@123 --delay 1m --interval 15s --run-time 10m --host=192.168.3.92
# 查找主服务器为 192.168.3.135 的 mysql 有所有从的层级关系 pt-slave-find --user=root --password=zhang@123 --host=192.168.3.135
# 监视 192.168.3.92 的从,跳过 1 个错误 pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --skip-count=1 # 监视 192.168.3.92 的从,跳过错误代码为 1062 的错误 pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --error-numbers=1062
REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lowe r_boundary, upper_boundary, this_cnt, this_crc) SELECT ‘test‘, ‘zhan g‘, ‘1‘, NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CON V(BIT_XOR(CAST(CRC32(CONCAT_WS(‘#‘, `id`, `name`, CONCAT(ISNULL (`name`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test`.`zhang` /*checksum table*/; UPDATE `test`.`checksums` SET chunk_time = ‘0.000563‘, master_crc = ‘31012777‘, master_cnt = ‘4‘ WHERE db = ‘test‘ AND tbl = ‘zha ng‘ AND chunk = ‘1‘
# 比较 test 数据库同步是否一致,结果显示所有的表 pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table --host=192.168.3.135 --port 3306 -uroot -pzhang@123 # 第一次运行的时候需要添加--create-replicate-table 参数,如果不加这个就需要手工运行添加表结构的 SQL,表结构 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 参数是因为我的 my.cnf 配置了replicate-ignore-db 和 replicate-wild-do-table 等参数。另外需要特别注意执行的 checksums 所在的数据库必须是同步的数据库。 # 比较 test 数据库同步是否一致,结果只显示数据不一致的表(添加--replicate-check-only 参数即可) pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --replicate-check-only --lock-wait-timeout=120 --host=192.168.3.135 --port 3306 --user=root --password=zhang@123
# 同步 3.135 的 test 库的 aaa 表到 192.168.3.92,在执行之前可以用--execute 参数换成--print 来查看会变更什么东西,后面那个主机必须是 master,否则会报错推出 pt-table-sync --execute --user=root --password=zhang@123 h=192.168.3.135,D=test,t=aaa h=192.168.3.92 # 将主的 test 数据库同步到 192.168.3.92,使从上具有一样的数据 pt-table-sync --execute --sync-to-master --user=root --password=zhang@123 h=192.168.3.92 --database test # 只同步指定的表 pt-table-sync --execute --sync-to-master --user=root --password=zhang@123 h=192.168.3.92 D=test,t=aaa # 根据 pt-table-checksum 的结果进行数据同步 pt-table-sync --execute --replicate test.checksums --user=root --password=zhang@123 h=192.168.3.135 # 根据 pt-table-checksum 使从的数据和主的数据一致 pt-table-sync --execute --replicate test.checksums --user=root --password=zhang@123 --sync-to-master h=192.168.3.92 D=test,t=aaa
# 查看本机所有的磁盘的状态情况 pt-diskstats # 只查看本机 sda2 磁盘的状态情况 pt-diskstats --devices-regex sda2
# 一个每次读取一百万行记录的范例 pt-fifo-split --lines 1000000 hugefile.txt while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done # 一个每次读取一百万行,指定 fifo 文件为/tmp/my-fifo,并使用 load data 命令导入到 mysql 中 pt-fifo-split infile.txt --fifo /tmp/my-fifo --lines 1000000 while [ -e /tmp/my-fifo ]; do mysql -e "set foreign_key_checks=0; set sql_log_bin=0; set unique_checks=0; load data local infile ‘/tmp/my-fifo‘ into table load_test fields terminated by ‘\t‘ lines terminated by ‘\n‘ (col1, col2);" sleep 1;done
# 查看本地系统信息概况 pt-summary
# 指定诊断触发条件为 status,同时运行语句超过 20 的时候触发,收集的数据存放在/tmp/test 目录下 pt-stalk --function status --variable Threads_running --threshold 20 --dest /tmp/test -- -uroot -pzhang@123 -h192.168.3.135 # 指定诊断触发条件为 processlist,超过 20 个状态为 statistics触发,收集的数据存放在/tmp/test 目录下 pt-stalk --function processlist --variable State --match statistics --threshold 20 --dest /tmp/test -- -uroot -pzhang@123 -h192.168.3.135
# 将 192.168.3.135 上的 sanmao 库的 oss_log 表 id 小于 100000的 记 录 转 移 到192.168.3.92 上的 sanmao 库 , 并 归 档 到oss_log_archive_20120605.log 文件中 pt-archiver --source h=192.168.3.135,D=sanmao,t=oss_log --user=root --password=zhang@123 --dest h=192.168.3.92,D=sanmao,t=oss_log --file ‘/var/log/oss_log_archive_20120605.log‘ --where "id<=100000" --commit-each # 将 192.168.3.135 上的 sanmao 库的 oss_log 小于 160000 的记录归档到 oss_log_archive_20120607.log 文件 pt-archiver --source h=192.168.3.135,D=sanmao,t=oss_log --user=root --password=zhang@123 --file ‘/var/log/oss_log_archive_20120607.log‘ --where "id<=160000" --commit-each # 删除 192.168.3.135 上的 sanmao 库的 oss_log 表中 id 小于167050 的记录 pt-archiver --source h=192.168.3.135,D=sanmao,t=oss_log --user=root --password=zhang@123 --purge --where ‘id<=167050‘ # 注意:如果是字符集是 utf8 的话,需要在 my.cnf 中的[client]下面添加 default-character-set = utf8,否则导出的文件内容中文会乱码。
# 查找 192.168.3.135 中 1 天以前创建的 InnoDB 的表 ,并打印 pt-find --ctime +1 --host=192.168.3.135 --engine InnoDB --user=root --password=zhang@123 # 查找 192.168.3.135 中 1 天以前更改过的数据库名字匹配%hostsops%的并且引擎为 MYISAM 的表,并将表的引擎更改为InnoDB 引擎 pt-find --mtime +1 --dblike hostsops --engine MyISAM --host=192.168.3.135 --user=root --password=zhang@123 --exec "ALTER TABLE %D.%N ENGINE=InnoDB" # 查找 192.168.3.135 中 aaa 库和 zhang 库中的空表,并删除 pt-find --empty aaa zhang --host=192.168.3.135 --user=root --password=zhang@123 --exec-plus "DROP TABLE %s" # 查找 192.168.3.135 中超过 100M 的表 pt-find --tablesize +100M --host=192.168.3.135 --user=root --password=zhang@123
# 查找 192.168.3.135 服务器运行时间超过 60s 的语句,并打印 pt-kill --busy-time 60 --print --host=192.168.3.135 --user=root --password=zhang@123 # 查找 192.168.3.135 服务器运行时间超过 60s 的语句,并 kill pt-kill --busy-time 60 --kill --host=192.168.3.135 --user=root --password=zhang@123 # 从 proccesslist 文件中查找执行时间超过 60s 的语句 mysql -uroot -pzhang@123 -h192.168.3.135 -e "show processlist" > processlist.txt pt-kill --test-matching processlist.txt --busy-time 60 --print
转载于: https://www.modb.pro/doc/1288
标签:检测 本地 其他 复制 erro nlog font 环境 sum
原文地址:https://www.cnblogs.com/yinminbo/p/12408764.html