Linux 系统管理

进程简介

进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源

进程管理的作用

  • 判断服务器健康状态
  • 查看系统中所有进程
  • 杀死进程

进程的查看

  • ps

    • ps aux 查看系统中所有进程,使用 BSD 操作系统格式
    • ps -le 查看系统中所有进程,使用 Linux 标准命令模式
    • 选项:
      • a 显示一个终端的所有进程,除了会话引线
      • u 显示进程的归属用户及内存的使用情况
      • x 显示没有控制终端的进程
      • -l 长格式显示。显示更加详细的信息
      • -e 显示所有进程,和 -A 作用一致
    • ps 命令输出
      • USER 该进程是由哪个用户产生的
      • PID 该进程的 ID 号
      • %CPU 该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源
      • %MEN 该进程占用物理内存的百分比,占用越高,进程越耗费资源
      • VSZ 该进程占用虚拟内存大小,单位 KB
      • RSS 该进程占用实际物理内存的大小,单位 KB
      • TTY 该进程是在哪个终端中运行的。其中 tty1-tty7 代表本地控制台终端,tty1-tty6 是本地的字符界面终端,tty7 是图形终端。pts/0-255 代表虚拟终端,? 代表内核运行
      • STAT 进程状态
        • R 运行
        • S 睡眠
        • T 停止状态
          • 位于后台
        • s 包含子进程
      • START 该进程的启动时间
      • TIME 该进程占用 CPU 的运算时间,注意不是系统时间
      • COMMAND 产生此进程的命令名
  • pstree

    • pstree [选项]
      • -p 显示进程的 PID
      • -u 显示进程的所属用户
  • top

    • top [选项]
    • top -b -n 1 > top.log 把每秒的 top 信息写进 top.log 文件中
    • 选项:
      • -d 秒数 指定 top 命令每隔几秒更新。默认是 3 秒
      • -b 使用批处理模式输出。一般和 “-n” 选项合用
      • -n 次数 指定 top 命令执行的次数。一般和 “-b” 选项合用
    • top 命令交互模式可以执行命令
      • ? 或 h 显示帮助
      • M 以内存使用率排序
      • P 以 CPU 使用率排序,默认此项
      • N 以 PID 排序
      • q 退出 top
    • top 参数意义
      • 第一行系统信息:
        • 12:26:46 系统当前时间
        • up 1 day,13:32 系统运行时间,本机已运行了 1 天 13 小时 32 分钟
        • 2 users 当前系统登录了用户
        • load average: 0.00,0.00,0.00 系统在之前 1 分钟,5 分钟,15 分钟的平均负载。一般认为小于1时,负载较小。如果大于 1,系统已经超出负荷
      • 第二行进程信息:
        • Tasks: 95 total 系统中的进程总数
        • 1 running 正在运行的进程数
        • 94 sleeping 睡眠的进程
        • 0 stopped 正在停止的进程
        • 0 zombie 僵尸进程。如果不是 0,需要手工检查僵尸进程
      • 第三行 CPU 信息:
        • Cpu(s) 0.1%us 用户模式占用的 CPU 百分比
        • 0.1%sy 系统模式占用的 CPU 百分比
        • 0.0%ni 改变过优先级的用户进程占用的 CPU 百分比
        • 99.7%id 空闲 CPU 的 CPU 百分比
        • 0.1%wa 等待输入 / 输出的进程的占用 CPU 百分比
        • 0.0%hi 硬中断请求服务占用的 CPU 百分比
        • 0.1%si 软中断请求服务占用的 CPU 百分比
        • 0,0%st 虚拟时间百分比
      • 第四行内存信息:
        • Mem: 635344k total 物理内存的总量,单位 KB
        • 571504k used 已经使用的物理内存数量
        • 53840k free 空闲的物理内存数量
        • 65800k buffers 作为缓冲的内存数量
      • 第五行交换分区信息:
        • Swap: 524280k total 交换分区(虚拟内存)的总大小
        • Ok used 已经使用的交互分区的大小
        • 524280k free 空闲交换分区的大小
        • 409280k cached 作为缓存的交互分区的大小

杀死进程

  • kill
    • kill -l 查看可用的进程信号
    • kill -1 进程 ID 重启进程
    • kill -9 进程 ID 强制杀死进程
  • killall
    • killall [选项] [信号] 进程名
      • 选项:
        • -i 交互式,询问是否要杀死某个进程
        • -I 忽略进程名的大小写
  • pkill
    • pkill [选项] [信号] 进程名
      • 选项:
        • -t 终端号:按照终端号踢出用户
      • 用法:
        • pkill -9 -t tty1

修改进程优先级

Linux 操作系统是一个多用户、多任务的操作系统,Linux 系统中通知运行着非常多的进程。但是 CPU 在同一个时钟周期内只能运算一个指令。进程优先级决定了每个进程处理的先后顺序呢。

执行命令 ps -le 返回的结果中,PRI 代表 Priority,NI 代表 Nice。这两个值都是优先级,数字越少代表改进程优先级越高。

用户可以修改 NI 值,注意事项如下:

  • NI 值的范围是 -20 到 19
  • 普通用户调整 NI 值的范围是 0 到 19,而且只能调整自己的进程
  • 普通用户只能调高 NI 值,而不能降低,如原本 NI 值为0,则只能调整为大于 0
  • root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程
  • PRI(最终值)= PRI(原始值)+ NI
  • 用户只能修改 NI 的值,不能直接修改 PRI

修改进程优先级的命令如下:

  • nice
    • nice [选项] 命令 nice 的命令可以给新执行的命令直接赋予 NI 值,但是不能修改已经存在进程的 NI 值
      • 选项:
        • -n NI 值:给命令赋予 NI 值
      • 用法:
        • nice -n -5 service httpd start
  • renice
    • renice [优先级] 进程 ID renice 命令是修改已经存在进程的 NI 值的命令
      • 用法:
        • renice -10 2125

工作管理

工作管理指的是在单个登录终端中(也就是登录的 Shell 界面中)同时管理多个工作的行为

工作管理注意事项如下:

  • 当前的登录终端,只能管理当前终端的工作,而不能管理其他登录终端的工作
  • 放入后台的命令必须可以持续运行一段时间,这样我们才能扑捉和操作这个工作
  • 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则放入后台只能暂停,而不能执行

工作管理方法

1
2
3
4
5
# 把命令放入后台,并在后台执行
top &
# 按下 ctrl + z 快捷键,放在后台暂停
top
  • jobs
    • josb [选项]
      • 选项:
        • -l 显示工作的 PID
      • + 号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作;- 号代表倒数第二个放入后台的工作
  • fg
    • fg %工作号 将后台暂停的工作恢复到前台执行,注意 % 号可以省略,但是注意工作号和 PID 的区别
  • bg
    • bg %工作号 后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台执行

后台命令脱离登录终端执行的方法

  • 第一种方法是把需要后台执行的命令加入 /etc/rc.local 文件
  • 第二种方法是使用系统定时任务,让系统在指定的时间执行某个后台命令
  • 第三种方法是使用 nohup 命令

系统资源查看

  • vmstat
    • vmstat [刷新延时 刷新次数]
    • 用法:
      • vmstat 1 3
    • 参数:
      • procs:进程信息字段
        • r 等待运行的进程数,数量越大,系统越繁忙
        • b 不可被唤醒的进程数量,数量越大,系统越繁忙
      • memory:内存信息字段
        • free 空闲的内存容量,单位 KB
        • buff 缓冲的内存容量,单位 KB
        • cache 缓存的内存容量,单位 KB
        • swpd 虚拟内存的使用情况,单位 KB
        • 缓冲和缓存的区别:缓存是用来加速数据读取的,缓冲是用来加速数据写入的
      • swap:交换分区的信息字段
        • si 从磁盘中交换到内存中数据的数量,单位 KB
        • so 从内存中交换到磁盘中数据的数量,单位 KB。此两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差。
      • io:磁盘读写信息字段
        • bi 从块设备读入数据的总量,单位是块
        • bo 写到块设备的数据的总量,单位是块。此两个数越大,代表系统的 I/O 越繁忙
      • system:系统信息字段
        • in 每秒被中断的进程次数
        • cs 每秒进行的事件切换次数。此两个数越大,代表系统与接口设备的通信非常繁忙
      • CPU:CPU 信息字段
        • us 非内核进程消耗 CPU 运算时间的百分比
        • sy 内核进程消耗 CPU 运算时间的百分比
        • id 空闲 CPu 的百分比
        • wa 等待 I/O 所消耗的 CPU 百分比
        • st 被虚拟机消耗的 CPU 百分比
  • dmesg
    • dmesg 显示系统内核信息
  • free
    • free [选项] 查看内存使用状态
      • 选项:
        • -\b 以字节为单位显示
        • -\k 以 KB 为单位显示,默认就是以 KB 为单位显示
        • -\m 以 MB 为单位显示
        • -\g 以 GB 为单位显示
      • 参数:
        • 第一行:total 是总内存数,used 是已经使用的内存数,free 是空闲的内存数,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cached 是缓存内存数。默认单位是 KB
        • 第二行:-/buffers/cache 的内存数,相当于第一行的 used-buffers-cached。+/buffers/cache 的内存数,相当于第一行的 free + buffers + cached
        • 第三行:total 是 swap 的总数;used 是已经使用的 swap 数,free 是空闲的 swap 数。默认单位是 KB
  • cat /proc/cpuinfo
    • 查看 CPU 信息
  • uptime
    • 显示系统的启动时间和平均负载,也就是 top 命令的第一行。
  • uname
    • uname [选项]
      • 选项:
        • -a 查看系统所有相关信息
        • -r 查看内核版本
        • -s 查看内核名称
  • file /bin/ls
    • 查看系统操作位数
  • lsb_release -a
    • 查询当前 Linxu 系统的发行版本
  • lsof
    • lsof [选项]
      • 选项:
        • -c 字符串:只列出以字符串开头的进程打开的文件
        • -u 用户名:只列出某个用户的进程打开的文件
        • -p PID:列出某个 PID 进程打开的文件
      • 例子:
        • lsof | more
        • lsof /sbin/init
        • lsof -c httpd
        • lsof -u root

Linux 服务管理

Linux 服务管理

简介与分类

  • 系统的运行级别

    • 查看运行级别命令:runlevel
    • 修改运行级别命令:init 运行级别
    • 系统开机进入级别:vim /etc/inittab ~ id:3initdefault:
