MySQL_物理备份

关于备份

备份原因

		丢
		删

备份目标

		1. 数据的一致性
		2. 服务的可用性

备份方式

		备份
			能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。
		冗余
			数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备模式、数据库集群。无法解决人为删除操作。

备份对象

		databases
		Binlog
		my.cnf

备份经验

		所有备份数据都应放在非数据库本地,而且建议有多份副本。
        测试环境中做日常恢复演练,恢复较备份更为重要。

备份技术

		物理备份
			直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
			tar,cp,scp
			拷贝数据,  优点快,缺点服务停止。
		逻辑备份
			备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
			mysqldump,mydumper
			效率相对较低

备份种类

		完全备份
		增量备份
			
			连续回复
			特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
		差异备份
			
			跳跃恢复
			特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。

实战案例

	percona-xtrabackup 物理备份 + binlog

简介

			logo
				
			简介
				它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;

为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本–percona Server。并围绕
percona Server还发布了一系列的mysql工具。

获得软件包

			官方站点
				https://www.percona.com/
			选择版本

安装

			wget http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
				下载YUM源
			yum -y install percona-release-0.1-3.noarch.rpm
				安装yum源
			yum -y install percona-xtrabackup-24.x86_64
				安装percona
			rpm -ql percona-xtrabackup-24 
				查询安装结果,安装文件

1-1 完全备份流程

			innobackupex --user=root --password='QianFeng@123' /xtrabackup/full
				连接数据库,开始备份。
				请注意备份结果是否完成
					xtrabackup: Transaction log of lsn (74182721) to (74182730) was copied.
	171127 15:04:12 completed OK!
			ls /xtrabackup/full/
				查看备份目录。数据库,配置文件,日志文件
			ls /xtrabackup/full/2017-08-01_00-00-02/
			cat /xtrabackup/full/2017-08-01_00-00-18/xtrabackup_binlog_info 
				二进制日志位置

