、 数据的备份恢复

  • mysqldump (逻辑备份 只可全备)

  • mysqlbinlog(逻辑备份)

  • xtrabackup(物理备份 全备,增量,差异)

物理备:直接复制数据文件进行备份,占用空间大,速度快

逻辑备:从数据库中'导出'进行备份,占用空间小,速度慢,有可能丢失精度

mysqldump

ps:mysqldump是以覆盖的形式恢复数据

#用法

Usage: mysqldump [OPTIONS] database [tables]  #还原时需手动创建库
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

#连接数据库端口号
--port, -P

#指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock
--socket, -S

#指定数据库
--database,  -B

#所有数据库中的所有表。与使用---database选项相同,在命令行中命名所有数据库
--all--database,-A

# 导出全部数据 --all-databases, -A
mysqldump -uroot -p -A > mysql.sql

#不加参数备份(备份表,但是不会备份库,恢复时要手动创建库)
mysqldump -uroot -p test > /tmp/test.sql

#导出指定数据库信息 --databases, -B (只能指定库,不能指定表)
mysqldump -uroot -p -B test>mysql.sql

#指定需要导出的表名
--tables
mysqldump   -h127.0.0.1 -uroot -ppasswd -B  test --tables test >mysql.sql

#导出某张表的某个字段(使用 where 条件的时候,引号是必须的。where 条件的使用和 sql 语句中 where 是相同的。)
-w, --where="name"

#备份触发器数据(有则备份)。该选项默认启用;用--skip-triggers禁用它
--triggers

#不查询缓存,直接输出,加快备份速度 (defaults to on ,--skip-quick to disable)
--quick, -q

#忽略错误继续执行
--force, -f

#使用16进制转储二进制列,当有BINARY,VARBINARYY,BLOB,BIT的数据类型时使用,防止乱码
--hex-blob

#不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。
--ignore-table
例如:--ignore-table=database.table1 --ignore-table=database.table2 ……

#备份事件
--events, -E

#在每个CREATE DATABASE语句前添加DROP DATABASE语句
--add-drop--database

#导出全部表空间
--all-tablespaces , -Y

#在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用–skip-add-locks取消选项)
--add-locks

#仅备份表结构
--no-data, -d 

#不导出任何数据,只导出数据库表结构。
--no-create-info, -t 

#备份函数和存储过程(有则备份)
--routines, -R 

#设置默认字符集,默认值为utf8
--default-character-set

#备份时刷新binlog
-F --flush-logs (备份时刷新binlog (每个库1次)配合--databse|--all-database 时会多次刷新,可以通过--single-transaction| -x ,--master-data 一起使用此时之刷新一次binlog)
mysqldump -uroot -p -A -F > /tmp/full.sql

#用于在master端dump数据,用于建立slave,备份时加入change master语句 0 没有,1不注释,2注释(备份时记录binlog的文件和新增数据的起点) 添加从库时设置为1 让从库和主库的文件和位置点一致 (Mysqldump 8.0.26以后为 source-data )

--master-data=1 将change master 语句写入dump文件中在从库导入后,配置主从无需再指定文件名和位置
--master-data=2 将change master 语句写入dump文件中,只不过会被注释掉在从库导入后,配置主从需要指定文件名和位置(会自动关闭--Lock-tables,开启-x全局读锁,除非加上--single-transaction)

#用户在slave端dump数据,建立新的slave,至少是第2个slave,也就是已经有A-->B,现在从B上导出数据建立A-->C的复制
--dump-slave=1 |--source-data=1 直接导入备份文件,start slave不需要指定file和position
--dump-slave=2 |--source-data=2 file和position是被注释掉的,需要手动指定file和position


mysqldump -uroot -p -A -R --triggers --master-data=2 > /tmp/full.sql (温备可读不可写)

