MySQL 运维常用工具&命令

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
转发路由器TR,750小时连接 100GB跨地域
简介: 以下列出的是平常工作中用到的小工具和命令连接如何不需要密码的登录,直接mysqlmy.cnf 或者写在 ~/.my.cnf, 相对安全[mysql] --表示: 只有mysql命令才能免密码user=rootpassword=123socket=/tmp/mysql.

以下列出的是平常工作中用到的小工具和命令


连接

  • 如何不需要密码的登录,直接mysql
my.cnf  或者写在 ~/.my.cnf, 相对安全

[mysql]  --表示: 只有mysql命令才能免密码
user=root
password=123
socket=/tmp/mysql.sock
 
[mysqladmin] --表示: 只有mysqladmin命令才能免密码
user=root
password=123
socket=/tmp/mysql.sock


[mysqldump] --表示: 只有mysqldump命令才能免密码
user=root
password=123
socket=/tmp/mysql.sock

[client]   --表示:只要是客户端的命令,都是可以免密码的
user=root
password=123
socket=/tmp/mysql.sock

MySQL如何查看用户名密码

  • MySQL5.7.6之前
1. show grants for $user;

2. select host,user,Password from user;

  • MySQL5.7.6+
1. select host,user,authentication_string,password_lifetime,password_expired,password_last_changed from mysql.user where user='lc_rx';

information_schema相关

如何在线kill掉满足某种条件的session

DB_SYS: perl /home/Keithlan/scripts/outage/kill_connection/kill_sleepconn_by_opt.pl -opt $opt

PROCESSLIST

  • 分析出当前连接过来的客户端ip的分布情况
select substring_index(host,':', 1) as appip ,count(*) as count from information_schema.PROCESSLIST group by appip order by count desc ;
  • 分析处于Sleep状态的连接分布情况
select substring_index(host,':', 1) as appip ,count(*) as count from information_schema.PROCESSLIST where COMMAND='Sleep' group by appip order by count desc ;
  • 分析哪些DB访问的比较多
select DB ,count(*) as count from information_schema.PROCESSLIST where COMMAND='Sleep' group by DB order by count desc ;
  • 分析哪些用户访问的比较多
select user ,count(*) as count from information_schema.PROCESSLIST where COMMAND='Sleep' group by user order by count desc ;

TABLES

  • 列出大于10G以上的表
select TABLE_SCHEMA,TABLE_NAME,TABLE_ROWS,ROUND((INDEX_LENGTH+DATA_FREE+DATA_LENGTH)/1024/1024/1024) as size_G from information_schema.tables where ROUND((INDEX_LENGTH+DATA_FREE+DATA_LENGTH)/1024/1024/1024) > 10 order by size_G desc ;

performance_schema相关

performance_schema占用多少内存

http://dev.mysql.com/doc/refman/5.7/en/show-engine.html
SHOW ENGINE PERFORMANCE_SCHEMA STATUS;
For the Performance Schema as a whole, performance_schema.memory is the sum of all the memory used (the sum of all other memory values).

performance_schema 瓶颈

1) SHOW VARIABLES LIKE 'perf%';
2) SHOW STATUS LIKE 'perf%';
3) SHOW ENGINE PERFORMANCE_SCHEMA STATUS\G

详细细节:http://keithlan.github.io/2015/07/17/22_performance_schema/

如何查看每个threads当前session变量的值


select * from performance_schema.variables_by_thread as a,(select THREAD_ID,PROCESSLIST_ID,PROCESSLIST_USER,PROCESSLIST_HOST,PROCESSLIST_COMMAND,PROCESSLIST_STATE from performance_schema.threads where PROCESSLIST_USER<>'NULL') as b where a.THREAD_ID = b.THREAD_ID and a.VARIABLE_NAME = 'sql_safe_updates'

TOP SQL 相关

能够解决什么问题: 可以找到某个表是否还有业务访问?
能够解决什么问题: 可以确定某个库,某个表的业务是否迁移干净?
能够解决什么问题: 可以用于分析业务是否异常?
能够解决什么问题: 根据TopN 可以分析压力?
能够解决什么问题: 可以用于分析哪些表是热点数据,这些TopN的表才是值得优化的表。只要每一条语句快0.01ms,那么1亿条呢?

实例中: 求SQL

  • 一个实例中查询最多的TopN SQL
select SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN  from performance_schema.events_statements_summary_by_digest where DIGEST_TEXT like 'select%' and DIGEST_TEXT not like '%SESSION%' order by COUNT_STAR desc limit 10\G
  • 一个实例中写入最多的TopN SQL
select SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN  from performance_schema.events_statements_summary_by_digest where DIGEST_TEXT like 'insert%' or DIGEST_TEXT like 'update%'or DIGEST_TEXT like 'delete%' or DIGEST_TEXT like 'replace%'  order by COUNT_STAR desc limit 10\G

库中: 求SQL

  • 一个库中查询最多的TopN SQL
同上 实例中: 求SQL
  • 一个库中写入最多的TopN SQL
同上 实例中: 求SQL

实例中:求table

  • 使用说明
usage: perl xx.pl -i 192.168.1.10 -p 3306 -e read|write|all 2>/dev/null ;
opt e:
 read       get select count
 write      get insert,update,delete count
 all        get all sql count
opt i:
  192.xx.xx.xx  ip address
opt p:
  3306          db port
  • 查看一个实例中,哪个表的SQL语句 访问最多?
DB_SYS: perl get_table_from_sql.pl -i $ip -p $port -e all 2> /dev/null
  • 查看一个实例中,哪个表的SQL语句 select【读】最多?
DB_SYS: perl get_table_from_sql.pl -i $ip -p $port -e read 2> /dev/null
  • 查看一个实例中,哪个表的SQL语句 insert+update+delete+replace【写】最多?
DB_SYS: perl get_table_from_sql.pl -i $ip -p $port -e write 2> /dev/null

Table IO 相关的监控

库级别

  • 如何查看一个MySQL实例中哪个库的all latency时间最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(SUM_TIMER_READ) as all_read_time,sum(SUM_TIMER_WRITE) as all_write_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_time  desc;
  • 如何查看一个MySQL实例中哪个库的read latency时间最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(SUM_TIMER_READ) as all_read_time,sum(SUM_TIMER_WRITE) as all_write_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_read_time  desc;
  • 如何查看一个MySQL实例中哪个库的write latency时间最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(SUM_TIMER_READ) as all_read_time,sum(SUM_TIMER_WRITE) as all_write_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_write_time  desc;
  • 如何查看一个MySQL实例中哪个库的总访问量最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_star  desc;
  • 如何查看一个MySQL实例中哪个库的查询量(除了select中的fetchs外,还包括update,delete过程中的fetchs)最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_read  desc;
  • 如何查看一个MySQL实例中哪个库的写入量最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_write  desc;
  • 如何查看一个MySQL实例中哪个库的update量最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_update  desc;
  • 如何查看一个MySQL实例中哪个库的insert量最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_insert  desc;
  • 如何查看一个MySQL实例中哪个库的delete量最大
select OBJECT_SCHEMA,sum(SUM_TIMER_WAIT) as all_time,sum(COUNT_STAR) as all_star,sum(COUNT_read) as all_read ,sum(COUNT_WRITE) as all_write,sum(COUNT_FETCH) as all_fetch,sum(COUNT_INSERT) as all_insert,sum(COUNT_UPDATE) as all_update,sum(COUNT_DELETE) as all_delete  from performance_schema.table_io_waits_summary_by_table   group by OBJECT_SCHEMA order by all_delete  desc;

表级别

  • 表的all latency时间(read + write)最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,SUM_TIMER_READ,SUM_TIMER_WRITE,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by SUM_TIMER_WAIT desc  limit 10
  • 表的read latency(fetch)时间最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,SUM_TIMER_READ,SUM_TIMER_WRITE,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by SUM_TIMER_READ desc  limit 10
  • 表的write latency 时间最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,SUM_TIMER_READ,SUM_TIMER_WRITE,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by SUM_TIMER_WRITE desc  limit 10
  • 表的rows 总访问量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by COUNT_STAR  desc  limit 10
  • 表的rows 查询量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by  COUNT_read desc  limit 10
  • 表的rows 写入量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by  COUNT_WRITE desc  limit 10
  • 表的rows update量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by  COUNT_update desc  limit 10
  • 表的rows insert量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by  COUNT_insert desc  limit 10
  • 表的rows delete量最大
select OBJECT_SCHEMA,OBJECT_NAME,SUM_TIMER_WAIT,COUNT_STAR,COUNT_read,COUNT_WRITE,COUNT_UPDATE,COUNT_insert,COUNT_delete from performance_schema.table_io_waits_summary_by_table  order by  COUNT_delete desc  limit 10