运行级别 含义
0 关机
1 单用户模式,主要用于系统修复
2 不完全的命令行模式,不含 NFS 服务
3 完全的命令行模式,就是标准字符界面
4 系统保留
5 图形模式
6 重启动
  • 服务的分类

    • Linux 服务
      • PRM 包默认安装的服务
        • 独立的服务
          • 默认配置文件位置
            • /etc/init.d/ 启动脚本位置
            • /etc/sysconfig/ 初始化环境配置文件位置
            • /etc/ 配置文件位置
            • /etc/xinetd.conf xinetd 配置文件
            • /etc/xinetd.d/ 基于 xineted 服务的启动脚本
            • /var/lib/ 服务产生的数据放在这里
            • /var/log/ 日志
        • 基于 xinetd 服务
      • 源码包安装的服务
        • 源码包安装位置,一般是 /usr/local
      • PRM 包安装和源码包安装的区别:两者服务安装的位置不同
  • 服务与端口

    • 概念:如果把 IP 地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个 IP 地址的端口可以有 65536 个
    • 服务与端口的对应:cat /etc/services
    • 查询系统中开启的服务:netstat [选项]
      • -t 列出 TCP 数据
      • -u 列出 UDP 数据
      • -l 列出正在监听的网络服务(不包含已经连接的网络服务)
      • -n 用端口号来显示服务,而不是用服务名
      • -p 列出该服务的进程 ID
    • chkconfig 和 netstat 的区别
      • chkconfig 查看自启动命令
      • netstat 查看启动命令
  • 服务启动与自启动

    • 独立服务的自启动
      • ntsysv 命令图形界面管理自启动
      • /etc/rc.d/rc.local 文件修改管理自启动
      • chkconfig --list 查看服务自启动状态,可以看到所有 RPM 包安装的服务
      • chkconfig [--level 运行级别] [独立服务名] [on|off] 修改服务自启动状态
    • 独立服务的启动
      • /etc/init.d/独立服务名 start、stop、status、restart
      • service 独立服务名 start、stop、status、restart
    • 源码包安装服务的启动
      • 使用绝对路径,调用启动脚本来启动。不同的源码包的启动脚本不同。可以查看源码包的安装说明,查看启动脚本的方法。
      • 用法:/usr/local/apache2/bin/apachectl start
    • 源码包服务的自启动
      • vi /etc/rc.d/rc.local 加入 /usr/local/apache2/bin/apachectl start
    • 源码包的 Apache 服务能被 Service 命令管理启动
      • ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache
    • 源码包的 Apache 服务能被 chkconfig 与 ntsysv 命令管理自启动
      • vi /etc/init.d/apache 加入 # chkconfig:35 86 76description:source package apache
      • chkconfig --add apache 把源码包 apache 加入 chkconfig 命令

Linux-Shell-基础之正则表达式

第1章 正则表达式

1-1 什么是正则表达式

正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。

1-2 正则表达式与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed 等命令可以支持正则表达式(字符串)
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp 这些命令不支持正则表达式,所以只能使用 Shell 自己的通配符来进行匹配了。(文件)
    • * 匹配任意内容
    • ? 匹配任意一个内容
    • [] 匹配括号中的一个字符

1-3 基础正则表达式

元字符 作用
* 前一个字符匹配 0 次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首,例如:^hello 会匹配以 hello 开头的行
$ 匹配行尾,例如:hello& 会匹配以 hello 结尾的行
[] 匹配中括号中指定的任意一个字符,只匹配一个字符。
[^] 匹配除中括号的字符以外的任意一个字符
\ 转义符,用于取消讲特殊符号的含义取消
\{n\} 表示其前面的字符恰好出现 n 次
\{n,\} 表示其前面的字符出现不小于 n 次
\{n,m\} 表示其前面的字符至少出现 n 次,最多出现 m 次

第2章 字符截取命令

  • cut 列提取字符串
    • cut [选项] 文件名
      • -f 列号:提取第几列
        • cut -f 2 student.txt 截取第二列
        • cut -f 2,4 student.txt 截取第二、第四列
      • -d 分隔符:按照指定分隔符分割列
        • grep "/bin/bash" /etc/passwd |grep -v "root" | cut -f 1 -d ":"
  • printf 格式化输出命令
    • printf '输出类型输出格式' 输出内容
      • 输出类型
        • %ns 输出字符串。n 是数字指代输出几个字符
        • %ni 输出整数。n 是数字指代输出几个数字
        • %m.nf 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如 %8.2f 代表共输出 8 位数,其中 2 位是小数,6 位是整数。
      • 输出格式
        • \a 输出警告声音
        • \b 输出退格键
        • \f 清除屏幕
        • \n 换行
        • \r 回车
        • \t 水平输出 Tab 键
        • \v 垂直输出 Tab 键
    • awk 命令的输出中支持 printprintf 命令
  • awk 字符截取命令
    • awk '条件1{动作1}条件2{动作2}...' 文件名
    • 条件
      • 一般使用关系表达式作为条件
      • x>10 判断变量 x 是否大于 10
      • x>=10 大于等于
      • x<=10 小于等于
    • 动作
      • 格式化输出
      • 流程控制语句
    • 例子
      • awk '{printf $2 "\t" $4 "\n"}' student.txt
      • awk '{print $2 "\t" $4 }' student.txt
      • df -h | awk '{print $1 "\t" $3}'
        • akw 'BEGIN{printf "This is a transcript \n"}{printf $2 "\t" $4 "\n"}' student.txt
        • cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
  • sed 字符替换命令
    • sed 是一个几乎包括在所有 UNIX 平台(包括 Linux)的轻量级编辑器。sed 主要是用来将数据进行选取、替换、删除、新增的命令
    • sed [选项] '[动作]' 文件名
      • 选项
        • -n 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过 sed 命令处理的行输出到屏幕
        • -e 允许对输入数据应用多条 sed 命令编辑
        • -i 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出
      • 动作
        • a 追加,在当前行后添加一行或多行
        • c 行替换,用 c 后面的字符串替换原数据行
        • i 插入,在当期行前插入一行或多行
        • d 删除,删除指定行
        • p 打印,输出指定的行
        • s 字符串替换,用一个字符串替换另外一个字符串,格式为 “行范围s/旧字符串g”
      • 例子
        • sed '2p' student.txt 查看文件的第二行
        • sed '2,4d' student.txt 表示删除【第2-4行】,但是不改变文件本身
        • sed '2a piaoliangdecxiaoguniang' student.txt 在第2行之后添加字符串,但是不改变字符串本身
        • sed '4c xxwmpg' student.txt 将第二行的整行替换为xxwmpg
        • sed '6s/70/100/g' student.txt 将第7行的所有70全部替换为100,如果不指定行的话会替换所有的指定字符串
        • sed -e 's/fengj//g';s/cang//g' student.txt 同时把fengj和cang替换为空

第3章 字符处理命令

  • sort 排序命令
    • sort [选项] 文件名
      • 选项
        • -f 忽略大小写
        • -n 以数值型进行排序,默认使用字符串型排序
        • -r 反向排序
        • -t 指定分隔符,默认的分隔符是制表符
        • -k n[,m] 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)
      • 用法
        • sort /etc/passwd 用户信息正向排序
        • sort -r /etc/passwd 用户信息反向排序
        • sort -t ":" -k 3,3 /etc/passwd 指定分隔符是 “:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序
        • sort -n -t ":" -k 3,3 /etc/passwd 作用同上,但把指定字符串排序改为数字排序
  • wc 统计命令
    • wc [选项] 文件名
      • 选项:
        • -l 只统计行数
        • -w 只统计单词数
        • -m 只统计字符数
      • 用法:
        • wc /etc/passwd
        • wc -l /etc/passwd

Linux 网络基础

网络基础

ISO / OSI 七层模型简介

  • ISO:国际标准化组织
  • OSI:开放系统互联模型
    • OSI 的七层模型
      • 应用层 - APDU
        • APDU 是应用协议数据单元
      • 表示层 - PPDU
        • PPDU 是表示层协议数据单元
      • 会话层 - SPDU
        • SPDU 是会话协议数据单元
      • 传输层 - TPDU
        • TPDU 是传输协议数据单元
      • 网络层 - 报文
        • IP 地址负责外网通信
      • 数据链路层 - 帧
        • MAC 地址负责局域网通信
      • 物理层 - 比特
    • 数据发送时候,从上层向下层传递;数据接收时候,从下层向上层传递。

ISO / OSI 七层模型详解

  • 应用层 - APDU
    • 用户接口
  • 表示层 - PPDU
    • 数据的表现形式、特定功能的实现如-加密
  • 会话层 - SPDU
    • 对应用会话的管理、同步
  • 传输层 - TPDU
    • 可靠与不可靠的传输、传输前的错误检测、流控
  • 网络层 - 报文
    • 提供逻辑地址、选路
  • 数据链路层 - 帧
    • 城帧、用 MAC 地址访问媒介、错误检测与修正
  • 物理层 - 比特
    • 设备之间的比特流的传输、物理接口、电器特征等

TCP / IP 四层模型

  • TCP / IP 四层模型
    • 应用层 (对应 OSI 模型的应用层、表示层、会话层)
      • 应用层对应于 OSI 参考模型的应用层、表示层、会话层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP 等
    • 传输层 (对应 OSI 模型的传输层)
      • 传输层对应于 OSI 模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据协议(UDP)
    • 网际互联层(对应 OSI 模型的网络层)
      • 网际互联对应于 OSI 模型的网络层,主要解决主机到主机的通信问题。它所包含的协议涉及数据包在整个网络上的逻辑传输。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
    • 网络接口层(对应 OSI 模型的数据链路层、物理层)
      • 网络接口层与 OSI 模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP /IP 本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与 TCP / IP 的网络接口层进行连接。地址解析协议(ARP)工作在此层,即 OSI 参考模型的数据链路层。

TCP / IP 三次握手(两军问题)

数据封装过程

应用数据 字节流(数据)
应用层 FTP + 数据
传输层 TCP 头 + FTP + 数据
网络层 IP 头 + TCP 头 + FTP + 数据
数据链路层 以太帧头 + (IP 头 + TCP 头 + FTP + 数据) = IP 数据报
最后 以太帧头 + 目的地址 + 源地址 + 包类型 + 包数据(IP 数据报) + CRC

IP地址详解

  • IP 包头
    • 第一行
      • 版本(4)
      • 头部长度(4)
      • 优先级和服务类型(8)
      • 总长度(16)
    • 第二行
      • 标识(16)
      • 标志(3)
      • 片偏移(13)
    • 第三行
      • 生存时间(8)
      • 协议(8)
      • 头部校验和(16)
    • 第四行
      • 源 IP 地址(32)
    • 第五行
      • 目的 IP 地址(32)
    • 第六行
      • 选项
    • 第七行
      • 数据

IP 地址分类

网络类别 最大网络数 IP 地址范围 最大主机数 私有 IP 地址范围
A 126 1.0.0.0 – 126.255.255.255 2^24-2 10.0.0.0 – 10.255.255.255
B 16384 128.0.0.0 – 191.255.255.255 2^16-2 172.16.0.0 – 172.31.255.255
C 2098152 192.0.0.0 – 223.255.255.255 2^8-2 192.168.0.0 – 192.168.255.255

子网掩码

网关作用

  • 网关(Gateway)又称为网间连接器、协议转换器
  • 网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连
  • 网关既可以用于广域网互连,也可以用于局域网互连
  • 网关是一种充当转换重任的服务器或路由器