--single-transaction (以事务的方式开启备份,备份前会先执行begin开启事务, 又称快照备份,把当前要备份的数据做瞬间做快照(其实就是记录binlog日志的结束位置点和文件),只备份快照内的数据适用于innodb,不适用myisam)
mysqldump -uroot -p -A -R --triggers --single-transaction --master-data=2 > /tmp/full.sql (热备可读可写)



-gzip 压缩备份
mysqldump -uroot -p -A -R --triggers --single-transaction --master-data=2 |gzip > /tmp/full.sql.gz(热备压缩)

#不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。
例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump  -h127.0.0.1 -uroot -ppasswd -A  --ignore-table=mysql.user > mysql.sql


#不导出任何数据,只导出数据库表结构。
--no-data, -d
mysqldump  -h127.0.0.1 -uroot -ppasswd -A  -d > mysql.sql


#提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭--single-transaction 和--lock-tables 选项。
--lock-all-tables,  -x
例如:
mysqldump -h127.0.0.1 -uroot -ppasswd -A  -x > mysql.sql
mysqldump -AR -uroot -p --socket=/data/mysqldata/mysql.sock  --triggers -x | gzip >./sql_full_$(date +%F_%X).sql.gz 

#对于每个要备份的数据库,在启动备份前分别锁定其所有表,默认为on,可以使用--skip-lock-tables禁用(多库备份时,只会对当前备份库中所有表进行锁定,其余表不受影响,当前库备份完成后会解锁,然后对下一个备份库加锁)
--lock-tables, -l

#分库备份脚本测试
#!/bin/bash

Mysql_user=root
Mysql_password=USER_PASSWORD
Mysql_sock=/data/mysqldata/mysql.sock
Data_dir=/backup

if  [ ! -d ${Data_dir} ];then
  mkdir -p {Data_dir}
fi

for db in `mysql -u${Mysql_user} -p${Mysql_password} -e "show databases"`; do  
  if [[ "$db" =~ ^(info|sys|perf).* ]]; then
	 continue 
  else  
	 mysqldump  -u${Mysql_user} -p${Mysql_password} -S ${Mysql_sock} --single-transaction -F -B $db |gzip >  ${Data_dir}/${db}_`date +%F_%H:%M:%S`.sql.gz" 
  fi
done

企业故障恢复案例

背景:
正在运行的网站系统,MySQL数据库,数据量20G,日业务增量10-15M。

备份策略:
每天00:00,计划任务调用mysqldump执行全备脚本

故障时间点:
上午10点误删除一个核心业务表

思路:

1)停对外业务避免数据的二次伤害
2)找一个临时的库,恢复前一天的全备数据
3)截取前一天00:00到第二天10点误删除之间的binlog,恢复到临时库
4)测试可用性和完整性
5)开启业务前的两种方式

a.直接使用临时库顶替原生产库,前端应用割接到新库
b.将误删除的表单独导出,然后导入到原生产环境

6)开启业务

模拟演练

准备环境

创建数据库和表
create database backup;
create table t1 select * from test.student;
create table t2 select * from test.student;
create table t3 select * from test.student;
create table t4 select * from world.city;

全备数据
mysqldump -uroot -pecho  -A -R  --triggers  --single-transaction --master-data=2 | gzip > /tmp/full_$(date +%F).sql.gz

模拟数据变化

create table user select * from mysql.user;
create table country select * from world.country;
update t4 set countrycode='CHN' where 1=1;
delete from t4 where id>200;
drop table t4;
drop table user;

开始恢复

首先停止对外服务
systemctl stop nignx php tomcat

准备一个新库
修改 新库配置文件 将binlog改为row模式(与故障机一致)
binlog-format=row
mysqld_safe --defaults-file=/data3309/my.cnf & #启动一个新实例
zcat /tmp/full_2021-07-04.sql.gz > /tmp/full_2021-07-04.sql #解压数据
mysql -uroot -p -S /data3309/data/mysql.sock  <  /tmp/full_2021-07-04.sql #导入全备数据
mysql -uroot -p -S /data3309/data/mysql.sock #连接3309查看已导入数据

