Blog

  • mysql参数配置

    [root@mail ~]# cat /etc/my.cnf
    [mysql]
    prompt = “(\u@\h)[\d]> ”
    no_auto_rehash
    default_character_set = utf8 #指定客户端连接字符集,等同set names utf8. <character_set_client, character_set_connection, character_set_results>。

    [mysqld]
    socket = /tmp/mysql.sock #mysql sock文件存放目录(该目录可以改动,但必需可以让mysql有写权限)
    user = mysql #启动mysql数据库的用户
    port = 3306 #mysql守护进程启动时监听的端口
    skip_external_locking #避免mysql外部锁定,减少出错机率增强稳定性(mysql5.5配置)
    skip_name_resolve #启动时和运行时跳过域名查询(mysql5.5不能用)
    query_cache_type = 1 #0或OFF(禁止使用缓存);1或ON(充许使用缓存,SELECT SQL_NO_CACHE查询语句除外);2或DEMAND(仅对SELECT SQL_CACH查询语句启动缓存)
    query_cache_limit = 8M #最大缓存结果大小
    query_cache_min_res_unit = 4k
    query_cache_size = 512M #查询缓存大小
    read_buffer_size = 2M #select时所能使用的缓冲区大小,每连接独享。
    read_rnd_buffer_size = 16M #order by | group by所使用的排序缓存大小,每连接独享。
    open_files_limit = 102400 #MySQL文件描述符限制
    sort_buffer_size = 4M #order by | group by,每连接独享。
    join_buffer_size = 2M #外链缓冲大小,每连接独享。
    key_buffer = 1G
    key_buffer_size = 1G
    table_cache = 2048 #为所有线程打开表的数量,同时须修改文件描述符默认大小。增加些值可有效避免频繁打开表产生的开销。
    max_connections = 2048 #最大允许多少个tcp进程连接
    back_log = 1000 #指定可能的连接数,当MySQL主线程在很短的时间内接收到非常多的请求时,该参数生效。达到该参数阀值会短暂停止响应新的请求(推置值 connection x 2)。
    max_connect_errors = 102400 #mysql实例在大量发时,而mysql本身处理不过来,就会产生最大连接错误,当达到设定值后会死锁实例,新的连接将无法进来,而老的连接正常。mysql有相应的自动timeout机制来控制将最大连接错误回滚成0。
    wait_timeout = 3600 #断开空闲时间超过此值的连接
    interactive_timeout = 3600 #服务器在关闭之前在一个交互连接上等待的秒数(一个交互的客户端被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户),默认为28800
    tmp_table_size = 512M #临时表大小
    slow_query_log = True #记录慢查询,对SQL优化很有帮助
    slow_launch_time = 1 #设置执行时间多长的查询为慢查询, 默认单位为秒(s)
    server_id = 61 #服务器id 主从时必需设置
    binlog_ignore_db = mysql,test
    log_bin = /data0/db-binlog/hupu.com/default/mysql-bin #打开binlog日志
    log_bin_index = /data0/db-binlog/hupu.com/default/mysql-bin.index #binlog 索引文件
    binlog_format = MIXED #binlog格式[STATEMENT(基于语句)|ROW(基于行)|MIXED(混合模式)]
    binlog_cache_size = 4M #binlog 缓存大小,调节该值大小可避免使用文件
    max_binlog_cache_size = 8M #默认4GB,限制缓存多语句事务的缓冲区总大小,当某个事务大于该值,将会失败并回滚
    max_binlog_size = 512M #指定binlog文件最大容量,超过些值会自动回滚binlog
    expire_logs_days = 60 #binlog保存最近7天的文件
    bulk_insert_buffer_size = 64M #insert … select … ,insert …(..),(..),(..) ,load data infile 有较大的加速效果, 针对每线程
    myisam_sort_buffer_size = 512M #myisam引擎排序缓冲大小,即MyISAM表发生变化时重新排序所需的缓冲区大小
    myisam_max_sort_file_size = 1G #myisam引擎最大允许排序文件大小
    myisam_repair_threads = 1 #mysql修复线程数
    myisam_recover #启动MySQL时自动修复损坏索引的表
    myisam_sort_buffer_size = 512M #表恢复时使用的缓冲区大小
    max_heap_table_size = 200M
    max_allowed_packet = 2G #导入时指定单表最大文件
    thread_concurrency = 8 #最大的并发连接线程数,取CPU的核心数x2,超线程CPU再x2
    thread_cache_size = 1024 #每个thread cache 池可以最多缓存多少个线程
    thread_stack = 192K #每个线程被创建时分配的内存空间大小

    innodb_support_xa = False #开启或关闭Innodb分布式事务. 如未使用分布式事务, 强列建议关闭. 减少磁盘刷新次数.
    innodb_additional_mem_pool_size = 8M #存储数据目录信息和其它内部数据结构的内存池大小, 表越多需要的内存也越多.默认为1MB
    innodb_buffer_pool_size = 2G #Innodb 表缓存池大小
    innodb_file_io_threads = 4 #innodb io线程数,默认为4个. 在unix类系统中设置大于4的值是没有意义的.windows则不同.
    innodb_thread_concurrency = 0 #innodb 并发线程数.设置值大于0时,innodb每次接MySQL线程调用时都将进一次并发性检测,看是否大于些值.如果show innodb status 中发现大量”waiting in InnoDB queue ” 则可将值设成0.让系统自已控制
    innodb_flush_log_at_trx_commit = 2 #innodb日志写入磁盘设置,0 : 每秒一次 ,1:每个事务完成时提交, 2:每次提交但不对日志写回磁盘操作,刷到磁盘上还是每秒一次.不受事务结束引响. 当设置为0时任何导至mysqld进程的崩溃都会删除前一秒的事务日志,当设为2时,只有操作系统崩溃或掉电才会删除最后一秒的事务.(当然磁盘回写也会导至事务的丢失,而这是磁盘的默认选项). 该选项默认值为 1.
    innodb_log_buffer_size = 8M #innodb log缓存大小,默认为1MB. 频繁写入时才修改此值到8MB或以上,因每秒(跟据innodb_flush_log_at_trx_commit值决定刷新缓存到磁盘的时间间隙)会被刷一次到磁盘. 不建议加很大
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 80
    innodb_lock_wait_timeout = 60 #Innodb引擎表死锁时等待的时间, 超出此时间事务还未执行成功, 此事务将回滚. 跟据需要设置些参数
    innodb_file_per_table = 1 #为每个innodb 表单独创建文件存放. 默认所有innodb表全部存放在ibdata1
    innodb_open_files = 1024 #Innodb 一次最多可以打开多少表,默认为300,最少值为10. 些选项跟innodb_file_per_table是多表还是单表存放innodb文件相关
    innodb_read_io_threads = 8 #Innodb 读取磁盘io线程数,默认为4. 如果磁盘性能OK, 可以加大些值来提高性能。
    innodb_write_io_threads = 4 #Innodb 写入磁盘io线程数,默认为4. 如果磁盘性能OK, 可以加大些值来提高性能。
    innodb_io_capacity = 200 #Innodb 刷新脏页到磁盘,指每秒刷新200个脏页,此值为默认。写密集型DB需加大此值。
    innodb_max_dirty_pages_pct = 80 #加快innodb脏页刷新频率减少恢得利 时间,也可保证磁盘的IP负载。值为百分比,默认90%
    innodb_adaptive_flushing = True #自适应刷新脏页,
    big_tables = True #MySQL 大表支持

    [mysqldump]
    quick
    max_allowed_packet = 2G #导出时指定单表最大文件

  • awk使用方法

    awk算是一门很强大的语言,这里只有常用的一些命令

    awk 的特性

    • awk 能按行,列读取文件
    • 和其他语言一样,有变量,条件,循环
    • 有计算和字符串操作
    • 可以生成格式化的输出

    语法要注意

    awk '/search pattern1/ {Actions}
         /search pattern2/ {Actions}' file
    • search 可以是正则表达式
    • action 为要执行的动作
    • 程序中间要用单引号引起来

    匹配符

    ~ 匹配
    !~ 不匹配

    特殊变量
    NF 字段个数
    NR 记录个数(行数)
    FS filed separator

    awk取出指定行,如第20行

    cat /etc/hosts | awk 'NR==20'

    awk取出偶数行

    awk 'NR % 2 == 0' /etc/passwd

    awk取出有3列的行

    cat /etc/hosts | awk 'NF==3'

    打印出指定列

    cat /etc/hosts | awk '{print $2}'

    打印出最后一列,列的长度参差不齐,也是打印最后一列

    cat /etc/hosts | awk '{print $NF}'

    利用求余数的方法取出某文件的随机一行

    countline=`cat swapfile | wc -l`
     awk "NR==$(($RANDOM%$countline))" swapfile

    指定分隔符为=号

    awk -F '=' '{print $2}'

    分析日志中 请求的 host 是 my.jpuyy.com 且 状态是200

    tail -n 10  nginx_access.log | awk -F' '  '$2=="my.jpuyy.com" && $10==200 {print $10}'

    $0代表了全部,打印全部 {print $0}

    tail -n 10  nginx_access.log | awk -F' '  '$2=="my.jpuyy.com" && $10==200 {print $0}'

    打印每一个filed

    echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print $i}'

    打印时与字会串拼接,用双引号引起来

    echo '11,13,15,61,3' | awk -F ',' '{for (i=1; i<=NF; i++) print "192.168.1."$i}'

    awk 与 grep 等价命令

    cat my.log | grep error
    等同于
    awk '$0 ~ "error" {print $0}' my.log

    使用 printf 打印指定格式
    下面是取出 nginx log 中 GET 请求,把其中 $3, $9 以 , 分隔,并加上换行输出到 csv 中

    cat nginx_access.log-20160410 | awk '$8=="GET" {printf "%s,%s\n", $3,$9}' >> nginx_access.log-20160410.csv

    把指定列做加法,如最后一列

    awk '{sum+=$NF} END {print sum}'

    把最后一列踢除掉

    awk '{$NF=""; print $0}' file

    全部变为大写

    awk '{print tolower($0)}'

    全部变为小写

    awk '{print toupper($0)}'

    统计目录大小,包含 G 的目录

    du -sh * | awk '$1 ~ /G/ { print }'
    

    打印 hostname 前三个字符

    hostname  | awk '{print substr($0,1,3)}'
    hostname | cut -c 1-3
    echo ${HOSTNAME:0:3}
    

    奇数行和偶数行合并

    awk 'NR%2==0 {print p" "$0;} NR%2 {p=$0;}' 
    
  • shell数组使用

    shell数组的定义可以通过如下方式
    (1) array=(var1 var2 var3 … varN) 直接写每个元素的value
    (2) array=([0]=var1 [1]=var2 [2]=var3 … [n]=varN) 写形式[下标]=value
    (3) 对每一个变量分开定义
    array[0]=var1
    arrya[1]=var2

    array[n]=varN

    可以发现shell数组下标是确定的,有一个备份实践一下array的使用

    #!/bin/bash

    arrayip=(
    [0]=192.168.1.15
    [1]=192.168.1.16
    )

    arraypath=(
    [0]=/home/www/bbs
    [1]=/home/www/user
    )

    i=0

    while [ “$i” -lt “${#arrayproject[@]}” ] ; do
    rsync -a root@${arrayip[$i]}:${arraypath[$i]} /backup/
    i=`expr $i + 1`
    done

  • ansible-fetch获取服务器上的文件

    目标是获取两台服务器下root,www用户的crontab文件,并保存在本地的fetched目录。

    main.yml文件如下

    – hosts: all
    tasks:
    – fetch: src=/var/spool/cron/www dest=fetched/cron-www-{{ ansible_hostname }} flat=yes

    – fetch: src=/var/spool/cron/root dest=fetched/cron-root-{{ ansible_hostname }} flat=yes

    执行完之后的目录结构如下

    [[email protected] fetch-crontab]# tree
    .
    ├── fetched
    │   ├── cron-root-2.jpuyy.com
    │   └── cron-www-1.jpuyy.com
    ├── hosts
    └── main.yml

  • ansible使用笔记-改主机名

    针对所有主机修改主机名

    - hosts: all
     hostname: name={{ hostname }}
  • 通过python netsnmp读取cisco交换机信息

    首先使用snmpwalk跑一遍看一下有没有问题

    snmpwalk -v 2c -c public 10.103.33.1

    这里测试用交换机是 WS-C2960G-24TC-L,以下脚本用于读取管理ip,序列号,型号,主机名。思科的交换机snmp oid信息都可通过如下网址查询http://tools.cisco.com/Support/SNMP/do/BrowseOID.do

    首先安装python的snmp依赖包

    yum install net-snmp-python

    获取信息的脚本

    #!/usr/bin/env python
    # by yangyang89
    # using snmp get switch serial, model, manage ip ..
    import netsnmp
    import sys
    import urllib
    import urllib2
    
    # reference python for linux and unix administration page 209
    class Snmp(object):
        """A basic SNMP session"""
        def __init__(self,oid="sysDescr", Version=2):
            self.oid = oid
            self.version = Version
            self.destHost = sys.argv[1]
            self.community = sys.argv[2]
    
        def query(self):
            """Creates SNMP query session"""
            try:
                result = netsnmp.snmpwalk(self.oid, Version = self.version, DestHost = self.destHost, Community = self.community)
            except Exception, err:
                print err
                result = None
            return result
    
    print sys.argv[1] + sys.argv[2]
    if sys.argv[1] and sys.argv[2]:
        s = Snmp()
        #print s.query()
        #s.oid = "2.47.1.1.1.1.11.1001"
        #http://tools.cisco.com/Support/SNMP/do/BrowseOID.do
        s.oid = ".1.3.6.1.2.1.4.20.1.1" # manage ip ipAdEntAddr
        ip = s.query()
        telnet = ip[0]
        print "ip: " + telnet
        
        s.oid = ".1.3.6.1.4.1.9.3.6.3" # serial numbers chassisId
        serial = s.query()
        serial = serial[0]
        print "serial: " + serial
        
        s.oid = ".1.3.6.1.2.1.47.1.1.1.1" # product_model entPhysicalEntry
        product_model = s.query()
        product_model = product_model[1].split(' ')[0]
        print "product_model: " + product_model
        #print s.query()
        
        s.oid = ".1.3.6.1.4.1.9.2.1.3" # hostname hostName
        hostname = s.query()
        hostname = hostname[0]
        print "hostname: " + hostname