端口作用

  • TCP 协议包头
    • 第一行
      • 源端口(16)
      • 目的端口(16)
    • 第二行
      • 序列号(32)
    • 第三行
      • 确认号(32)
    • 第四行
      • 数据偏移(4)
      • 保留(6)
      • 标志(6)
      • 窗口(16)
    • 第五行
      • 校验和(16)
      • 紧急指针(16)
    • 第六行
      • 选项
    • 第七行
      • 数据
  • UDP 协议包头
    • 第一行
      • 源端口(16)
      • 目的端口(16)
    • 第二行
      • 长度(16)
      • 校验和(16)
    • 第三行
      • 数据

常见端口号

  • FTP(文件传输协议):20 21
  • SSH(安全 Shell 协议):22
  • TELNET(远程登录协议):23
  • DNS(域名系统):53
  • HTTP(超文本传输协议):80
  • SMTP(简单邮件传输协议):25
  • POP3(邮局协议 3 代):110

查看本机启用的端口

  • netstat -an
    • -a 查看所有连接和监听端口
    • -n 显示 IP 地址和端口号,而不显示域名和服务名

DNS 作用

  • DNS 的作用:将域名解析为 IP 地址
    • 客户机向 DNS 服务器发送域名查询请求
    • DNS 服务器告知客户机 Web 服务器的 IP 地址
    • 客户机与 Web 服务器通信
  • DNS 的查询类型
    • 从查询方式上分
      • 递归查询
        • 要么做出查询成功响应,要么做出查询失败的响应,一般客户机和服务器之间属于递归查询,即当客户机向 DNS 服务器发出请求后,若 DNS 服务器本身不能解析,则会向另外的 DNS 服务器发出查询请求,得到结果后转交给客户机。
      • 迭代查询
        • 服务器收到一次迭代查询回复一次结果,这个结果不一定是目标 IP 与域名的映射关系,也可以是其他 DNS 服务器的地址
    • 从查询内容上分
      • 正向查询由域名查找 IP 地址
      • 反向查询由 IP 地址查找域名

Linux 网络配置

IP 地址配置

1
2
3
4
5
6
7
8
# 查看与配置网络状态命令
ifconfig
# 临时设置 eth0 网卡的 IP 地址与子网掩码
ifconfig eth0 192.168.0.200 netmask 255.255.255.0
# setup 图形界面(红帽专用)
setup

使用文件配置 IP 地址

网卡信息文件

1
vim /etc/sysconfig/network-scripts/ifcfg-eth0

主机名文件

1
vim /etc/sysconfig/network

Linux 网络命令

网络环境查看命令

  • ifconfig 查看与配置网络状态命令
    • 只能看到 IP 和子网掩码,看不到网关和 DNS
  • ifdown 网卡设备名称 禁用指定网卡设备
  • ifup 网卡设置名称 启用指定网卡设备
  • netstat 选项
    • -t 列出 TCP 协议端口
    • -u 列出 UDP 协议端口
    • -n 不使用域名与服务名,而是用 IP 地址和端口号
    • -l 仅列出在监听状态网络服务
    • -a 列出所有的网络连接
  • route -n 查看路由列表
  • route add default gw 192.168.1.1 临时设定网关
  • nslookup [主机名或 IP] 进行域名与 IP 地址解析
  • nslookup >server 查看本机 DNS 服务器

网络测试命令

  • ping [选项] [IP 或域名] 探测指定 IP 或域名的网络状况
    • -c 次数 指定 ping 包的次数
  • telnet [域名或 IP] [端口] 远程管理与端口探测命令
  • wget URL 下载命令
  • tcpdump -i eth0 -nnX port 21
    • -i 指定网卡接口
    • -X 以十六进制和 ASCII 码显示数据包内容
    • -nn 将数据包中的域名与服务转为 IP 和端口
    • port 指定监听的端口

Linux 命令基础

命令基本格式及文件处理命令

命令提示符

命令提示符例子:[root@localhost ~]#,参数意义如下:

  • root:当前登录用户名称
  • @:分隔用户名称和主机名称
  • localhost:主机名称
  • ~:当前所在目录
  • #:超级用户提示符,普通用户提示符是 $

命令格式

命令 [选项] [参数]

  • 个别命令使用不遵循此格式
  • 当有多个选项时,可以写在一起
  • 简化选项与完整选项:-a 等于 –all

查询目录中内容:ls

ls [选项] [文件或目录]

选项:

  • -a:显示所有文件,包括隐藏文件
  • -l:显示详细信息
  • -d:查看目录属性
  • -h:人性化显示文件大小
  • -i:显示 inode

命令 ls -l 等于命令 ll

目录处理命令

  • 新建目录:mkdir
    • mkdir -p [目录名称]
    • -p 递归创建
    • 命令英文原意:make directories
  • 切换所在目录:cd
    • cd [目录名称]
      • cd ~ :进入当前用户的家目录
      • cd - :进入上次目录
      • cd . :进入当前目录
      • cd .. :进入上一级目录
    • 命令英文原意:change directory
    • 相对路径:参照当前所在目录,进行查找
    • 绝对路径:从根目录开始制定,一级一级递归查找。在任何目录下,都能进入指定目录
  • 查询所在目录位置:pwd
    • pwd
    • 命令英文原意:print working directory
  • 删除空目录:rmdir
    • rmdir [目录名称]
    • 命令英文原意:remove empty directories
  • 删除文件或目录:rm
    • rm -rf [文件或目录]
      • -r :删除目录
      • -f :强制
    • 命令英文原意:remove
  • 复制命令:cp
    • cp [选项] [原文件或目录] [目标目录]
      • -r :复制目录
      • -p :连带文件属性复制
      • -d :若源文件是链接文件,则复制链接属性
      • -a :相当于 -pdr
    • 命令英文原意:copy
  • 剪切或重命名命令:mv
    • mv [原文件或目录] [目标目录]
    • 命令英文原意:move

常见目录作用

  • / :根目录
  • /bin :命令保存目录
  • /dev :设备文件保存目录
  • /etc :配置文件保存目录
  • /lib :系统保存目录
  • /mnt :系统挂载目录
  • /tmp :临时目录
  • /sys :
  • /var :系统相关文档内容
  • /usr :系统软件资源目录
    • /usr/bin :系统命令(普通用户)
    • /usr/sbin :系统命令(超级用户)
  • /boot :启动目录,启动相关文件
  • /home :普通用户的家目录
  • /root :超级用户的家目录
  • /sbin :命令保存目录
  • /proc :直接写入内存的
  • /media : 挂载目录

链接命令

  • 链接命令:ln
    • ln [参数] [原文件] [目标文件]
      • -s :创建软链接
      • 默认创建硬链接
    • 命令英文原意:link
    • 功能描述:生成链接文件
  • 硬链接特征:
    • 拥有相同的 I 节点和存储 Block 块,可以看做是同一个文件
    • 可通过 I 节点识别
    • 不能跨分区
    • 不能针对目录使用
  • 软连接特征:
    • 类似 Windows 快捷方式
    • 软链接拥有自己的 I 节点和 Block 块,但是数据块中只保存原文件的文件名和 I 节点号,并没有实际的文件数据
    • 软连接文件权限都为:rwxrwxrwx
    • 修改任意文件,另一个都改变
    • 删除原文件,软链接不能使用

文件搜索命令

文件搜索命令 locate

  • locate 文件名(只能搜索文件名)
    • 在后台数据库中按文件名搜索,搜索速度更快
  • /var/lib/mlocate
    • locate 命令所搜索的后台数据库
  • updatedb
    • 更新数据库
  • /etc/updatedb.conf 配置文件
    • PRUNE_BIND_MOUNTS = “yes” (开启搜索限制)
    • PRUNEFS = (搜索时,不搜索的文件系统)
    • PRUNENAMES = (搜索时,不搜索的文件类型)
    • PRUNEPATHS = (搜索时,不搜索的路径)

命令搜索命令 whereis 与 which

  • whereis
    • 搜索命令所在路径及帮助文档所在位置
    • 选项
      • -b 只查找可执行文件
      • -m 只查找帮助文件
  • which (能看到命令的别名,只能看到命令的所在位置)

文件搜索命令 find

  • find [搜索范围] [搜索条件]
    • 搜索文件
  • find / -name install.log
    • 避免大范围搜索,会非常耗费系统资源
    • find 是在系统当中搜索符合条件的文件名。如果需要匹配,使用通配符匹配,通配符是完全匹配
    • Linux 中的通配符
        • 匹配任意内容
      • ? 匹配任意一个字符
      • [] 匹配任意一个中括号内的字符
  • find /root -iname install.log 不区分大小写
  • find /root -user root 按照所有者搜索
  • find /root -nouser 查找没有所有者的文件
  • find /var/log/ -mtime +10 查找 10 天前修改的文件
    • 10 10 天当天修改的文件
    • -10 10 天内修改文件
    • +10 10 天前修改的文件
    • atime 文件访问时间
    • ctime 改变文件属性
    • mtime 修改文件内容
  • find . -size 25k 查找文件大小是 25 KB 的文件
    • 25K 等于 25 KB的文件
    • -25K 小于 25 KB的文件
    • +25K 大于 25KB 的文件
  • find . -inum 262422 查找 i 节点是 262422 的文件
  • find /etc -size +20k -a -size -50k 查找 /etc/ 目录下,大于 20 KB 并且小于 50 KB 的文件
    • -a and 逻辑与,两个条件都满足
    • -o or 逻辑或,两个条件满足一个即可
  • find /etc -size +20k -a -size -50k -exec ls -lh {} \; 查找 /etc/,大于 20 KB 并且小于 50 KB 的文件,并显示详细信息,-exec/ -ok 命令 {}\; 对搜索结果执行操作

字符串搜索命令 grep

  • grep [选项] 字符串 文件名 在文件当中匹配符合条件的字符串
    • -i 忽略大小写
    • -v 排除指定字符串

find 命令与 grep 命令的区别

find 命令:在系统当中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配。

grep 命令:在文件当中搜索符合条件的字符串,如果需要匹配,使用正则表达式进行匹配,正则表达式时包含匹配。

帮助命令

帮助命令 man

  • man 命令 获取指定命令的帮助
  • man -f 命令 相当于 whatis 命令 查看命令的帮助级别
  • man -k 命令 相当于 apropos 命令 查看和命令相关的所有帮助
  • man 的级别
    • 1 : 查看命令的帮助
    • 2 : 查看可被内核调用的函数的帮助
    • 3 : 查看函数和函数库的帮助
    • 4 : 查看特殊文件的帮助(主要是 /dev 目录下的文件)
    • 5 : 查看配置文件的帮助
    • 6 : 查看游戏的帮助
    • 7 : 查看其他杂项的帮助
    • 8 : 查看系统管理员可用命令的帮助
    • 9 : 查看和内核相关文件的帮助

其他帮助命令

  • 命令 --help 获取命令选项的帮助
    • ls --help
  • help shell 内部命令 获取 shell 内部命令的帮助
    • whereis cd 确定是否是 shell 内部命令
    • help cd 获取内部命令帮助
  • info 命令
    • 回车 : 进入子帮助页面
    • u : 进入上层页面
    • n : 进入下一个帮助小节
    • p : 进入上一个帮助小节
    • q : 退出