截取3306 binlog数据

1).找起点(查看全备的数据文件)
 cat /tmp/full_2021-07-04.sql|more
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000005', MASTER_LOG_POS=136030;

2).找终点
mysqlbinlog --base64-output=decode-rows -vvv /data/mysql_bin.000005 | tail -200 | grep -C5 -i  "drop"
终点为 535950

3).开始截取
 mysqlbinlog --start-position=136030 --stop-position=535950 /data/mysql_bin.000005 > /tmp/mysql.sql

导入数据
mysql -uroot -p -S /data3309/data/mysql.sock
set sql_log_bin=0 临时关闭binlog
source /tmp/mysql.sql

将误删除的表单独导出,然后导入到原生产环境
mysqldump -uroot -p -S /data3309/data/mysql.sock -B backup --tables user > /tmp/user.sql 导出数据
 
 mysql -uroot -p backup < /tmp/user.sql 导入到源数据库


xtrabackup安装使用(物理备份)

安装:

#下载xtrabackup 包
wget -c https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.23/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm
#安装包(需要安装依赖)
yum localinstall -y percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm #(解决依赖安装)

[innobackupex参数说明]

​ 常用参数

    --user:该选项表示备份账号。
    --password:该选项表示备份的密码。
    --port:该选项表示备份数据库的端口。
    --host:该选项表示备份数据库的地址。
    --socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql。
    --defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。
    --databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"db1 db2",同时,在指定某数据库时,也可以只指定其中的某张表。  如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。

  压缩参数
    --compress:该选项表示压缩innodb数据文件的备份。
    --compress-threads:该选项表示并行压缩worker线程的数量。
    --compress-chunk-size:该选项表示每个压缩线程worker buffer的大小,单位是字节,默认是64K。

  加密参数
    --encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256。
    --encrypt-key:该选项使用合适长度加密key,因为会记录到命令行,所以不推荐使用。
    --encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base64 24。
    --encrypt-threads:该选项表示并行加密的worker线程数量。
    --encrypt-chunk-size:该选项表示每个加密线程worker buffer的大小,单位是字节,默认是64K。

  增量备份参数
    --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir。
    --incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用。
    --incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用。
    --incremental-dir:该选项表示增量备份的目录。
    --incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页。
    --incremental-history-name:该选项表示存储在PERCONA_SCHEMA.xtrabackup_history基于增量备份的历史记录的名字。Percona Xtrabackup搜索历史表查找最近    (innodb_to_lsn)成功备份并且将to_lsn值作为增量备份启动出事lsn.与innobackupex--incremental-history-uuid互斥。如果没有检测到有效的lsn,xtrabackup会返回error。
    --incremental-history-uuid:该选项表示存储在percona_schema.xtrabackup_history基于增量备份的特定历史记录的UUID。

  主从
    --slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。
    --safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。

    --include:该选项表示使用正则表达式匹配表的名字[db.tb],要求为其指定匹配要备份的表的完整名称,即databasename.tablename。
    --tables-file:该选项表示指定含有表列表的文件,格式为database.table,该选项直接传给--tables-file。
    --no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。
    --rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用。
    --stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。
    --ibbackup:该选项指定了使用哪个xtrabackup二进制程序。IBBACKUP-BINARY是运行percona xtrabackup的命令。这个选项适用于xtrbackup二进制不在你是搜索和工作目录,如果指定了该选项,innoabackupex自动决定用的二进制程序。
    --kill-long-queries-timeout:该选项表示从开始执行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的这些查询之间等待的秒数。默认值为0,不会kill任何查询,使用这个选项xtrabackup需要有Process和super权限。
    --kill-long-query-type:该选项表示kill的类型,默认是all,可选select。
    --ftwrl-wait-threshold:该选项表示检测到长查询,单位是秒,表示长查询的阈值。
    --ftwrl-wait-query-type:该选项表示获得全局锁之前允许那种查询完成,默认是ALL,可选update。
    --galera-info:该选项表示生成了包含创建备份时候本地节点状态的文件xtrabackup_galera_info文件,该选项只适用于备份PXC。
    --defaults-extra-file:该选项指定了在标准defaults-file之前从哪个额外的文件读取MySQL配置,必须在命令行的第一个选项的位置。一般用于存备份用户的用户名和密码的配置文件。
    --defaults-group:该选项表示从配置文件读取的组,innobakcupex多个实例部署时使用。
    --no-lock:该选项表示关闭FTWRL的表锁,只有在所有表都是Innodb表并且不关心backup的binlog pos点,如果有任何DDL语句正在执行或者非InnoDB正在更新时(包括mysql库下的表),都不应该使用这个选项,后果是导致备份数据不一致,如果考虑备份因为获得锁失败,可以考虑--safe-slave-backup立刻停止复制线程。
    --tmpdir:该选项表示指定--stream的时候,指定临时文件存在哪里,在streaming和拷贝到远程server之前,事务日志首先存在临时文件里。在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
    --history:该选项表示percona server 的备份历史记录在percona_schema.xtrabackup_history表。 --close-files:该选项表示关闭不再访问的文件句柄,当xtrabackup打开表空间通常并不关闭文件句柄目的是正确的处理DDL操作。如果表空间数量巨大,这是一种可以关闭不再访问的文件句柄的方法。使用该选项有风险,会有产生不一致备份的可能。
    --compact:该选项表示创建一份没有辅助索引的紧凑的备份。
    --throttle:该选项表示每秒IO操作的次数,只作用于bakcup阶段有效。apply-log和--copy-back不生效不要一起用。