抓包





* tshark 中的 -e参数有哪些内容请参考
    http://www.wireshark.org/docs/dfref/
    https://www.wireshark.org/docs/dfref/m/mysql.html
    https://www.wireshark.org/docs/dfref/t/tcp.html
    https://www.wireshark.org/docs/dfref/m/memcache.html
    https://www.wireshark.org/docs/dfref/h/http.html



* tshark: 抓取mysql tcp包,以及大小
    tshark -i any -R 'tcp.port == 3306 && mysql' -T fields -e tcp.port -e ip.addr -e mysql.query  -e mysql.packet_length -e tcp.len
    tshark 高级版本将 -R 替换成了 -Y

* tshark: 抓mysql包
tshark -i any dst host ${ip} and dst port 3306 -l -d tcp.port==3306,mysql -T fields -e frame.time -e 'ip.src'  -e 'mysql.query' > yy.tshark  --这种方式,会在/tmp/目录下创建很多临时文件,要小心,会产生磁盘报警。

* tshark -i any dst host ${ip} and dst port 3306 -l -d tcp.port==3306,mysql -T fields -e 'ip.src' -e 'tcp.srcport' -e 'mysql.schema'  -e 'mysql.query' -w yy.tshark  --类似于tcpdump。

nohup tshark -i any dst host ${ip} and dst port 3306 -l -d tcp.port==3306,mysql -a duration:20  -T fields -e mysql.schema -e frame.time -e ip.src -e tcp.srcport -e mysql.query -w xx.sql &  -- -a duration 当时间超过 20秒时,停止抓取。  


nohup tshark -i any dst host ${ip} and dst port 3306 -l -d tcp.port==3306,mysql -a filesize:2000000 -T fields -e mysql.schema -e frame.time -e ip.src -e tcp.srcport -e mysql.query -w xx.sql &     注:当文件超过2G时,停止抓取。单位是Kilobyte。

* 只抓取MySQL的包,不会有空格之类的了
tshark -i any dst host ${ip} and dst port 3306 -l -a duration:10 -R 'mysql.query' -T fields -e 'ip.src'  -e 'mysql.query'


==from gitlab http://gitlab.corp.anjuke.com/_incubator/knowledge/blob/master/tshark.md


* thark:解tcpdump包
tshark -r xx.tcpdump -d tcp.port==3306,mysql -T fields -e mysql.schema  -e frame.time -e ip.src -e mysql.query  > test.tshark


* 案例一、 memcache
    # 需要使用 -d 让 tshark 认为 11213 是使用的 memcache 协议,否则 tshark 默认是将 11211 认为是 memcache 协议
    ~ tshark -i eth0 -d tcp.port==11213,memcache -R 'tcp.dstport == 11213 && memcache'

* 案例二、 mysql
    ~ tshark -i eth0 -R 'tcp.port == 3306 && mysql.query' -T fields -e frame.time -e 'ip.src'  -e 'mysql.query'

* 案例三、http
    ~ tshark -i eth0 -R 'tcp.port == 80 && http'

    # 这个命令非常有用,当我们的程序非常慢,但是有没有打印任何日志时,我们怀疑可能是某个 http 请求慢了,可以用这个命令检查
    # http.time 表示整个 http请求 消耗的时间
    # http.response.code 200、403、500 等
    # tcp.analysis.initial_rtt tcp 三次握手时间
    # tcp.stream tshark 针对每一个5元组,都有一个编号,根据这个编号,可以方便的查到整个会话过程的所有请求 src.ip,src.port,tcp,dst.ip,dst.port,例如在这里,可以根据这个编号,找到请求所对应的 http.response.code ,因为在并发很高的时候,2个记录不一定紧挨着

    ~ tshark -i eth0 -R 'http && tcp.port == 80' -T fields -e tcp.analysis.initial_rtt -e frame.time -e ip.addr -e tcp.port -e http.request.uri -e tcp.stream -e http.response.code -e http.time

* 案例四、tcp
    # 检查是否有tcp 包重传
    ~ tshark -i eth0 -R 'tcp.analysis.retransmission'

slow query优化--切忌:不要在master进行分析和调优,在没有业务的机器上或者etl上分析诊断

