Mysql 备份恢复

Mysql 备份恢复

关于备份

原因、目标
  • 数据的一致性
  • 服务的可用性
方式

备份:能防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在其他地方。

冗余:数据有多分冗余,但不等备份,只能防止机械故障带来得数据丢失,例如主备模式、数据库集群。

对象
  • databases
  • binlog
  • my.cnf
经验
  • 所有备份数据都应放在非数据库本地,而且建议由多份副本。

  • 在测试环境中做日常恢复演练(备份恢复更为重要)

技术
物理备份

tar,cp,scp

直接复制数据库文件,适用于大型数据库环境,不受储存引擎 的限制,但不能恢复到不同的mysql版本。

优点:快

缺点:服务停止

逻辑备份

mysqldump , mydumper

备份的是建表,建库,插入等操作所执行的sql语句(DDL DML DCL),适用于中小型数据库。

缺点是效率相对较低

种类
完全备份(略)
增量备份

连续恢复

这里写图片描述

每次仅备份上次备份的文件,备份体积小,速度快,但是恢复的时候需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。

差异备份

跳跃恢复

这里写图片描述

占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。

物理备份

tar方式

物理备份数据库,备份期间,服务不可用

过程
备份
1.停止数据库
systemctl stop mysqld
2.准备目录放置备份数据
mkdir  /backup  
3.tar备份数据
 tar -cf /backup/`date +%F`-mysql-all.tar /var/lib/mysql

注:备份文件应复制到其他服务器或存储上

4.启动数据库
systemctl start mysqld
还原
1.停止数据库
systemctl stop mysqld

2.清理环境(模拟损坏)

注:生产环境中不要作死

