实验:恢复误删除的数据库到最新状态

第一步:衡量误删除数据库与其它数据库2是否有重要关系  
停止数据库的访问

第二步:查看全备份的时间点(master-data 二进制日志文件备份的时间点)

1 完全备份 (-F 每备份一个数据库就生成一个二进制日志文件)
mysqldump -A -F --master-data=1(主从复制建议加1) --single-transaction(确保数据库操作一致) > /app/all-`date +%F%T`.sql

2 对数据库修改
insert
drop database hellodb;

3 发现问题

mysql>flush tables with read lock;
iptables 禁止其它用户访问

4 查看完全备份的位置
less /app/all-2018-02-2309\:48\:53.sql 
CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000008', MASTER_LOG_POS=245;

5 flush logs 生成新日志文件

6 备份日志文件
cp /var/lib/mysql/mariadb-bin.000008 /app/
mysqlbinlog --start-position=245  mariadb-bin.000008  > /app/bin.sql
mysqlbinlog  mariadb-bin.000009 >> /app/bin.sql

7 vim /app/bin.sql
删除drop database hellodb; 此命令

8 mysql>set sql_log_bin=0;   后续还原不记录二进制文件

9 mysql>unlock tables;

10 mysql> source /app/all-2018-02-2309\:48\:53.sql 

11 mysql> source /app/bin.sql

12 mysql>set sql_log_bin=1;

13 iptables 恢复用户访问

flush logs

实验:基于LVM的备份还原

准备阶段
fdisk /dev/sda
partprobe

pvcreate /dev/sda6
vgcreate vg0 /dev/sda6
lvcreate -n mysqldata -L 2G vg0
lvcreate -n binlogs -L 3G vg0

剩余5G用来放快照
mkfs.xfs /dev/vg0/mysqldata
mkfs.xfs /dev/vg0/binlogs
mkdir /data{mysqldata,binlogs} -pv
vim /etc/fstab
UUID=4a9ba44e-4f5b-40f4-95e5-f48deda9d800 /data/mysqldata xfs defaults 0 0 
UUID=3f2eaf34-9c93-4540-b731-46b324e10bc2 /data/binlogs xfs defaults 0 0

chown mysql.mysql /data/      更改权限
vim /etc/my.cnf
[mysqld]
datadir=/data/mysqldata
socket=/var/lib/mysql/mysql.sock
log-bin=/data/binlogs/mysql-bin

systemctl start mariadb

1 分离数据和binlog到各自的逻辑卷
 binlogs         mysqldata

vim /etc/my.cnf
datadir=/data/mysqldata
socket=/var/lib/mysql/mysql.sock
log-bin=/data/binlogs/mysql-bin

2  请求锁定所有表
mysql> FLUSH TABLES WITH READ LOCK;

3记录二进制日志文件及事件位置
mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER logs' > /PATH/TO/SOMEFILE(/app/pos.log)
4 创建快照(注意创建快照的二进制日志文件位置)
lvcreate -L #(2G) -s -p r -n NAME(mysqldata-snapshot) /DEV/VG_NAME/LV_NAME(/dev/vg0/mysqldata)
删除hellodb.学生表
5 释放锁
mysql> UNLOCK TABLES;
6挂载快照卷,执行数据备份
mount -o nouuid(不检查UUID),norecovery /dev/vg0/mysqldata-snapshot  /mnt/snap
cp -a /mnt/snap/*  /backups/  (通常备份到远程主机)

7备份完成后,删除快照卷
umount /mnt/snap
lvremove /dev/vg0/mysqldata-snapshot
8 破坏数据库
systemctl stop mariadb
rm -rf /data/mysqldata/*

9 还原
cp -a   /backups/* /data/mysqldata/
system start mariadb

10 binlog还原

cp /data/binlogs/mysql-bin.00000{4,5} /app/ -a
mysql>flush tables with read lock; (停止客户对数据库更改,还原到数据库的最新状态)
mysqlbinlog  --start-position=245 mysql-bin.000004 > bin.sql
mysqlbinlog   mysql-bin.000005 >> bin.sql

>set sql_log_bin=0;

MariaDB [(none)]> unlock tables;
MariaDB [(none)]>source /app/bin.sql
MariaDB [(none)]>>set sql_log_bin=1;

mysqldump 工具做完全备份速度很慢,所以对大型数据库做备份就不适合,而且它是通过select查询数据库数据然后导出到文本文件中

xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份 
一个线程复制 redo log 也即事务日志   /data/mysqldata/ib_logfile0
一个线程复制 idb 数据库数据

yum install percona-xtrabackup-24   解决装包的依赖性

xtrabackup工具对于innodb引擎面向磁盘文件的数据块进行复制,而对于MYISAM引擎是磁盘单个文件进行复制

innobackupex 是基于xtrabackup的封装

--apply-log:  用于解决在某个时间点存在一半的事务,这时需要回滚事务,保存事务的一致性

lsn(log sequence number)  数据库日志文件在磁盘的序列号:数据库文件中每个数据块都有编号

实验:完全备份及还原

1 在原主机 
 innobackupex --user=root /backups
scp -r /backups/2018-02-23_11-55-57/ 192.168.27.17:/app/ 

2 在目标主机
vim /etc/my.cnf
innodb_file_per_table
log-bin

innobackupex --apply-log /app/2018-02-23_11-55-57/   整理数据库数据,对于不完整的事务需回滚
systemctl stop mariadb
rm  -rf /var/lib/mysql/*
innobackupex  --copy-back /app/2018-02-23_11-55-57/
chown -R mysql.mysql /var/lib/mysql/
systemctl start mariadb

实验:完全,增量备份及还原

1 在原主机
innobackupex  /backups
mkdir /backups/inc{1,2} 
insert students (name,age,gender)values('a',29,'F');
innobackupex  --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42
insert students (name,age,gender)values('b',20,'M');
innobackupex  --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17
scp -r /backups/ 192.168.27.17:/app/

2 在目标主机
不启动mariadb
rm -rf /var/lib/mysql/*
整理完全备份
innobackupex  --apply-log --redo-only /app/backups/2018-02-23_14-21-42/
将第一次增量备份合并到完全备份中
innobackupex  --apply-log --redo-only /app/backups/2018-02-23_14-21-42/ --incremental-dir=/app/backups/inc1/2018-02-23_14-26-17
将第二次增量备份合并到完全备份中
innobackupex  --apply-log --redo-only /app/backups/2018-02-23_14-21-42/ --incremental-dir=/app/backups/inc2/2018-02-23_14-28-29/

ls /var/lib/mysql/   保证数据库数据目录为空
innobackupex  --copy-back /app/backups/2018-02-23_14-21-42/
chown -R mysql.mysql /var/lib/mysql/
systemctl start mariadb

MariaDB-server.x86_64_10.2.13  默认支持innodb_file_per_table
实验:单表导出和导入

1 单表备份 (数据库版本必须在5.6版本以上)
备份表数据
innobackupex  --include='hellodb.students' /backups
备份表结构
2 、mysql -e 'show create table hellodb.students' > student.sql
student.sql文件挑选下面内容
 CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

3 删除表
mysql -e 'drop table  hellodb.students'
整理数据库数据并导出会使数据库文件目录发生变化
4 innobackupex  --apply-log --export /backups/2018-02-23_15-03-23/
还原:
创建表结构
5 mysql>
 CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8

表空间:存放数据库表数据 
5 alter table students discard tablespace;  删除students.ibd文件

6 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/

7 chown -R mysql.mysql /var/lib/mysql/hellodb/
将数据库的表数据与表结构关联起来
8 mysql>alter table students import tablespace;
mysql>select * from students;