小生博客:http://xsboke.blog.51cto.com

                    -------谢谢您的参考,如有疑问,欢迎交流

  1. mysql
# mysql部分数据的导入和导出
#查询到的数据导出为csv文件
select * from user where username='xiaoli
INTO OUTFILE '/tmp/user.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n';
#csv文件导入到表中
LOAD DATA INFILE '/user.csv'
INTO TABLE user
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n';

# 创建mysql数据库时指定字符集
CREATE DATABASE `dbname` DEFAULT CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;

#推荐一个数据库主从角色互换流程
数据库主从角色互换:https://www.cnblogs.com/nbuntu/p/5523331.html

#传统主从复制master语句
CHANGE MASTER TO
  MASTER_HOST='master_IP',
  MASTER_USER='APP_USER',
  MASTER_PASSWORD='APP_PASSWD',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mariadb-bin.000003',
  MASTER_LOG_POS=4; 

#查询数据库大小
#进入information_schema 数据库(存放了其他的数据库的信息)
use information_schema;
#查询所有数据的大小:
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables;
#查看指定数据库的大小:
#比如查看数据库home的大小
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='home';
#查看指定数据库的某个表的大小
#比如查看数据库home中 members 表的大小
select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='home' and table_name='members';

# mysql修复表
check table 和 repair table
   登陆mysql 终端:
   mysql -uxxxxx -p dbname
   check table tabTest;
   如果出现的结果说Status是OK,则不用修复,如果有Error,可以用:
   repair table tabTest;
   进行修复,修复之后可以在用check table命令来进行检查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。

#主从复制报错  InnoDB: Could not find a valid tablespace file for 'dbname/tbname'.解决办法
一般带有分区的表,会出现这种情况
alter table tbname ADD PARTITION (PARTITION p20180907 VALUES in (737309));
  1. 从库主从报错:Error initializing relay log position: Could not open log file解决办法

    MariaDB [(none)]> show slave status\G;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 192.168.0.1
    Master_User: username
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mariadb-bin.000071
    Read_Master_Log_Pos: 846334461
    Relay_Log_File: relay-bin.000143
    Relay_Log_Pos: 756833718
    Relay_Master_Log_File: mariadb-bin.000060
    Slave_IO_Running: Yes
    Slave_SQL_Running: No

    可以看出,Relay_Log_Pos的756833718在master的mariadb-bin.000060中

step 1:首先mysqlbinlog中继日志relay-bin.000143,找到756833718里面的[end_log_pos]字段,这个字段就是与当前位置对应的master binlog日志的logpos

# at 756833691
#181102 18:00:00 server id 2 end_log_pos 960891450 Xid = 7671532648
COMMIT/!/;
DELIMITER ;
# End of log file
ROLLBACK / added by mysqlbinlog /;
/!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE/;
/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0/;

只找到了最接近756833718的logpos [# at 756833691]所以我们去master找到binlog日志mariadb-bin.000060的logpos的960891450位置

step 2:查看master的binlog日志mariadb-bin.000060,找到 logpos 960891450,然后核对两边的日志内容是否相对应,如果对应,在从库重新change master to即可

# at 960891450
#181102 18:00:01 server id 2 end_log_pos 960891488 GTID 0-2-8899109099 trans
/!100001 SET @@session.gtid_seq_no=8899109099//!/;
BEGIN
/!/;

step 3:恢复同步

stop slave;
reset slave;
change master to master_host='192.168.0.1',master_user='username',master_password='123456',MASTER_PORT=3306,master_log_file='mariadb-bin.000060',master_log_pos=960891450;
start slave;

step 4: 验证

MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: 192.168.0.1
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000061
Read_Master_Log_Pos: 717998442
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 19634263
Relay_Master_Log_File: mariadb-bin.000060
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

  1. redis通过模糊查询key批量删除
redis-cli -h 192.168.0.1 -p 6379  keys "*lottery-method-max-prize*" | xargs redis-cli -h 192.168.0.1 -p 6379 del
  1. zip
# 压缩排除目录或者文件
zip -r yasuo.zip /var/www -x="/var/www/logs/*"

# 只压缩符合条件的文件
zip -r yasuo.zip /var/www -i="/var/www/logs/*.zip"
  1. lsof的应用
 lsof -c mysql  查看某个进程打开的文件
  1. nginx
#nginx直接返回text到页面
location /remote_addr {
    default_type text/plain;
    return 200 "$remote_addr\n";
}

#https跳转
if ($scheme = http) {
   return 301 https://$host$request_uri;
   }
  1. 磁盘单位换算
 磁盘单位换算
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024Byte
  1. Shell
#关于$符号
$$  Shell本身的PID(ProcessID) 
$!  Shell最后运行的后台Process的PID 
$?  最后运行的命令的结束代码(返回值) 
$-  使用Set命令设定的Flag一览 
$*  所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@  所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$#  添加到Shell的参数个数 
$0  Shell本身的文件名 
$1~$n   添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

#颜色
/033[31m   文本 /033[0m

31 红色
32 绿色
33 ×××
34 蓝色

#if  判断

IF条件判断

1、基本语法:
if [ command ]; then
符合该条件执行的语句
fi
2、扩展语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi

3、语法说明:
bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。
当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。
返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。

注意:
1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
4、判断是不支持浮点值的
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
6、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

文件/目录判断:
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。

字符串判断
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]  如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

#shell脚本测试和跟踪
sh -n  test.sh      # 测试脚本是否有错误
sh -vx test.sh   # 跟踪脚本执行过程,只加-x也可以

# vim在每行的行首添加字符串
:%s/^/add/g
# vim在每行的行尾添加字符串
:%s/$/add/g

:1,10 s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
:10 s/from/to/ 表示只在第10行搜索替换;

# Vim搜索后,匹配的文字会高亮,再次打开文件,还是高亮状态,
:nohl

# 将以welcome 开始 to结尾的行改为to开始welcome结尾
>> welcome 34545646 to
>> welcomefdafadfto
:%s /welcome\(.*\)to/to\1welcome/g
说明:   \1  就代表中间正则匹配到的内容
  1. git
手动更新
git branch `date +%Y%m%d%H%M%S`   #备份
git pull                                                        #拉取
git branch                                                  #查看所在分支

回滚到旧的分支
git  branch 切换到旧的分支
git  checkout  [branch名称]
git  checkout master
git checkout .    # 放弃当前所有操作
  1. ubuntu
#关闭ubuntu自动下载最新内核配置
修改配置文件/etc/apt/apt.conf.d/10periodic。
            将“1”改为“0”,保存即可。0是关闭

            vi /etc/apt/apt.conf.d/10periodic

            APT::Periodic::Update-Package-Lists "0";
            APT::Periodic::Download-Upgradeable-Packages "0";
            APT::Periodic::AutocleanInterval "0";

# 创建用户,ubuntu默认不自动创建家目录
useradd -s /bin/bash -G sudo -k /etc/skel -m -d /home/username  username

#删除旧的内核:
apt-get autoremove
  1. sed
# 在指定行号的行前添加字符串
sed -i "3,5 s/^/aaaaa /" a.txt
[^]:代表行前
[3,5]:代表范围:x,y-1