1) 先搞清楚时间到底花在哪里&&为什么时间会花在那  (show profile)
   1.1 ) 主要工具和方法就是profiling
   1.2 ) 整个性能优化,应该花90%的时间在测量上面,只有这样才能够对症下药
   1.3 ) 通过show profile 可以知道,时间都花在哪里
   1.4 )通过session级别的status,可以知道为什么时间会花在那里
       flush status;
       select xx from tt where ff ;
       show status where variable_name like 'Handler%' or Variable_name like 'Created%';

2) 完成一项任务的时间分两个部分  执行时间和等待时间
   如何优化执行时间呢 --比较简单?
   2.1) 降低子任务数量
   2.2) 降低子任务的执行频率
   2.3) 提升子任务的执行效率并且判断任务在什么时间执行最长

   如何优化等待时间呢 --比较复杂?
   2.4) 一般是由于资源竞争导致,要用合适的工具找到竞争点。
       2.5) 判断任务在什么地方被阻塞的时间最长。


3) 通过slow,可以找到值得优化的SQL
   awk '/^# Time:/{print $3, $4, c;c=0}/^# User/{c++}' dbbak10-001-slow.log    --可以统计出每个时间点的slow 数量,精度比较细
3.1) 执行总时间最多的SQL
3.2) 单条SQL执行时间最多的SQL

4) 三种轻量级别的SQL抓取  show processlist  &  tcpdump  & slow-query   解析工具可以用:pt-query-digest 解析tcpdump和slow query
   msyql -e 'show proceslist\G' | grep State: | sort | uniq -c | sort -rn     --轻量级 (show processlist && show status)

5) 找到最需要优化的SQL后,可以开始跟踪分析单条SQL来获得更加底层实际的东 西,目前最好的三种方法是a)show profile b)show status c)slow query条目
a)show profile
SQL> set profiling=1;
SQL> select * from table;
SQL> show profiles;
SQL> show profile for query 1;
格式化输出:
SQL> set @query_id = 1;
SQL> SELECT STATE,SUM(DURATION) AS Total_R,
        ROUND(
       100*SUM(DURATION) /
         (SELECT SUM(DURATION)
           FROM INFORMATION_SCHEMA.PROFILING
           WHERE QUERY_ID = @query_id
             ), 2) AS Pct_R,
    COUNT(*) AS CallS,
        SUM(DURATION) / COUNT(*) AS "R/CALL"
     FROM INFORMATION_SCHEMA.PROFILING
     WHERE QUERY_ID = @query_id
     GROUP BY STATE
     ORDER BY Total_R DESC;

当然,通过show profile 可以知道时间主要花在什么地方,但是你不知道为什么 会花在那些地方?这是时候就必须要跟踪堆栈来找到进一步的原因了。

查看是否使用了磁盘临时表还是内存临时表:
flush status;
sql;
show status where variable_name like 'Handler%' or variable_name like 'Created%';

b) show status
SQL> 句柄计数器 handler counter,临时文件,表计数器
SQL>  flush status ; 刷新绘画级别的状态值。
SQL> select * from table;
SQL> show status where variable_name like 'Handler%' or Variable_name like 'Created%';  --可以看到是否利用了磁盘临时表,而explain是无法看到的。


6. 监控点  -- 通过监控状态数据可以发现哪些地方是异常的,然后再具体分析异 常时间点的日志。
a)show global status;   --开销比较低
b)show processlist | grep state;   或者使用innotop --开销比较低
c)slow query + pt-query-digest
d)show innoDB status;
e) vmstat
f) iostat


7. 关于索引统计
    发生过一件事情,show table status看到的大小100M,但是实际物理大小10G,通过这个发型索引统计有的时候非常不准确    
    这里简单介绍下:  

    innodb_stats_persistent=on ,  db重启后不会清空,不需要重新收集  
    innodb_stats_persistent=off, db重启后统计信息清空,需要重新收集统计  
    1、针对是否持久化统计信息mysql可以通过innodb_stats_persistent参数来控制  
  2、针对统计信息的时效性,mysql通过innodb_stats_auto_recalc参数来控制是否自动更新  
  3、针对统计信息的准确性,mysql通过innodb_stats_persistent_sample_pages 参数来控制更新  
    4、mysql通过analyze table 语句来手动的更新统计信息  
    5、mysql> select * from innodb_table_stats; last_update可以查看索引统计的最后更新时间    
    6、当索引统计不准确的时候,可以通过analyze table来更新索引统计信息,让执行计划更加准确。    
        如果这样做后,执行计划还是不准确,那么可以试图调大innodb_stats_persistent_sample_pages,让索引页收集的更加多,让执行计划更准确    


