Linux基础知识面试题
一、网络基础
三次握手,四次挥手
答案:
TCP三次握手是建立连接的过程:
- 客户端向服务端发送SYN包请求连接,随机序列号seq=x
- 服务端回复客户端ACK=1,确认客户端序列号ack=x+1,同时发送SYN建立连接,随机序列号seq=y
- 客户端回复服务端ACK=1,确认服务器序列号ack=y+1,连接建立
TCP四次挥手是断开连接的过程:
- 客户端向服务端发送FIN包请求断开,随机序列号seq=v
- 服务端回复客户端ACK=1,回复随机序列号ack=v+1
- 服务端向客户端发送FIN包断开连接,随机序列号seq=u
- 客户端回复服务端ACK=1,回复随机序列号ack=u+1,连接断开
tcp协议特点,udp协议特点
答案:
- TCP协议特点:面向连接、可靠传输、全双稳定的工协议,适合重要数据传输
- UDP协议特点:无连接、不可靠的单工协议传输,适合不重要的数据传输,传输效率高
交换机工作原理
答案:交换机工作在数据链路层,通过MAC地址表进行数据转发。当收到数据帧时,交换机学习源MAC,记录数据帧的源 MAC 地址与端口映射到 MAC 地址表,并根据目标MAC地址查找MAC地址表,将数据帧转发到对应的端口。如果目标MAC地址不在MAC地址表中,则会广播该数据帧。
arp协议的作用
答案:ARP协议(地址解析协议)用于将IP地址解析为MAC地址。当主机需要发送数据给另一个主机时,会先检查本地ARP缓存,如果没有目标主机的MAC地址,则发送ARP请求广播,目标主机收到后会回复ARP响应,包含自己的MAC地址。
子网掩码的作用
答案:子网掩码用于区分IP地址中的网络部分和主机部分。通过与IP地址进行按位与运算,可以得到网络地址。子网掩码还用于划分子网,提高IP地址的利用率。
什么是静态路由
答案:静态路由是由网络管理员手动配置的路由条目,不会自动更新。当网络拓扑发生变化时,需要管理员手动修改静态路由。静态路由适用于小型网络。
什么是默认路由
答案:默认路由是一种特殊的静态路由,当路由表中没有与目标网络匹配的路由条目时,数据包会按照默认路由进行转发。默认路由通常配置为指向互联网接入设备。
OSI参考模型,一共几层,核心设备
答案:OSI参考模型分为7层,从下到上分别是:
| 级别 | 层级 | 核心功能 | 核心设备/协议 | 封装内容 |
|---|---|---|---|---|
| 1 | 物理层 | 比特流传输 | 集线器、中继器 | 无地址封装 |
| 2 | 数据链路层 | 帧传输,MAC 寻址 | 交换机、网桥 | 源/目标 MAC |
| 3 | 网络层 | 路由选择,IP 寻址 | 路由器 | 源/目标 IP |
| 4 | 传输层 | 端到端连接(TCP/UDP) | 防火墙 | 源/目标端口 |
| 5 | 会话层 | 建立/维护会话 | VPN | 无地址封装 |
| 6 | 表示层 | 数据加密/压缩 | SSL | 无地址封装 |
| 7 | 应用层 | 用户接口(HTTP/FTP) | 网关 | 应用数据 |
MAC头部,IP头部,tcp头部里各自最重要的两个数据是什么?
答案:
- MAC头部:源MAC地址、目标MAC地址
- IP头部:源IP地址、目标IP地址
- TCP头部:源端口、目标端口
mac地址表记录的是什么
答案:MAC地址表记录的是MAC地址与交换机端口的对应关系。交换机通过学习数据帧中的源MAC地址来构建MAC地址表,用于数据帧的转发。
arp缓存表记录的是什么
答案:ARP缓存表记录的是IP地址与MAC地址的对应关系。主机通过ARP协议获取其他主机的MAC地址后,会将其保存在ARP缓存表中,以减少ARP请求的次数。
FIN字段和SYN字段分别表示什么意思?
答案:
- FIN字段:表示请求断开连接
- SYN字段:表示请求建立连接
MAC地址的广播地址是什么?
答案:MAC地址的广播地址是FF:FF:FF:FF:FF:FF。当数据帧的目标MAC地址为广播地址时,同一网段内的所有主机都会接收该数据帧。
二、Linux文件系统
什么是绝对路径
答案:绝对路径是从根目录(/)开始的完整路径,能够唯一标识一个文件或目录的位置。例如:/home/user/documents/file.txt
什么是相对路径
答案:相对路径是相对于当前工作目录的路径,不能唯一标识一个文件或目录的位置。例如:如果当前工作目录是/home/user,那么documents/file.txt就是相对路径。
什么是家目录
答案:家目录是用户登录系统后默认进入的目录,通常位于/home/username。家目录用于存储用户的个人文件和配置。
管道符的意义:
答案:管道符(|)用于将一个命令的输出作为另一个命令的输入。例如:ls -l | grep .txt 表示将ls -l的输出传递给grep .txt命令进行过滤。
压缩文件: 压缩文件 解压文件
答案:
- 压缩文件:
gzip filename - 解压文件:
gzip -d filename.gz或gunzip filename.gz
针对目录:打包命令: 打包时排除的文件 不解压查看打包文件: 解包: 解包到指定路径
答案:
- 打包命令:
tar -cvf archive.tar directory/ - 打包时排除文件:
tar -cvf archive.tar --exclude=file.txt directory/ - 不解压查看打包文件:
tar -tvf archive.tar - 解包:
tar -xvf archive.tar - 解包到指定路径:
tar -xvf archive.tar -C /path/to/directory
系统盘的MBR引导部分是磁盘的前多少k?系统盘的前512字节里究竟都有些什么?
答案:系统盘的MBR引导部分是磁盘的前512字节(即0.5KB)。系统盘的前512字节里包含:
- 446字节的引导程序
- 64字节的分区表(最多4个主分区)
- 2字节的校验码
如何以只读方式挂载文件系统?
答案:使用mount -o ro /dev/sda1 /mnt命令,其中-o ro表示只读挂载
如何挂载镜像文件?
答案:使用mount -o loop filename.iso /mnt命令,其中-o loop表示将镜像文件视为块设备进行挂载
三、包管理
yum的基础源文件
答案:yum的基础源文件通常位于/etc/yum.repos.d/目录下,以.repo为后缀。例如:CentOS-Base.repo
yum 安装
答案:yum install package_name
yum 卸载
答案:yum remove package_name
yum 查找
答案:yum search package_name
yum 查看某个命令二进制包
答案:yum provides command_name 或 yum whatprovides command_name
yum 查看历史
答案:yum history
yum 回滚
答案:yum history undo transaction_id
rpm -ivh 软件
答案:安装rpm包,-i表示安装,-v表示显示详细信息,-h表示显示进度条
rpm -qf
答案:查询文件属于哪个rpm包
rpm -ql
答案:列出rpm包安装的所有文件
rpm -e
答案:卸载rpm包
企业自定义yum源的命令叫什么?请手写一个简单的自定义yum源文件(包路径:/root/rpm/)
答案:
- 自定义yum源的命令:
createrepo -v /root/rpm/ - 自定义yum源文件:
[rpm] name=rpm baseurl=file:///root/rpm gpgcheck=0 enabled=1
四、用户与权限管理
Linux系统中的用户分类
答案:Linux系统中的用户分为三类:
- 超级用户(root):UID为0,拥有系统所有权限
- 普通用户:UID范围一般为1000-65535,拥有有限权限
- 系统用户:UID范围一般为1-999,用于运行系统服务,无法登陆
UID和GID的作用
答案:
- UID(用户标识号):用于唯一标识一个用户
- GID(组标识号):用于唯一标识一个用户组
/etc/passwd文件的字段含义
答案:/etc/passwd文件每行包含7个字段,用冒号分隔:
- 用户名
- 密码占位符(x表示密码存储在/etc/shadow文件中)
- UID
- GID
- 用户描述
- 家目录
- 默认shell
创建用户的命令
答案:useradd username
设置用户密码的命令
答案:passwd username
修改用户所属组的命令
答案:usermod -g groupname username
Linux文件权限的表示方法
答案:Linux文件权限用9个字符表示,分为3组,每组3个字符,分别表示所有者、所属组和其他用户的权限。每个组的3个字符分别表示读(r)、写(w)、执行(x)权限。例如:-rwxr-xr--表示所有者有读写执行权限,所属组有读执行权限,其他用户只有读权限。
数字表示法中,r、w、x分别对应的值
- 答案:r=4,w=2,x=1
修改文件权限的命令
- 答案:
chmod permissions filename
修改文件所有者的命令
- 答案:
chown username filename
修改文件所属组的命令
- 答案:
chgrp groupname filename
五、Shell脚本
什么是Shell脚本
答案:Shell脚本是包含一系列命令的文本文件,用于自动化执行任务。Shell脚本可以包含变量、条件判断、循环结构等。
Shell脚本的执行方式
答案:
- 给脚本添加执行权限,然后直接执行:
chmod +x script.sh; ./script.sh - 使用bash命令执行:
bash script.sh - 使用.或source命令执行:
. script.sh 或 source script.sh
变量的定义和使用
答案:
- 定义变量:
variable=value - 使用变量:
$variable 或 ${variable}
条件判断的基本语法
答案:
if [ condition ]; then
commands
elif [ condition ]; then
commands
else
commands
fifor循环的基本语法
答案:
for variable in list; do
commands
donewhile循环的基本语法
答案:
while [ condition ]; do
commands
doneShell特殊变量
答案:
- $n:第n个参数
- $0:脚本名称
- $*:所有参数作为一个整体
- $@:所有参数作为独立个体
- $#:参数个数
- $$:当前进程PID
- $?:上一条指令退出的状态码
exit、return、break和continue的区别
答案:
- exit:退出整个脚本
- return:退出函数
- break:结束当前循环
- continue:跳过本次循环
grep命令的常用选项及含义
答案:
- -v:反向匹配,显示不包含匹配文本的行
- -n:显示匹配行及行号
- -o:只显示匹配的文本部分
- -w:匹配整个单词
- -l:只显示包含匹配文本的文件名
- -i:忽略大小写
- -E:使用扩展正则表达式
- -A:显示匹配行及其后指定行数
- -B:显示匹配行及其前指定行数
- -C:显示匹配行及其前后指定行数
sed命令的常用选项及操作
答案:
- 常用选项:
- -n:只打印模式空间的内容
- -i:直接修改文件内容
- -r:使用扩展正则表达式
- -e:执行多个编辑命令
- 常用操作:
- 'p':打印
- 'd':删除
- 'i':在行前插入
- 'a':在行后插入
- 'c':替换整行
- 's###g示例:
- 不显示某行:sed '90d' 1.txt
- 不显示含有某个字符的行:sed '/字符/d' 文件
- 从n行到m行行前插入aaaaa:sed 'n,mi aaaaa' 文件
- 从n行到m行行后插入bbbbb:sed 'n,ma bbbbb' 文件
- 提取IP地址:sed -n 's/.([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})./\1/p' 文件
awk命令的常用选项及示例
答案:
- 常用选项:
- NR:行号
- NF:字段数
- RS:输入行分隔符
- ORS:输出行分隔符
- FS:输入列分隔符
- OFS:输出列分隔符
- BEGIN:处理数据前执行的代码块
- END:处理数据后执行的代码块
- $0:整行内容
- $n:第n个字段
- $NF:最后一个字段
- 示例:
- 数组统计不同值出现的次数:
awk -F "[. ]+" '{h[$1]=h[$1]+1}END{for (i in h)print i ,h[i]}' access.log - 数组统计某个字段对内容和:
awk -F "[. ]+" '{h[$1]=h[$1]+$4}END{for (i in h)print i ,h[i]}' access.log - 数组统计某个字段的次数和对应内容的和:
awk -F "[. ]+" '{h[$1]=h[$1]+$4;s[$1]=s[$1]+1}END{for (i in h)print i ,h[i],s[i]}' access.log
- 数组统计不同值出现的次数:
find命令的常用选项及含义
答案:
- 按名称查找:
-name "filename" - 按类型查找:
-type [f|d|l](文件|目录|链接) - 按时间查找:
-mtime [+n|-n](修改时间,+n表示n天前,-n表示n天内) - 按大小查找:
-size [+n|-n][c|k|M|G](+n表示大于n,-n表示小于n,单位:字节|KB|MB|GB) - 按inode查找:
-inum inode_number - 注意:递归查询不配合通配符是精准查询
source和bash的区别
答案:
- source:在当前shell环境中执行脚本,脚本中定义的变量和函数会影响当前shell
- bash:创建一个新的shell环境执行脚本,脚本中定义的变量和函数不会影响当前shell
如何检测脚本是否有语法错误?
答案:使用bash -n script.sh命令,如果没有输出,则表示脚本没有语法错误
如何查看脚本执行过程,分步执行脚本?
答案:使用bash -x script.sh命令,会显示脚本执行的每一步及其参数
Shell中的判断符号含义
答案:
- -d:判断是否为目录
- -f:判断是否为普通文件
- -e:判断文件或目录是否存在
Shell中的比较运算符含义
答案:
- -gt:大于(greater than)
- -lt:小于(less than)
- -eq:等于(equal)
- -ge:大于等于(greater than or equal)
- -le:小于等于(less than or equal)
- -ne:不等于(not equal)
Shell中常用的计算方式
答案:
- expr:
expr $a + $b(注意空格) - $(()):
c=$(($a+$b)) - let:
let c=$a*$b
Shell中变量的取值范围有哪些?
答案:
- 列举法:直接列出变量的可能取值
- 列举一个序列:例如
{1..5}表示1到5的序列 - 命令的执行结果:使用
$(command)或`command`将命令执行结果赋给变量 - 比较表达式:例如
((i=5;i<=9;i++))用于循环中
Shell中函数的定义及语法结构
答案:
- 函数概念:把一些固定的用法写好,写好之后直接调用
- 语法结构:bash
function 函数名() { 执行的脚本 }
Shell中case语句的作用及语法结构
答案:
- 作用:case语句是一种并列的选择关系,用于多条件判断
- 语法结构:bash
case 变量名 in 条件1) 条件1情况下执行的语句 ;; 条件2) 条件2情况下执行的语句 ;; *) 默认 ;; esac
批量分发密钥脚本的作用及实现思路
答案:
- 作用:自动向多台服务器分发SSH密钥,实现免密码登录
- 实现思路:
- 生成密钥
- 使用循环遍历服务器列表
- 结合sshpas和ssh-copy-id命令进行密钥分发
批量创建用户的脚本实现方法
答案:
- 实现方法:使用循环读取用户列表文件,结合useradd命令创建用户,并设置初始密码
- 示例:bash
while read username; do useradd $username echo "123456" | passwd --stdin $username done < userlist.txt
如何检查主机存活状态
答案:
- 方法1:使用ping命令,
ping -c 1 192.168.1.1 > /dev/null && echo "alive" || echo "down" - 方法2:使用nmap命令,
nmap -sn 192.168.1.0/24 | grep "Host is up"
构建yum仓库的脚本实现
答案:
#!/bin/bash
# 挂载路径
MOUNT_PATH="/media/cdrom"
[ -e "$MOUNT_PATH" ] || mkdir -p $MOUNT_PATH
# 备份
cd /etc/yum.repos.d && mkdir bak
mv *.repo bak
# yum源
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=media
baseurl=file:///$MOUNT_PATH
gpgcheck=0
enabled=1
EOF
# 开机自动挂载
echo "/dev/sr0 $MOUNT_PATH iso9660 defaults 0 0" >> /etc/fstab
mount -a
# 清理旧缓存并生成新缓存
dnf clean all && dnf makecache
# 查看yum源列表
dnf repolist数据库备份脚本的编写要点
答案:
- 要点:指定备份目录、设置备份文件名(包含时间戳)、使用mysqldump命令备份数据库、压缩备份文件、删除过期备份
- 示例:bash
backup_dir="/backup/mysql" filename="mysql_backup_$(date +%Y%m%d%H%M%S).sql.gz" mysqldump -u root -p密码 --all-databases | gzip > $backup_dir/$filename find $backup_dir -type f -mtime +7 -delete
数据实时备份脚本的实现思路
答案:
- 主库持续生成binlog
- 解析binlog日志增量变更,比如上一次执行的时间或GTID位置等
- 执行增量备份到备份库
如何获取CPU使用率
答案:
- 方法1:使用top命令,
top -b -n 1 | grep "%Cpu(s)"|awk '{print $2+$4}' - 方法2:使用vmstat命令,
vmstat 1 5 | awk '{print $13+$14}' | tail -n 1 - 方法3:通过/proc/stat文件计算
查看内存使用情况的脚本实现
答案:
- 实现方法:使用free命令获取内存信息,并提取关键指标
- 示例:bash
free -m | awk '/Mem/{printf "%.2f%%\n",$3*100/$2}'
检测硬盘使用情况的脚本实现
答案:
- 实现方法:使用df命令获取磁盘信息,并检查使用率是否超过阈值
- 示例:bash
df | awk ' NR>1 && $1 !~ /tmpfs/ { if ($3 > 0) { printf "%s:%.2f%%\n", $NF, ($3 * 100 / $2) } else { printf "%s:0.00%%\n", $NF } }'
数据库全备脚本的编写要点
答案:
- 要点:备份所有数据库、包含二进制日志、设置定时执行、验证备份完整性、远程存储备份
- 示例:bash
mysqldump -u root -p密码 --all-databases --master-data=2 --single-transaction |gzip > mysql_full_backup.sql.gz
keepalive中主备服务脚本的作用及实现
答案:
- 作用:实现服务的高可用,当主服务故障时自动切换到备服务
- 实现:
- 主服务脚本:监控服务状态,故障时通知备服务
- 备服务脚本:检测主服务状态,主服务故障时接管服务
- 核心组件:通常结合vrrp_script使用
六、系统管理
Linux文件删除的原理
答案:Linux文件删除的本质是删除文件的inode节点链接,当一个文件的所有链接都被删除且没有进程占用时,该文件的数据块才会被释放。
su和su -的区别
答案:
- su:切换用户身份,但保留原用户的环境变量
- su -:切换用户身份,并切换到该用户的环境变量
软链接和硬链接的区别
答案:
- 软链接:
- 存储依靠文件名,与源文件inode号不同
- 可以跨文件系统
- 可以链接目录
- 删除源文件有影响,链接文件会变成悬空文件
- 硬链接:
- 与源文件共享同一个inode
- 不可跨文件系统
- 不可链接目录
- 删除源文件不影响链接文件
定时任务中五个星号的含义
答案:定时任务的五个星号依次表示:
- 分钟(0-59)
- 小时(0-23)
- 日(1-31)
- 月(1-12)
- 周(0-7)
磁盘管理工具
答案:
- fdisk:用于小于2TB的磁盘分区
- parted:用于大于2TB的磁盘分区
- mkfs:格式化磁盘,如mkfs.ext4 /dev/sda1
- df:查看磁盘空间,如df -h(人类可读格式)、df -hT(显示文件系统类型)
No space left on device报错原因
答案:可能原因包括:
- 磁盘空间已满
- inode节点耗尽
- 权限问题
- 文件系统损坏
SSH的基本概念及加密方式
答案:
- 基本概念:SSH(Secure Shell)是一种C/S架构的安全传输协议,通过加密方式对数据进行传输
- 加密方式:
- 对称加密:通信双方使用同一套密钥,加密和解密使用相同的技术手段
- 非对称加密:分为公钥和私钥,公钥用于加密,私钥用于解密
sshpass命令的作用及使用方法
答案:
- 作用:sshpass命令可以在非交互式情况下提供SSH密码,实现自动化的SSH登录和操作
- 使用方法示例:bash
# 使用sshpass进行ssh-copy-id密钥分发 sshpass -p "666666" ssh-copy-id -i ~/.ssh/rsa.pub root@192.168.159.146 -p 22 # 参数说明: # -p "666666":指定sshpass的密码 # -p 22:指定ssh-copy-id的端口
如何生成SSH密钥对
答案:
- 使用ssh-keygen命令生成密钥对:bash
ssh-keygen -P "" -t rsa -f /root/.ssh/id_rsa - 参数说明:
- -P "":设置空密码
- -t rsa:指定密钥类型为RSA
- -f /root/.ssh/id_rsa:指定密钥文件路径
如何使用sshpass实现免密码登录
答案:
- 结合sshpass和ssh-copy-id命令:bash
sshpass -p "666666" ssh-copy-id -i ~/.ssh/rsa.pub root@192.168.159.146 -p 23 -o "StrictHostKeyChecking no" - 参数说明:
- -o "StrictHostKeyChecking no":禁用严格主机密钥检查,自动接受新的主机密钥
交换分区相关操作
答案:
- 交换分区的作用:当物理内存不足时,将部分内存数据交换到磁盘
- 交换分区大小:通常设置为物理内存的1-2倍
- 格式化交换分区:
mkswap /dev/sda2 - 挂载交换分区:
swapon /dev/sda2 - 取消挂载交换分区:
swapoff /dev/sda2
RAID级别特点
答案:
- RAID 0:条带化,无冗余,性能最高,最少两块盘
- RAID 1:镜像,100%冗余,性能较低,最少两块盘
- RAID 5:分布式奇偶校验,允许一个磁盘故障,最少三块盘
- RAID 10:先镜像后条带化,兼顾性能和冗余,最少四块盘
根据服务名强杀进程的命令是什么?
答案:可以使用pkill -9 服务名或killall -9 服务名命令
什么是平均负载?
答案:平均负载是指在特定时间间隔内系统中处于可运行状态和不可中断状态的进程数。它反映了系统的繁忙程度,通常有1分钟、5分钟和15分钟三个统计周期
定时任务相关问题
答案:
定时任务保存在:
/var/spool/cron/用户名系统邮件保存路径:
/var/spool/mail/用户名发送邮件失败的小文件保存路径:
/var/spool/postfix/maildrop/创建定时任务:
crontab -e查看定时任务:
crontab -l定时任务中特殊符号含义:
- * 表示所有可能的值 , 表示列举多个值 / 表示每隔多久执行一次
- - 表示范围
每天早上7:50自动开启sshd,22:50关闭:
50 7 * * * systemctl start sshd50 22 * * * systemctl stop sshd每隔5天清空一次FTP服务器公告目录/var/ftp/pub:
0 0 */5 * * rm -rf /var/ftp/pub/*每周六7:30重启httpd服务:
30 7 * * 6 systemctl restart httpd每周一、三、五的17:30打包备份/etc/httpd目录:
30 17 * * 1,3,5 tar -czvf /backup/httpd-$(date +%F).tar.gz /etc/httpd
a锁和i锁有什么区别?
答案:
- a锁(共享锁/读锁):多个进程可以同时持有该锁,用于读取数据
- i锁(排他锁/写锁):只有一个进程可以持有该锁,用于修改数据
- 区别:共享锁之间兼容,共享锁与排他锁不兼容,排他锁之间不兼容
根据登录的客户端强杀进程命令是什么?
答案:可以使用pkill -9 -t ttyname或kill -9 $(ps -t ttyname -o pid=)命令,其中ttyname是客户端登录的终端设备名
七、网络服务
rsync服务的监听端口及限速参数
答案:
- 监听端口:rsync服务默认监听873端口
- 限速参数:使用
--bwlimit参数可以限制rsync的传输速度,例如--bwlimit=100表示限制为100KB/s
NFS在/etc/fstab里配置开机自动挂载失败的原因
答案:可能原因包括:
- 配置格式错误,正确格式应为:
服务器IP:/共享目录 /本地挂载点 nfs defaults 0 0 - 网络连接问题,NFS服务依赖网络,若网络未就绪则挂载失败
- NFS服务未启动或未正确配置
- 权限问题,挂载点目录权限不足
- 防火墙或SELinux限制
DNS递归查询和迭代查询的区别
答案:
- 递归查询:本地查询 -> 网关查询,未到公网DNS服务器的过程
- 迭代查询:根域名 -> 顶级域名 -> 权威域名 -> 三级业务域名 -> 返回IP地址
- 区别:递归查询中服务器承担全部责任,而迭代查询中客户端需要多次发起查询
FTP的工作端口和连接类型
答案:
- FTP工作有两个端口:20端口(数据传输)和21端口(控制连接)
- FTP有两种连接类型:主动传输和被动传输
- 主动传输:客户端向服务端的21端口发起请求,服务端通过20端口向客户端传输数据
- 被动传输:客户端向服务端21端口发起请求,服务端告知客户端自己开放的端口,客户端通过该端口获取数据
SSH的加密方式
答案:SSH使用对称加密和非对称加密相结合的方式
- 对称加密:双方使用同一套密钥进行加密和解密
- 非对称加密:分为公钥和私钥,公钥用于加密,私钥用于解密
Rsync的三种数据传输方式
答案:
- 本地传输(类似cp命令)
- 远程传输(类似scp命令)
- 守护进程模式(监听873端口,集中管理数据传输)
NFS的工作原理
答案:
- 启动rpcbind服务,再启动NFS服务
- NFS将自己开放的端口向rpcbind注册
- 用户向rpcbind的111端口请求NFS开放的端口
- rpcbind告知用户NFS的端口
- 用户通过该端口连接NFS服务获取数据
DNS递归查询和迭代查询
答案:
- 递归查询过程:
- 查找系统本地DNS缓存
- 查找hosts文件
- 查找LDNS缓存
- 查找LDNS的hosts文件
- 查找LDNS的域名解析记录
- 迭代查询过程: 6. LDNS向根服务器请求域名解析 7. 根服务器返回顶级域名服务器地址 8. LDNS向顶级域名服务器请求解析 9. 顶级域名服务器返回权威域名服务器地址 10. LDNS向权威域名服务器请求解析 11. 权威域名服务器返回IP解析记录 12. LDNS缓存解析记录并返回给客户端
用户访问网站的基本流程
答案:
- 在浏览器中输入域名
- DNS解析域名为IP地址
- 与目标服务器进行TCP三次握手,建立连接
- 向Web服务器发起URL请求
- 服务器响应请求,返回响应包
- 浏览器解析响应包,显示网页内容
八、Web服务
HTTP和HTTPS的默认端口
答案:HTTP默认端口80;HTTPS默认端口443
常见HTTP状态码的含义
答案:
- 200 OK:操作成功
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
- 304 Not Modified:触发缓存
- 403 Forbidden:权限拒绝
- 404 Not Found:找不到网页
- 500 Internal Server Error:内部服务器错误
- 502 Bad Gateway:网关出现问题
- 503 Service Unavailable:服务当前不可用
- 504 Gateway Timeout:网关超时
GET和POST请求的区别
答案:
- GET:请求指定资源信息,速度快,明文传输,只有消息头没有消息体,传输大小有限制
- POST:提交数据到服务器,加密传输,有消息体,用于用户注册等场景,传输数据大
Nginx的三大功能
答案:
- Web服务器
- 反向代理或负载均衡服务器
- 前端业务数据缓存服务
Nginx和Apache的网络模型
答案:
- Apache使用select(同步阻塞I/O网络模型)
- Nginx使用epoll(异步非阻塞I/O模型)
同步阻塞I/O和异步非阻塞I/O的含义
答案:
- 同步阻塞I/O模型:线程干活时,是一件事一件事的干,向磁盘读写数据时,线程需要等待磁盘I/O完成
- 异步非阻塞I/O模型:线程干活时,可以同时做多件事情,永不等待,向磁盘读写数据时,线程不需要等待而是先做其他事情
URL的组成
答案:统一资源定位符URL由协议类型(protocol)、主机名(hostname)、端口(port)、路径及文件名(path)组成。
URL=域名+URI(URI:具体的资源位置,页面的路径)静态网页和动态网页的区别
答案:
- 静态网页:Server端通过xml协议及json协议经过JavaScript的循环处理,使用HTML语言及CSS语言将网页数据传递到客户端
- 动态网页:有后台数据库,在服务器端运行的,以.asp .aspx .php .js等形式作为后缀的,网址中有标识性符号"?""&",使用程序设计的交互式网页
伪静态网页的本质
答案:动态网页被转换重写成静态网页类型页面,通过浏览器访问地址和真的静态页面没区别。(将内存中临时生成的动态网页写入到硬盘中,当用户下次有相同的访问请求时,直接以静态网页的形式返回给用户)
前端语言和后端语言的种类
答案:
- 前端语言:HTML、CSS、JavaScript
- 后端语言:PHP、Java、Python、Golang
HTTP响应报文结构
答案:
- WEB服务器HTTP响应报文结构:响应报文头部+响应报文主体
- 报头:记录用户的属性及请求信息与响应信息与访问状态
- 主体:用户想看的网页
IP、PV、UV的定义
答案:
- 独立IP数:不同IP地址的计算机访问网站时被计算的总次数
- PV(访问量):页面浏览器或点击量,用户每次访问一个网站页面都会被计算一个PV
- UV(独立访客):同一台客户端(PC或移动端)访问网站被计算为一个访客
Nginx的location五种优先级过滤规则
答案:优先级从高到低
- 精确匹配(=)
- 特殊正则(^~):使前缀字符串优先级高于正则
- 普通正则(~或者~*):*忽略大小写
- 字符串前缀匹配(/images/优先级高于/images)
- 默认匹配(/)
会话保持的概念及Nginx实现方法
答案:
- 概念:会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在做负载均衡的同时还保证一系列相关连的访问请求会保持分配到一台服务器上
- 实现方法:
- ip_hash静态调度算法:按客户端IP的hash结果分配
- 将用户的session存入cookie里
- 利用Memcached将所有服务器产生的session存入同一台服务器的缓存中
- 一致性hash算法:根据用户请求的URI或者指定字符串进行计算(需下载补丁包)
连接保持的概念和作用
答案:
- 概念:连接保持指打开网页需要建立三次握手,若没有连接保持代表浏览器完成解析后,TCP三次握手直接断开,若有连接保持,解析完成后TCP三次握手仍然建立状态,等待下次请求,无需频繁建立三次握手
- 作用:可以节约系统资源
如何通过IP地址访问限制指定网站
答案:
- 在Nginx配置中使用
default_server指令,可以指定默认服务器,当用户通过IP地址访问时,会默认访问该服务器
Nginx的403访问错误原因
答案:
- Nginx配置文件里没有配置默认首页参数或首页文件在站点目录下没有索引文件 如果输入域名时,不告诉浏览器看哪个页面,nginx会自动将页面跳转到首页;然而,跳转过程中发现找不到首页时,会默认将整个网页的内容显示出来,此时nginx的安全机制拒绝用户访问,就触发了nginx安全模块,显示403
- 站点目录或内部的程序文件没有Nginx用户访问权限(x权限) 如果用户对目录没有x权限,就进不去这个目录
- Nginx配置文件中设置了allow,deny等权限控制,导致客户端没有访问权限
Nginx的404访问错误原因
答案:
- 服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源导致
网站图片盗链的本质
答案:
- 一个网站中如果并没有相应图片信息,而是将这个图片连接到别的网站,盗用其他网站资源。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,一方面损害了原网站的合法利益,另一方面加重了对方服务器的负担
Nginx Web服务器图片访问基本流程原理
答案:
- 当用户发起请求之后经过location过滤,如果过滤到图片信息,首先去数据库读取图片的位置,把位置信息返回Web浏览器,重新发起一个新静态请求,然后经过location过滤到静态去存储拿取图片放回给用户
Nginx Web前端安全优化
答案:
- 隐藏Nginx版本号
- 降权启动,更改掉默认的Nginx服务用户
- 上传文件大小限制(动态服务器web应用)
- Nginx日志相关优化(日志切割,不记录指定元素日志,最小化日志目录权限)
- 限制指定目录或指定扩展名的文件被访问
- 事件驱动模型优化(epoll)
- Nginx连接数(最大并发连接数):worker_connections
- Nginx静态文件缓存
- Nginx连接超时设置,一般设置60左右,因为浏览器默认超时为60s
- 设置CPU亲合,设置CPU绑定
- 系统句柄数(文件打开数)优化
- 开启高效传输:sendfile
- 设置gzip压缩输出
- 设置防盗链
- 防止爬虫优化
九、网络安全与防护
DDOS攻击的概念
答案:DDoS(分布式拒绝服务)是指攻击者通过控制多个分布式节点,向目标服务器发送大量请求,导致合法用户无法访问正常网络服务的攻击行为。其目的是阻止合法用户对正常网络资源的访问。
常见的DDOS攻击类型
答案:
- SYN类攻击:利用TCP三次握手的缺陷,发送大量SYN请求但不完成握手过程
- CC类攻击:模拟正常用户请求,消耗服务器资源
- UDP攻击:发送大量UDP数据包,消耗网络带宽
- TCP洪水攻击:发送大量TCP连接请求,耗尽服务器连接资源
DDOS攻击的防御策略
答案:
- 了解攻击类型与特征:熟悉各种DDOS攻击的原理和特征,掌握抓包和分析日志的技能
- 评估系统承受能力:了解公司带宽、服务器、防火墙和架构的承受能力,制定应急预案
- 选择可靠IDC机房:选择有实力、能提供高级别防护的IDC厂商合作
- 架构设计优化:采用无单点架构、多缓存策略,保证高可用,跨ISP、跨机房分布式部署
- 系统优化:进行操作系统内核优化、程序代码优化、数据库结构优化等
- 使用CDN:借助CDN分担访问压力
- 硬件防护:使用专业的防DDOS防火墙(如傲盾、黑洞等)组建集群
- 数据包及日志分析:通过分析数据包和日志制定防护策略
- 处理疑似DDOS攻击:对于文件被盗链、服务器中毒、程序BUG等情况,通过抓包和日志分析定位问题
- 第三方求助:请求IDC、ISP协助处理大量攻击,或寻求行业专家帮助
十、容器技术
Docker的核心概念
答案:Docker的核心概念包括:
- 镜像(Image):容器的模板,包含应用代码和运行环境
- 容器(Container):独立的软件运行环境,共享宿主机内核
- 仓库(Repository):存储和管理Docker镜像的服务
Docker容器与虚拟机的区别
答案:
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 虚拟化级别 | 操作系统级虚拟化 | 硬件级虚拟化 |
| 隔离性 | 进程级别隔离(较弱) | 完全隔离(更强) |
| 启动速度 | 秒级(非常快) | 分钟级(较慢) |
| 性能 | 接近原生性能 | 有性能损耗(约5-15%) |
| 资源占用 | 非常小(共享主机内核) | 较大(每个VM需要完整OS) |
常用Docker命令
答案:
- 查找镜像:docker search image_name
- 拉取镜像:docker pull image_name[:tag]
- 查看本地镜像:docker images
- 删除镜像:docker rmi image_id
- 镜像改名:docker tag old_image_name:tag new_image_name:tag
- 运行容器:docker run [options] image_name [command]
- 临时运行一个容器:docker run --rm [options] image_name [command]
- 查看容器:docker ps(运行中)、docker ps -a(所有)
- 停止容器:docker stop container_id
- 删除容器:docker rm container_id
- 强制删除容器:docker rm -f container_id
- 批量删除容器:docker rm $(docker ps -aq)
- 暂停容器:docker pause container_id
- 启动已暂停的容器:docker unpause container_id
- 查看容器日志:docker logs container_id
- 进入容器:docker exec -it container_id /bin/bash
- 将容器端口映射到本地的物理端口:docker run -p host_port:container_port image_name
- 容器端口随机映射本地端口:docker run -P image_name
- 将运行的容器制作成镜像:docker commit container_id new_image_name:tag
- 将运行的容器导出到本地:docker export container_id > image.tar
- 将容器文件导入到系统:docker import image.tar new_image_name:tag
- 将镜像导出:docker save image_name:tag > image.tar
- 将镜像导入到系统内:docker load < image.tar
- 将容器的变化提交的镜像:docker commit container_id new_image_name:tag
- 查看本地存储卷:docker volume ls
- 将容器test1的/usr/share/nginx/html目录挂载到存储卷html上:docker run -v html:/usr/share/nginx/html --name test1 nginx
- 将容器test1的/etc/nginx目录挂载到本地目录/etc/nginx上:docker run -v /etc/nginx:/etc/nginx --name test1 nginx
- 创建容器网络,并指定网段:docker network create --subnet=172.18.0.0/16 mynetwork
Docker的网络类型有哪些?
答案:
- bridge:默认网络模式,为容器创建独立的网络栈
- host:容器共享宿主机的网络栈
- none:容器没有网络接口
- container:容器共享另一个容器的网络栈
- 自定义网络:用户可以创建自定义网络
Dockerfile常用字段的含义是什么?
答案:
- FROM:指定基础镜像
- RUN:在构建镜像时执行命令
- CMD:容器启动时执行的命令
- ENTRYPOINT:容器入口点
- ARG:构建参数
- ENV:环境变量
- ADD:添加文件到镜像(支持URL和压缩文件自动解压)
- COPY:复制文件到镜像
- WORKDIR:设置工作目录
- EXPOSE:声明容器监听的端口
docker create 和docker run 的区别
答案:
docker create:创建一个新容器但不启动它,返回容器IDdocker run:创建并启动一个新容器,相当于docker create+docker start
如何保证Docker容器开机自启?
答案:使用--restart=always参数,例如:docker run -d --restart=always nginx
Docker的存储类型有哪些?
答案:
- aufs:早期的存储驱动
- overlay/overlay2:当前推荐的存储驱动
- btrfs:适合大数据量场景
- devicemapper:适合企业级场景
- zfs:适合高性能存储
十一、数据库技术
MySQL的存储引擎
答案:MySQL的常用存储引擎包括:
- InnoDB:默认存储引擎,支持事务、行级锁和外键
- 支持事务的四种隔离级别
- 读写阻塞与事务隔离级别有关
- 行级别锁定,一般读写不阻塞,支持并发写
- 可以缓存索引,也可以缓存数据,对内存占用大
- MyISAM:不支持事务,支持表级锁,查询性能高
- 只对读数据支持非常好
- 读写阻塞互斥
- 表级别的锁定,不支持多用户并发写
- 可以缓存索引,但是不缓存数据,内存占用小
- MEMORY:内存存储引擎,数据存储在内存中,速度快但不持久
- NDB:集群存储引擎
索引的作用
答案:索引的主要作用包括:
- 加快数据检索速度
- 保证数据的唯一性(唯一索引)
- 加速表与表之间的连接
- 减少分组和排序的时间
什么是辅助索引和聚集索引?
答案:
- 辅助索引:也称为非聚簇索引,叶子节点存储的是主键值而非数据行,查询时需要先找到主键值,再通过主键索引查找数据行
- 聚集索引:也称为主键索引,数据行实际存储在索引的叶子节点,InnoDB引擎特有,查询效率高
索引的类型
答案:MySQL的索引类型包括:
- 普通索引:最基本的索引类型,没有唯一性之类的限制
- 唯一索引:索引列的所有值都只能出现一次,必须唯一,但是可为空
- 主键索引:是一种特殊的唯一性索引,必须指定为PRIMARY KEY,具有唯一性的同时且不能为空
- 全文索引:用于全文检索
- 聚簇索引(PRI):数据行实际存储在索引的叶子节点,InnoDB引擎特有
- 非聚簇索引(MUL/UNI):叶子节点存储的是主键值而非数据行
- B-Tree索引:最常见的索引类型,适用于全键值、键值范围或键前缀查找
- Hash索引:基于哈希表实现,只支持等值比较查询
- 复合索引:多个列组合的索引
- 前缀索引:对列的前缀部分创建索引
如何创建索引?
答案:
- 创建普通索引:
CREATE INDEX index_name ON table_name(column_name); - 创建唯一索引:
CREATE UNIQUE INDEX index_name ON table_name(column_name); - 创建前缀索引:
CREATE INDEX index_name ON table_name(column_name(length)); - 创建复合索引:
CREATE INDEX index_name ON table_name(column1, column2, ...); - 创建全文索引:
CREATE FULLTEXT INDEX index_name ON table_name(column_name); - 修改表结构添加索引:
ALTER TABLE table_name ADD INDEX index_name(column_name); - 创建表时添加索引:sql
CREATE TABLE table_name ( id INT PRIMARY KEY, column_name VARCHAR(100), INDEX index_name(column_name) );`
事务的特性
答案:事务的特性包括ACID:
- 原子性(Atomicity):事务是不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚
- 一致性(Consistency):事务执行前后,数据库从一个一致状态变到另一个一致状态
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务
- 持久性(Durability):事务一旦提交,其结果就是永久性的
如何查看和设置autocommit变量?
答案:
- 查看autocommit变量:
SHOW VARIABLES LIKE 'autocommit'; - 设置autocommit变量:
SET autocommit = 0;(0表示关闭自动提交,1表示开启自动提交) - 注意:autocommit默认值为1(开启状态),即每条SQL语句执行后自动提交事务
事务隔离级别
答案:MySQL的事务隔离级别包括:
- READ UNCOMMITTED:最低隔离级别,可能出现脏读、不可重复读和幻读
- READ COMMITTED:保证不读取未提交数据,可能出现不可重复读和幻读
- REPEATABLE READ:MySQL默认级别,保证不读取未提交数据和不可重复读,可能出现幻读
- SERIALIZABLE:最高隔离级别,不允许任何并发问题
主从复制的原理
答案:
- 主库将数据变更记录到二进制日志(binlog)中
- 从库的IO线程连接到主库,读取主库的binlog日志并写入到从库的中继日志(relay log)中
- 从库的SQL线程读取中继日志,解析出SQL语句并执行,从而实现数据同步
数据备份的类型
答案:MySQL的数据备份类型包括:
- 按备份方法分类:热备、冷备、温备
- 按备份内容分类:物理备份、逻辑备份
- 按备份策略分类:完全备份、增量备份、差异备份
MySQL数据库备份命令
答案:
- 全备命令(备份所有的库所有的表):bash
mysqldump -u用户名 -p密码 --opt --all-databases | gzip -9 > /备份路径/备份文件名 或mysqldump -uroot -p123123 --opt --all-databases | gzip -9 > /backup/mysql_all.$(date +%F-%T).sql.gz - 备份指定库(benet,yunjisuan)的命令:bash
mysqldump -u用户名 -p密码 --databases benet yunjisuan > /备份路径/备份文件名 或mysqldump -uroot -p123123 --databases benet yunjisuan > /bacup/mysql-$(date +%F-%T).sql - 备份单库单表:
mysqldump -u用户名 -p密码 database_name table_name > /备份路径/backup.sql
唯一性索引和主键索引的区别是什么?
答案:
- 主键索引是一种特殊的唯一性索引,必须指定为PRIMARY KEY
- 主键索引不允许为空值,而唯一性索引允许为空值
- 一个表只能有一个主键索引,但可以有多个唯一性索引
- InnoDB存储引擎中,主键索引是聚集索引,而唯一性索引是非聚集索引
MySQL日志管理相关配置
答案:
- 开启二进制日志的配置文件参数:ini配置后需重启MySQL服务,二进制文件默认在/usr/local/mysql/data/目录下生成
log-bin=mysql-bin - 控制MySQL二进制日志大小的参数:ini
max_binlog_size=1024000 (1M) - 强制刷新binlog日志的命令:ini
flush logs; - 查看binlog:
show binary logs; - 按事件查看binlog日志:
show binlog events in 'mysql-bin.000001'; - 开启MySQL中继日志的配置文件参数:ini
relay-log=relay-bin - 慢查询日志配置:ini
long_query_time = 5 log-slow-queries = /var/log/mysql/mysql-slow.log - 查看当前日志保存天数:
show variables like '%expire_logs_days%'; - 设置日志保留时长:
set global expire_logs_days=7; - 手动删除BINLOG:
PURGE {MASTER | BINARY} LOGS TO 'log_name';或PURGE {MASTER | BINARY} LOGS BEFORE 'date'; - binlog日志空间占满解决方法:
- 设置日志保留时长自动删除:
set global expire_logs_days=7;(临时生效),并在my.cnf中添加expire_logs_days = 7(永久生效) - 手动删除BINLOG:
PURGE {MASTER | BINARY} LOGS TO 'log_name';或PURGE {MASTER | BINARY} LOGS BEFORE 'date';
- 设置日志保留时长自动删除:
多表联查时要注意什么?
答案:
- 确保连接条件正确,避免笛卡尔积
- 尽量使用内连接(INNER JOIN),避免外连接(LEFT JOIN、RIGHT JOIN)带来的性能问题
- 连接的表数量不宜过多,一般不超过5个
- 确保连接字段上有索引
- 使用表别名简化SQL语句
如何给用户授权所有的库、所有的表、所有的地址权限?
答案:GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
如何查看用户权限?
答案:SHOW GRANTS FOR 'username'@'host';
如何查看MySQL表结构?
答案:
- 使用
DESCRIBE命令:DESCRIBE table_name;或DESC table_name; - 使用
SHOW CREATE TABLE命令:SHOW CREATE TABLE table_name;
MySQL语句类型有哪些?
答案:
- DDL(数据定义语言):定义和管理数据库对象,如CREATE、ALTER、DROP等
- DML(数据操作语言):操作数据库中的数据,如INSERT、UPDATE、DELETE等
- DQL(数据查询语言):查询数据库数据,如SELECT等
- DCL(数据控制语言):控制数据库访问权限,如GRANT、REVOKE等
- TCL(事务控制语言):如COMMIT、ROLLBACK等
常用的MySQL数据库管理命令
答案:
- 创建库(指定字符集):
CREATE DATABASE database_name CHARACTER SET utf8mb4; - 查看库的元信息:
SHOW CREATE DATABASE database_name; - 更改库的元数据信息:
ALTER DATABASE database_name CHARACTER SET utf8; - 切换库:
USE database_name; - 增加表结构字段:
ALTER TABLE table_name ADD column_name data_type; - 更改表结构字段名称:
ALTER TABLE table_name CHANGE old_column_name new_column_name data_type; - 更改表结构字段的属性(增加name字段字符长度):
ALTER TABLE table_name MODIFY COLUMN name VARCHAR(255); - 删除字段:
ALTER TABLE table_name DROP COLUMN column_name; - 向表内插入数据信息:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); - 创建两个一模一样的表(结构一致):
CREATE TABLE new_table LIKE old_table; - 修改表数据信息:
UPDATE table_name SET column1=value1, column2=value2 WHERE condition; - 删除语句:
DELETE FROM table_name WHERE condition; - 新安装的mysql设置root密码的命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; - 查看mysql.user表里的user,host,password字段的所有数据:
SELECT user, host, authentication_string FROM mysql.user; - 查看当前数据库的用户连接数(数据库并发量):
SHOW STATUS LIKE 'Threads_connected'; - 查看支持的字符类型:
SHOW CHARACTER SET; - 授权账号yunjisuan拥有192.168.200.0/24网段的所有登录和修改权限,密码333333:
GRANT ALL PRIVILEGES ON *.* TO 'yunjisuan'@'192.168.200.%' IDENTIFIED BY '333333' WITH GRANT OPTION; - 给用户myslave授权所有的库,所有的表所有的地址权限,密码123123:
GRANT ALL PRIVILEGES ON *.* TO 'myslave'@'%' IDENTIFIED BY '123123' WITH GRANT OPTION; - 让mysql的设置立即生效:
FLUSH PRIVILEGES; - 查看当前用户的权限记录:
SHOW GRANTS; - 查看yunjisuan@'192.168.200.%'账号的权限记录:
SHOW GRANTS FOR 'yunjisuan'@'192.168.200.%'; - 查看用户myslave的权限:
SHOW GRANTS FOR 'myslave'@'%'; - 查看yunjisuan库下的users表的表结构:
DESCRIBE yunjisuan.users;或DESC yunjisuan.users; - 查看select * from t1;语句的执行过程:
EXPLAIN SELECT * FROM t1;
MyISAM和InnoDB的区别是什么?
答案:
- 事务支持:MyISAM不支持事务,InnoDB支持事务
- 锁机制:MyISAM使用表级锁,InnoDB使用行级锁
- 索引结构:MyISAM的索引和数据分离,InnoDB的主键索引是聚集索引
- 缓存:MyISAM只缓存索引,InnoDB缓存索引和数据
- 外键支持:MyISAM不支持外键,InnoDB支持外键
- 崩溃恢复:MyISAM崩溃后恢复困难,InnoDB支持崩溃恢复
- 读写性能:MyISAM对读数据支持非常好,写操作时会锁定整个表
- 资源占用:MyISAM对系统资源占用小
- 并发支持:MyISAM读写阻塞互斥,不支持多用户并发写操作
如何进行MySQL非交互使用?
答案:使用-e参数执行SQL语句,例如:mysql -uusername -ppassword -e "SELECT * FROM table_name;"
如何备份MySQL数据库中的某个库?
答案:使用mysqldump命令,例如:mysqldump -uusername -ppassword database_name > /backup/database_name.sql
什么叫慢查询日志,它用来做什么的?如何打开慢查询日志?
答案:
- 慢查询日志:记录所有执行时间超过long_query_time秒数的SQL语句的日志,用于找到执行时间长的语句,用于优化
- 打开方法:在my.cnf配置文件中添加以下两行:ini
long_query_time = 5 slow_query_log_file = /var/log/mysql/mysql-slow.log - 然后重启MySQL服务
MySQL临时锁表只读命令是什么?
答案:FLUSH TABLES WITH READ LOCK;
MySQL解除临时锁表只读命令是什么?
答案:UNLOCK TABLES;
MySQL主从复制延迟时间大,都有哪些可能的原因及解决办法?
答案:
- 主库的从库太多,导致复制延迟 解决:一般一个主库五个从库最多,不可再添加从库
- 从库的硬件条件比主库差,导致复制延迟 解决:提升从库硬件条件
- 慢SQL语句太多 解决:开启从库的慢查询日志,会记录执行时间超过指定时间的SQL语句,告诉开发,让开发去更新优化语句
- 主从复制的设计问题,从库的SQL线程为单线程,只能一条一条处理并发过来的SQL语句,所以会有延迟 解决:更新版本,mysql5.6版本之后从库的SQL线程为多线程,大大降低了延迟
- 主从库之间的网络延迟 解决:优化网络
- 主库读写压力大,导致复制的时候就产生了延迟 解决:优化主库性能,如读写分离
- MySQL主从复制延迟时间查看参数:
show slave status显示参数Seconds_Behind_Master不为0 - 输入命令临时跳过一条sql线程的解析的命令:
set global sql_slave_skip_counter=1;
MySQL5.6x版和MySQL5.7x版本的数据库有什么新特性?
答案:
- MySQL5.6特性:
- 支持全文索引
- 整合了memcached API,可以使用API直接访问InnoDB表
- 增强了InnoDB存储引擎的性能和功能
- 支持GTID(全局事务标识符)
- 优化了InnoDB事务处理
- 增加了Performance Schema
- MySQL5.7特性:
- 安全性增强:用户表plugin字段不允许为空,默认值为mysql_native_password
- 增加密码过期机制
- 支持JSON数据类型
- 支持在线开启GTID
- 增强了查询优化器
- 增加了sys schema,提供更丰富的性能监控数据
- 支持多源复制
- 优化了InnoDB存储引擎
- 增加了generated columns(生成列)
- 支持空间数据类型和函数
MySQL 5.7 与 8.0 的核心区别
以下是 MySQL 5.7 与 8.0 的核心区别对比:
查询功能增强
- 窗口函数:8.0 支持
ROW_NUMBER()、RANK()、LAG()等,简化复杂分析查询;5.7 需嵌套子查询实现。 - CTE(公共表表达式):8.0 支持递归和非递归 CTE,提升查询可读性;5.7 不支持。
- JSON 支持:8.0 增强
JSON_TABLE()、->>操作符及部分更新;5.7 仅基础 JSON 操作。
- 窗口函数:8.0 支持
索引优化
- 降序索引:8.0 直接支持
ORDER BY ... DESC的索引优化;5.7 需文件排序。 - 隐藏索引:8.0 可临时禁用索引(
ALTER INDEX ... INVISIBLE),避免删除重建;5.7 不支持。 - 函数索引:8.0 支持基于表达式创建索引(如
UPPER(c2));5.7 不支持。
- 降序索引:8.0 直接支持
安全机制
- 身份验证:8.0 默认使用
caching_sha2_password插件;5.7 使用mysql_native_password,旧客户端需适配。 - 角色管理:8.0 支持角色权限分配(
CREATE ROLE);5.7 需手动授权。 - 密码策略:8.0 强制密码复杂度检查、过期策略及历史记录;5.7 功能较弱。
- 身份验证:8.0 默认使用
数据字典与存储
- 原子 DDL:8.0 确保 DDL 操作完全成功或回滚;5.7 可能部分失败。
- 自增列持久化:8.0 重启后自增值不重置;5.7 可能重置导致主键冲突。
- 元数据存储:8.0 将系统表移至 InnoDB(
mysql.ibd);5.7 使用 MyISAM 和.frm文件。
字符集与性能
- 默认字符集:8.0 改用
utf8mb4(支持表情符号);5.7 默认latin1。 - 并行查询:8.0 支持全表扫描并行化(配置
innodb_parallel_read_threads);5.7 不支持。 - 资源组:8.0 可限制 CPU 和线程优先级(
CREATE RESOURCE GROUP);5.7 无此功能。
- 默认字符集:8.0 改用
事务与高可用
- 锁控制:8.0 支持
SELECT ... FOR UPDATE NOWAIT/SKIP LOCKED跳过锁等待;5.7 仅等待超时。 - 备份锁:8.0 引入
LOCK INSTANCE FOR BACKUP,减少备份阻塞;5.7 无此功能。 - Group Replication:8.0 优化多主模式性能;5.7 并行复制较弱。
- 锁控制:8.0 支持
⚠️ 版本支持:MySQL 5.7 已于 2023 年 10 月结束标准支持,8.0 为当前推荐版本。
🔧 升级需测试客户端兼容性、SQL 保留字冲突及执行计划变化。
十二、缓存技术
Redis的默认监听端口是什么?
答案:6379
Redis的持久化方式
答案:Redis支持两种持久化方式:
- RDB(快照):将内存中的数据以快照的方式写入到二进制文件中(默认是dump.rdb)
- AOF(追加文件):将所有写操作记录到日志文件中,重启时通过重新执行这些操作来恢复数据
RDB和AOF的区别
答案:
- RDB(快照):
- 优点:快照周期短,对系统性能影响小
- 缺点:无法做到数据完全不丢失,快照期间会阻塞客户端写入
- AOF(追加文件):
- 优点:可以做到数据完全不丢失
- 缺点:对系统性能影响较大
Redis的淘汰策略
答案:Redis的淘汰策略包括:
- volatile-lru:从设置了过期时间的key中,选择最近最少使用的key删除
- volatile-ttl:从设置了过期时间的key中,选择剩余时间最短的key删除
- volatile-random:从设置了过期时间的key中,随机选择key删除
- allkeys-lru:从所有key中,选择最近最少使用的key删除
- allkeys-random:从所有key中,随机选择key删除
- noeviction:不删除key,直接返回错误
Redis的主从复制
答案:Redis主从复制是将主节点的数据同步到从节点的过程。主节点负责处理写操作,从节点负责处理读操作,从而实现读写分离和负载均衡。
Redis的哨兵模式
答案:Redis哨兵模式是一种高可用解决方案,通过哨兵节点监控主节点的状态,当主节点出现故障时,自动将一个从节点提升为新的主节点,从而实现故障自动转移。
解释Redis中save和bgsave命令的区别?
答案:
- save:同步保存操作,执行该命令时,Redis服务器进程会被阻塞,直到数据保存完成为止,期间无法处理客户端发送的其他命令请求
- bgsave:异步保存操作,执行后会立刻返回OK,Redis会fork一个子进程,原来的Redis主进程继续执行后续操作
