下载安装包

在官网下载jdk 安装包:

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

解压

1
2
# 解压 并输出到 /usr/local
tar -zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local

配置

编辑 /etc/profile

vim /etc/profile

1
2
3
4
JAVA_HOME=/usr/local/jdk1.8.0_91
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib
export JAVA_HOME PATH CLASSPATH

使配置生效:

source /etc/profile

验证

1
2
3
java
java -version
javac

简介

Linux fdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。

语法

fdisk [必要参数] [选择参数]

必要参数:

1
2
-l 列出素所有分区表
-u 与"-l"搭配使用,显示分区数目

选择参数:

1
2
-s<分区编号> 指定分区
-v 版本信息

菜单操作说明

1
2
3
4
5
6
7
8
9
10
11
m :显示菜单和帮助信息
a :活动分区标记/引导分区
d :删除分区
l :显示分区类型
n :新建分区
p :显示分区信息
q :退出不保存
t :设置分区号
v :进行分区检查
w :保存修改
x :扩展应用,高级功能

参考:

Linux fdisk命令

fdisk命令

简介

LVM 是逻辑盘卷管理( Logical Volume Manager)的简称,它是 Linux 环境下对磁盘分区进行管理的一种机制,LVM 是建立在硬盘和 分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

通过 LVM 系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组 (volume group),形成一个存储池。

管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系 统。管理员通过 LVM 可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。

例如按照使用用途进行定义:developmentsales,而不是使用物理磁盘名 sdasdb。而且当系统添加了新的磁盘,通过 LVM 管理员就不必将磁盘的 文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。

58846-20160825131201304-610664422.jpg

LVM 相关名词

  • PV(physical volume):物理卷 在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区。
  • VG(volume group):卷组 建立在物理卷上,一卷组中至少要包括一物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。
  • LV(logical volume):逻辑卷 建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。
  • PE(physical extent):物理区域 是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的 pv 加入到 vg 后,pe 的大小自动更改为 vg 中定义的 pe 大小。
  • LE(logical extent):逻辑区域 是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
    卷组描述区域:卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中逻辑卷、逻辑卷中物理区域的分配等所有信息,它是在使用 pvcreate 建立物理卷时建立的。

关于 PV 命令:

pvcreate 命令用于将物理硬盘分区初始化为物理卷,以便 LVM 使用。

1
2
3
4
pvcreate:将物理分区制作成 物理卷 PV
pvscan:搜索当前系统里所有的具有 PV 属性的磁盘
pvdisplay:显示当前系统上的 PV 状态
pvremove:将 PV 属性删除,让其不具有 PV 属性,成为一般的分区

关于 VG 下命令:

1
2
3
4
5
6
7
vgcreate:建立 VG 。它的参数比较多,一会儿详细介绍
vgscan:搜索当前系统里有多少个卷组 VG 存在
vgdisplay:显示当前系统里指定的 VG 或所有 VG 的信息
vgextend:在卷组 VG 中增加额外的物理卷 PV
vgreduce:在卷组 VG 中删除 物理卷 PV
vgchange:设置 VG 是否启动(active)
vgremove:删除一个卷组 VG 本身

创建 LVM 过程

创建 LVM 过程 :

分区成 LVM 格式(8e)—PV 创建–VG 创建—LV 创建—格式化分区—MOUNT 分区—-e2fsadm 调整 LV 大小

在 LVM 发行包中有一个称为 e2fsadm 的工具,它同时包含了 lvextendresize2fs 的功能。

创建分区

使用分区工具(如: fdisk 等)创建 LVM 分区,方法和创建其他一般分区的方式是一样的,区别仅仅是 LVM 的分区类型为 8e。

1
2
3
4
5
6
7
fdisk /dev/vdb

# 选项
# p n w

# 重启(可选)
reboot

创建物理卷

创建物理卷的命令为 pvcreate,利用该命令将希望添加到卷组的所有分区或者磁盘创建为物理卷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 格式化
mkfs.ext4 /dev/vdb

# 将整个磁盘创建为物理卷
pvcreate /dev/vdb

# 或 将单个分区创建为物理卷
pvcreate /dev/vda1

# 或 将6-9分区转成pv
pvcreate /dev/vda{6,7,8,9}

# -v显示创建的全部过程
pvcreate [-v] /dev/vda2 /dev/vdb2

# 显示系统上的 PV 状态
pvdisplay