压缩命令

  • 常用的压缩格式:
    • .zip
    • .gz
    • .bz2
    • .tar.gz
    • .tar.bz2
  • .zip 格式
    • zip 压缩文件名 源文件 压缩文件
    • zip -r 压缩文件名 源目录 压缩目录
    • unzip 压缩文件 解压 .zip 文件
  • .gz 格式
    • gzip 源文件 压缩为 .gz 格式的压缩文件,源文件消失
    • gzip -c 源文件 > 压缩文件 压缩为 .gz 格式的压缩文件,源文件保留
    • gzip -r 目录 压缩目录下所有的子文件,但是不能压缩目录
    • gzip -d 压缩文件 解压文件
    • gunzip 压缩文件 解压文件
  • .bz2
    • bzip2 源文件 压缩为 .bz2 格式的压缩文件,不保留源文件
    • bzip2 -k 源文件 压缩为 .bz2 格式的压缩文件,保留源文件
    • bzip2 命令不能压缩目录
  • tar.gz
    • tar -cvf 打包文件名 源文件
      • 选项
        • -c : 打包
        • -v : 显示过程
        • -f : 指定打包后的文件名
      • 举例:tar -cvf longzls.tar longzls
    • tar -xvf 打包文件名
      • 选项
        • -x : 解打包
      • 举例:tar -xvf longzls.tar
    • tar -zcvf 压缩包名.tar.gz 源文件 压缩为 .tar.gz 格式的压缩文件
    • tar -zxvf 压缩包名.tar.gz 解压 .tar.gz 格式的文件
    • tar -jcvf 压缩包名.tar.bz2 源文件 压缩为 .tar.bz2 格式的压缩文件
    • tar -jxvf 压缩包名.tar.bz2 解压 .tar.bz2 格式的文件

关机重启命令

  • shutdown 命令
    • shutdown [选项] 时间
    • 选项
      • -c :取消前一个关机命令
      • -h :关机(尽可能少用)
      • -r :重启
  • 其他关机命令
    • halt
    • poweroff
    • init 0
  • 其他重启命令
    • reboot
    • init 6
  • 系统运行级别
    • 0 关机
    • 1 单用户
    • 2 不完全多用户,不含 NFS 服务
    • 3 完全多用户
    • 4 未分配
    • 5 图形界面
    • 6 重启
  • cat /etc/inittab 可以修复系统默认运行级别
  • runlevel 查询系统运行级别
  • logout 退出登录命令

挂载命令

  • 查询与自动挂载
    • mount [-t 文件系统] [-o 特殊选项] 设备 文件名 挂载点
      • -t 文件系统:加入文件系统类型来指定挂载的类型,可以 ext3、ext4、iso 9660 等文件系统
      • -o 特殊选项:可以指定挂载的额外选项
    • mount 查询系统中已经挂载的设备
    • mount -a 依据配置文件 /etc/fstab 的内容,自动挂载
  • 光盘的挂载
    • 挂载光盘
      • mkdir /mnt/cdrom/ 建立挂载点
      • mount -t iso9660 /dev/cdrom /mnt/cdrom/ 挂载光盘
      • mount /dev/sr0 /mnt/cdrom/
    • 卸载命令
      • umount 设备文件名或挂载点
      • umount /mnt/cdrom
  • U 盘的挂载
    • fdisk -l 查看存储设备文件名
    • mount -t vfat /dev/sdb1 /mnt/usb/

用户登录查看命令

  • w
    • USER :登录的用户名
    • TTY :登录终端
    • FROM :从哪个 IP 地址登录
    • LOGIN@ :登录时间
    • IDLE :用户闲置时间
    • JCPU :指的是和该终端连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间;
    • PCPU :是指当前进程所占用的时间;
    • WHAT :当前正在运行的命令
  • who
    • 用户名
    • 登录终端
    • 登录时间(登录来源 IP 地址)
  • last(查询当前登录和过去登录的用户信息)
    • last 命令默认是读取 /var/log/wtmp 文件数据
    • 命令输出
      • 用户名
      • 登录终端
      • 登录 IP
      • 登录时间
      • 退出时间(在线时间)
  • lastlog(查看所有用户的最后一次登录时间)
    • lastlog 命令默认是读取 /var/log/lastlog 文件内容
    • 命令输出
      • 用户名
      • 登录终端
      • 登录 IP
      • 最后一次登录时间

Shell 基础

Shell 概述

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,
用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

Shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性比较强。
Shell 是解释执行的脚本语言,在 Shell 中可以直接调用 Linux 的系统命令

Shell 的分类

  • Bourne Shell
    • sh、ksh、Bash、psh、zsh
  • C Shell
    • csh、tcsh

