数据库备份之lvm快照热备

 阅读约 7 分钟
  • 使用的是虚拟机环境,先在虚拟机中添加一块儿新的硬盘。然后给硬盘分区。注意给相关目录的权限,如果权限不够可能会报错。如/mnt,/var/lib/mysql
fdisk -l #查看分区信息
pvcreate mysql_pv /dev/sdb #创建物理卷
vgcreate vgmysql /dev/sdb #创建卷组
lvcreate -L 3G -n lv0 vgmysql #创建逻辑卷
mkfs.ext4 /dev/vgmysql/lv0 #格式化挂载
mount /dev/vgmysql/lv0 /mnt #挂载逻辑卷
service mysqld stop #关闭mysql服务
cp -a /var/lib/mysql/* /mnt #将数据库数据拷贝到mnt目录下
umount /dev/vgmysql/lv0 #移除挂载信息
mount /dev/vgmysql/lv0 /var/lib/mysql/
service mysqld start #重启mysqld服务
mkdir /backup/mysql/binlog
mysql -uroot -p123456 -e "SHOW MASTER STATUS;" > /backup/mysql/binlog/binlog.pos
  • 设置开机自动挂载,在/etc/fstab文件中配置。
  • 最好不要采用在 /etc/fstab直接指定分区(如/dev/sdb1)的方法,因为设备的顺序编码在关闭或者开启服务器过程中可能发生改变,例如/dev/sdb1可能会变成/dev/sdb2。推荐使用UUID来配置自动挂载数据盘。
  • 查询磁盘分区的UUID
blkid /dev/sdb1
  • UUID=一串数字:要挂载的磁盘分区的UUID
  • /var/lib/mysql:挂载目录
  • ext4:分区格式为ext4
  • defaults:挂载时所要设定的参数(只读,读写,启用quota等),输入defaults包括的参数有(rw、dev、exec、auto、nouser、async)
    0:使用dump是否要记录,0为不需要,1为需要 2:2是开机时检查的顺序,boot系统文件为1,其他文件系统都为2,如不要检查就为0

**innodb表,一般情况下需要打开独立表空间模式innodb_file_per_table,将其值设为1.
检查独立表是否开启

mysql> show variables like "%per_table%";
Variable_name Value
innodb_file_per_table ON

1 row in set (0.00 sec)**

库名文件夹里面的表文件只是结构。而ibdata1文件才是数据库的真实数据存放文件。新版的Mysql默认引擎是innodb,所以默认会有ibdata1文件。
mysql采用缓冲方式将数据写入到ibdata1文件中的。当mysql运行时,对ibdata1进行拷贝会导致ibdata1文件中的数据出错。所以备份时要关闭mysql服务。
ibdata1文件会不断增大,无法向操作系统回收空间。容易导致线上出现过大的共享表空间文件,致使当前空间爆满。ibdata1文件达到一定程度时,会影响insert,update的速度。如果删表频繁的话,共享表空间产生的碎片会比较多。打开独立表空间,方便进行innodb表的碎片整理。
使用myISAM表引擎的数据库会分别创建3个文件:表结构,表索引,表数据空间。可以将某个数据库目录直接迁移到其他数据库也可以正常工作。
使用InnoDB时,默认将所有数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1文件。增删数据库时,ibdata1文件不会自动收缩。单个数据库备份成为问题。
因此设置innodb_file_per_table值为1,会修改innodb为独立表空间模式,使每个数据库的每个表都会生成一个数据空间。
在innodb表中,即使时请求到了读锁,InnoDB在后台依然可能会有事务进行读写操作。所以在备份之前要show engine innodb status;查看后台进程状态,等没有写请求后再做备份。

在给lv0做快照之前,先使用FLUSH TABLES和FLUSH TABLES WITH READ LOCK强行将所有OS的缓冲数据写入磁盘(类似于操作系统的sync命令),同时将数据库置为全局只读。并且要show engine innodb status.查看进程状态,没有请求后再进行备份。快照完成之后,再使用UNLOCK TABLES解锁。然后只需要将快照进行挂载,复制其中数据,在复制完成之后删除该快照即可

! /bin/bash

DATE=date +%Y%m%d
TIMESTAMP=date +%Y%m%d%H%M%S
HOSTNAME="127.0.0.1"
USERNAME="root"
PASSWORD=""
MYSQL="/usr/bin/mysql"
LVCREATE="/sbin/lvcreate"
LVREMOVE="/sbin/lvremove"
MOUNT="/bin/mount"
UMOUNT="/bin/umount"
TAR="/bin/tar"
SNAP_SIZE=0.3G
SNAP_MYSQL=mysql_snapshot
MOUNT_POINT=/mnt

EXEC_MySQL="
FLUSH TABLES;
FLUSH TABLES WITH READ LOCK;

FLUSH LOGS;
! $LVCREATE -s -L$SNAP_SIZE -n $SNAP_MYSQL /dev/vgmysql/lv0
UNLOCK TABLES;"

echo "$EXEC_MySQL" | $MYSQL -u$USERNAME -p$PASSWORD -h$HOSTNAME

if [ ! -d $MOUNT_POINT/$DATE ];then

mkdir $MOUNT_POINT/$DATE
chmod -R 777 $MOUNT_POINT/$DATE

fi

$MOUNT /dev/vgmysql/$SNAP_MYSQL $MOUNT_POINT/$DATE

cd /root
$TAR -zcvf ${TIMESTAMP}.tgz $MOUNT_POINT/$DATE

$UMOUNT $MOUNT_POINT/$DATE
$LVREMOVE -f /dev/vgmysql/$SNAP_MYSQL

mysql备份学习参考https://cloud.tencent.com/dev...

阅读 348更新于 3月19日
推荐阅读

学习之旅

3 人关注
13 篇文章
专栏主页
目录