创建卷组

创建卷组的命令为 vgcreate,将使用 pvcreate 建立的物理卷创建为一个完整的卷组:

1
2
3
# unicomvg:指定该卷组的逻辑名:
# 后面参数指定希望添加到该卷组的所有分区和磁盘
vgcreate unicomvg /dev/vdb

vgcreate 在创建卷组 unicomvg 以外,还设置使用大小为 4MB 的 PE(默认为 4MB),这表示卷组上创建的所有逻辑卷都以 4MB 为增量单位来进行扩充 或缩减。

由于内核原因,PE 大小决定了逻辑卷的最大大小,4MB 的 PE 决定了单个逻辑卷最大容量为 256GB,若希望使用大于 256G 的逻辑卷则创建卷组时指定更大的 PE。

PE 大小范围为 8KB 到 512MB,并且必须总是 2 的倍数(使用-s 指定,具体请参考 manvgcreate )。(centos 6.2 系统已发现没有这种限制)

例如,如果希望使用 64MB 的 PE 创建卷组,这样逻辑卷最大容量就可以为 4TB,命令如下:

1
vgcreate -64MB lvmdisk /dev/vdb1 /dev/vdc1

激活卷组

为了立即使用卷组而不是重新启动系统,可以使用 vgchange 来激活卷组:

1
vgchange -ay unicomvg

添加新的物理卷到卷组中

当系统安装了新的磁盘并创建了新的物理卷,而要将其添加到已有卷组时,就需要使用 vgextend 命令:

1
vgextend unicomvg /dev/vdb1

这里/dev/vdb1是新的物理卷。

从卷组中删除一个物理卷

要从一个卷组中删除一个物理卷,首先要确认要删除的物理卷没有被任何逻辑卷正在使用,就要使用 pvdisplay 命令察看一个该物理卷信息:

如果某个物理卷正在被逻辑卷所使用,就需要将该物理卷的数据备份到其他地方,然后再删除。

删除物理卷的命令为 vgreduce:

1
vgreduce unicomvg /dev/sda1

创建逻辑卷

逻辑卷(Logical Volumes)简称 LV,是在卷组中划分的一个逻辑区域,类似于非 LVM 系统中的硬盘分区。
创建逻辑卷的命令为 lvcreate,通过下面的命令。

该命令就在卷组 unicomvg 上创建名字为 unicomvol ,大小为 15000M(15G)的逻辑卷,并且设备入口为 /dev/unicomvg/unicomvol ( unicomvg 为卷组名,unicomvol 为逻辑卷名)。

创建逻辑卷的命令为 lvcreate:

  • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
  • -l:指定逻辑卷的大小(LE 数)。
1
2
3
4
5
6
7
lvcreate -L 15000 -n unicomvol unicomvg

# 或 指定100%的LE 到逻辑卷
lvcreate -l 100%VG -n unicomvol unicomvg

# 也可以指定大小为 15G
lvcreate -L 15G -n unicomvol unicomvg

如果希望创建一个使用全部卷组的逻辑卷,则需要首先察看该卷组的 PE 数,然后在创建逻辑卷时指定:

1
2
3
4
5
6
vgdisplay unicomvg | grep "TotalPE"

# 显示
Total PE 45230

lvcreate -l 45230 unicomvg -n unicomvol

同卷组一样,逻辑卷在创建的过程中也被分成了一块一块的空间,这些空间称为 LE(Logical Extents),在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。

创建文件系统

创建了文件系统以后,就可以加载并使用它:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建目录
mkdir /data/wwwroot

# 挂载
mount /dev/unicomvg/unicomvol /data/wwwroot

# 如果希望系统启动时自动加载文件系统,
# 则还需要在 /etc/fstab 中添加内容:
/dev/unicomvg/unicomvol /data/wwwroot ext4 defaults 0 0

# 或者使用
echo "/dev/mapper/unicomvg-unicomvol /unicom ext4 defaults 0 0 " >>/etc/fstab

/etc/fstab文件的每一行都遵循以下格式:

1
<device>   <dir>    <type>   <options>       <dump> <pass>
  • device:指定加载的磁盘分区或移动文件系统,除了指定设备文件外,也可以使用 UUID、LABEL来指定分区;
  • dir:指定挂载点的路径;
  • type:指定文件系统的类型,如 ext3ext4等;
  • options:指定挂载的选项,默认为 defaults,其他可用选项包括aclnoautoro等;
  • dump:表示该挂载后的文件系统能否被 dump 备份命令作用;0 表示不能,1 表示每天都进行 dump 备份,2 表示不定期进行 dump 操作。
  • pass:表示开机过程中是否校验扇区;0 表示不要校验,1 表示优先校验(一般为根目录),2 表示为在 1 级别校验完后再进行校验;

删除一个逻辑卷

删除逻辑卷以前首先需要将其卸载,然后删除:

1
2
3
4
5
# 卸载
umount /dev/unicomvg/unicomvol

# 删除
lvremove /dev/unicomvg/unicomvol

扩展逻辑卷大小

LVM 提供了方便调整逻辑卷大小的能力,扩展逻辑卷大小的命令是 lvextend :

1
2
3
4
5
6
7
8
# 将逻辑卷unicomvol的大小扩招为12G
lvextend -L12G /dev/unicomvg/unicomvol

# 将逻辑卷unicomvol的大小增加1G
lvextend -L +1G /dev/unicomvg/unicomvol、

# 将卷组 100% 分配到 逻辑卷unicomvol
lvextend -l 100%VG /dev/mapper/centos-root

调整文件系统大小:

resize2fs 命令是用来增大或者收缩未加载的 ext2/ext3/ext4 文件系统的大小。

参数:

  • -d 打开调试特性
  • -p 打印已完成的百分比进度条
  • -f 强制执行调整大小操作,覆盖掉安全检查操作
  • -F 开始执行调整大小前,刷新文件系统设备的缓冲区
  • -M: 将文件系统缩小到最小值
  • -P: 显示文件系统的最小值
1
2
3
4
5
6
7
8
9
# 建议最好将文件系统卸载,调整大小,然后再加载
# 卸载
umount /dev/unicomvg/unicomvol

# 调整
resize2fs -p /dev/unicomvg/unicomvol

# 挂载
mount /dev/unicomvg/unicomvol /data/wwwroot

减少逻辑卷大小

lvreduce命令用于减少 LVM 逻辑卷占用的空间大小。使用 lvreduce 命令收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。

  • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
  • -l:指定逻辑卷的大小(LE 数)。

需要首先将文件系统卸载:

1
2
3
4
5
6
umount /data/wwwroot

# 减小 2G
lvreduce -L -2G /dev/unicomvg/unicomvol

mount /dev/unicomvg/unicomvol /data/wwwroot

参考:

LVM

Linux-centos 磁盘扩容

LVM 原理及 PV、VG、LV、PE、LE 关系图

简介

Linux df 命令用于显示目前在 Linux 系统上的文件系统的磁盘使用情况统计。默认显示单位为 KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

1
df [选项]... [FILE]...

选项

  • -a 或–all:包含全部的文件系统;
  • –block-size=<区块大小>:以指定的区块大小来显示区块数目;
  • -h 或–human-readable:以可读性较高的方式来显示信息;
  • -H 或–si:与-h 参数相同,但在计算时是以 1000 Bytes 为换算单位而非 1024 Bytes;
  • -i 或–inodes:显示 inode 的信息;
  • -k 或–kilobytes:指定区块大小为 1024 字节;
  • -l 或–local:仅显示本地端的文件系统;
  • -m 或–megabytes:指定区块大小为 1048576 字节;
  • –no-sync:在取得磁盘使用信息前,不要执行 sync 指令,此为预设值;
  • -P 或–portability:使用 POSIX 的输出格式;
  • –sync:在取得磁盘使用信息前,先执行 sync 指令;
  • -t<文件系统类型>或–type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
  • -T 或–print-type:显示文件系统的类型;
  • -x<文件系统类型>或–exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
  • –help:显示帮助;
  • –version:显示版本信息。

实例

1
2
3
4
5
# 查看系统磁盘设备,默认是KB为单位
df

# 查看磁盘空间占用情况
df -h

参考:

Linux df 命令

简介

Linux umount命令用于卸除文件系统。
umount可卸除目前挂在Linux目录中的文件系统。

语法

1
umount [-ahnrvV] [-t <文件系统类型>] [文件系统]

