Mysql数据库的备份与还原🍃
备份对于数据库而言是至关重要的。当数据文件发生损坏、MySQL服务出现错误、系统内核崩溃、计算机硬件损坏或者数据被误删等事件时,使用一种有效的数据备份方案,就可以快速解决以上所有的问题。MySQL提供了多种备份方案,包括:逻辑备份、物理备份、全备份以及增量备份,你可以选择最适合自己使用的方式备份数据。
物理备份通过直接复制包含有数据库内容的目录与文件实现,这种备份方式适用于对重要的大规模数据进行备份,并且要求实现快速还原的生产环境。典型的物理备份就是复制 MySQL数据库的部分或全部目录,物理备份还可以备份相关的配置文件。但采用物理备份需要MySQL处于关闭状态或者对数据库进行锁操作,防止在备份的过程中改变发送数据。物理备份可以使用mysqlbackup对InnoDB数据进行备份,使用mysqlhotcopy对MyISAM数据进行备份。另外,也可以使用文件系统级别的cp、scp、tar、rsync等命令。
逻辑备份通过保存代表数据库结构及数据内容的描述信息实现,如,保存创建数据结构以及添加数据内容的SQL语句,这种备份方式适用于少量数据的备份与还原。逻辑备份需要查询MySQL服务器获得数据结构及内容信息,因为需要查询数据库信息并将这些信息转换为逻辑格式,所以相对于物理备份而言比较慢。逻辑备份不会备份日志、配置文件等不属于数据库内容的资料。逻辑备份的优势在于不管是服务层面、数据库层面还是数据表层面的备份都可以实现,由于是以逻辑格式存储的,所以这种备份与系统、硬件无关。
全备份将备份某一时刻所有的数据,增量备份仅备份某一段时间内发生过改变的数据。通过物理或逻辑备份工具就可以完成完全备份,而增量备份需要开启MySQL二进制日志,通过日志记录数据的改变,从而实现增量差异备份。
mysqldump参数大全:https://blog.51cto.com/SongR/7092848
percona-xtrabackup官方站点:https://www.percona.com/
备份🍃
关于备份的原因⭐
防止丢失和误删
备份的目标⭐
1.数据的一致性
2.服务的可用性
备份技术⭐
物理备份/冷备份
直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但是不能恢复到不同的MySQL版本。
tar cp scp
拷贝数据的 优点 快
缺点 服务停止 后才可拷贝
逻辑备份/热备份
备份的是建表,建库,插入等操作所执行SQL语句(DDL DML DCL), 适用于中小型数据库。
mysqldump mydumper
效率相对比较低
备份种类⭐
完全备份
土财主专用(金融)
增量备份
连续回复
特点:
因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
差异备份
跳跃恢复
特点:
占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后 一次的差异版本(包含所有的差异),恢复速度介于完整备份和增量备份之间。
还原🍃
percona-xtrabackup 🍃
Percona XtraBackup是一个开源的MySQL数据库热备工具,允许你在备份的时候不锁表。支持备份的存储引擎有InnoDB, XtraDB, MyISAM ;支持的MySQL版本 5.1 5.5, 5.6 , 5.7;无论是7X24的高负载数据库环境,还是低TPS的数据库环境,Percona XtraBackup都能完成备份而不影响生产环境
Percona XtraBackup是世界上唯一开源免费的MySQL热备工具,可以对InnoDB 和 XtraDB存储引擎的表进行非堵塞备份。
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本--percona Server。并围绕percona Server还发布了一系列的mysql工具。
特点**⭐**
1 快速可靠完成备份
2 备份期间不会打断正在进行的事务
3 由于有压缩备份选项可以节省磁盘空间和网络带宽
4 自动的备份校验
5 更快的恢复速度,更短的恢复时间
备份过程**⭐**
1.首先拷贝Innodb表的数据文件(利用两个进程 一个拷贝文件一个拷贝变化)
2.如果支持 backup lock,利用LOCK TABLE FOR BACKUP拷贝非Innodb表的数据文件(percona MySQL 5.6+ 支持oracle的MySQL支持吗?)
3.使用 LOCK BINLOG FOR BACKUP 禁止所有改变Exec_Master_Log_Pos 或 Exec_Gtid_Set的操作。完成redo log的备份和获取binlog的日志中的坐标输出到备份目录。然后释放锁
实例**⭐**
1-1 完全备份流程
#连接数据库,开始备份。
innobackupex --user=root --password='QianFeng@123' /xtrabackup/full
#查看备份目录。数据库,配置文件,日志文件
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
#生成回滚日志(指定备份点)
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;
sqlmysql> select * from test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
#完整备份(周一)
sqlrm -rf /xtrabackup/* ; date 09010000 innobackupex --user=root --password='QianFeng@123' /xtrabackup ll /xtrabackup/
#增量备份(周二)
TypeScriptdate 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/
2-2 增量恢复流程
#停止数据库
systemctl stop mysqld
#清理环境
rm -rf /var/lib/mysql/*
#周一
innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04 回滚合并
#周二
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,怎么办
sqlsystemctl 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'