备份方式(物理备份)

1)对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。
2)对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。
3)备份时读取配置文件/etc/my.cnf

备份时刻,立即将已经commit过的内存中的数据页刷新到磁盘

备份时刻有可能会有其他数据写入,已备走的数据文件就不会再发生变化了

在备份过程中,备份软件会一直监控着redo和undo,一旦有变化会将日志一并备走

全备使用:

innobackupex --user=root --socket=/data/mysql.sock --password=echo /backup

innobackupex --user=root --socket=/data/mysql.sock --password=echo --no-timestamp /backup/full #不让目录按时间命名(全备)


[root@db02 full]\# ll /backup/full/
total 180252
drwxr-x--- 2 root root       202 Jul  5 21:56 backup                
-rw-r----- 1 root root       494 Jul  5 21:56 backup-my.cnf   mysql配置文件中默认参数      
-rw-r----- 1 root root  79691776 Jul  5 21:56 ibdata1         共享表空间
-rw-r----- 1 root root 104857600 Jul  5 21:56 ibdata2         共享表空间(undo)
drwxr-x--- 2 root root      4096 Jul  5 21:56 mysql
drwxr-x--- 2 root root      4096 Jul  5 21:56 performance_schema
drwxr-x--- 2 root root       204 Jul  5 21:56 test
drwxr-x--- 2 root root       184 Jul  5 21:56 world
-rw-r----- 1 root root        21 Jul  5 21:56 xtrabackup_binlog_info       记录binlog名和位置点
-rw-r----- 1 root root       141 Jul  5 21:56 xtrabackup_checkpoints      记录备份信息 
-rw-r----- 1 root root       513 Jul  5 21:56 xtrabackup_info           备份汇总信息
-rw-r----- 1 root root      2560 Jul  5 21:56 xtrabackup_logfile          redo


[root@db02 full]\# cat xtrabackup_checkpoints 
#备份类型:full全备
backup_type = full-backuped
#日志版本号 备份到哪
from_lsn = 0
to_lsn = 554795923
#更新到哪
last_lsn = 554795923
compact = 0
recover_binlog_info = 0
flushed_lsn = 554795923