参数:

  • -a 卸除/etc/mtab中记录的所有文件系统。
  • -h 显示帮助。
  • -n 卸除时不要将信息存入/etc/mtab文件中。
  • -r 若无法成功卸除,则尝试以只读的方式重新挂入文件系统。
  • -t<文件系统类型> 仅卸除选项中所指定的文件系统。
  • -v 执行时显示详细的信息。
  • -V 显示版本信息。
  • [文件系统] 除了直接指定文件系统外,也可以用设备名称或挂入点来表示文件系统。

实例

1
2
3
4
5
6
7
8
9
# 通过设备名卸载
umount -v /dev/sda1

# 通过挂载点卸载
umount -v /mnt/mymount/

# 如果设备正忙,卸载即告失败。
# 卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录
umount: /mnt/mymount: device is busy

参考:

Linux umount命令

简介

mount 命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。

语法

1
2
3
4
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

参数说明:

  • -V:显示程序版本
  • -h:显示辅助讯息
  • -v:显示较讯息,通常和 -f 用来除错。
  • -a:将 /etc/fstab 中定义的所有档案系统挂上。
  • -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
  • -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
  • -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
  • -s-r:等于 -o ro
  • -w:等于 -o rw
  • -L:将含有特定标签的硬盘分割挂上。
  • -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
  • -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
  • -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
  • -o sync:在同步模式下执行。
  • -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
  • -o auto、-o noauto:打开/关闭自动挂上模式。
  • -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
  • -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
  • -o suid、-o nosuid:允许执行档在 root 权限下执行。
  • -o user、-o nouser:使用者可以执行 mount/umount 的动作。
  • -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
  • -o ro:用唯读模式挂上。
  • -o rw:用可读写模式挂上。
  • -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

实例

1
2
3
4
5
6
7
8
9
10
# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt

# 将 /dev/hda1 用只读模式挂在 /mnt 之下。
mount -o ro /dev/hda1 /mnt

# 将 /tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在
# /mnt/cdrom之下。用这种方法可以将一般网络上可以找到的 Linux
# 光碟 ISO 在不烧录成光碟的情况下检视其内容。
mount -o loop /tmp/image.iso /mnt/cdrom

参考:

Linux mount命令

简介

lvdisplay 命令用于显示 LVM 逻辑卷空间大小、读写状态和快照信息等属性。如果省略”逻辑卷”参数,则 lvdisplay 命令显示所有的逻辑卷属性。否则,仅显示指定的逻辑卷属性。

LVM 是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。

语法

1
lvdisplay (参数)

参数

逻辑卷:指定要显示属性的逻辑卷对应的设备文件。

实例

使用lvdisplay命令显示指定逻辑卷的属性。在命令行中输入下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#显示逻辑卷属性
lvdisplay /dev/mapper/vg_ren-LogVol06_u01
--- Logical volume ---
LV Path /dev/vg_ren/LogVol06_u01
LV Name LogVol06_u01
VG Name vg_ren
LV UUID xMhOr0-M11J-X410-BLmE-0zVw-ojqJ-yiH1yd
LV Write Access read/write
LV Creation host, time ren-sj0001, 2020-01-19 11:18:05 +0800
LV Status available
# open 1
LV Size 300.00 GiB
Current LE 76800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:3

参考:

lvdisplay命令

简介

lsblk 命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM盘 的信息。块设备有 硬盘闪存盘cd-ROM 等等。lsblk 命令包含在 util-linux-ng 包中,现在该包改名为 util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载 util-linux包。Fedora用户可以通过命令 sudo yum install util-linux-ng 来安装该包。

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-a, --all            显示所有设备。
-b, --bytes 以bytes方式显示设备大小。
-d, --nodeps 不显示 slaves 或 holders。
-D, --discard print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs 显示文件系统信息。
-h, --help 显示帮助信息。
-i, --ascii use ascii characters only。
-m, --perms 显示权限信息。
-l, --list 使用列表格式显示。
-n, --noheadings 不显示标题。
-o, --output <list> 输出列。
-P, --pairs 使用key="value"格式显示。
-r, --raw 使用原始格式显示。
-t, --topology 显示拓扑结构信息。

显示说明:

  • NAME:这是块设备名。
  • MAJ: MIN:本栏显示主要和次要设备号。
  • RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
  • SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
  • RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
  • TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
  • MOUNTPOINT:本栏指出设备挂载的挂载点。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认选项不会列出所有空设备,使用 -a 显示空设备。
lsblk -a

# 列出一个特定设备的拥有关系,同时也可以列出组和模式.
lsblk -m