1-2 完全恢复流程

			停止数据库
				systemctl stop mysqld
			清理环境(模拟损坏)
				rm -rf /var/lib/mysql/*
				rm -rf /var/log/mysqld.log 
				rm -rf /var/log/mysql-slow/slow.log 
			生成回滚日志
				innobackupex --apply-log /xtrabackup/full/2017-08-01_00-00-18/
					指定备份点
			恢复文件
				innobackupex --copy-back /xtrabackup/full/2017-08-01_00-00-18/
			登陆验证
				ls /var/lib/mysql
				chown -R mysql.mysql /var/lib/mysql
				systemctl start mysqld
				mysql -uroot -p'QianFeng@123'

2-1 增量备份流程

			准备工作
				create database testdb;
				use testdb;
				create table test(id int);
				 insert into test values (1);
				select * from test;
					mysql> select * from test;
	+------+
	| id   |
	+------+
	|    1 |
	+------+
	1 row in set (0.00 sec)

			完整备份:周一
				rm -rf /xtrabackup/*
				date 09010000
					时间建议靠后设置。
				innobackupex --user=root --password='QianFeng@123' /xtrabackup
				ll /xtrabackup/
					2017-09-01_00-00-04
				请问数据库中的记录是多少?
					1
			增量备份:周二
				date 09020000
					更新时间
				mysql -uroot -p'QianFeng@123' -e  'insert into testdb.test values (2)'
				innobackupex --user=root --password='QianFeng@123' 
	--incremental /xtrabackup/ 
	--incremental-basedir=/xtrabackup/2017-09-01_00-00-04
					basedir基于周一的备份。
	会生成一个今天的。
				ls  /xtrabackup/
					2017-09-01_00-00-04  
	2017-09-02_00-00-58
			增量备份:周三
				date 09030000
				mysql -uroot -p'QianFeng@123' -e  'insert into testdb.test values (3)'
				innobackupex --user=root --password='QianFeng@123' 
	--incremental /xtrabackup/ 
	--incremental-basedir=/xtrabackup/2017-09-02_00-00-26
					basedir基于周2的备份。
	会生成一个今天的。
				ls  /xtrabackup/
					2017-09-01_00-00-04  
	2017-09-02_00-00-58
	2017-09-03_00-00-36
			周四。。周五。。周六

2-2 增量恢复流程

			停止数据库
				 systemctl stop mysqld
			 清理环境
				rm -rf /var/lib/mysql/*
			周一
				看一看备份目录
					116M	/xtrabackup/
				innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04
				再看看备份目录
					124M	/xtrabackup/
			周二
				 innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04 
	--incremental-dir=/xtrabackup/2017-09-02_00-00-26
			恢复
				innobackupex --copy-back /xtrabackup/2017-09-01_00-00-06  
				chown -R mysql.mysql /var/lib/mysql
				systemctl start mysqld
			登陆查询记录。请思考记录是第几天的。
				想回复3,怎么办
					 systemctl stop mysqld
					 innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04  
	--incremental-dir=/xtrabackup/2017-09-03_00-00-27
					# rm -rf /var/lib/mysql/*
					innobackupex --copy-back /xtrabackup/2017-09-01_00-00-04 
					chown -R mysql.mysql /var/lib/mysql
					systemctl start mysqld
					mysql -uroot -p'QianFeng@123' -e 'select * from testdb.test'
					请思考,如何直接从周一恢复到周三呢?

3-1 差异备份流程

			rm -rf /xtrabackup/*
			1.完整备份
				周一
					date 10010000
					create database testdb;
	use testdb;
	create table test2(id int);
	insert into test2 values(1);
	select * from test2;
					innobackupex --user=root --password='QianFeng@123' /xtrabackup
						ll /xtrabackup/
						du -sh /xtrabackup/
						2017-10-01_00-00-54
			2.差异备份
				周二
					date 10020000
					mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(2)'
					 innobackupex --user=root --password='QianFeng@123'
	 --incremental /xtrabackup 
	--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
						完全备份目录(周一)
						ll /xtrabackup/
						du -sh /xtrabackup/
				周三
					date 10030000
					mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(3)'
					 innobackupex --user=root --password='QianFeng@123' 
	--incremental /xtrabackup 
	--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
						完全备份目录(周一)
						ll /xtrabackup/
						du -sh /xtrabackup/
				周四
					date 10040000
					mysql -uroot -p'QianFeng@123' -e 'insert into testdb.test2 values(4)'
					 innobackupex --user=root --password='QianFeng@123' 
	--incremental /xtrabackup 
	--incremental-basedir=/xtrabackup/2017-10-01_00-01-12
								完全备份目录(周一)
						ll /xtrabackup/
						du -sh /xtrabackup/
		3-2 差异恢复流程
			停止数据库
				systemctl stop mysqld
			清理环境
				rm -rf /var/lib/mysql/*
			重演回滚redo log(周一,某次差异)--> 恢复数据
				innobackupex --apply-log --redo-only /xtrabackup/2017-10-01_00-01-12
				innobackupex --apply-log --redo-only 
	/xtrabackup/2017-10-01_00-01-12 
	--incremental-dir=/xtrabackup/2017-10-04_00-00-29
				 innobackupex --copy-back /xtrabackup/2017-10-01_00-01-12
				修改权限
					chown -R mysql.mysql /var/lib/mysql/
				启动mysqld
					systemctl start mysqld
				通过binlog增量恢复(略)
				请思考能否直接还原到周三?

扩展

	案例1
		tar备份数据库(物理备份)
			注
				备份期间,服务不可用
			备份的过程
				1. 停止数据库
					systemctl stop mysqld
					mkdir /backup
						准备目录,放置备份数据。
				2. tar备份数据
					 tar -cf /backup/`date +%F`-mysql-all.tar /var/lib/mysql
						注:备份文件应该复制其它服务器或存储上
				3. 启动数据库
					systemctl start mysqld
			还原的过程
				1. 停止数据库
					systemctl stop mysqld
				2. 清理环境(模拟损坏)
					rm -rf /var/lib/mysql/*
				3. 导入备份数据
					tar -xf /backup/2016-12-07-mysql-all.tar -C /
						注意权限chown -R mysql.mysql
				4. 启动数据库
					systemctl start mysqld
				5. binlog恢复(略)
					注意,从备份点,到崩溃点 之间的数据无法回复,通过bin回复。
	案例2
		Lvm快照实现物理备份 + binlog(物理备份))
			lvm快照部分复习
				1.创建新的逻辑卷lv1
	pvcreate /dev/sdb
	vgcreate vg1 /dev/sdb
	lvcreate  -L 500M -n lv1 /dev/vg1
	
	mkdir /lv1
	
	mkfs.ext4 /dev/vg1/lv1 
	mount /dev/vg1/lv1  /lv1/
	df -hT
	
	2.为lv1分区,创建测试文件。
	dd if=/dev/zero of=/lv1/1.txt bs=1M count=400
	df -hT
	
	3.创建快照卷lv1-snap。
	lvcreate -L 200M -s -n lv1-snap /dev/vg1/lv1
	
	4。挂载快照卷。
	mount  /dev/vg1/lv1-snap  /lv1-snap/
	
	df -hT
	ls /lv1-snap/ /lv1 -l
	5.拷贝快照卷数据,并卸载快照卷。(略)


			Lvm快照实现mysql物理备份 + binlog(物理备份))
				注
					数据一致,服务可用
					MySQL数据lv 和 将要创建的snapshot 必须在同一VG,因此VG必须要有一定的剩于空间
				特点
					优点
						    几乎是热备 (创建快照前把表上锁,创建完后立即释放)
						    支持所有存储引擎
						    备份速度快
						    无需使用昂贵的商业软件(它是操作系统级别的)
					缺点
						    可能需要跨部门协调(使用操作系统级别的命令,DBA一般没权限)
						    无法预计服务停止时间
						    数据如果分布在多个卷上比较麻烦(针对存储级别而言)
				LVM备份MYSQL的前提(2选1)
					全新安装mysql在LVM卷
						1. 安装系统
						2. 准备LVM,例如 /dev/vg_tianyun/lv-mysql,mount /var/lib/mysql
						3. 安装MySQL,默认datadir=/var/lib/mysql
					将已运行mysql迁移到LVM卷
						请思考:将现在的数据迁移到LVM
						1. 准备lvm及文件系统
							 lvcreate -n lv-mysql -L 2G  vg1
								创建新的LVM分区
							mkfs.xfs /dev/vg1/lv-mysql
								文件系统
						2. 将数据迁移到LVM
							systemctl stop mysqld
							mount /dev/vg1/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
				创建库,表,记录用作恢复
				LVM快照备份流程
					1. 加全局读锁
						mysql> flush tables with read lock;
							1-3必须同一会话中完成
					2. 创建快照
						# lvcreate -L 500M -s -n lv-mysql-snap /dev/vg1/lv-mysql
						mysql -p'QianFeng@123'  -e 'show master status' > /backup/`date +%F`_position.txt
							查询二进制日志的位置,下次使用binlog 作为还原数据(最近一次备份点到崩溃点之间的数据)的依据。
					3. 释放锁
						mysql> unlock tables;
					4. 从快照中拷贝
						mount -o nouuid /dev/vg1/lv-mysql-snap /mnt/
							如果是xfs文件系统:请使用额外选项-o ro,nouuid
						cd /mnt/
						tar -cf /backup/`date +%F`-mysql-all.tar ./*
							快照的使命结束。删除快照。
					5. 移除快照
						cd; umount /mnt/
						 lvremove -f   /dev/vg1/lv-mysql-snap
					shell脚本解决示例(略)
						[root@localhost ~]# echo "FLUSH TABLES WITH READ LOCK; 
	SYSTEM lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql; 
	UNLOCK TABLES;" | mysql -p'QianFeng@123'
							UNLOCK TABLES;可以不用输入
				LVM快照恢复流程
					1. 停止数据库,也可以找个新库。
						systemctl stop mysqld
					2. 清理环境
						rm -rf  /var/lib/mysql/* 
					3. 导入数据
						 tar -xf /backup/2016-12-07-mysql-all.tar -C /var/lib/mysql/
					4. 修改权限
						chown -R  mysqlmysql  /var/lib/mysql/
					5. 启动数据库
						systemctl start mysqld
					6. binlog恢复(略)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值