[root@db02 full]# cat xtrabackup_info 
#记录当前实例的uuid
uuid = db1c00df-dd98-11eb-b558-000c299bba30
name = 
#记录用什么工具备份 命令,参数,版本
tool_name = innobackupex
tool_command = --user=root --socket=/data/mysql.sock --password=... --no-timestamp /backup/full
tool_version = 2.4.23
ibbackup_version = 2.4.23
server_version = 5.6.40-log
#备份开始结束时间
start_time = 2021-07-05 21:56:51
end_time = 2021-07-05 21:56:54
#锁定时间
lock_time = 0
#binlog位置点
binlog_pos = filename 'mysql_bin.000008', position '120'
#日志版本号 备份到哪
innodb_from_lsn = 0
innodb_to_lsn = 554795923
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N


全备恢复

准备备份

将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚 ,模拟CSR的过程

[root@db01 full]\#  innobackupex --user=root --password=echo --apply-log  /backup/full #模拟csr过程

[root@db02 ~]# ll /backup/full/
total 299040
drwxr-x--- 2 root root       202 Jul  5 21:56 backup
-rw-r----- 1 root root       494 Jul  5 21:56 backup-my.cnf
-rw-r----- 1 root root  79691776 Jul  5 22:23 ibdata1
-rw-r----- 1 root root 104857600 Jul  5 22:23 ibdata2
-rw-r----- 1 root root  50331648 Jul  5 22:23 ib_logfile0
-rw-r----- 1 root root  50331648 Jul  5 22:23 ib_logfile1
-rw-r----- 1 root root  12582912 Jul  5 22:23 ibtmp1
drwxr-x--- 2 root root      4096 Jul  5 21:56 mysql
drwxr-x--- 2 root root      4096 Jul  5 21:56 performance_schema
drwxr-x--- 2 root root       204 Jul  5 21:56 test
drwxr-x--- 2 root root       184 Jul  5 21:56 world

备份恢复

前提1:被恢复的目录是空的
前提2:被恢复的数据库的实例是关闭的

basedir = /usr/local/mysqld
datadir = /data

[root@db01 full]\# /etc/init.d/mysqld stop #停库  保证被恢复的数据库的实例是关闭的
                   
[root@db01 full]\#  cd /data/ #进入数据目录
[root@db01 full]\#  mv /data/ /tmp #移动下现有数据目录 保证被恢复的目录是空的
[root@db01 full]\# innobackupex --copy-back /backup/full 将数据copy回/data目录下(前提:因为xtrabackup会读取配置文件,所以要指定好basedir和 datadir路径 也可以手动cp )
[root@db01 full]\# chown -R mysql.mysql /data #修改权限

增量备份和恢复

备份方式

1)基于上一次备份进行增量
2)增量备份无法单独恢复,必须基于全备进行恢复
3)所有增量必须要按顺序合并到全备当中

模拟实验

先做一次增量备份
innobackupex --user=root --password=echo --no-timestamp /backup/full

模拟第一次数据变化

mysql> create database data1;
mysql> use data1
mysql> create table t1(id int);
mysql> insert into t1 values (1),(2),(3),(4);
mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

进行第一次增备

innobackupex --user=root --password=echo --no-timestamp (不以时间名) --incremental(增量备份打开) --incremental-basedir=/backup/full (incremental-basedir=/backup/full 上次备份的目录)  /backup/inc1  

 innobackupex --user=root --password=echo --no-timestamp --incremental --incremental-basedir=/backup/full  /backup/inc1 #增量备份
 
 [root@db02 backup]# ll
total 0
drwxr-x--- 7 root root 244 Jul  6 21:02 full
drwxr-x--- 8 root root 309 Jul  6 21:13 inc1

[root@db02 backup]\# cat full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 554815036    结束位置
last_lsn = 554815036
compact = 0
recover_binlog_info = 0 
flushed_lsn = 554815036

[root@db02 backup]\#  cat inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 554815036  增备开始位置
to_lsn = 554820687
last_lsn = 554820687
compact = 0
recover_binlog_info = 0
flushed_lsn = 554820687
 