脚本执行方式

  • echo 输出命令
    • echo [选项] [输出内容]
    • 选项
      • -e :支持反斜线控制的字符转换
    • 字符转换
      • \a 输出警告音
      • \b 退格键,也就是向左删除键
      • \n 换行符
      • \r 回车键
      • \t 制表符
      • \v 垂直制表符
      • \0nnn 按照八进制 ASCII 码表输出字符。其中 0 为数字零,nnn 是三位八进制数
      • \xhh 按照十六进制 ASCII 码表输出字符。其中 hh 是两位十六进制数
    • 使用颜色
      • 30m=黑色
      • 31m=红色
      • 32m=绿色
      • 33m=黄色
      • 34m=蓝色
      • 35m=洋红
      • 36m=青色
      • 37m=白色
      • \e[1;31m \e[0m
    • 例子
      • echo -e "hell\bo";
      • echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f\t";
      • echo -e "\e[1;31mHello World \e[0m";

命令别名与快捷键

  • alias 查看系统中所有的命令别名
  • alias 别名='原命令' 设定命令别名
    • 例子:alias vi='vim'
  • vi ~/.bashrc 写入环境变量配置文件
  • unalias 别名 删除别名
  • 命令生效顺序
    • 第一顺位执行用绝对路径或相对路径执行的命令
    • 第二顺位执行别名
    • 第三顺位执行 Bash 的内部命令
    • 第四顺位执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令
  • 常用快捷键
    • Ctrl + c 强制终止当前命令
    • Ctrl + l 清屏
    • Ctrl + a 光标移动到命令行首
    • Ctrl + e 光标移动到命令行尾
    • Ctrl + u 从光标所在位置删除到行首
    • Ctrl + z 把命令放入后台
    • Ctrl + r 在历史命令中搜索

历史命令

  • history [选项] [历史命令保存文件]
    • 选项
      • -c :清空历史缓存
      • -w :把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
    • 历史命令默认会保存 1000 条,可以在环境变量配置文件 /etc/profile 中的 HISTSIZE 进行修改
    • 历史命令的调用
      • 使用上、下箭头调用以前的历史命令
      • 使用 !n 重复执行第 n 条历史命令
      • 使用 !! 重复执行上一条命令
      • 使用 !字符 重复执行最后一条以该字符串开头的命令

输出重定向

1.标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输入
显示器 /dev/sdterr 2 标准错误输出

2.输出重定向

类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备中
标准输出重定向 命令 >> 文件 以追加的方式,把命令的正确输出,输出到指定的文件或设备中
标准错误输出重定向 错误命令2>文件 以覆盖的方式,把命令的错误输出,输出到指定的文件或设备中
标准错误输出重定向 错误命令2>>文件 以追加的方式,把命令的错误输出,输出到指定的文件或设备中
正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令 &>文件 以覆盖的方式,把正确输出和错误输出都保存都同一个文件当中
正确输出和错误输出同时保存 命令 &>>文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存 命令>>文件1 2>>文件2 把正确的输出追加到文件 1 中,把错误的输出追加到文件 2 中

3.输入重定向

  • wc [选项] [文件名] 输入重定向
    • 选项
      • -c :统计字节数
      • -w :统计单词数
      • -i :统计行数

        管道符

1.多命令顺序执行

多命令执行符 格式 作用 例子
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系,即使报错也会往下执行 date ; ls ; cd ~; history;
&& 命令1&&命令2 逻辑与,当命令 1 正确执行,则命令 2 才会执行,当命令 1 执行不正确,则命令 2 不会执行 ls && echo yes
II 命令1 II 命令2 逻辑或,当命令 1 执行不正确,则命令 2 才会执行,当命令 1 正确执行,则命令 2 不会执行 lsls II echo no

2.管道符

  • 格式:命令 1 | 命令 2
  • 作用:命令 1 的正确输出作为命令 2 的操作对象

通配符

1.通配符

通配符 作用
? 匹配一个任意字符
* 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符,例如:[abc] 代表一定匹配一个字符,或是 a,或是 b,或是 c
[-] 匹配中括号中任意一个字符,- 代表一个范围,例如:[a-z] 代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符,例如:[^0-9] 代表匹配一个不是数字的字符

通配符执行例子

  • 存在文件夹dzp,dzp2,dzp3,dzp34,dzpadzpbols,dzpcang
  • 执行命令 ls dzp,显示文件夹 dzp
  • 执行命令 ls dzp?,显示文件夹 dzp2dzp3
  • 执行命令 ls dzp[0-9],显示文件夹 dzp2dzp3
  • 执行命令 ls dzp[0-9][0-9],显示文件夹 dzp34
  • 执行命令 ls dzp[^0-9],显示文件夹 dzpa
  • 执行命令 ls dzp[^0-9]*,显示文件夹 dzpadzpbolsdzpcang

2.Bash 中其他特殊符号

符号 作用
‘’ 单引号。在单引号中所有特殊符号,如 $ 和 ` 都没有特殊含义。
“” 双引号。在双引号中特殊符号都没有特殊含义,但是 $ 、`、\ 是例外,拥有调用变量值引用命令转义符的特殊含义
`` 反引号。反引号包括起来的内容是系统命令,在 Bash 中会先执行它。和 $() 作用一样,不过推荐使用 $(),因为反引号非常容易看错。
$() 和反引号作用一样,用来引用系统命令
# 在 Shell 脚本中,# 开头的行代表注释
$ 用于调用变量的值,如需要调用变量 name 的值时,需要用 $name 的方式得到变量的值
\ 转义符,跟在 \ 之后的

用户管理

用户和用户组的概念

  • 用户:使用操作系统的人
  • 用户组:具有相同系统权限的一组用户
  • /etc/group 存储当前系统中所有用户组信息
    • Group:x:499:root,luis,daemon
    • 组名称:组密码占位符:组编号:组中用户名列表
  • /etc/gshadow 存储当前系统中用户组的密码信息
    • Group:*: :root,luis
    • 组名称:组密码:组管理者:组中用户名列表
  • /etc/passwd 存储当前系统中所有用户的账号信息
    • root:x:0:0:root:/root:/bin/bash
    • 用户名:密码占位符:用户编号:用户组编号:用户注释信息:用户主目录:Shell 类型
  • /etc/shadow 存储当前系统中所有用户的密码信息
    • root:$6$tBDREHKV$JfcEQ/hTxaOWI8QKoRPARviOq3etqaE.szqFoqW8/Uxh6nAkCvlQzp8nRhg4kRM4ySRjpsfyS7kxXfa5cOlLa.:17044:0:99999:7:::
    • 用户名:密码:::

用户和用户组的基本命令

  • 用户组基本命令
    • 新增用户组:groupadd 用户组名称
    • 新增用户组并指定编号:groupadd -g 数字编号 用户组名称
    • 修改用户组名称:groupmod -n 新名称 旧名称
    • 修改用户组编号:groupmod -g 数字编号 用户组名称
    • 删除用户组:groupdel 用户组名称
  • 用户基本命令
    • 删除用户:userdel 用户名称
    • 删除用户并删除个人文件夹:userdel -r 用户名称
    • 新增用户并指定用户组:useradd -g 用户组名称 用户名称
    • 新增用户并指定用户个人文件夹:useradd -d 目录路径 用户名称
    • 修改用户名称:usermod -l 新名称 旧名称
    • 修改用户备注信息:usermod -c 备注信息 用户名称
    • 修改用户的用户组信息:usermod -g 用户组名称 用户名称
    • 指定用户新的个人文件夹:usermod -d 目录路径 用户名称
  • 其他命令
    • 切换用户:su
    • 锁定用户:passwd -l 用户名称
    • 解锁用户:passwd -u 用户名称
    • 无密码登录:passwd -d 用户名称
    • 设置组密码:gpasswd 用户组名称
    • 显示用户详情:
      • 显示当前登录用户名:whoami
      • 显示用户信息和组信息:id 用户名称
      • 显示用户所在的所有组:groups 用户名称
    • 设置用户资料:chfn 用户名称
    • 新增用户附属组:gpasswd -a 用户名称 用户组名称(在 Linux 当中,一个用户可以属于多个用户组,但只能有一个主要组,其余都是附属组)
    • 删除用户附属组:gpasswd -d 用户名称
    • 切换用户附属组:newgrp 用户组名称
    • 新增用户指定主要组和附属组:useradd -g 主要组名称 -G 附属组名称

MySQL 5.7 版本新特性

第 1 章 MySQL 服务功能增强

1-1 初始化方式变更

MySQL 5.7 之前
scripts/mysql_install_db \ --datadir=/data/sql_data \ --user=mysql --basedir=/home/mysql

MySQL 5.7 之后
bin/mysql --initialize --user = mysql \ --basedir=/home/mysql \ --datadir=/home/mysql/data

1-3 旧版本支持为表增加计算列演练

MySQL 5.7 之前,需要增加一个插入触发器和更新触发器来实现计算列的功能,或者是一个视图来实现计算列的功能

MySQL 5.7 之后,在 CREATE TABLEALTER TABLE 语句中支持增加计算列的方式

1
2
3
col_name data_type [GENERATED ALWAYS] AS (expression)
[VIRTUAL | STORED] [UNIQUE [KEY]] [COMMENT comment]
[[NOT] NULL] [[PRIMARY] KEY]

1-4 MySQL5.7支持为表增加计算列实际演练

1
2
3
4
5
6
7
8
9
CREATE TABLE t(id int AUTO_INCREMENT not null,c1 int,c2 int,c3 int as (c1+c2),PRIMARY KEY (id));
INSERT INTO t(c1,c2) VALUES(1,2);
SELECT * FROM t;
UPDATE t set c1 = 5 WHERE id = 1;
SELECT * FROM t;

1-5 引入JSON列类型及相关函数

MySQL 5.7 之前

只能在 varchar 或是 text 等字符类型的列中存储 JSON 类型的字符串,并通过程序解析使用 JSON 字符串。

MySQL 5.7 之后

增加了 JSON 列类型及以 JSON 开头的相关处理函数,如 JSON_TYPE(),JSON_OBJECT(),JSON_MERGE() 等。

1
2
SELECT JSON_ARRAY(1,2,3,now());
SELECT JSON_OBJECT('keyA',1,'keyB',2);

第 2 章 Replication 相关增强

2-1 支持多源复制

2-2 基于库或是逻辑锁的多线程复制

MySQL 5.7 之前

从 MySQL 5.6 开始支持多线程复制,只不过是对于每一个库一个复制线程。

MySQL 5.7 之后

MySQL 5.7 后对多线程复制功能进行了加强,增加了 slave_paraller_type 参数可以控制并发同步是基于 database 还是 logical_clock

2-3 在线变更复制方式

MySQL 5.7 之前

要把基于日志点的复制方式变为基于 gtid 的复制方式或是把基于 gtid 的复制方式变成基于日志点的复制方式必须要重启 master 的服务器

MySQL 5.7 之后

允许在线变列复制的方式,而不用重启 master 服务器

第 3 章 InnoDB 引擎增强

3-1 支持缓冲池大小在线变更

MySQL 5.7 之前

要变更 innodb_buffer_pool 大小必须更改 my.cnf 文件后重启数据库服务器

MySQL 5.7 之后

innodb_buffer_pool_size 参数变为动态参数,可以在线调整 innodb 缓存池的大小

3-2 增加 innodb_buffer_pool 导入导出功能

MySQL 5.7 之后,新增以下参数控制 innodb_buffer_pool 的导入导出

1
2
3
4
5
innodb_buffer_pool_dump_pct
innodb_buffer_pool_dump_now
innodb_buffer_pool_dump_at_shutdown
innodb_buffer_pool_load_at_startup
innodb_buffer_pool_load_now

3-3 支持为 innodb 表建立表空间

MySQL 5.7 之前

具有系统表空间及可以为每个表建立一个独立的表空间

MySQL 5.7 之后

支持 CREATE TABLESPACE 语法为一个表或多个表建立共用的表空间

第 4 章 安全及管理方面增强

4-1 不再支持old_password认证

4-2 增加账号默认过期时间

show variables like 'default_password_lifetime';

4-3 加强了对账号的管理功能

4-4 增加了 sys 管理数据库

与 MySQL 的零距离接触(二)

目录

第 6 章 运算符和函数

  • 6-1 回顾和概述

    • 运算符
    • 函数
      • 字符函数
      • 数值运算符和函数
      • 比较运算符和函数
      • 日期时间函数
      • 信息函数
      • 聚合函数
      • 加密函数
  • 6-2 字符函数

    • CONCAT() - 字符连接
    • CONCAT_WS() - 使用指定的分隔符进行字符连接
    • FORMAT() - 数字格式化
    • LOWER() - 转换成小写字母
    • UPPER() - 转换成大写字母
    • LEFT() - 获取左侧字符
    • RIGHT() - 获取右侧字符
    • LENGTH() - 获取字符串长度
    • LTRIM() - 删除前导空格
    • RTRIM() - 删除后续空壳
    • TRIM() - 删除前导和后续空格
    • SUBSTRING() - 字符串截取
    • [NOT] LIKE - 模式匹配
      • %(百分号):代表任意个字符
      • _(下划线):代表任意一个字符
    • REPLACE() - 字符串替换
  • 6-3 数值运算符和函数

    • CEIL() - 进一取整
    • DIV - 整数除法
    • FLOOR() - 舍一取整
    • MOD - 取余数
    • POWER() - 幂运算
    • ROUND() - 四舍五入
    • TRUNCATE() - 数字截取
  • 6-4 比较运算符和函数

    • [NOT] BETWEEN…AND… - [不]在范围之内
    • [NOT] IN() - [不]在列出值范围内
    • IS [NOT] NULL - [不]为空
  • 6-5 日期时间函数

    • NOW() - 当前日期和时间
    • CURDATE() - 当前日期
    • CURTIME() - 当前时间
    • DATE_ADD() - 日期变化
    • DATEDIFF() - 日期差值
    • DATE_FORMAT() - 日期格式化
  • 6-6 信息函数

    • CONNECTION_ID() - 连接 ID
    • DATEBASE() - 当前数据库
    • LAST_INSERT_ID() - 最后插入记录的 ID
    • VERSION() - 最后插入记录的 ID 号
    • USER() - 当前用户
  • 6-7 聚合函数

    • AVG() - 平均值
    • COUNT() - 计数
    • MAX() - 最大值
    • MIN() - 最小值
    • SUM() - 求和
  • 6-8 加密函数

    • MD5() - 信息摘要算法
    • PASSWORD() - 密码

第 7 章 自定义函数

  • 7-1 自定义函数简介

    • 自定义函数:用户自定义函数(user-defined function,UDF)是一种对 MySQL 扩展的途径,其用法与内置函数相同。
    • 自定义函数的两个必要条件:
      • 参数
      • 返回值
      • 函数可以接受任意类型的参数,也可以返回任意类型的值
      • 函数的参数与返回值没有任何必然、内在的联系
    • 创建自定义函数
      • CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body
      • routine_body - 函数体
        • 函数体由合法的 SQL 语句构成
        • 函数体可以是简单的 SELECT 或 INSERT 语句
        • 函数体如果为复合结构则使用 BEGIN…END 语句
        • 复合结构可以包含声明,循环,控制结构
  • 7-2 创建不带参数的自定义函数

    • create function f1() returns varchar(30) return date_format(now(),'%Y年%m月%d %H:%i:%s');
    • 执行 SELECT f1();,输出 2016年09月09 17:30:08
  • 7-3 创建带有参数的自定义函数

    • create function f2(num1 smallint unsigned,num2 smallint unsigned) returns float(10,2) unsigned return (num1+num2)/2;
    • 执行 SELECT f2(10,30);,输出 20.00
  • 7-4 创建具有复合结构函数体的自定义函数

    • 重定义 SQL 语句结束分隔符 - DELIMITER string
    • create function adduser(username varchar(20)) returns int unsigned begin insert test(username) values(username); return last_insert_id(); end //

第 8 章 MySQL 存储过程

  • 8-1 存储过程简介

    • SQL 命令执行过程
      • SQL 命令 > MySQL 引擎 > 分析语法 > 可识别命令 > 执行 > 返回执行结果
        • 存储过程的简介
      • 存储过程是 SQL 语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理,就是保存一条或多条 MySQL 语句的集合。
      • 存储过程是业务逻辑和流程控制的集合,可以在执行过程中创建表,更新数据,删除数据等等。
        • 存储过程的有点
      • 增强 SQL 语句的功能和灵活性
      • 实现较快的执行速度
      • 减少网络流量
  • 8-2 存储过程语法结构解析

    • 创建存储过程的语法结构
      • CREATE
      • [DEFINER = {user | CURRENT_USER}]
      • PROCEDURE sp_name([proc_parameter[,...]])
      • [characteristic ...] routine_body
      • proc_parameter:
      • [IN | OUT | INOUT] param_name type
    • 创建存储过程的参数含义
      • IN,表示该参数的值必须在调用存储过程时指定
      • OUT,表示该参数的值可以被存储过程改变,并且可以返回
      • INOUT,表示该参数在调用时指定,并且可以被改变和返回
    • 创建存储过程的过程体
      • 过程体由合法的 SQL 语句构成
      • 过程体可以是任意 SQL 语句
      • 过程体如果为复合结构则使用 BEGIN…END 语句
      • 复合结构可以包含声明,循环,控制结构
  • 8-3 创建不带参数的存储过程

    • SQL 语句 - CREATE PROCEDURE sp1() SELECT VERSION();
    • 调用 - CALL sp1();CALL sp1
  • 8-4 创建带有IN类型参数的存储过程

    • SQL 语句 - CREATE PROCEDURE removeUserById(IN user_id INT UNSIGNED) BEGIN DELETE FROM users WHERE id = user_id; END //
    • 调用 - CALL removeUserById(22);
  • 8-5 创建带有IN和OUT类型参数的存储过程

    • SQL 语句 - CREATE PROCEDURE removeUserAndReturnUserNums(IN user_id INT UNSIGNED,OUT user_nums INT UNSIGNED) BEGIN DELETE FROM users WHERE id = user_id; SELECT cout(id) FROM users INTO user_nums; END //
    • 调用 - CALL removeUserAndReturnUserNums(27,@user_nums); SELECT @user_nums
    • @name 声明用户变量,只能是当前用户使用
  • 8-6 创建带有多个OUT类型参数的存储过程

    • SQL 语句 - CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN user_age SMALLINT UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED,OUT user_counts SMALLINT UNSIGNED) BEGIN DELETE FROM users WHERE age = user_age; SELECT ROW_COUNT() INTO deleteUsers; SELECT COUNT(id) FROM users INTO user_counts; END //
    • 调用 - CALL removeUserByAgeAndReturnInfos(20,@a,@b)
  • 8-7 存储过程与自定义函数的区别

    • 存储过程实现的功能要复杂一些;而函数的针对性更强
    • 存储过程可以返回多个值;函数只能有一个返回值
    • 存储过程一般都是独立执行;而函数可以作为其他 SQL 语句的组成部分来出现。

第 9 章 MySQL 存储引擎

  • 9-1 存储引擎简介

    • 简介:MySQL 可以将数据以不同的技术存储在文件(内存)中,这种技术就成为存储引擎。每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。
    • 类型:
      • MyISAM
      • InnoDB
      • Memory
      • CSV
      • Archive
  • 9-2 相关知识点之并发处理

    • 并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性
      • 概念:当多个查询同一时刻进行数据查询或修改时,就会产生并发控制的问题。
      • 共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生任何变化。
      • 排它锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。
    • 锁颗粒
      • 表锁,是一种开销最小的锁策略,会锁定整张表,MyISAM 使用表锁。
      • 行锁,是一种开销最大的锁策略,最大程度地支持并发处理,InnoDB 使用行锁。
  • 9-3 相关知识点之事务处理

    • 事务
      • 事务用于保证数据库的完整性
  • 9-4 相关知识点之外键和索引

    • 外键
      • 外键是保证数据一致性的策略
    • 索引
      • 是对数据表中一列或多列的值进行排序的一种结构。
  • 9-5 各个存储引擎特点

特性/引擎 MyISAM Aria InnoDB XtraDB Memory Archive
数据存储 传统顺序数据储存 传统顺序数据储存 表空间存储方式 表空间存储方式
事务支持 不支持 支持 支持 支持 不支持 不支持
外键 不支持 不支持 支持 支持 不支持 不支持
全文检索 支持 支持 5.6 之后支持 5.6 之后支持
锁级别 表级锁 表级锁 行级锁 行级锁 表级锁 行级锁
Count 速度
适合业务 读多写少、单表数据量小于 1 KW 读多写少、单表数据量小于 1 KW 读写均衡、数据量不限 读写均衡、数据量不限
可用版本 MySQL、MariaDB、Percona MariaDB MySQL、MariaDB、Percona MariaDB、Percona
其他说明 传统顺序索引数据库,适合读多写少小数据量业务 MyISAM 增强版,性能更好 适合高压力高性能的业务模型 InnoDB 增强版
  • 9-6 设置存储引擎

    • 修改搜索引擎的方法,主要有两种:
      • 通过修改 MySQL 配置文件实现:default-storage-engine = engine
      • 通过创建数据表命令实现
        • CREATE TABLE table_name(...,...) ENGINE = engine;
      • 通过修改数据表命令实现
        • ALTER TABLE table_name ENGINE [=] engine_name;

第 10 章 MySQL 图形化管理工具

第 11 章 MySQL 索引

  • 11-1 索引简介

    • 索引(Index)是帮助 MySQL 高效获取数据的数据结构
  • 11-2 索引类型

    • 普通索引:最基本的索引,没有任何约束限制
    • 唯一索引:类似普通索引,但具有唯一性约束
    • 主键索引:特殊唯一索引,不允许列存在空值
    • 复合索引:将多个列组合在一起创建索引,可以覆盖多个列
    • 全文索引:只有 MyISAM 类型的表才能使用全文索引,并且只能对英文进行全文检索。
    • 外键索引:只有 InnoDB 类型的表才能使用外键索引,保证数据的一致性、完整性和实现级联操作。
    • 区别
      • 一张表只能有一个主键索引,可以有多个唯一索引。
      • 主键索引一定是唯一索引,唯一索引不是主键索引。
      • 主键可以与外键构成参照完整性约束,防止数据不一致。
  • 11-3 索引作用

    • 大大减少服务器需要扫描的数据量
    • 帮助服务器避免排序和临时表
    • 将随机 I/O 变顺序 I/O
    • 大大提高查询速度,降低写的速度,占用硬件存储空间
  • 11-4 索引场景

    • 对于非常小的数据表,大部分情况下全表扫描效率更高
    • 对于中大型的数据表,使用索引非常有效
    • 对于特大型的数据表,建立和使用索引的代价将随之增长,可以使用分区技术来解决
  • 11-5 索引创建原则

    • 最适合索引的列是出现在 WHERE 子句中的列,或是 JION 子句中的列,而不是出现在 SELECT 关键字后的列。
    • 索引列的基数越大,索引的效果越好。
    • 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。
    • 根据情况创建复合索引,复合索引可以提高查询效率。
    • 避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率。
    • 主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用,提高索引效率。
  • 11-6 索引注意事项

    • 复合索引遵循最左前缀原则。
      • 创建复合索引 KEY(a, b, c)
        • 索引生效的条件查询如下:
          • WHERE a = 1 and b = 2 and c = 3
          • WHERE a = 1 and b = 2
          • WHERE a = 1
        • 索引无效的条件查询如下:
          • WHERE b = 2 and c = 3
          • WHERE a = 1 and c = 3
    • LIKE 查询时,% 不能在前,否则 MySQL 会使用全文索引。
      • WHERE name LIKE "%wange%",name 索引无效。
      • WHERE name lIKE "wang%",name 索引生效。
    • column is null 会使用索引
    • 如果 MySQL 估计使用索引比全表扫描更慢,会放弃使用索引。
      • WHERE id > 2 and id < 100
    • 如果 OR 前的条件中的列有索引,OR 后的条件中的列没有索引,索引都不会生效。
    • 列类型是字符串型,查询时一定要给值加引号,否则索引失效。

与 MySQL 的零距离接触(一)

目录

第 1 章 初涉 MySQL

  • MySQL 概述

    • MySQL 是由瑞典 MySQL AB 公司开发的,目前被 Oracle 公司收购了
    • MySQL 是一款开源的关系型数据库管理系统
    • MySQL 分为社区版和企业版
  • MySQL 的安装与配置

    • Mac OS 使用 HomeBrew 安装:brew install mysql
    • MySQL 目录结构:
      • bin - 存储可执行文件
      • lib - 存储库文件
      • share - 存储错误消息和字符集文件
      • scripts - 存储脚本文件
      • include - 存储包含的头文件
      • mysql-test
      • support-files
  • 启动与停止 MySQL 服务

    • 启动 MySQL 服务:launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"
    • 停止 MySQL 服务:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist"
  • <a id=”1.4>登录与退出

    • 登录
      • mysql 命令
        • -D, –database=[name] : 指定数据库
        • -P, –port=[number] : 指定端口号
        • -u, –user=[name] : 指定登录用户
        • -h, –host=[name] : 指定服务器
        • -p, –password : 密码
        • -V, –version :查看版本
        • –delimiter=[name] : 指定分隔符
        • –prompt=[name] : 设置提示符
      • mysql 命令例子
        • mysql -uroot -p
        • mysql --version
        • mysql -uroot -P6606 -p
    • 退出
      • mysql CLI 环境中输入
        • exit;
        • quit:
        • \q;
  • 修改 MySQL 提示符

    • 连接客户端时通过参数指定:shell>mysql -uroot -proot --prompt 提示符
    • 连接上客户端后,通过设置 prompt 提示符指定:prompt 提示符
    • prompt 提示符参数:
      • \D 完整的日期
      • \d 当前数据库
      • \h 服务器名称
      • \u 当前用户
    • prompt 提示符参数用法:prompt \h-\u-\p-\D
  • MySQL 常用命令以及语法规范

    • 常用命令:
      • 查看数据库版本 - SELECT VERSION();
      • 查看数据库当前时间 - SELECT NEW();
      • 查看数据库当前用户 - SELECT USER();
      • 查看数据库列表 - SHOW DATABASES;
      • 查看警告日志 - SHOW WARINGS;
    • 语法规范:
      • 关键字与函数名称全部大写
      • 数据库名称、表名称、字段名称全部小写
      • SQL 语句必须以分号结尾
  • 操作数据库

    • 创建数据库 - CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

    • 修改数据库 - ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name;

    • 删除数据库 - DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

第 2 章 数据类型与操作数据表

  • 数据类型之整型

    • 数据类型的概念:数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。
    • 整数类型的长度:为整数类型指定长度,例如:INT(11) 对大多数应用是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,声明 zerofill 后,会自动在数值填充 0 以达到指定长度。
    • 整型类型:
      • TINYINT
        • 有符号值:-128 ~ 127 (- 2)
        • 无符号值:0 ~ 255
        • 字节:1
      • SMALLINT
        • 有符号值:-32768 ~ 32767
        • 无符号值:0 ~ 65535
        • 字节:2
      • MEDIUMINT
        • 有符号值:-8388608 ~ 8388607
        • 无符号值:0 ~ 16777215
        • 字节:3
      • INT
        • 有符号值:-2147483648 ~ 2147483647
        • 无符号值:0 ~ 4294967295
        • 字节:4
      • BIGINT
        • 有符号值:-9223372036854775808 ~ 9223372036854775807
        • 无符号值:0 ~ 18446744073709551615
        • 字节:8
  • 数据类型之浮点型

    • FLOAT [(M,D)]:M 是数字总位数,D 是小数点后面的位数。如果 M 和 D 被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约 7 位小数位。
    • DOUBLE [(M,D)]
    • DECIMAL [(M,D)]:可存储比 BIGINT 更大的整数,也可以用于存储精确的小数。
  • 数据类型之日期时间型

    • YEAR
    • TIME
    • DATE
    • DATETIME
    • TIMESTAMP
    • 日期时间型注意项
      • 尽量使用 TIMESTAMP,比 DATETIME 空间效率高
      • 用整数保存时间戳的格式通常不方便处理
      • 如果需要存储微秒,可以使用 BIGINT 存储
  • 数据类型之字符型

    • CHAR:M 个字节,0 <= M <= 255
      • 用于储存定长字符串,根据定义的字符串长度分配足够的空间。
      • 根据需要采用空格进行填充以方便比较。
      • 适合存储很短的字符串,或者所有值都接近同一个长度。
      • 如果存储内容超出指定长度,会被截断。
    • VARCHAR:L + 1 个字节,其中 L <= M 且 0 <= M <= 65535
      • 用于储存可变长字符串
      • 使用 1 或 2 个额外字节记录字符串的长度,列长度小于 255 字节,使用 1 个字节表示,否则用 2 个字节表示。
      • 如果存储内容超出指定长度,会被截断。
    • TINYTEXT:L + 1 个字节,其中 L < 2^8
    • TEXT:L + 2 个字节,其中 L < 2^16
    • MEDIUMTEXT:L + 3 个字节,其中 L < 2^24
    • LONGTEXT:L + 4 个字节,其中 L < 2^32
    • ENUM(‘value1’,’value2’,…):1 或 2 个字节,取决于枚举值的个数(最多 65535 个值)
    • SET(‘value1’,’value2’,…):1、2、3、4 或者 8 个字节,取决于 set 成员的数目(最多64个)
    • 字符型注意项
      • 对于经常变更的数据,CHAR 比 VARCHAR 更好,CHAR 不容易产生碎片。
      • 对于非常短的列,CHAR 比 VARCHAR 在存储空间上更有效率。
      • 只分配真正需要的空间,更长的列会消耗更多的内存。
      • 尽量避免使用 BLOB/TEXT 类型,查询会使用临时表,导致严重的性能开销。
  • 创建数据表

    • 数据表概念:数据表是数据库最重要的组成部分一直,是其他对象的基础。
    • 选择数据库 - use {database}
    • 创建数据表 - CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,....)
  • 查看数据表

    • SHOW TABLES [FROM db_name] [LIKE 'pattern'|WHERE expr]
  • 查看数据表结构

    • SHOW COLUMNS FROM tbl_name
  • 记录的插入与查找

    • 插入:INSERT [INTO] tal_name[(col_name)VALUES(val,..)]
    • 插入省略字段需要为所有字段都要赋值,否则数据库报错
    • 查找:SELECT expr,... FROM tbl_name
  • 空值与非空

    • NULL,字段值可以为空
    • NOT NULL,字段值禁止为空
  • 自动编号

    • AUTO_INCREMENT,自动编号,且必须与主键组合使用
    • 默认情况下,起始值为 1,每次的增量为 1
  • 初涉主键约束

    • PRIMARY KEY
      • 主键约束
      • 主键自动为 NOT NULL
      • 主键保证记录的唯一性
      • 每张数据表只能存在一个主键
      • AUTO_INCREMENT 必须和 PRIMARY KEY 一起使用,PRIMARY KEY 不必须和 AUTO_INCREMENT 一起使用
  • 初涉唯一约束

    • UNIQUE KEY
      • 唯一约束
      • 唯约束可以保证记录的唯一性
      • 唯一约束的字段可以为空值(NULL)
      • 每张数据表可以存在多个唯一索引
  • 初涉默认约束

    • DEFAULT
      • 默认值
      • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值

