小生博客:http://xsboke.blog.51cto.com
-------谢谢您的参考,如有疑问,欢迎交流
- 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));
- 从库主从报错: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
- 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
- zip
# 压缩排除目录或者文件
zip -r yasuo.zip /var/www -x="/var/www/logs/*"
# 只压缩符合条件的文件
zip -r yasuo.zip /var/www -i="/var/www/logs/*.zip"
- lsof的应用
lsof -c mysql 查看某个进程打开的文件
- 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;
}
- 磁盘单位换算
磁盘单位换算
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024Byte
- 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 就代表中间正则匹配到的内容
- git
手动更新
git branch `date +%Y%m%d%H%M%S` #备份
git pull #拉取
git branch #查看所在分支
回滚到旧的分支
git branch 切换到旧的分支
git checkout [branch名称]
git checkout master
git checkout . # 放弃当前所有操作
- 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
- sed
# 在指定行号的行前添加字符串
sed -i "3,5 s/^/aaaaa /" a.txt
[^]:代表行前
[3,5]:代表范围:x,y-1