MySQL
事务的特性ACID
事务:一组由SQL语句组成的整体,或者独立工作的单元---面试重点
##面试重点
事务的4个特性
A:原子性,整个事务中要么全部执行成功,要么全部失败回滚,唯一性,不可分割的步骤
C:一致性,必须遵循能量守恒定律,比如银行转账1000块,对方银行必定增加1000块,不存在转账后,1000块没了,双方平衡,双方加起来钱还是一致的
I:隔离性,即事务还未提交的时候,(还没显示结果),别人看不到你提交了一半的事务的过程--->dirty data脏数据,没有具体落地的东西
D:持久型,一旦事务提交,修改永久保存在数据库中
事务的隔离级别--->区分场景,安全性,数据完整性
MySQL支持四种事务隔离级别
读未提交read uncomimited:可读取到未提交的数据
读提交read commited:可读取提交的数据,但是未提交的数据不可读,导致每次读取的数据不一致(比如不同用户再执行,看到的都是自己执行的事务修改,别的人修改后的最终数据看不到)
幻读(可重复读):永远看到是最初的样子,没经过修改的,别人提交多少次,我这个用户都看不到(MySQL默认事务隔离级别)
创新:读操作加读锁,写操作加写锁
##查询事务隔离级别,默认是幻读
[hellodb]>select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
##配置MySQL的事务隔离级别,读未提交
vim /etc/my.cnf
transaction-isolation=read-uncommited
transaction-isolation=read-commited ##读提交,commit后能看到
重启服务
##幻读级别:适用于备份场景
repeatable-read--->保证我在备份的时候,备份的是原始数据,不会在别人操作的时候提交事务,而修改了原数据
bash+shell
生成random密码的几种方式
1.安装expect生成mkpasswd,使用mkpasswd生成,只能生成9位的密码
组成:大小写、数字、特殊字符
[root@ecs-web01 ~]#mkpasswd
0lN6qf&Ns
[root@ecs-web01 ~]#mkpasswd
hw0bm8LX[
[root@ecs-web01 ~]#mkpasswd
Zr*o1Ow8h
2.用urandom设备生成,转换,生成任意长度的字符
urandom块设备中断输出,截取指定位数的字符head -c
优点:可以转换成任意你想要的字符密码并且输出,可以结合创建用户密码标准输入
加上 | xargs代表换行
[root@ecs-web01 ~]#cat /dev/urandom | tr -dc [:alnum:] | head -c 10 | xargs--->字母+数字
9ouLPuXaZe
[root@ecs-web01 ~]#cat /dev/urandom | tr -dc [:upper:] | head -c 10 --->纯大写字母
MYLMOTXQGY
[root@ecs-web01 ~]#cat /dev/urandom | tr -dc [:lower:] | head -c 10 --->纯小写字母
wbkzacqgwp
##也可以使用标准输入
[root@ecs-web01 ~]#tr -dc '[:alnum:]' < /dev/urandom | head -c 10 | xargs
x5PSlm3W9m
##实现user的密码标准输入
passwd=`xxx`
echo passwd | stdin --passwd $user
3.openssl生成
效果和/dev/urandom块设备生成类似
[root@ecs-web01 ~]#openssl rand -base64 9 | head -c 10
4DDS3odTxw
[root@ecs-web01 ~]#openssl rand -base64 9 | head -c 10
Nr4a9aETwI
[root@ecs-web01 ~]#openssl rand -base64 9 | head -c 10
59a02XwQUM
打印出1-100相加的结果
awk的用法效率高,而且简单
time:测试命令的执行速度,time()
##awk写法,定义变量,主要还是格式问题,还是awk+while方便,while(i<=100){sum+},中间不需要;
##这里不是shell,不需要加do
awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};{print sum}}'
awk 'BEGIN{for(i=1;i<=100;i++){sum+=i};{print sum}}'
##for循环
sum=0;for((i=1;i<=100;i++));do ((sum+=i));done;echo $sum
5050
##seq
seq -s+ 100 |bc
##统计执行时间,1+到1000000,awk工具的效率最快
awk时间:0.769s
for时间:5.651s
[root@ecs-web01 ~]#time(awk 'BEGIN{i=1;sum=0;while(i<=1000000){sum+=i;i++};{print sum}}')
500000500000
real 0m0.075s
[root@ecs-web01 ~]#time(sum=0;for((i=1;i<=1000000;i++));do ((sum+=i));done;echo $sum)
500000500000
real 0m5.651s
add.txt文件内有1-10 10个数字,相加的和
##
[root@ecs-web01 2use]#cat 1.txt
1 2 3 4 100 11111
[root@ecs-web01 2use]#cat 1.txt | tr ' ' + | bc
11221
输出nginx日志内访问的最多的IP(client IP)
##传统写法,先sort来排一下序列,取第一列进行排序
[root@ecs-web01 2use]#cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 5
39 209.182.103.18
34 183.240.111.153
18 8.219.71.118
6 167.94.146.57
4 85.119.151.251
##awk数组写法,array[$1]代表第一列,++代表遍历所有第一列的元素(这里的元素就是IP地址); i in array表示i是下标,打印出元素+数组下标
##下标是IP地址,次数array[i]这个整体
awk '{array[$1]++}END{for (i in array){print array[i],i}}' /var/log/nginx/access.log | sort -nr | head -n 5
39 209.182.103.18
34 183.240.111.153
18 8.219.71.118
6 167.94.146.57
4 85.119.151.251
文本处理--ipv4地址
取私网IP地址可以直接hostname -I
##案例
hostname -I | awk '{print $1}':直接输出IP地址(内网IPV4)
##文本取法
ifconfig eth0 | awk 'NR==2{print $2}'
ifconfig eth0 | sed -n '2p' | awk '{print $2}'
ifconfig eth0 | awk '/netmask/{print $2}' #awk取匹配字段
ifconfig eth0 | grep -w inet | awk '{print $2}' #直接取inet那一行
##取服务器的公网IP
curl -s icanhazip.com
curl cip.cc
输出硬盘的使用率
空格%+,代表[[:space:]],也是正则内空格表达式的一种,最好还是用awk
df -h | awk -F"[ %]+" '{print $5}'
df -h | awk -F"[ %]+" '{print $(NF-2)}'
df -h | awk -F" +|%" '{print $5}' --->常用
df -h | tail -n +2 | tr -s ' ' : | cut -d: -f 5 | tr -d %
输出/etc/profile内的非空行和非注释行
sed '/xxx/d;':输出除去xxx的行,';'分号专门用于分离,一般的sed命令格式是'/script/d;/xxxx/d'
sed '2,5d':输出的内容内除去2到5行,sed基本都是根据行来处理的
sed -n '/xxx/d;/$/d' /etc/profile:实现两个script,d排除掉注释行和空行,这个需要写在' '单引号里面
grep内可以使用[ ]中括号,比如'[#]',sed内是/^#/来排除
用法归纳:不匹配正则的话,就要加\反斜杠转义
##p是打印,d是删除
##sed方法
sed用法和awk类似
sed '/^#/d;/^$/d' /etc/profile
sed '/^#\|^$/d' /etc/profile #删除掉^#或者是空行输出
sed '/^#\|^$/p' /etc/profile #只打印空行/#开头,转义匹配
##grep用法,可使用扩展正则
grep -v '^#\|^$' /etc/profile
grep -Ev '^#|^$' /etc/profile,扩展正则
##awk用法,非匹配这些,即不输出带^#或者空行,反过来就是匹配输出^#或者^$;默认输出'{print $0}'
awk '!/^#|^$/' /etc/profile
awk '/^#|^$/' /etc/profile
统计目前连接tcp的状态,并且输出统计的次数
处理文本,处理第一列
ss -ant | awk '{print $1}' | tail -n +2 | sort | uniq -c
ss -ant | awk '{print $1}' | sed -n '2,$p' | sort | uniq -c | sort -nr | head -n 2
##netstat记录各个连接的状态,listen是监听,还未建立连接;established是已经建立的TCP连接
netstat -ant | awk '{state[$NF]++} END {for (i in state) print i,state[i]}'
LISTEN 10
State 1
ESTABLISHED 2
established) 1
两个主机的网络(服务)不通,如何排查
##排查思路
1.先看主机是否有开机,主机内是否配置网卡,网卡是否配置IP
ifconfig
systemctl status network
2.是否是同一个VPC(网段),在同一个VPC内子网间是否配置了ACL策略进行拒绝访问,白名单等问题,firewalld是否关闭,是否有iptables规则
systemctl status firewalld
iptables -L
云安全组是否有放通
3.对应应用服务又没起来
systemctl status httpd
ss -ntl | grep 80
4.(如果是docker),容器的端口有没有映射到主机
docker ps
ss -ntl
5.中间有网络策略隔绝了访问
现在主机卡顿,如何找出占用CPU/内存最大的进程,并且找到他的磁盘文件?(病毒)--现在找不到路径
1.先用以下命令查看cpu和内存占用最大的进程以及进程的pid
ps aox pid,%cpu,%mem,cmd -k -%cpu
ps aox pid,%cpu,%mem,cmd --sort -%mem
##使用ps aux 查看占用内存和CPU最多的进程
ps aux --sort -%mem
ps aux --sort -%cpu
##主要是查看进程号
2.到/proc目录下找到该进程的目录,看是否真的存在
ls /proc | grep pid
3.进入到pid目录下,ll查看exe文件是否是某个磁盘文件的连接文件
4.备份恢复/杀死进程/删除掉磁盘文件rm -rf /*,或者杀死进程 kill -9 pid号
killall -0
标签:##,root,面试,sed,awk,print,ecs,重点 From: https://www.cnblogs.com/catyer/p/16633326.html