############################

增量备份与增量恢复

(1)启用binlog日志,实现增量备份
binlog日志: 二进制日志,是mysql数据库服务日志的一种,记录连接服务器后,执行的除查询之外的sql命令。
(a)增量备份
启用binlog日志
/etc/my.cnf
[mysqld]
server_id=11    /1-255,一般为ip地址主机位 
log-bin=/目录/文件名   /目录默认在/var/lib/mysql 在恢复过程中需要读取此目录下文件,所以需要目录拥有权限 chown mysql /目录
			  / 文件名默认 主机名-bin.[000001] > 500M时,产生新的文件
binlog_format="mixed"   /设置日志文件的记录格式。不设置只能看到文件变化,无法看见是何种sql命令

log-bin=文件名      /可以不修改默认目录,只修改文件名。不能只修改默认目录
systemctl restart mysqld

日志索引文件: 主机名-bin.index  记录当前已有的binlog日志文件名。
查看binlog日志
mysqlbinlog  /目录/文件

binlog日志文件记录sql命令的方式:
时间点
pos  /偏移量

(b)binlog增量恢复
mysqlbinlog [选项] binlog日志文件 | mysql -uroot -pabc123
[选项]
--start-datetime="yyyy-mm-dd hh:mm:ss" --stop-datetime="yyyy-mm-dd hh:mm:ss"
--start-position=偏移量 --stop-position=偏移量
#mysqlbinlog --start-position=254 --stop-positon=689 /var/lib/mysql/mysql-bin.000001 | mysql -uroot -pabc123

生成新的binlog日志
>flush logs;
mysql -uroot -pabc123 -e "flush logs"
mysqldumo --flush-logs
systemctl restart mysqld

删除binlog日志
>purge master logs to binlog日志文件;  /删除早于指定版本的binlog日志
>reset master   /删除所有binlog日志,重新创建新日志

##########################################

Percona XtraBackup 备份

使用第三方软件提供的命令innobackupex做增量备份
备份过程中不会锁表,适合生产环境
但是只适用于存储引擎为 innodb
(a)安装软件包
rpm -ivh percona...
(b)命令格式
#innobackupex 选项    /man innobackupex
[选项]
--user
--password
--databases
--no-timestamp    /不用日期命名备份文件储存的子目录
--apply-log       /准备换原(日志回滚)
--copy-back		/恢复数据
--increment 目录名 	/增量备份
--increment-basedir=目录名  /增量备份时,指定上一次备份数据存储的目录名
事务日志文件: ibdata
LSN 日志序列号
ib_logfile0   sql 命令
ib_logfile1

完全备份
#innobackupex --user root --password abc123 --databases="系统库 存储数据库"  备份目录
#innobackupex --user root --password abc123 --databases="mysql sys performance_schema teadb" /allbak --no-timestamp

完全恢复数据
#innobackupex --user root --password abc123 --databases="mysql sys performance_schema teadb" --apply-log /allbak 
#innobackupex --user root --password abc123 --databases="mysql sys performance_schema teadb" --copy-back /allbak

增量备份(必须先有一次备份,通常会先做一次完全备份)
#innobackupex --user root --password abc123 --databases="系统库 存储数据库"  /allbak --no-timestamp
vim /allbak/xtrabackup_checkpoints  查看序列号lsn
#innobackupex  --user root --password abc123 --databases="系统库列表   存储数据库"  --incremental /newdir1  --incremental-basedir=/allbak  --no-timestamp
vim /newdir1/xtrabackup_checkpoints  查看序列号lsn
#innobackupex  --user root --password abc123 --databases="系统库列表   存储数据库"  --incremental /newdir2  --incremental-basedir=/newdir1  --no-timestamp
vim /newdir2/xtrabackup_checkpoints  查看序列号lsn
每一次增量备份都是在上次备份的基础上进行备份 所以--incremental-basedir=目录名  这个目录名是上次备份的目录名

增量恢复
#innobackupex --user root --password abc123 --databases="系统库 存储数据库" --appy-log --redo-only /allbak
#vim /allbak/xtrabackup_checkpoints  查看序列号lsn
#innobackupex --user root --password abc123 --databases="系统库 存储数据库" --apply-log --redo-only /allbak --incremental-dir=/newdir1
#vim /allbak/xtrabackup_checkpoints  查看序列号lsn
#innobackupex --user root --password abc123 --databases="系统库 存储数据库" --apply-log --redo-only /allbak --incremental-dir=/newdir2
#vim /allbak/xtrabackup_checkpoints  查看序列号lsn

#innobackupex --user root --password abc123 --databases="系统库 存储数据库" --copy-back /allbak
增量恢复就是把增量备份的部分一次一次还原到第一次备份的过程

########################################

使用完全备份文件恢复单个表

(a)完全备份
#innobackupex --user root --password abc123 --databases="系统库 存储数据库"  /allbak --no-timestamp
(b)模拟环境
#drop table gamedb.t1
(c)按照源表结构创建表t1
#create table gamedb.t1(age int)
(d)从备份文件中导出表信息
#innobackupex --user root --password abc123 --databases="系统库 存储数据库" --apply-log /allbak
(e)删除表空间
#mysql>alter table t1 discard tablespace;
#cp /allbak/gamedb/t1.{exp,cfg,idb} /var/lib/mysql/gamedb
#chown mysql:mysql /var/lib/gamedb/t1.*
(f)导入表空间
#mysql>alter table t1 import tablespace
#select * from gamedb.t1