天天看点

Linux中,使用lvm快照(snapshot)来快速备份数据

Linux中,使用lvm快照(snapshot)来快速备份数据

lv快照的工作原理是建立一个快照区,如果原来的数据发生变化,那么就把变化前的数据放到快照区,借用鸟哥的图:

Linux中,使用lvm快照(snapshot)来快速备份数据

也就是说,原来数据的修改量,不能超过快照区的大小,否则这个快照,就不能用了:

示例:原本有一个1G的LV,mysqllv1,上面的文件系统挂载在目录/root/mysqldata下:

[email protected]:~# df -h

Filesystem Size Used Avail Use% Mounted on

udev 961M 4.0K 961M 1% /dev

tmpfs 195M 1.1M 194M 1% /run

/dev/sda1 39G 14G 23G 38% /

none 4.0K 0 4.0K 0% /sys/fs/cgroup

none 5.0M 0 5.0M 0% /run/lock

none 972M 0 972M 0% /run/shm

none 100M 0 100M 0% /run/user

/dev/mapper/mqsvg1-mysqllv1 976M 957M 0 100% /root/mysqldata

[email protected]:~# lvdisplay

--- Logical volume ---

LV Path /dev/mqsvg1/mysqllv1

LV Name mysqllv1

VG Name mqsvg1

LV UUID K3coIn-e7j3-IWib-wtMx-8JL4-F9oz-jWA1r2

LV Write Access read/write

LV Creation host, time db2a, 2017-08-18 04:44:31 -0700

LV Status available

# open 1

LV Size 1.00 GiB

Current LE 256

Segments 1

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 252:0

[email protected]:~# ls -lh /root/mysqldata

total 955M

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.001

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.002

-rw-r--r-- 1 root root 339M Aug 18 17:07 db2diag.log.003

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.004

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.005

drwxr-xr-x 3 root root 4.0K Aug 18 04:53 logdir

drwx------ 2 root root 4.0K Aug 18 04:45 lost+found

现在在mysqllv1上新建一个lv快照,名子为mysqllvsnap,大小为300M,下面命令中的-s表示是快照,-n表示名子,

[email protected]:~# lvcreate -L 300M -s -n mysqllvsnap /dev/mqsvg1/mysqllv1

Logical volume "mysqllvsnap" created

可以看到,两个lv的大小都是1G,但mysqllvsnap的 COW-table LE为300MB:

[email protected]:~# lvdisplay

--- Logical volume ---

LV Path /dev/mqsvg1/mysqllv1

LV Name mysqllv1

VG Name mqsvg1

LV UUID K3coIn-e7j3-IWib-wtMx-8JL4-F9oz-jWA1r2

LV Write Access read/write

LV Creation host, time db2a, 2017-08-18 04:44:31 -0700

LV snapshot status source of

mysqllvsnap [active]

LV Status available

# open 1

LV Size 1.00 GiB

Current LE 256

Segments 1

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 252:0

--- Logical volume ---

LV Path /dev/mqsvg1/mysqllvsnap

LV Name mysqllvsnap

VG Name mqsvg1

LV UUID vsZQ0A-qo8g-pgZ9-LwT6-O2CA-0qvG-24teLn

LV Write Access read/write

LV Creation host, time db2a, 2017-08-18 17:07:40 -0700

LV snapshot status active destination for mysqllv1

LV Status available

# open 0

LV Size 1.00 GiB

Current LE 256

COW-table size 300.00 MiB <--快照区实际容量

COW-table LE 75

Allocated to snapshot 0.00% <--快照区已经使用百分比

Snapshot chunk size 4.00 KiB

Segments 1

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 252:1

如果把mysqllvsnap挂载到某个目录上,并查看文件内容,会发现和原来的mysqllv1里内容完全一样,

[email protected]:~# mkdir /root/mysqlsnap

[email protected]:~# mount /dev/mqsvg1/mysqllvsnap /root/mysqlsnap/

[email protected]:~# df -h

Filesystem Size Used Avail Use% Mounted on

udev 961M 4.0K 961M 1% /dev

tmpfs 195M 1.1M 194M 1% /run

/dev/sda1 39G 14G 23G 38% /