第 3 章 约束以及修改数据表

  • 外键约束的要求解析

    • 约束
      • 约束保证数据的完整性和一致性
      • 约束分为表级约束和列级约束
      • 约束类型:
        • DEFAULT(默认约束)
        • NOT NULL(非空约束)
        • UNIQUE KEY(唯一约束)
        • PRIMARY KEY(主键约束)
        • FOREIGN KEY(外键约束)
      • FOREIGN KEY - 外键约束
        • 保持数据一致性,完整性
        • 实现一对一或一对多关系
      • 使用外键约束的要求
        • 父表和子表必须使用相同的存储引擎,而且禁止使用临时表
        • 数据表的存储引擎只能为 InnoDB
        • 外键列和参照列必须具有相似的数据类型。其中数字的长度或是是否有符号位必须相同;而字符的长度则可以不同
        • 外键列和参照列必须创建索引,如果参照列不存在索引的话,MySQL 将自动创建索引
      • 编辑数据表的默认存储引擎:default-storage-engine=INNODB
  • 外键约束的参照操作

    • CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行
    • SET NULL:从父表删除或更新行,并设置子表中的外键列为 NULL。如果使用该选项,必须保证子表列没有指定 NOT NULL
    • RESTRICT:拒绝对父表的删除或更新操作
    • NO ACTION:标准 SQL 的关键字,在 MySQL 中与 RESTRICE 相同
  • 表级约束与列级约束

    • 对一个数据列建立的约束,称为列级约束
    • 对多个数据列建立的约束,称为表级约束
    • 列级约束既可以在列定义时声明,也可以在列定义后声明
    • 表级约束只能在列定义后声明
  • 修改数据表-添加/删除列

    • 添加单列:ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
    • 添加多列:ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,...)
    • 删除单列:ALTER TABLE tbl_name DROP [COLUMN] col_name
  • 修改数据表–添加约束

    • 添加主键约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,...)
    • 添加唯一约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY][index_name][index_type](index_col_name,...)
    • 添加外键约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name](index_col_name,...) reference_definition
    • 添加/删除默认约束:ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  • 修改数据表–删除约束

    • 删除主键约束:ALTER TABLE tbl_name DROP PRIMARY KEY
    • 删除唯一约束:ALTER TABLE tbl_name DROP {INDEX | KEY} index_name
    • 删除外键约束:ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
  • 修改数据表–修改列定义和更名数据表

    • 修改表名称
      • ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
      • RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 To ewn_tbl_name2,...]
    • 修改列定义:ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
    • 修改列名称:ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
  • 小结

    • 约束
      • 功能
        • NOT NULL(非空约束)
        • PRIMARY KEY(主键约束)
        • UNIQUE KEY(唯一约束)
        • DEFAULT(默认约束)
        • FOREIGN KEY(外键约束)
      • 数据列的数目
        • 表级约束
        • 列级约束
    • 修改数据表
      • 针对字段的操作:添加 / 删除字段、修改列定义,修改列名称等
      • 针对约束的操作:添加 / 删除各种约束
      • 针对数据表的操作:数据表更名(两种方式)

