MySQL备份还原方法2----LVM

张开发
2026/4/16 16:12:29 15 分钟阅读

分享文章

MySQL备份还原方法2----LVM
2.LVM 备份LVMLogical Volume Manager逻辑卷管理器是 Linux 环境下强大的存储管理工具其备份主要基于 快照Snapshot 功能实现热备份在线备份即系统运行时备份无需卸载文件系统。2.1准备新磁盘 逻辑卷不要用我们的系统磁盘更安全。在虚拟机去添加一块新磁盘[rootbogon ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda8:0010G0disk#新加的磁盘sr011:0112.7G0rom /mnt nvme0n1259:00200G0disk ├─nvme0n1p1259:10600M0part /boot/efi ├─nvme0n1p2259:201G0part /boot └─nvme0n1p3259:30198.4G0part ├─rhel-root253:0070G0lvm / ├─rhel-swap253:102G0lvm └─rhel-home253:20126.4G0lvm /home#创建卷组物理卷会自动创建[rootbogon ~]# vgcreate mysql /dev/sdaVolume groupmysqlsuccessfully created#创建逻辑卷[rootbogon ~]# lvcreate -n lv_mysql -L 6G mysqlWARNING: xfs signature detected on /dev/mysql/lv_mysql at offset0. Wipe it?[y/n]: y Wiping xfs signature on /dev/mysql/lv_mysql. Logical volumelv_mysqlcreated.#格式化[rootbogon ~]# mkfs.xfs /dev/mysql/lv_mysql[rootbogon ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda8:0010G0disk └─mysql-lv_mysql253:306G0lvm#这里sr011:0112.7G0rom /mnt nvme0n1259:00200G0disk ├─nvme0n1p1259:10600M0part /boot/efi ├─nvme0n1p2259:201G0part /boot └─nvme0n1p3259:30198.4G0part ├─rhel-root253:0070G0lvm / ├─rhel-swap253:102G0lvm └─rhel-home253:20126.4G0lvm /home#挂载2.2数据迁移[rootbogon ~]# systemctl stop mysqld[rootbogon ~]# tar -zcf /tmp/mysql.tar.gz /var/lib/mysql/*[rootbogon ~]# tar -tf /tmp/mysql.tar.gz #可以查看压缩包[rootbogon ~]# mount /dev/mysql/lv_mysql /var/lib/mysql[rootbogon ~]#[rootbogon ~]# tar -zxf /tmp/mysql.tar.gz -C /[rootbogon ~]# ll -d /var/lib/mysqldrwxr-xr-x.9root root4096Mar3116:13 /var/lib/mysql[rootbogon ~]# ll /var/lib/mysqltotal90192-rw-r-----.1mysql mysql56Mar2811:53 auto.cnf -rw-r-----.1mysql mysql4487Mar2812:01 binlog.000001 -rw-r-----.1mysql mysql181Mar2814:21 binlog.000002 。。。。。。[rootbogon ~]# chown -R mysql: /var/lib/mysql[rootbogon ~]# systemctl start mysqld1.解压那一步不要指定解压到/var/lib/mysql因为压缩时这个目录也同样压缩了。否则解压出来是/var/lib/mysql/var/lib/mysql/。。。2.一定要先压缩再挂载最后解压直接挂载新卷覆盖了目录里面的数据是新卷自带的可能是空的、旧的、或别的备份再解压先把旧数据打包保存挂载新卷后再把旧数据还原进去3.在压缩前先暂停服务。停服务是为了保证数据一致性避免备份/迁移过程中数据损坏。4.关于权限问题不仅要关注目录里面文件权限也要关注目录本身的权限2.3数据备份大概步骤1锁表 flush table with read lock2查看position号并记录便于后期恢复 show master status3创建snapshot快照 create snapshop4解表 unlock tables5挂载snapshot6拷贝snapshot数据进行备份。备份整个数据库之前要关闭mysql服务保护ibdata1文件7卸载8移除快照这里可以用shell脚本来做[rootbogon ~]# cat bak_mysql.sh#!/bin/bashbak_dir/bak/$(date%F)[-d${bak_dir}]||mkdir-p${bak_dir}echoflush tables with read lock; system lvcreate -s -n lv_mysql_s -L 500M /dev/mysql/lv_mysql; unlock tables;|mysql-uroot-p123456[-d/media/mysql/]||mkdir-p/media/mysqlmount-txfs-onouuid /dev/mysql/lv_mysql_s /media/mysql#用 rsync 把快照里的数据同步到备份目录rsync-az/media/mysql/${bak_dir}if[$?-eq0];thenumount/media/mysql/lvremove-f/dev/mysql/lv_mysql_s/dev/nullfi[rootbogon ~]# bash bak_mysql.sh[rootbogon ~]# ls /bak/2026-03-31auto.cnf ca.pem ibdata1 mysql.sock school binlog.000001 client-cert.pem#innodb_redomysql.sock.lock server-cert.pem binlog.000002 client-key.pem#innodb_tempmysql_upgrade_history server-key.pem binlog.000003#ib_16384_0.dblwrmydb performance_schema sys binlog.index#ib_16384_1.dblwrmysql private_key.pem undo_001 ca-key.pem ib_buffer_pool mysql.ibd public_key.pem undo_002rsync -az /media/mysql/ ${bak_dir}这一步相当于rsync -az /media/mysql/ /bak/2026-03-31/media/mysql/是/dev/mysql/lv_mysql_s快照中的数据即逻辑卷的数据即/var/lib/mysql的数据用快照而不是直接挂载逻辑卷主要是为了实现一致性备份。为什么要弄一个/media/mysql,而不是直接将快照挂载到/bak/2026XXX…???/bak/2026XXX是文件系统路径不是挂载点简单类比就像你要复制光盘里的文件到硬盘需要先把光盘挂载到某个空目录复制到目标文件夹而不是直接把光盘挂载到目标文件夹。但是我的/bak/2026XXX本来也是空的,专门用一个中转的区别在这么做优点防止意外覆盖如果/bak/2026XXX不小心非空了直接挂载会隐藏原有文件。用固定空目录挂载安全。脚本简单可靠挂载点固定/media/mysql备份目录可变/bak/日期。逻辑解耦不容易写错路径。支持并发备份可以同时挂载多个快照到不同目录/media/mysql1、/media/mysql2同时备份到不同/bak/子目录。2.4数据还原 验证#模拟数据被破坏mysqldrop database mydb;Query OK,1row affected(0.01sec)#停止mysqld服务[rootbogon ~]# systemctl stop mysqld#改数据目录为之前备份的目录[rootbogon ~]# vim /etc/my.cnf[rootbogon ~]# cat /etc/my.cnf | grep datadir#datadir/var/lib/mysqldatadir/bak/2026-03-31#检查该目录本身及下面文件都是mysql用户[rootbogon ~]# ll -d /bak/2026-03-31drwxr-xr-x.9mysql mysql4096Mar3116:41 /bak/2026-03-31[rootbogon ~]# ll /bak/2026-03-31total90204-rw-r-----.1mysql mysql56Mar2811:53 auto.cnf -rw-r-----.1mysql mysql4487Mar2812:01 binlog.000001 。。。。。。#重启[rootbogon ~]# systemctl restart mysqld#检验mysqlshow databases;--------------------|Database|--------------------|information_schema||mydb|#又回来了|mysql||performance_schema||school||sys|--------------------流程原理删除数据库后这个删除的日志记录在/var/lib/mysql下面/etc/my.cnf中默认的数据路径这时候我们要停止服务进入/etc/my.cnf中修改datadir为删除前备份的目录再重启就相当于是用的删除前的日志因此数据库恢复存在

更多文章