8. 关于索引选择性:  字段1 building_id,字段2 status  
    单索引字段的索引选择性: select count(distinct building_id)/count(*) as selectivity from community_units;     
    组合索引的索引选择性:   select count(distinct (concat(building_id,status)))/count(*) as selectivity from community_units;    
    组合前缀的索引选择性:   select count(distinct (concat(building_id,left(status,2))))/count(*) as selectivity from community_units;     
    得到的结果越接近1,效果越好     

cpu 模式调节

https://wiki.archlinux.org/index.php/CPU_frequency_scaling

  • 有哪几种模式
Governor Description
ondemand Dynamically switch between CPU(s) available if at 95% cpu load
performance Run the cpu at max frequency
conservative Dynamically switch between CPU(s) available if at 75% load
powersave Run the cpu at the minimum frequency
userspace Run the cpu at user specified frequencies
  • 如何查看当前的cpu模式

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

  • 如何查看cpu支持哪几种模式

cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_available_governors

  • 如何设置
  1. bios里面设置
  2. os设置

NC 传送


传送文件
目的主机监听
nc -l 监听端口<未使用端口>  > 要接收的文件名
nc -l 4444 > cache.tar.gz
 
源主机发起请求
nc  目的主机ip    目的端口 < 要发送的文件
nc  192.168.0.85  4444 < /root/cache.tar.gz
=============================================

==传送文件夹==
接收方的命令:
nc -l ${ip} 4444 | tar xf -

传送方的命令:
tar -cvf - ppc_* | nc ${ip} 4444

rsync

核心算法:http://www.oschina.net/question/28_54213?fromerr=DHoiMICG  
小bug:如果rsync一段时间,突然不传了,且流量中断,不妨加上这个参数试试  /usr/bin/rsync --sockopts=SO_RCVBUF=10485760   

配置:/etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 64
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[dbbak]
path = /data/dbbackup
use chroot = no
ignore errors
read only = no
list = no

[Binlog]
path = /data/BINLOG_BACKUP
use chroot = no
ignore errors
read only = no
list = no

[fullbak]
path = /data/FULL_BACKUP
use chroot = no
ignore errors
read only = no
list = no    

启动: /usr/bin/rsync --daemon

限速100k/s传输 :
    /usr/bin/rsync -av --progress  --update --bwlimit=100 --checksum --compress  $file  root@$ip::dbbak

正常传输:
   /usr/bin/rsync -av --progress   $file  root@$ip::dbbak

pigz使用

  • 常用知识普及
错误的写法:nohup tar -cvf - xx_20151129 | pigz  -p 24 > xx_20151129.tar.gz & --一定不能加nohup,因为中间有管道符,不能传递下去的
错误的代价:
    tar: This does not look like a tar archive
    tar: Skipping to next header
    tar: Exiting with failure status due to previous errors
以上错误的案例中,为此付出过很大的代价,哭晕在厕所N次了...

正确的写法:  tar -cvf - xx_20151129 | pigz  -p 24 > xx_20151129.tar.gz &

  • 用法
* 压缩
tar cvf - 目录名 | pigz -9 -p 24 > file.tgz
pigz:用法-9是压缩比率比较大,-p是指定cpu的核数。

* 解压1
pigz -d file.tgz
tar -xf --format=posix file

* 解压2
tar xf file.tgz

axel & httpd 多线程数据传输

* axel 下载&安装
wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.x86_64.rpm
rpm -ivh axel-2.4-1.el5.rf.x86_64.rpm

* axel 核心参数
-n   指定线程数
-o   指定另存为目录


* httpd服务搭建与配置

    yum install httpd

* httpd配置主目录
    /etc/httpd/conf/httpd.conf

[xx html]# cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
#DocumentRoot "/var/www/html" --注释
DocumentRoot "/data/dbbackup/html" --配置成容量大的地址

* 开启httpd服务

service httpd restart

* 下载数据
目的地ip shell> nohup axel -n 10 -v -o /data/dbbackup/ http://$数据源ip/xx_20151129.tar.gz &

git 基本

1. git add xx
2. git commit -m 'xx'
3. git pull
4. git push

如何模拟网络延迟或丢包

  • 模拟网络eth0 timeout 1000ms
tc qdisc add dev eth0 root netem delay 1000ms
  • 模拟网络eth0丢包率 10%
tc qdisc add dev eth0 root netem loss 10%
  • 删除以上tc命令导致的网络延迟或者丢包规则