rm -rf /var/lib/mysql/*

3.导入备份数据

tar -xf /backup/2058-01-01-mysql-all.tar -C /
4.启动数据库
systemctl start mysqld
5.使用binlog恢复未备份的数据
lvm快照+binlog

lvm快照实现物理备份 + binlog(物理备份)数据一致,服务可用

注意

MySQL数据lv 和 将要创建的snapshot 必须在同一VG,因此VG必须要有一定的剩于空间

优缺点
优点
  • 几乎等于热备(创建快照前先把表上锁,创建完成后立即释放)
  • 支持所有存储引擎
  • 备份速度快
  • 无需使用商业软件
缺点
  • ​ 可能需要跨部门协调(使用操作系统级别的命令,DBA一般没权限)
  • ​ 无法预计服务停止时间
  • ​ 数据如果分布在多个卷上比较麻烦(针对存储级别而言)
前提

mysql运行一段时间,数据并没有存储lvm,将现在的数据迁移到lvm

1.准备lvm及文件系统
# lvcreate -n lv-mysql -L  2G  datavg
# mkfs.xfs   /dev/datavg/lv-mysql
2.将数据迁移到lvm
# systemctl stop mysqld
# mount /dev/datavg/lv-mysql /mnt/       //临时挂载点
# cp -a /var/lib/mysql/*  /mnt           //将MySQL原数据镜像到临时挂载点
# umount /mnt/
# vim /etc/fstab                    //加入fstab开机挂载
/dev/datavg/lv-mysql    /var/lib/mysql     xfs     defaults        0 0
# mount -a
# chown -R mysql.mysql /var/lib/mysql
# systemctl start mysqld
备份
1.加全局读锁
mysql> flush tables with read lock;
2.创建快照
# lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql
# mysql -p'密码'  -e 'show master status' > /backup/`date +%F`_position.txt
3.释放锁
mysql> unlock tables;
4.从快照中拷贝
# mount -o ro /dev/datavg/lv-mysql-snap /mnt/
# cd /mnt/
# tar -cf /backup/`date +%F`-mysql-all.tar ./*
5.移除快照
# cd; umount /mnt/
# lvremove -f   /dev/datavg/lv-mysql-snap
恢复
1.停止数据库
# systemctl stop mysqld
2.清理环境
# rm -rf  /var/lib/mysql/* 
3.导入数据
# tar -xf /backup/2028-01-01-mysql-all.tar -C /var/lib/mysql/
4.修改权限
# chown -R  mysqlmysql  /var/lib/mysql/
5.启动数据库
# systemctl start mysqld
6.binlog恢复
总结
1、flush table with read lock;       全局读锁
2、create snapshot            创建快照
3show master status; show slave status; [可选]
查询二进制日志的位置,下次使用bin 作为依据。
4、unlock tables;   释放锁
5、Copy files from the snapshot  从快照卷,复制数据。
6、Unmount the snapshot.    卸载并删除快照。
7、Remove snapshot
脚本 + Cron
脚本
#!/bin/bash
#LVM backmysql...
back_dir=/backup/`date +%F`

[ -d $back_dir ] || mkdir -p $back_dir

echo "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql; \
UNLOCK TABLES;" | mysql -p'密码'

mount -o ro,nouuid /dev/datavg/lv-mysql-snap /mnt/

rsync -a /mnt/ $back_dir

if [ $? -eq 0 ];then
         umount /mnt/
         lvremove -f /dev/datavg/lv-mysql-snap 
fi
cron
crontab -e
0 2 * * *    /root/mysql.sh
percona-xtrabackup
简介

它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。

官网 https://www.percona.com/

使用略

逻辑备份

使用mysqldump实现逻辑完全备份 + binlog

mysqldump
优势
  • 自动记录position位置 (show master status\G;)
  • 可用性,一致性(锁表机制)
语法
mysqldump -h 服务器  -u 用户名 -p密码  数据库名 >备份文件.sql
常用数据库选项
-A, --all-databases 所有库
database    数据库名
database stu_info t1    是指database数据库的表stu_info、t1
-B, --databases bbs test mysql  多个数据库
-F, --flush-logs   备份之前刷新binlog日志(截断日志。备份之后新binlog。) 
--master-data=1|2 
该选项将会记录备份时binlog的日志位置与文件名并追加到文件中,内容如下:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000016', 
MASTER_LOG_POS=107;
表示备份的是日志文件16里位置为107之前的数据    
--quick,-q         
该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--no-data,-d    
不导出任何数据,只导出数据库表结构。 
-x, --lock-all-tables                   
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭
--lock-tables          
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表
-R, --routines        备份存储过程和存储函数
--triggers            备份触发器
帮助
mysqldump --help
举个栗子
备份
1.备份库
# mysqldump -uroot -p'密码' -A >all.sql
2.备份二进制日志文件
# cp /var/lib/mysql/*bin*-
恢复数据
恢复流程:
1. 停止数据库
2. 清理环境
3. 启动数据库        【初始密码 /var/log/mysqld.log】
4. 重置密码           【新密码 】
5. mysql恢复数据   【新密码 】
6. 刷新授权           【备份时密码 】
 mysql -p'密码' < /backup/2028-01-01-01-mysql-all.sql
二进制日志恢复
1.观察二进制截取记录
vim /backup/2028-01-01-01-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000002', MASTER_LOG_POS=154;
注意后续有多少日志,要跟多少日志名字。
2.恢复
mysqlbinlog localhost-bin.000002 localhost-bin.000003 --start-position=154  | mysql -p'密码'
备份脚本
#!/bin/bash
fullday=`date +%w`
backfile=`find /var/lib/mysql/ -name mylog.00* | head -1`

if [ $fullday -eq 0 ]
then
    mysqldump -A > /mysql_backup/full_`date +%Y%m%d%H%M`.sql
else
    if [ -z $backfile ]
    then
        echo 'file not found,create new binlog!'
        mysqladmin flush-logs
    else
    mysqladmin flush-logs
    tar cvzf  /mysql_backup/`date +%Y%m%d%H%M`.tar.gz $backfile
    rm -rf $backfile
    fi
fi
记录的导出和导入
SELECT… INTO OUTFILE 导出
select * from db1.t1  into outfile  '/backup/t1.txt'
mysql命令导出文本文件
# mysql -uroot -p'password' -e 'select * from db1.t1' > /backup/testdb1.t2.txt
# mysql -u root -p'password' --xml -e 'select * from db1.t1' > /backup/testdb1.t3.txt
# mysql -u root -p'password' --html -e 'select * from db1.t1' > /backup/index.html
LOAD DATA INFILE 导入文本文件
目录权限
vim /etc/my.cnf
secure-file-priv=/backup     mysql不信任该目录
chown mysql.mysql /backup    mysql用户没有权限
导入

标的导入和导出只会备份表记录,不会备份表结构,因此需要mysqldump备份表结构,恢复时先恢复表结构,再导入数据。

load data infile '/backup/db1.t1.txt'  into table db1.t1; 
#读取备份文件
into table db1.t1 
#输入表中
select * from  db1.t1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值