# 该命令也可以只获取指定设备的信息,
# 可以通过在提供给lsblk命令的选项后指定设备名来实现
# 以字节显示你的磁盘驱动器大小
lsblk -b /dev/sda
# 等价于
lsblk --bytes /dev/sda

# 获取SCSI设备的列表
lsblk -S

# lsblk列出SCSI设备,而-s是逆序选项(将设备和分区的组织关系逆转过来显示)
lsblk -s

参考:

Linux lsblk命令

简介

1
2
3
4
5
6
7
8
# 查看binlog的格式的脚本
show GLOBAL variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec)

mysql复制主要有三种方式:
基于SQL语句的复制(statement-based replication, SBR)
基于行的复制(row-based replication, RBR)
混合模式复制(mixed-based replication, MBR)。

对应的 binlog 的格式也有三种:STATEMENTROWMIXED

STATEMENT模式(SBR)

每一条会修改数据的sql语句会记录到 binlog 中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了 binlog 日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave 中的数据不一致(如 sleep() 函数, last_insert_id(),以及 user-defined functions(udf) 等会出现问题)

ROW模式(RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或 function、或 trigger 的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是 alter table 的时候会让日志暴涨。

MIXED模式(MBR)

以上两种模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog ,对于 STATEMENT 模式无法复制的操作使用ROW模式保存 binlog,MySQL会根据执行的SQL语句选择日志保存方式。

binlog 复制配置

在mysql的配置文件my.cnf中,可以通过一下选项配置 binglog 相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# binlog日志格式,mysql默认采用ROW,建议使用mixed
binlog_format=MIXED

# binlog日志文件
log-bin=/usr/local/mysql/binlogs/bin-log

# binlog过期清理时间
expire_logs_days=7

# binlog每个日志文件大小
max_binlog_size=100m

# binlog缓存大小
binlog_cache_size=4m

# 最大binlog缓存大小
max_binlog_cache_size=512m

MIXED说明

对于执行的SQL语句中包含 now() 这样的时间函数,会在日志中产生对应的 unix_timestamp()*1000 的时间字符串,slave 在完成同步时,取用的是 sqlEvent 发生的时间来保证数据的准确性。另外对于一些功能性函数 slave 能完成相应的数据同步,而对于上面指定的一些类似于 UDF 函数,导致 Slave无法知晓的情况,则会采用 ROW 格式存储这些 Binlog ,以保证产生的 Binlog 可以供 Slave 完成数据同步。

比较以下 SBRRBR 两种模式各自的优缺点:

SBR 的优点:

  • 历史悠久,技术成熟
  • binlog 文件较小
  • binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
  • binlog 可以用于实时的还原,而不仅仅用于复制
  • 主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR 的缺点:

不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。
调用具有不确定因素的 UDF 时复制也可能出问题
使用以下函数的语句也无法被复制:

  • LOAD_FILE()
  • UUID()
  • USER()
  • FOUND_ROWS()
  • SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)

SBR:

  • INSERT ... SELECT 会产生比 RBR 更多的行级锁
  • 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
  • 对于有 AUTO_INCREMENT 字段的 InnoDB 表而言,INSERT 语句会阻塞其他 INSERT 语句
  • 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
  • 存储函数(不是存储过程)在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
  • 确定了的 UDF 也需要在从服务器上执行
  • 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
  • 执行复杂语句如果出错的话,会消耗更多资源

RBR 的优点:

任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:

  • INSERT … SELECT
  • 包含 AUTO_INCREMENT 字段的 INSERT
  • 没有附带条件或者并没有修改很多记录的 UPDATEDELETE 语句
  • 执行 INSERTUPDATEDELETE 语句时锁更少
  • 从服务器上采用多线程来执行复制成为可能

RBR 的缺点:

  • binlog 大了很多
  • 复杂的回滚时 binlog 中会包含大量的数据
  • 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
  • UDF 产生的大 BLOB 值会导致复制变慢
  • 无法从 binlog 中看到都复制了写什么语句
  • 当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生

另外,针对系统库 mysql 里面的表发生变化时的处理规则如下:

  • 如果是采用 INSERTUPDATEDELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录
  • 如果是采用 GRANTREVOKESET PASSWORD 等管理语句来做的话,那么无论如何都采用 SBR 模式记录

注:采用 RBR 模式后,能解决很多原先出现的主键重复问题。

参考:

mysql中binlog_format模式与配置详解

0%