tc qdisc del dev eth0 root

如何模拟网络故障

  • host1 网络断掉,只允许host2 访问
host1> iptables -A INPUT -p tcp -s host2  -j ACCEPT
host1> iptables -A INPUT -p tcp -s 0.0.0.0/0 -j DROP
  • host1 网络断掉,只允许host2的22端口访问
host1> iptables -A INPUT -p tcp -s host2 --dport 22  -j ACCEPT
host1> iptables -A INPUT -p tcp -s 0.0.0.0/0 -j DROP
  • 恢复host1 网络
host1> service iptables restart

ansible 基础知识

文档

官方: http://docs.ansible.com/
个人: http://sofar.blog.51cto.com/353572/1579894

基础用法

  • ssh互信
1) 不需要加入key,也能登陆到所有机器
2)前提是:
    ssh-add --mac本地,线下,将私钥加入到内存
    ssh -A root@xx ;  --会将私钥传送到远端机器
    ssh-add -L 查看下。 --查看私钥是否传送过来
  • yaml

- hosts: etl
  remote_user: root
  tasks:
        - shell: cat /home/mysql/xx.pl
        - copy: src=files/rsync dest=/usr/bin/
        - template: src=files/xx.pl dest=/home/mysql/

  • hosts
[test1]
10.x.x.x bak_dest_ip=10.y.y.y bak_source_port=xx

[etl]
10.x.x.x bak_dest_ip=10.y.y.y bak_source_port=xx
  • files
*.pl
*.file
  • 常用语法
* 命令中如果有管道等多种命令,需要用bash -c ,并且引号起来
* -T:ping延迟时间 -f:线程数 -i:后面接hosts文件,xx标签  -m:command 命令模式 -a:命令内容
ansible -T 2 -f 1 -i ./hosts etl -m command -a "bash -c 'cat /home/mysql/xx.pl |grep bin/rsync'"

* playbook方式跑ansible

ansible-playbook -i ./hosts rsync.yaml

网络流量诊断

  • tools
* ifstat

* iftop

iftop -nNP -i tunl1 —看出口流量
iftop -nNP —看看整体的

* 查看ip1 与 ip2 之间的流量

root@ip1> iftop -F $ip2/32     =============   iftop -F $P{ip}/32

* 如何查看一个机器上哪个端口占用的流量最大

1> iftop 进入界面
2> 按 N
3> 按 S

vim块操作

  • [选择] -> 在普通模式下按ctrl+v或者v进入块操作模式
v(小写)     按字符选择,选中按下V时光标所在的字符到当前光标所在字符间的内容  
V(大写)     按行选择  
[Ctrl]+V     选择矩形字符块  
  • [动作] -> 通过光标移动选中内容,可以进行ydp操作
y:复制选中内容到粘贴板  
d:删除选中内容  
p:用粘贴板里的内容替换选中的内容  
=:对齐选中内容  
对于矩阵字符块:[Shift] + i xxx [esc] :把xxx写到每一行的光标前面的位置  
  • [替换] -> 批量缩进或反缩进,类似于文本编辑器中的格式化
选中多行,按I(大写)进入插入模式,写入Tab,之后按ESC,即可完成批量缩进的功能  
也可以写入内容,到选中的每一行的光标位置  

TGW 接口

  • TGW相关问题
* 根据vip,vport,找到rsip(不需要固定key,因为不需要访问real-server)

wget -O- --post-data 'data={ "operator":"xx_DEV", "rulelist":[ { "vip":"'"$vip"'", "vport":'"$vport"', "protocol":"TCP" } ] }' "http://10.126.70.51/cgi-bin/fun_logic/bin/public_api/getrs.cgi"

* 将vip 从rsip下线(需要固定key,因为要访问real-server)

$del_rs=`wget -O- --post-data 'data={ "client_type" : "x'x_DB", "ignore_exist_error" : false, "operator" : "xx_DEV", "rs_type" : "linux_tunl", "need_setup_rs" : true, "op_type" : "'del'", "rule_list" : [ { "rule_group":[ { "vip":"'$vip'", "vport":'$vport', "protocol":"TCP" } ], "rs_os_type":"linux", "rs_list":[ { "rs_ip":"'$source_ip'", "rs_port":'$source_port', "rs_weight":100 } ] } ], "sync" : true }' 'http://xx/cgi-bin/fun_logic/bin/public_api/op_rs.cgi' 2>/dev/null`;