第 4 章 操作数据表中的记录

  • 插入记录 INSERT

    • INSERT
      • INSERT [INFO] tbl_name [(col_name,...)] {VALUES | VALUE}({expr|DEFAULT},...),(...)
  • 插入记录 INSERT SET-SELECT

    • INSERT SET 与 INSERT 的区别在于,此方法可以使用子查询(SubQuery)
      • INSERT [INTO] tbl_name SET col_name={expr | DEFAULT},...
    • INSERT SELECT 与 INSERT 的区别在于,此方法可以将查询结果插入到指定数据表
      • INSERT [INTO] tbl_name [(col_name,...)] SELECT ...
  • 单表更新记录 UPDATE

    • UPDATE
      • UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr | DEFAULT}[,col_name2={expr2|DEFAULT}]...[WHERE where_condition]
  • 单表删除记录 DELETE

    • DELETE
      • DELETE FROM tbl_name [WHERE where_condition]
  • 查询表达式解析

    • SELECT
      • SELECT select_expr[,select_expr ...]
      • [
        • FROM table_references
        • [WHERE where_condition]
        • [GROUP BY {col_name | position} [ASC | DESC], ...]
        • [HAVING where_condition]
        • [ORDER BY {col_name | expr | position} [ASC | DESC],...]
        • [LIMIT {[offset,] row_count | row_count OFFSET offset}]
      • ]
    • select_expr - 查询表达式
      • 每一个表达式表示想要的一列,必须有至少一个。
      • 多个列之间以英文逗号分隔
      • 星号()表示所有列。tbl_name. 可以表示命名表的所有列
      • 查询表达式可以使用 [ AS ] alias_name 为其赋予别名
      • 别名可用于 GROUP BYORDER BYHAVING 子句
  • WHERE 语句进行条件查询

    • WHERE - 条件表达式
      • 对记录进行过滤,如果没有指定 WHERE 子句,则显示所有记录
      • WHERE 表达式中,可以使用 MySQL 支持的函数或者运算符
  • GROUP BY 语句对查询结果分组

    • [GROUP BY {col_name | position} [ASC | DESC], ...]
  • HAVING 语句设置分组条件

    • [HAVING where_condition]
    • 请使用聚合函数或 select_column,否则报错
  • ORDER BY 语句对查询结果排序

    • [ORDER BY {col_name | expr | position} [ASC | DESC],...]
  • LIMIT 语句限制查询数量

    • [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    • 想要获取第三、第四条记录,写法是 LIMIT 2 OFFSET 2

第 5 章 子查询与连接

  • 子查询简介

    • 简介
      • 子查询(Subquery)是指出现在其他 SQL 语句内的 SELECT 子句
      • 子查询指嵌套在查询内部,且必须始终出现在圆括号内
      • 子查询可以包含多个关键字或条件,如 DISTINCT、GROUP BY、ORDER BY、LIMIT、函数等
      • 子查询的外层查询可以:SELECT、INSERT、UPDATE、SET、DO 等
      • 子查询可以返回标量、一行、一列或子查询
    • 例子
      • SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2);
        • 其中 SELECT * FROM t1,称为 Outer Query / Outer Statement
        • SELECT col2 FROM t2,称为 SubQuery
  • 由比较运算符引发的子查询

    • 使用比较运算符的子查询:=,>,<,>=,<=,<>,!=,<=>
    • 语法结构:operand comparison_operator subquery
    • 比较运算符
      • operand comparison_operator ANY(subquery)
        • >、>= 最小值
        • <、<= 最大值
        • = 任意值
        • <>、!=
      • operand comparison_operator ALL(subquery)
        • >、>= 最大值
        • <、<= 最小值
        • =
        • <>、!= 任意值
      • operand comparison_operator SOME(subquery)
        • >、>= 最小值
        • <、<= 最大值
        • = 任意值
        • <>、!=
  • 由 [NOT] IN/EXISTS 引发的子查询

    • 语法结构:operand comparison_operator [NOT] IN (subquery)
      • =ANY 运算符与 IN 等效
      • !=ALL 或 <>ALL 运算符与 NOT IN 等效
    • 语法结构:operand comparison_operator [NOT] EXISTS
      • 如果子查询返回任何行,EXISTE 将返回 TRUE,否则为 FALSE
  • 使用 INSERT…SELECT 插入记录

    • INSERT..SELECT
      • 将查询结果写入数据表:INSERT [INTO] tbl_name [(col_name)] SELECT...
    • UPDATE table_references
    • SET col_name1={expr1|DEFAULT}
    • [,col_name2={expr2|DEFAULT}]
    • [WHERE where_condition]
  • 多表更新之一步到位

    • CREATE…SELECT
      • 创建数据表同时将查询结果写入到数据表:CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] select_statement
  • 连接的语法结构

    • 连接
      • MySQL 在 SELECT 语句、多表更新、多表删除语句中支持 JOIN 操作
      • 语法结构
        • table_reference - 数据表参照
          • tbl_name [[AS] alias] | table_subquery [AS] alias
            • 数据表可以使用 tbl_name As alias_name 或 tbl_name alias_name 赋予别名
            • table_subquery 可以作为子查询使用在 FROM 子句中,这样的子查询必须为其赋予别名
        • {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}
        • table_reference
        • ON conditional_expr
  • 连接类型

    INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
    • 内连接
      • INNER JOIN
    • 外连接
      • LEFT JOIN
      • RIGHT JOIN
    • 交叉连接
      • CROSS JOIN
    • 全连接
      • FULL JOIN
    • 联合查询
      • UNION
      • UNION ALL
  • 关于连接的几点说明

    • 外连接
      • SELECT * FROM A LEFT JOIN B [WHERE where_condition]
        • 数据表 B 的结果集依赖数据表 A
        • 数据表 A 的结果集根据左连接条件依赖所有数据表
        • 左外连接条件决定如何检索数据表 B
        • 如果数据表 A 的某条记录符合 WHERE 条件,但是在数据表 B 不存在符合连接条件的记录,将生成一个所有列为空的额外的行
    • 交叉连接
      • SELECT * FROM A,B,(,C)或者SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
        • 没有任何关联条件,结果是笛卡尔积,结果集会较大,适用场景较少。
    • 内连接
      • SELECT * FROM A,B WHERE A.id = B.id或者SELECT * FROM A INNER JOIN B ON A.id = B.id
        • 数据表 A 结果集和 数据表 B 结果集的交集。
      • 内连接类型
        • 不等值连接:ON A.id = B.id
        • 等值连接:ON A.id > B.id
        • 自连接:SELECT * FROM A T1 INNER JOIN A T2 ON T1.id = T2.pid
    • 联合查询
      • SELECT * FROM A UNION SELECT * FROM B UNION ...
      • 把多个结果集结合在一起,UNION 前的结果为基准,需要注意的是联合查询的列数要相等。
      • UNINO 会合并相同的记录行。
      • UNION ALL 不会合并重复的记录行。
    • 全连接
      • MySQL 不支持全连接
      • 可以使用 LEFT JOIN 和 UNION 和 RIGHT JOIN 联合使用 SELECT * FROM A LEFT JOIN B ON A.id = B.id UNION SELECT * FROM A RIGHT JOIN B ON A.id = B.id
  • 多表删除

    • DELETE tbl_name[.*] [,tbl_name[.*]] ... FROM table_references [WHERE where_condition]