模拟第二次数据变化

mysql> create database data2;
mysql> use data2
mysql> create table t2(id int);
mysql> insert into t2 values (1),(2),(3),(4);
mysql> select * from t2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

进行第二次增量备份

[root@db02 backup]\# innobackupex --user=root --password=echo  --no-timestamp  --incremental --incremental-basedir=/backup/inc1 /backup/inc2

[root@db02 backup]\# cat inc1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 554815036
to_lsn = 554820687   *******
last_lsn = 554820687
compact = 0
recover_binlog_info = 0
flushed_lsn = 554820687

root@db02 backup]\# cat inc2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 554820687   *******
to_lsn = 554826923
last_lsn = 554826923
compact = 0
recover_binlog_info = 0
flushed_lsn = 554826923

破坏数据

[root@db02 backup]\# /etc/init.d/mysqld stop
[root@db02 backup]\# rm -rf /data

恢复数据

准备备份

1)full+inc1+inc2
2)需要将inc1和inc2按顺序合并到full中
3)分步骤进行--apply-log

在全备中apply-log时,只做redo,不做undo(不管有多少次增备) 只有最后一次增备合并和最后一次整体full目录做redo和undo

原因:如果在第一次增备时最后一个请求没有commit,恰巧commit做到了第二次增备中,那么如果执行undo 数据就会回滚,此数据会丢失

1.全备中做redo 不做undo 模拟csr
[root@db02 ~]\# innobackupex  --apply-log --redo-only /backup/full
2.将inc1增量备份合并到full中,并且apply-log,只做redo 不做undo 
[root@db02 ~]\# innobackupex  --apply-log --redo-only --incremental-dir=/backup/inc1/ /backup/full/
3.将inc2增量备份合并到full中,因为是最后一次增量合并 应用apply-log时,redo和undo都要应用
[root@db02 backup]\# innobackupex  --apply-log --incremental-dir=/backup/inc2/ /backup/full/
4.整体full目录做一次apply-log  redo和undo都要应用
[root@db02 backup]\# innobackupex --apply-log  /backup/full/
5.恢复数据
[root@db02 backup]\# innobackupex --user=root --password=echo --copy-back /backup/full
6.修改所有者和所属组
chown -R mysql.mysql /data
7.启动mysqld查看是否有数据

差异备份

差异备份--incremental-basedir=/backup/full/ 指定为上次全备的目录,每次差异备份后,差异备份的起始lsn位置都是全备的结束lsn

1.准备一次全备
innobackupex --user=root --password=echo --no-timestamp /backup/full

[root@db02 backup]\# cat full/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 554832329    *******
last_lsn = 554832329
compact = 0
recover_binlog_info = 0
flushed_lsn = 554832329
2.模拟第一次数据变化
mysql> create database data5;
mysql> use data5
mysql> create table t5(id int);
mysql> insert into t5 values (1),(2),(3),(4);
3.做第一次差异备份
[root@db02 backup]\# innobackupex --user=root --password=echo --no-timestamp --incremental --incremental-basedir=/backup/full/ /backup/chayi1

[root@db02 backup]\# cat chayi1/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 554832329   与全备的结束lsn相同
to_lsn = 554838592     
last_lsn = 554838592
compact = 0
recover_binlog_info = 0
flushed_lsn = 554838592
4.模拟第二次数据变化
mysql> create database data6;
mysql> use data6
mysql> create table t6(id int);
mysql> insert into t6 values (1),(2),(3),(4);
5.做第二次差异备份
[root@db02 backup]\# innobackupex --user=root --password=echo --no-timestamp --incremental --incremental-basedir=backup/full /backup/chayi2

