zoukankan      html  css  js  c++  java
  • 运维工作中,关于Linux,MySQL你都有哪些技巧

    来自:DoDBA
    Linux
    
    1. screen
    
    screen是一个可以统一管理多个会话,并可在会话之间切换,共享会话的工作,更是DBA在执行DDL,大事务性工作的利器。
    
    示例:
    
    ##新建一个screen   
    [lufei@dodba ~]$ screen -R lufei   
    ##查看所有screen   
    [lufei@dodba ~]$ screen -lsThere is a screen on:14919.lufei(Attached)1 Socket in /var/run/screen/S-lufei.   
    ##将指定的screen离线   
    [lufei@dodba ~]$ screen -D 14919   [14919.lufei power detached.]   
    ##恢复一个screen   
    [lufei@dodba ~]$ screen -R 14919
    2.Ctrl-Z/fg/bg/jobs
    
    如果你正在前台正运行一个执行时间很长的任务,但又需要做其他的事情,这个时候你可以使用Ctrl-Z,将前台任务挂到后台。
    
    常用:
    
    CTRL+Z  挂起进程并放入后台。
    jobs       显示当前暂停的进程。
    bg %N   使第N个任务在后台运行,默认表示对最后一个进程操作。
    fg   %N  使第N个任务在前台运行,默认表示对最后一个进程操作。
    示例:
    
    ##使用Ctrl-Z 将cp任务挂到后台   
    
    [lufei@dodba ~]$ cp dump.gz dump.gz2016   
    ^Z[1]+  Stopped  cp -i dump.gz dump.gz2016   
    
    ##jobs 查看后台任务   
    [lufei@dodba ~]$ jobs   
    [1]+  Stopped  cp -i dump.gz dump.gz2016   
    
    ## fg 将最后一个后台任务拉到前台   
    [lufei@dodba ~]$ fg   
    cp -i dump.gz dump.gz2016   
    
    ##可以再次使用Ctrl-Z 将cp任务挂到后台   
    ^Z[1]+  Stopped cp -i dump.gz dump.gz2016   
    
    ##使用bg,将最后一个任务放到后台执行   
    [lufei@dodba ~]$ bg   
    [1]+ cp -i dump.gz dump.gz2016 &   
    
    ##使用jobs 可以看到cp在后台执行   
    [lufei@dodba ~]$ jobs   
    [1]+  Running  cp -i dump.gz dump.gz2016 &
    3. shell set 命令
    
    set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值, [+ -]分别为打开和关闭这个参数,set 有很多参数,而set -x是我最常用的。 set -x ,显示shell脚本运行的冗余输出,每一条命令以及加载命令行中的任何参数都会显示出来,调试shell脚步非常方便。
    
    [lufei@dodba ]$ cat set.sh    
    #!/bin/bash   
    set -x   
    echo -n "your name?"   read name   
    if [ $name = "lufei" ]then   
            echo "hello"else   
     echo "haha"   fi   
    [lufei@dodba ]$ bash set.sh    
    + echo -n 'your name?'your name?   
    + read name   
    lufei   
    + '[' lufei = lufei ']'+ echo hello   
    hello   
    另一中方式sh -x   
    
    [lufei@dodba]$ cat set.sh    
    #!/bin/bash   
    echo -n "your name?"   read name   
    if [ $name = "lufei" ]   
    then   
        echo "hello"   else   
     echo "haha"   fi   
    
    [lufei@dodba]$ sh -x set.sh    
    + echo -n 'your name?'your name?   
    + read name   
    lufei   
    + '[' lufei = lufei ']'   + echo hello   
    hello
    4. shell 日志记录
    
    运维工作的同学编写shell脚步应该是硬技能,将一些复杂的操作编写成shell脚步,可以提高不少效率,shell脚步记录日志是必不可少的,日志可以用来排错,追溯等用途,下面提供一个记录shell脚步日志的方法。
    
    LOGFILE=${BASEDIR}/logs/${DTTIME}.log      
    exec 3>&1 4>&2 1>>${LOGFILE} 2>&1
    5. shell 并发
    
    上面刚说到运维同学会使用shell是硬性要求,那么如何在shell中使用并发呢,见下面代码。
    
    #!/bin/bash      
    cat ip.txt|while read info;      do      zn=`echo ${info}|awk '{print $1}'`;      
    IP=`echo ${info}|awk '{print $2}'`;      
    joblist=($(jobs -p)); --还可以根据ps -ef|grep 当前脚步名称|wc -l      while(( ${#joblist[*]} >= 10 ))--控制并发数,可以做为参数      do      sleep 40joblist=($(jobs -p));      
    done      
    scp ${IP}:/home/databak/*${zn}*2016050603* /home/lufei/dump/ &      
    done;
    6. crt显示主机名
    
    有时候在crt中打开多个窗口,太多了后,自己都分不清哪个是哪个,使用下面的方法,可以在打开crt时显示主机名
    
    ## 在/etc/profile 中增加以下,然后crt选择Xterm      
    echo -ne "e]2;$(hostname)a"
    还有一些常用命令如下:
    
    Ctrl+a 光标移动到命令行开始
    Ctrl+e 光标移动到到命令行末尾
    Ctrl+u 清除剪切光标之前的内容
    Ctrl+w 清除光标前的一个单词
    Ctrl+r 查找历史命令
    Ctrl+l 清屏
    MySQL
    
    1.MySQL与shell交互
    
    有些时候我们需要从MySQL中读出数据,然后传给shell,去做一些逻辑判断,下面是一个实例,目前我们使用beego框架开发了一套SQL上线平台,这个web平台主要控制审批流程,然后将审批过的信息存到MySQL中,后台我们使用以下脚本远程执行。
    
    #!/bin/bash   
    while read id dbname dbip sqlfile;    do    echo $id $dbname $dbip $sqlfile   
    ##mysql -h$dbip -utest -p'test'    -D $dbname --default-character-set=utf8 -vvv < ${SQLDIR}/$sqlfile   
    done < <(/usr/bin/mysql -utest -p"test"    
        -s --skip-column-names  -e "use enndb;select id,n,d,e from aw where s='3'")
    还有一个经典的交互案例就是备份,我们都知道mysqldump备份是串行的,多个database,一个一个备份,同database中一个一个table去备份,如何可以并行使用mysqldump备份呢,写多个mysqldump,太low了吧。下面代码可以做到。
    
    for db in $(mysql -e "show databases" -s --skip-column-names);   
    do    echo $db;   
    mysqldump ........ &   
    done
    2.MySQL 解压恢复
    
    使用mysqldump备份的时候,一般我们为了节省磁盘空间会使用以下方法进行压缩,
    
    mysqldump -hlocalhost --default-character-set=utf8       
    --master-data=2 --single-transaction        
    -B a   | gzip > 'a'`date +%Y%m%d%H%M`.sql.gz
    在进行恢复/搭建从库时需要先解压,再去导入,需要两条命令,简洁的方法如下:
    
    gunzip < a201612071131.sql.gz |mysql
    3.MySQL loose_
    
    当你在不同的MySQL版本中,或是不同的MySQL分支中切换my.conf配置文件时(少数),可能有些参数会不兼容,使用loose_参数,如果没有这个参数,将会忽略。
    
    [root@dodba ~]# grep dodba /etc/my.cnf   
    dodba=1   [root@dodba ~]# /etc/init.d/mysql startStarting MySQL (Percona Server)......    
    ERROR! The server quit without updating PID file (/home/mysql/dodba.com.pid).   
    [root@dodba ~]# tail -f error.log   
    2016-12-19T10:08:31.875314Z 0 [ERROR] unknown variable 'dodba=1'   2016-12-19T10:08:31.875371Z 0 [ERROR] Aborting   
    
    ##增加loose_前缀   
    [root@dodba ~]# grep dodba /etc/my.cnf   
    loose_dodba=1   [root@dodba ~]# /etc/init.d/mysql start   
    Starting MySQL (Percona Server).. SUCCESS!
    4.MySQL 帮助
    
    众多的MySQL命令,除了常用的,应该有很多都记不住,其实不用查文档,直接使用?+命令就会有很详细的帮助。
    
    mysql> ? purge   
    Name: 'PURGE BINARY LOGS'Description:   
    Syntax:   
    PURGE { BINARY | MASTER } LOGS   
        { TO 'log_name' | BEFORE datetime_expr }   
    
    Examples:   
    PURGE BINARY LOGS TO 'mysql-bin.010';   
    PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
    5.MySQL --initialize-insecure
    
    相信大家都知道MySQL5.7版本的安装最重要的一个变化就是不在使用mysql_install_db,而是使用mysqld --initialize,其实还有一个参数是--initialize-insecure。
    
    两个参数的区别就是前者生成一个临时密码在日志中,对于自动化安装脚步来讲还得处理,而直接使用后者,会生成一个空密码的账号,安装脚步就不需要再处理,但是登陆后为安全起见还是希望你能修改密码。
    
    6.MySQL -vv
    
    在mysql中使用-vv参数,可以返回更详细的信息,有详细的信息就会更容易排错。
    
    ##什么都不返回   
    [root@dodba ~]# mysql  -e "use tdb;update t set name=444;"      ##-v 显示语句本身   
    [root@dodba ~]# mysql  -v -e "use tdb;update t set name=444;"   --------------update t set name=444--------------   
    
    ##-vv 显示执行时间,结果   
    [root@dodba ~]#  mysql  -vv -e "use tdb;update t set name=444;"   --------------update t set name=444--------------   
    Query OK, 0 rows affected (0.02 sec)   
    Rows matched: 2  Changed: 0  Warnings: 0   Bye
    7.MySQL 类型转换
    
    有些时候,有同学在SQL的where条件中会直接写key=1278类似(值不加引号)的谓词条件,但如果这个key是varchar类型,就会发生隐式类型转换,导致全表扫描。其实你只需要记住一条,谓词条件中的值,都加引号就可以了。 下面是个实例:
    
    mysql> desc t;   
    +-------+-------------+------+-----+---------+-------+   
    | Field | Type        | Null | Key | Default | Extra |   
    +-------+-------------+------+-----+---------+-------+   
    | id    | int(11)     | YES  |     | NULL    |       |   
    | name  | varchar(20) | YES  |     | NULL    |       |   
    +-------+-------------+------+-----+---------+-------+   
    2 rows in set (0.00 sec)   
    
    mysql> alter table t add index ind_id(id);   
    Query OK, 0 rows affected (0.19 sec)   
    Records: 0  Duplicates: 0  Warnings: 0   mysql> alter table t add index ind_name(name);   
    Query OK, 0 rows affected (0.09 sec)   
    Records: 0  Duplicates: 0  Warnings: 0   ##隐式转换,全表扫描   
    select * from t where name=222;   
    
    ##不会发生隐式类型转换,索引扫描   
    select * from t where name='222';   
    select * from t where id=1;   
    select * from t where id='1';
  • 相关阅读:
    Android之ActionBar的样式使用
    Android之在View中执行Activity的跳转
    Android之百度定位API使用
    那些年掉进过的Android坑之Fragment系列
    Android UI设计框架[1]: ViewPager+Fragment实现底部图标文字的导航栏(IconTabPageIndicator)
    SQLite3初探
    【GDOI2018模拟7.9】期末考试
    【ZJOJ1321】灯
    【NOIP2016提高A组模拟8.23】函数
    【ZJOJ5186】【NOIP2017提高组模拟6.30】tty's home
  • 原文地址:https://www.cnblogs.com/zq6041/p/6895076.html
Copyright © 2011-2022 走看看