none 4.0K 0 4.0K 0% /sys/fs/cgroup

none 5.0M 0 5.0M 0% /run/lock

none 972M 0 972M 0% /run/shm

none 100M 0 100M 0% /run/user

/dev/mapper/mqsvg1-mysqllv1 976M 957M 0 100% /root/mysqldata

/dev/mapper/mqsvg1-mysqllvsnap 976M 957M 0 100% /root/mysqlsnap

[email protected]:~# ls -lh /root/mysqldata

total 955M

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.001

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.002

-rw-r--r-- 1 root root 339M Aug 18 17:07 db2diag.log.003

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.004

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.005

drwxr-xr-x 3 root root 4.0K Aug 18 04:53 logdir

drwx------ 2 root root 4.0K Aug 18 04:45 lost+found

[email protected]:~# ls -lh /root/mysqlsnap

total 955M

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.001

-rw-r--r-- 1 root root 170M Aug 18 17:06 db2diag.log.002

-rw-r--r-- 1 root root 339M Aug 18 17:07 db2diag.log.003

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.004

-rw-r--r-- 1 root root 54M Aug 18 17:07 db2diag.log.005

drwxr-xr-x 3 root root 4.0K Aug 18 04:53 logdir

drwx------ 2 root root 4.0K Aug 18 04:45 lost+found

修改mysqllv1里的数据后,mysqllvsnap对应的数据不会发生变化,从而起到备份的作用。但要注意一点,修改的内容不能超过300MB,否则快照区不够用,导致快照失效,下面的例子中,第一次修改了大约170MB的数据,快照区被使用了56.77% (170/300),第二次再次修改了170MB的数据之后,快照失效:

[email protected]:~# cat /root/mysqldata/db2diag.log > /root/mysqldata/db2diag.log.001

[email protected]:~# lvdisplay /dev/mapper/mqsvg1-mysqllvsnap

--- Logical volume ---

LV Path /dev/mqsvg1/mysqllvsnap

LV Name mysqllvsnap

VG Name mqsvg1

LV UUID vsZQ0A-qo8g-pgZ9-LwT6-O2CA-0qvG-24teLn

LV Write Access read/write

LV Creation host, time db2a, 2017-08-18 17:07:40 -0700

LV snapshot status active destination for mysqllv1

LV Status available

# open 1

LV Size 1.00 GiB

Current LE 256

COW-table size 300.00 MiB

COW-table LE 75

Allocated to snapshot 56.77%

Snapshot chunk size 4.00 KiB

Segments 1

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 252:1

[email protected]:~# cat /root/mysqldata/db2diag.log > /root/mysqldata/db2diag.log.002

[email protected]:~# lvdisplay /dev/mapper/mqsvg1-mysqllvsnap

/dev/mqsvg1/mysqllvsnap: read failed after 0 of 4096 at 1073676288: Input/output error

/dev/mqsvg1/mysqllvsnap: read failed after 0 of 4096 at 1073733632: Input/output error

/dev/mqsvg1/mysqllvsnap: read failed after 0 of 4096 at 0: Input/output error

/dev/mqsvg1/mysqllvsnap: read failed after 0 of 4096 at 4096: Input/output error

--- Logical volume ---

LV Path /dev/mqsvg1/mysqllvsnap

LV Name mysqllvsnap

VG Name mqsvg1

LV UUID vsZQ0A-qo8g-pgZ9-LwT6-O2CA-0qvG-24teLn

LV Write Access read/write

LV Creation host, time db2a, 2017-08-18 17:07:40 -0700

LV snapshot status INACTIVE destination for mysqllv1

LV Status available

# open 1

LV Size 1.00 GiB

Current LE 256

COW-table size 300.00 MiB

COW-table LE 75

Snapshot chunk size 4.00 KiB

Segments 1

Allocation inherit

Read ahead sectors auto

- currently set to 256

Block device 252:1

所以,为了防止快照失效,有两种办法,第一是创建完快照之后,挂载到某个目录,马上将里面的内容备份出来。另一个是,建立一个和原来的lv一样大小或者更大的快照,这样的快照也不会失效。

继续阅读