* 将vip 从rsip上线(需要固定key,因为要访问real-server)

$add_rs=`wget -O- --post-data 'data={ "client_type" : "xx_DB", "ignore_exist_error" : false, "operator" : "xx_DEV", "rs_type" : "linux_tunl", "need_setup_rs" : true, "op_type" : "'add'", "rule_list" : [ { "rule_group":[ { "vip":"'$vip'", "vport":'$vport', "protocol":"TCP" } ], "rs_os_type":"linux", "rs_list":[ { "rs_ip":"'$target_ip'", "rs_port":'$target_port', "rs_weight":100 } ] } ], "sync" : true }' 'http://xx/cgi-bin/fun_logic/bin/public_api/op_rs.cgi' 2>/dev/null`;

* 问题

其实TGW的接口会做两步操作:1,操作TGW server上的配置  2,操作real-server上的配置,这两步应该是原子操作。

> 假设:1 成功,2失败,那么就会导致tgw上的配置,请求均切换了,但是real-server却没做改变,导致两端出现问题。

临时解决方案:2失败了,那么手动执行2的操作。假设在TGW上执行的操作是del_rs,那么可以在read-server上执行  /usr/local/realserver/RS_TUNL0/etc/setup_rs.sh -c (将本地的rsip和vip直接的配置关系清理掉)

> 假设:1 没有执行,2 执行了,那么就会导致tgw上的配置没变,但是real-server的配置改变了,导致从tgw来的请求均在real-server上找不到,出现问题。

临时解决方案:2执行了,那么手动让2还原到没有执行的状态。假设在read-server上误清理掉相关rs配置(/usr/local/realserver/RS_TUNL0/etc/setup_rs.sh -c),那么可以调用add_rs 来恢复。
  • vip漂移脚本

* 位置: db_sys: /data/online/tools/tgw_vip_shift

usage:
    python vip_shift.py view --vip=$vip --vip_port=$vip_port
    python vip_shift.py del --vip=$vip --vip_port=$vip_port --src_ip=$src_ip --src_port=$src_port
    python vip_shift.py add --vip=$vip --vip_port=$vip_port --target_ip=$target_ip --target_port=$target_port
    python vip_shift.py change --vip=$vip --vip_port=$vip_port --src_ip=$src_ip --src_port=$src_port --target_ip=$target_ip --target_port=$target_port

       [-h] [--vip VIP] [--vip_port VIP_PORT] [--src_ip SRC_IP]
       [--src_port SRC_PORT] [--target_ip TARGET_IP]
       [--target_port TARGET_PORT] [-v VERBOSITY]
       {del,add,change,view}


SSH 如何跳过输入密码,只允许认证模式

ssh -o BatchMode=yes -o PasswordAuthentication=no root@ip 

如何永久清空一台机器上的history

* 立即清空里的history当前历史命令的记录 
    history -c

* 要求bash立即更新history文件
    history -w

nohup 失效的问题

  • 在secureCRT 或者 iterm2 等类似终端,使用nohup 执行命令,为啥退出后,后台执行的命令也就停止了?
* 错误的做法
1. nohup xx_cmd &
2. 点击左上角或者右上角的xx按钮退出
3. 然后发现,刚刚在后台的命令异常终止了

* 正确的做法
1. nohup xx_cmd &
2. 必须显示的 exit 退出shell,接下来,你想干嘛干嘛
3. 然后发现,刚刚在后台的命令,安然无恙,放心睡觉吧  

如何让iTerm2 tab页面显示从哪台机器上登陆过来的

sudo vi /bin/go

#!/bin/sh

if [ "$1" = "" ]; then
    echo "pleaes input ip"
else

    echo "go ==> ssh -A root@$1"
    echo  "\033]0;$1\007"
    ssh -A root@$1
#   ssh -A Keithlan@$堡垒机 -t "ssh root@xx"
fi

如何查看memcache/redis当前哪个链接数最多

ss | grep '$ip:$port' | awk '{print $5}' | awk -F ':' '{print $1}' | sort -nr | uniq -c | sort -nr

kibana简单语法

* 地址:http://opses.corp.anjuke.com/
* 注意:选择搜索的时间段,右上角
* filter: 
    语法: message:(+SQLSTATE +connection)    每个关键字用+号,不能有空格
* 选择log name:
    ops-user-userlog*
    ops-xinfang-userlog*
    ops-broker-userlog*