[root@db02 backup]\# cat chayi2/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 554832329   *****与全备的结束lsn相同
to_lsn = 554844842     
last_lsn = 554844842
compact = 0
recover_binlog_info = 0
flushed_lsn = 554844842
6.破坏数据
[root@db02 backup]\# /etc/init.d/mysqld stop
root@db02 backup]\# rm -rf /data
7.apply-log
	1).全备中做redo 不做undo 模拟csr
	[root@db02 ~]\# innobackupex --apply-log --redo-only /backup/full
	2).合并最后一次差异备份 且redo和undo都要做(差异数据恢复=全备+差异备份)
	[root@db02 backup]\# innobackupex  --apply-log --incremental-dir=/backup/chayi2/ /backup/full
	3).整体full目录做一次apply-log  redo和undo都要应用
	[root@db02 backup]\# innobackupex --apply-log  /backup/full
8.恢复数据且修改所有者和所属组
[root@db02 backup]\# innobackupex --user=root --password=echo --copy-back /backup/full/
[root@db02 backup]\# chown -R mysql.mysql /data

9. 启动mysql查看数据是否恢复

、 数据导入

MySQL数据命令导入方式常用基本有四种

  • mysql命令导入 (系统终端)

  • source 命令导入(mysql终端)

  • load 命令导入(mysql 终端)

  • mysqlimport命令导入(系统终端)

mysql命令导入

#格式
mysql -u用户名    -p密码  [-D|--database]  <  要导入的数据库数据(test_db.sql)

mysql -uroot -p123456 < test_db.sql

mysql命令导入

#格式
mysql> source < 要导入的数据库数据(test_db.sql)

使用 load data 导入数据

MySQL 中提供了load data infile语句来插入数据。 将从当前目录中读取文件 ,并将该文件中的数据插入到当前数据库的指定表中

mysql8需要在登陆时手动指定--local-infile=1,开启load data

#语法格式
	LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]]
    [LINES TERMINATED BY '\n']
    [IGNORE number LINES]
    [(col_name,...)]


mysql> load data local infile '文件路径/文件名'  into table 指定表;


例如:
# mysql8需要在登陆时手动指定--local-infile=1,开启load data

mysql -uroot -p --local_infile=1  #客户端登录 

mysql> set global local_infile=1; #开启服务端load data

Query OK, 0 rows affected (0.00 sec)
 
mysql> use test_db;     #使用test_db库
Database changed


mysql> create table t_table(id int not null auto_increment,name varchar(30),primary key (id));  #创建一个测试表

mysql> select * from t_table;
Empty set (0.01 sec)

mysql> load data local infile '/root/test.txt'  into table t_table fields terminated by ',' lines terminated by '\n';  #导入表
Query OK, 10000 rows affected (0.59 sec)
Records: 10000  Deleted: 0  Skipped: 0  Warnings: 0

#查看导入数据是否成功
mysql> select count(*) from t_table;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.12 sec)

mysql> select * from t_table limit 10;
+----+----------+
| id | name     |
+----+----------+
|  1 | 用户1    |
|  2 | 用户2    |
|  3 | 用户3    |
|  4 | 用户4    |
|  5 | 用户5    |
|  6 | 用户6    |
|  7 | 用户7    |
|  8 | 用户8    |
|  9 | 用户9    |
| 10 | 用户10   |
+----+----------+

mysql> set global local_infile=0; 关闭load data选项
  • 如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。

  • 其中local是关键词,表示从客户主机路径读取文件,如果local没指定,文件必须位于服务器上。

  • replace和ignore关键词控制对现有的唯一键记录的重复的处理。

    • 如果你指定replace,新行将代替有相同的唯一键值的现有行 (覆盖)。

    • 如果你指定ignore,跳过有唯一键的现有行的重复行的输入

    • 如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略

  • load data语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。两个命令的fields和 lines 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,fields 子句必须出现在 lines 子句之前,fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL至少需要下面的一个选项:

    • terminated by字段的分隔符,默认情况下是tab字符(\t)

    • enclosed by字段的界定符。

    • escaped by转义字符。默认的是反斜杠(backslash:\ )