复习使用 MySQL(三)

环境

  • MySQL 5.7.13

MySQL 优化:硬件

  • CPU:使用多核 CPU,能够充分发挥新版 MySQL 多核下的效果,建议 4 核以上
  • 内存:如果数据量比较大,建议使用不要低于 20 G 内存的服务器
  • 硬盘:SSD 硬盘,提高 TPS,选择适合的 RAID 方案
  • 网卡:保证足够的吞吐量,建议千兆网卡

MySQL 优化:软件

  • OS 类型
    • Linux
    • FreeBSD
  • Linux 关键配置
    • 文件打开描述符:/etc/security/limits.conf 中 nofile、/proc/sys/fs/nr_open
    • 可分配文件句柄数:/etc/sysctl.conf 中 fs.file-max、/proc/sys/fs/file-max
    • 进程数:/etc/security/limits.conf 中的 nproc
    • 线程数:/proc/sys/kernel/thread-max
    • 其他 TCP 和网络相关选项:/etc/sysctl.conf
    • 这些都可以通过ulimit 或 直接调整 /proc 中变量进行临时修改
    • 建议关闭 SWAP 分区(内存要足够大才行);如果数据太大,为了防止夯死主机,可以设置 2G 左右的 SWAP 分区

MySQL 优化:基础配置

基础配置 & MyISAM 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
max_connections=3000
max_user_connections=2800
max_connect_errors=10
max_allowed_packet=64M
max_heap_table_size=512M
tmp_table_size=512M
max_length_for_sort_data=16k
wait_timeout=172800
interactive_timeout=172800
net_buffer_length=8K
read_buffer_size=4M
read_rnd_buffer_size=1M
sort_buffer_size=256K
join_buffer_size=2M
table_open_cache=512
thread_cache_size=512
query_cache_type=1
query_cache_size=256M

InnoDB 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
innodb_file_per_table=1
innodb_open_files=7168
innodb_use_sys_malloc=1
innodb_additional_mem_pool_size=64M
innodb_buffer_pool_instances=4
innodb_buffer_pool_size=20G
innodb_data_home_dir=/home/work/data
innodb_data_file_path=ibdata1:1024M:autoextend
innodb_autoextend_increment=128
innodb_thread_concurrency=0
innodb_flush_log_at_trx_commit=1
innodb_fast_shutdown=1
innodb_force_recovery=0
innodb_log_buffer_size=16M
innodb_log_file_size=128M
innodb_log_files_in_group=4
innodb_log_group_home_dir=/home/work/data
innodb_max_dirty_pages_pct=60
innodb_purge_threads=0
innodb_lock_wait_timeout=50
innodb_rollback_on_timeout=1
innodb_commit_concurrency=0
innodb_concurrency_tickets=1024
innodb_autoinc_lock_mode=2
innodb_change_buffering=all

MySQL 优化:表设计原则

  • 互联网业务的特点:数据量大、读写操作多、业务模式相对简单
  • 单表字段不宜过多,尽量不按照第三范式去设计表结构,
  • 尽量减少表关联,适当的冗余保证不联表查询
  • 表名和字段尽量采用小写字母+下划线的命名规则,尽量使用英文,例如:user_score
  • 每个表一定要有主键,一般建议自增ID;单表索引不宜过多,一般5~6个索引
  • 字段尽量使用高效类型,比如数字或时间,IP地址、手机号等都可以使用数字类型存储,非不得已采用字符

MySQL 优化:查询语句

  • 不要写太复杂的SQL语句,尽量简单,能够让业务去做的,就不要让数据库区操作
  • 尽量避免:子查询、group by、distinct 等操作(子查询可以用left join替代)
  • where、order by 等关键字段一定要建立索引,where里多个条件经常使用的可以建立联合索引(注意建立索引的数据必须是尽量分布多并且具备单调性,重复率低)
  • 把数据当做神一样来供着,能够缓存的尽量缓存(redis、memcached等),能够多次查询的就不要关联查询
  • 所有的变更操作(update、delete)必须有where条件!
  • 不适合使用MySQL服务的数据功能操作,尽量采用别的第三方服务支持,比如全文检索功能

MySQL 优化:SQL 优化实例

  • Like 优化
  • Limit 优化
  • InnoDB 中 count 优化
  • 定期使用 Explain 查看执行计划

PHP 与 MySQL 交互

  • 扩展层
  • 代码层

    • 为防止mysql太慢夯住PHP,建议设置SQL超时,或者设置execute_time等超时设置
    • $mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
    • $mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
    • 务必在代码里记录相关SQL语句执行性能和时间等信息,方便后续优化
  • 超时设置

    • PHP代码连接后端的超时设置
    • php.ini中execute_time设置
    • php-fpm中request_terminate_timeout,request_slowlog_timeout
    • nginx upstream相关超时设置

PHP 与 MySQL 安全

  • SQL 注入
  • MySQL 服务端
  • 备份机制

复习使用 MySQL(二)

环境

  • MySQL 5.7.13

MySQL 主要存储引擎

特性/引擎 MyISAM Aria InnoDB XtraDB Memory Archive
数据存储 传统顺序数据储存 传统顺序数据储存 表空间存储方式 表空间存储方式
事务支持 不支持 支持 支持 支持 不支持 不支持
外键 不支持 不支持 支持 支持 不支持 不支持
全文检索 支持 支持 5.6 之后支持 5.6 之后支持
锁级别 表级锁 表级锁 行级锁 行级锁 表级锁 行级锁
Count 速度
适合业务 读多写少、单表数据量小于 1 KW 读多写少、单表数据量小于 1 KW 读写均衡、数据量不限 读写均衡、数据量不限
可用版本 MySQL、MariaDB、Percona MariaDB MySQL、MariaDB、Percona MariaDB、Percona
其他说明 传统顺序索引数据库,适合读多写少小数据量业务 MyISAM 增强版,性能更好 适合高压力高性能的业务模型 InnoDB 增强版

MySQL 索引定义

MySQL 的索引(Index)是帮助 MySQL 高效获取数据的数据结构

MySQL 索引类型

  • Normal
    • 普通索引,对存储的数值没有任何限制
  • Unique
    • 唯一索引,不允许数值重复,但允许空值
  • Primary
    • 主键索引,是一种特殊的唯一索引,不允许存在数值重复或空值
  • Spatial(R-Tree)
    • GIS 相关空间查询使用索引数据结构。
  • Fulltext
    • 主要用于全文检索,目前只有 MyISAM 和 MySQL 5.6 + 的 InnoDB 支持;目前只支持英文。

MySQL 索引方法

  • B+Tree
    • 可用于排序的索引数据结构,可应用于 =,>,< 等各个范围查询,并且可以排序
    • 时间复杂度:O(log2N)
  • Hash
    • 只能用于 =,IN 等操作,无法进行范围操作,Key 冲突严重情况下可能性能比 B-Tree 低下
    • 时间复杂度:O(1)

MyISAM 索引结构:B+ Tree

  • MyISAM 主索引和辅助索引
    • 区别在于:主索引 Key 是唯一;辅助索引 Key 可以重复
  • MyISAM 为非聚簇索引

InnoDB 索引结构:B+ Tree

  • InnoDB 主索引和辅助索引
    • InnoDB 的主索引是聚簇索引,数据和 Key 本身都会存储在 B+Tree 的叶子节点
    • InnoDB 的辅助索引本身主要是记录主索引的 Key,最终查找数据还是从辅助索引再去主索引查找
  • InnoDB 为聚簇索引

存储引擎及版本选择

结论:

  • 使用 InnoDB 于生产环境
  • 使用 MySQL 5.5+ 于生产环境

原因:

  • 更稳定可靠的数据存储和索引结构;整个存储引擎设计思想更可靠先进,接近于Oracle、SQL Server级别的数据库(有兴趣可以去阅读源码了解细节)
  • 更多可靠特性支持,比如事务、外键等支持(支付等关键领域事务非常重要)
  • 运行更稳定,不论读写数据的量级,都能够保证比较稳定的性能响应
  • 更好地崩溃恢复机制,特别利用一些Percona的一些工具,更有效运维InnoDB
  • MySQL 5.5+ 对比 MySQL 5.1.x 总体功能和性能提升太多,改进太多