* 哪些关键字跟DB紧密相关
    SQLSTATE
    connection time out
    too many connection
    max_user_connections

定位系统问题的工具和方法

*  perf top -G : 当CPU性能出现问题的时候,使用最佳    --注意: 会卡住,导致linux宕机,小心 : http://blog.51cto.com/1152313/1767927
    [ ] perf record -g  --保留文件,稍后可以用 perf report分析  
        [ ] 如果需要分析某一个进程,可以加 -p , perf record -g -p $pid
    [ ] perf top -g 实时分析,不保留数据到文件
        [ ] 如果需要分析某一个进程,可以加 -p , perf top -g -p $pid
     
* pidstat 1 5 :分析cpu问题的好工具       

* dstat
* pstack : 当进程卡住的时候,使用效果最佳  
* ss -tnlp
* nstat
    1. 检查back_log 是否设置合理,如果不合理,那么就会看到很多如下信息,代表客户端的请求会connect timeout
        linux> nstat -a | grep -i 'drops\|Overflow'
        TcpExtListenOverflows           208539             0.0
        TcpExtListenDrops               236999             0.0
* top :
    1. top -Hp $pid
    2. top , 然后输入f,然后输入p和y , 就可以看到top显示中对了2列, p对应的是swap(查看swap的进程),y对应的是wchan(Sleeping in Function),很实用  

* gdb   https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64

    gdb -p $id
        info thread
            thread $id
                bt

* strace
    第一种: strace -o /data/dbbackup/strace.log  -fp $pid
    第二种: 跟踪某些具体的操作 strace -o /data/dbbackup/strace.log  -T -tt -f -e trace=read,open -p $pid

* other
    http://blog.donghao.org/2014/04/24/%E8%BF%BD%E8%B8%AAcpu%E8%B7%91%E6%BB%A1/  
    如果perf都用不了,可以尝试 echo t > /proc/sysrq-trigger , 然后dmesg 或者查看kernel日志
    如果上述方法还不行, 可以尝试  /proc/{pid}/wchan

atop的使用方法

查看历史的top

atop -r /var/log/atop/atop_20180906 -b 4:00 -e 5:00   --查看某台机器凌晨4点~5点的top日志, t 下一页,T 上一页

如何优化swap被占用的情况

  • 处理原则
1. 如果swap占用的内存比较小(500M以内),那么通过 swapoff -a && swapon -a 可以快速释放掉(此操作有风险,谨慎)    

2. 如果swap占用的内存比较大,则需要保证两点
    2.1 必须保证linux的空闲内存 大于 swap占用空间
    2.2 然后通过下面的方法找到占用swap最多的进程,优化处理进程,让其达到第一点后再释放swap  
  • 发现swap占用最多的进程
1. for i in $(ls /proc | grep "^[0-9]" | awk '$0>100'); do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps;done| sort -k2nr | head

有些linux无法跑上面的程序,可参考下一条命令  

2. for i in $(ll /proc | awk '{print $9}' | grep "^[0-9]" | awk '$0>100'); do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps;done| sort -k2nr | head
  • 查看机器有哪些服务
ss -tpnl
  • 如何是否os的cache
cat  /proc/sys/vm/drop_caches
sync;sync;sync;
sync;sync;sync;
sync;sync;sync;

echo 3 > /proc/sys/vm/drop_caches
sync;sync;sync;
sync;sync;sync;
echo 0 > /proc/sys/vm/drop_caches
sync;sync;sync;
sync;sync;sync;
cat /proc/sys/vm/drop_caches
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
51 3
|
1月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
61 2
|
21天前
|
运维 监控 网络协议
|
6天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
26 4
|
7天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
24 3
|
8天前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
21天前
|
运维 关系型数据库 MySQL
运维|MySQL 数据库被黑,心力交瘁
前一阵有一个测试用的 MySQL 数据库被黑了,删库勒索的那种,这里记录一下事情经过,给自己也敲个警钟。
31 2
|
29天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
45 1
|
1月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
1月前
|
人工智能 运维 监控
自动化运维:从脚本到工具的演变之路
【10月更文挑战第8天】在数字化时代的浪潮中,运维不再是简单的硬件维护,它已经演变成一场关于效率、稳定性和创新的技术革命。本文将带您领略自动化运维的魅力,从最初的脚本编写到现代复杂的自动化工具,我们将一探究竟,看看这些工具如何帮助运维人员简化日常任务,提升工作效率,并最终推动业务发展。