MySQL数据库5
mysqldump备份恢复数据库
冷备份还原数据库
逻辑卷快照备份还原数据库
xtrabackup备份还原数据库
1. 备份和恢复概述
2. 冷备份示例
实验目标 冷备方法备份数据,还原数据到另外一台主机上
实验步骤
数据库中止服务
[ root@hai7-6 hellodb] $systemctl stop mariadb
打包数据文件,并传送给预还原主机
1. '打包数据库工做目录并压缩'
[ root@hai7-8 data] $tar Jcvf /data/mysql.bak.` date +%F` .tar.xz /data/mysql/
2. '将数据发送到预还原主机上'
[ root@hai7-8 data] $scp /data/mysql.bak.2018-10-13.tar.xz 192.168.50.100:/data
3. '将配置文件发送到预还原主机'
[ root@hai7-8 data] $scp /etc/my.cnf 192.168.50.100:/data
将备份的配置文件覆盖还原主机上的配置文件
[ root@hai7-8 mysql] $mv /data/my.cnf /etc/my.cnf
解压文件到/var/lib/mysql目录下,并重启服务,还原完成
[ root@hai7-8 mysql] $tar xf mysql.2018-10-13.tar.xz
[ root@hai7-8 mysql] $mv * /var/lib/mysql
3. 基于LVM的备份
实验目的
将数据库数据文件和二进制文件分别存放
利用逻辑卷快照功能备份并恢复丢失数据
准备逻辑卷
拿现有干净分区sda7做为物理卷
[ root@hai7-6 data] $pvcreate /dev/sda7
将物理卷加入卷组
[ root@hai7-6 data] $vgcreate vg_mysql /dev/sda7
创建两个逻辑卷分别存放数据mysqldata和二进制文件mysqlbin
[ root@hai7-6 data] $lvcreate -n mysqldata -L 2G vg_mysql
[ root@hai7-6 data] $lvcreate -n mysqlbin -L 4G vg_mysql
格式化文件系统
[ root@hai7-6 data] $mkfs .xfs /dev/vg_mysql/mysqlbin
[ root@hai7-6 data] $mkfs .xfs /dev/vg_mysql/mysqldata
创建两个挂载点,分别挂载mysqldata与mysqlbin
[ root@hai7-6 data] $mkdir /vg_data/{ mysqlbin,mysqldata} -pv
'将逻辑卷分别挂载到目录上'
[ root@hai7-6 data] $mount /dev/vg_mysql/mysqlbin /vg_data/mysqlbin/
[ root@hai7-6 data] $mount /dev/vg_mysql/mysqldata /vg_data/mysqldata/
数据备份
修改以上逻辑卷挂载目录权限,确保mysql程序有写权限
[ root@hai7-6 data] $chown mysql.mysql /vg_data/
修改配置文件指定数据保存路径,启动服务
[ root@hai7-6 ~] $vim /etc/my.cnf
[ mysqld]
innodb_file_per_table
datadir= /vg_data/mysqldata <= 将数据库路径修改成刚才创建的路径
log_bin= /vg_data/mysql-bin <= 将二进制日志保存路径修改成以上创建的新目录
'启动服务'
[ root@hai7-6 data] $systemctl start mariadb
进入mysql,清空二进制日志文件
MariaDB [ ( none) ] > reset master;
准备一些数据库文件,这里导入数据库hellodb
[ root@hai7-6 data] $mysql < hellodb_innodb.sql
请求锁定全部表
[ root@hai7-6 data] $mysql -e 'FLUSH TABLES WITH READ LOCK'
记录二进制文件及事件位置,方便之后使用二进制日志文件恢复备份时间点之后的文件
[ root@hai7-6 data] $mysql -e 'SHOW MASTER logs' > bin.log
[ root@hai7-6 data] $cat bin.log
Log_name File_size
mysql-bin.000001 7655 <= = 备份时二进制日志位置
建立快照
[ root@hai7-6 mapper] $lvcreate -p r -s -n snap_mysql -L 1G /dev/mapper/vg_mysql-mysqld
释放锁
[ root@hai7-6 mapper] $mysql -e 'UNLOCK TABLES'
在mysql中增长几条记录,后续使用二进制恢复到最新状态
MariaDB [ hellodb] > INSERT teachers values( 6,'B' ,'30' ,'F' ) ;
MariaDB [ hellodb] > SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8059 | <= = 二进制日志文件更新后大小
数据恢复 还原阶段须要拒绝客户访问,保证数据不变,利用防火墙或者锁等工具实现
挂载快照卷,执行数据备份
因为UUID相同,因此挂载快照卷须要加-o nouuid,norecovery
[ root@hai7-6 vg_mysql] $mount -o nouuid,norecovery /dev/vg_mysql/snap_mysql /mnt
将快照下备份的数据拷贝到出来
[ root@hai7-6 vg_mysql] $cp -av /mnt/* /data/
备份完成后,删除快照卷(快照会影响系统性能)
取消挂载
[ root@hai7-6 vg_mysql] $umount /mnt
删除逻辑快照
[ root@hai7-6 vg_mysql] $lvremove /dev/vg_mysql/snap_mysql
模拟损坏,删除存放数据库的目录下全部文件
[ root@hai7-6 vg_mysql] $rm -rf /vg_data/mysqldata/*
将备份的文件拷贝回数据库目录下,保留原属性
[ root@hai7-6 vg_mysql] $cp -av /data/* /vg_data/mysqldata/
利用二进制日志还原数据到最
'备份数据时已经记录的二进制日志位置为mysql-bin.000001 7655 ,导出以后全部记录,多个文件需追加到同一文件'
[ root@hai7-6 ~] $mysqlbinlog --start-position= 7655 /vg_data/mysql-bin.000001 > /root/binlong.sql
[ root@hai7-6 ~] $mysqlbinlog /vg_data/mysql-bin.000002 >> /root/binlong.sql
进入数据库,暂时关闭二进制日志记录功能,防止导入数据时生成新的二进制日志
MariaDB [ ( none) ] > SET sql_log_bin= off;
将导出的二进制日志数据导入mysql中,在数据库中直接进行,命令为SOURCE
MariaDB [ ( none) ] > SOURCE /root/binlong.sql
启动二进制日志记录功能,查看还原效果
MariaDB [ ( none) ] > SET sql_log_bin= on;
MariaDB [ hellodb] > SELECT * FROM teachers;
4. 逻辑备份工具(mysqldump, mydumper, phpMyAdmin)
4.1 mysqldump工具
语法格式 mysqldump [OPTIONS] database [tables] mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…] mysqldump [OPTIONS] --all-databases [OPTIONS]缓存
常见选项
-A
| --all-databases
:备份全部数据库,含create database
-B
| --databases db_name…
:指定备份的数据库,包括create database语句
-E
| --events
:备份相关的全部event scheduler(调度器),计划任务之类的,-A包含-E
-R
| --routines
:备份全部存储过程和自定义函数, -A包含
--triggers
:备份表相关触发器,默认启用,用--skip-triggers
,不备份触发器
--default-character-set=utf8
:指定字符集
--master-data[=#]
: 此选项须启用二进制日志
所备份的数据以前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
记录为注释的CHANGE MASTER TO语句 此选项会自动关闭–lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启–single-transaction)
'记录备份时,二进制日志文件所在位置,说明在此位置以前的数据作了备份'
[ root@hai7-6 data] $mysqldump -A --master-data= 1 > all.sql
'查看备份数据'
[ root@hai7-6 data] $vim all.sql
'多出以下行,若是设置为--master-data=2,只是将以下行注释掉,仅作描述'
CHANGE MASTER TO MASTER_LOG_FILE= 'mysql-bin.000002' , MASTER_LOG_POS= 34742814;
-F, --flush-logs
:备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会致使刷新屡次数据库。建议在同一时刻执行转储和日志刷新,可经过和--single-transaction
或-x
,--master-data
一块儿使用实现,此时只刷新一第二天志,添加此选项能够区分备份前二进制文件和备份后二进制文件,不须要去文件中找备份位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. '当前二进制日志文件是两个1和2'
[ root@hai7-6 data] $mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742814 |
+------------------+-----------+
2. '备份两个数据库hi和mysql'
[ root@hai7-6 data] $mysqldump -F -B hi mysql > ba.back.sql
3. '生成2个新的日志文件,也就是选项描述中-A、-B是会刷新屡次,和备份多少个数据库有关'
[ root@hai7-6 data] $mysql -e 'show master logs;'
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 8078 |
| mysql-bin.000002 | 34742857 |
| mysql-bin.000003 | 288 | <= = 刷新的二进制日志文件
| mysql-bin.000004 | 245 | <= = 刷新的二进制日志文件
+------------------+-----------+
--compact
: 去掉注释,适合调试,导出的文件没有注释描述,不推荐使用,有可能丢失关键信息,好比master-data=2记录的二进制备份位置
-d, --no-data
: 只备份表结构
-t, --no-create-info
: 只备份数据,不备份create table
-n,--no-create-db
: 不备份create database,可被-A或-B覆盖
--flush-privileges
:备份系统数据库mysql时须要使用
-f, --force
: 忽略SQL错误,继续执行
--hex-blob
: 使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
-q, --quick
: 不缓存查询,直接输出,加快备份速度
备份还原示例
示例一: 默认设置读取数据库数据,并还原(不建议使用,须要手动建立数据库,数据库建立信息极可能不许确)
读取数据库hellodb数据,导出到文件hellodb_back.sql中
[ root@hai7-6 data] $mysqldump hellodb > /data/hellodb_bak.sql
模拟数据库破坏,删除hellodb数据库
[ root@hai7-6 data] $mysql -e 'drop database hellodb'
使用默认选项读出来的数据,并无建立数据库命令,还原数据库须要手动建立数据库
1. '建立数据库,极可能与原建立属性不一样'
[ root@hai7-6 data] $mysql -e 'create database hi'
2. '将数据导入新建的数据库中(这里必须指定数据库),完成恢复'
[ root@hai7-6 data] $mysql hi < /data/hellodb_bak.sql
示例二:加上选项-A、-B备份,只要有的数据库都会备份,使输出的信息更完整包括建立命令
备份全部数据库 选项-A
[ root@hai7-6 mysqldata] $mysqldump -A > /data/all'data+%F' .sql
查看导出的数据
[ root@hai7-6 mysqldata] $vim /data/alldata+%F.sql
CREATE DATABASE /*! 32312 IF NOT EXISTS*/ ` hi` /*! 40100 DEFAULT CHARACTER SET latin1 */;
USE ` hi` ; <= = 建立数据库的SQL语句,只要有的数据库都会输出建立语句 选项-B
'能够同时备份多个,例如hi和mysql两个数据库'
[root@hai7-6 mysqldata]$mysqldump -B hi mysql > /data/b'data+%F'.sql
模拟故障,删除数据库
[ root@hai7-6 mysqldata] $mysql -e 'drop database hi'
[ root@hai7-6 mysqldata] $mysql -e 'drop database mysql'
'查看删除后数据库保留状况'
[ root@hai7-6 mysqldata] $mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| test |
+--------------------+
还原,因为备份中已经有库建立语句,能够直接导入
[ root@hai7-6 mysqldata] $mysql < /data/bdata+%F.sql
[ root@hai7-6 mysqldata] $mysql -e 'show databases'
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi |
| mysql |
| performance_schema |
| test |
+--------------------+
输出备份数据时同时压缩 压缩工具默认是读取屏幕输出,压缩导入指定文件,能够配合mysqldump工具,直接压缩备份文件
[ root@hai7-6 ~] $mysqldump -B hi | gzip > /data/a.sql.gz
编制脚本,实现将mysql中的数据库分库备份
数据库库信息输出格式以下所示,首先挑出不须要备份的库
[ root@hai7-6 data] $mysql -e 'show databases' | cat
Database <= = 表头,不须要备份
information_schema <= = 状态信息,不须要备份
hi
mysql
performance_schema <= = 状态信息,不须要备份
test
实现方法 方法1:while…do…done
[ root@hai7-6 data] $mysql -e 'show databases' | grep -Ev 'Database|information|performance' | while read dbname ; do mysqldump -B $dbname | gzip > /data/${dbname} _bak` date +%F` .gz; done 方法2 :使用sed语句实现 bash能够接收标准输出,标准输出是一个可执行的脚本就能够执行
[ root@hai7-6 data] $mysql -e 'show databases' | grep -Ev '^Database|info|perfor' | sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1_bak` date +%F` .gz@' | bash 方法3:使用for循环
[ root@hai7-6 data] $for db in ` mysql -e 'show databases' | grep -Ev '^Database|info|perfor' ` ; do mysqldump -B $db | gzip > /data/${db} _bak` date +%F` .gz; done
4.2 MyISAM、InnoDB再mysqldump中特殊的备份选项
4.3 生产环境实战备份策略
InnoDB建议备份策略
mysqldump -uroot -A -F -E -R --single-transaction --master-data= 1 --flush-privileges --triggers --default-character-set= utf8 --hex-blob > /backup/fullbak_$BACKUP_TIME .sql
MyISAM建议备份策略
mysqldump -uroot -A -F -E -R -x --master-data= 1 --flush-privileges --triggers --default-character-set= utf8 --hex-blob > /BACKUP/fullbak_$BACKUP_TIME .sql
示例
目的 模拟生产环境数据库恢复,彻底备份,并还原至最新状态
步骤
将数据文件和二进制日志文件分开存放,修改配置文件,并启动二进制日志功能
[ root@hai7-6 ~] $vim /etc/my.cnf
datadir= /vg_data/mysqldata <= = 数据文件路径
log_bin= /vg_data/mysqlbin/mysql_bin <= = 二进制日志文件路径
备份数据
[ root@hai7-6 ~] $mysqldump -A -F --single-transaction --master-data= 2 --hex-blob| gzip > /data/all_back.aql.gz
备份后,再建立几条记录,供二进制日志还原使用
MariaDB [ hi] > INSERT teachers VALUES( 10,'A' ,40,'M' )
MariaDB [ hi] > INSERT teachers VALUES( 11,'B' ,50,'M' ) ;
模拟故障,删除全部数据文件
[ root@hai7-6 data] $rm -rf /vg_data/mysqldata/*
开始还原数据,从这里开始禁止用户访问,直到还原完成,中止mariadb服务,再启动服务,生成系统数据库文件,若是是自编译安装,须要运行系统脚本生成
[ root@hai7-6 mysqlbin] $systemctl stop mariadb
'启动服务,让系统自动生成系统数据库'
[ root@hai7-6 mysqlbin] $systemctl start mariadb
解压备份文件
[ root@hai7-6 data] $gzip -d all_back.aql.gz
中止二进制日志服务,避免导入备份文件时生成大量二进制数据,影响备份时间点后的数据恢复,将备份文件导入mysql中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. '中止二进制日志服务'
MariaDB [ ( none) ] > SET sql_log_bin= off;
2. '还原彻底备份数据'
MariaDB [ ( none) ] > source /data/all_back.aql
3. '查看彻底备份还原效果'
MariaDB [ hi] > SELECT * FROM teachers; <= = 没有第3步添加的,备份后数据
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
+-----+---------------+-----+--------+
查看备份文件,确认二进制日志文件备份位置,将备份后生成的数据位置导入文件,恢复到最新状态,开放用户访问数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1. '查看备份文件,确认二进制日志文件彻底备份时位置'
[ root@hai7-6 data] $vim all_back.aql
-- CHANGE MASTER TO MASTER_LOG_FILE= 'mysql_bin.000002' , MASTER_LOG_POS= 245;
2. '将245位置后的二进制日志内容导入至文件in.sql中'
[ root@hai7-6 data] $mysqlbinlog --start-position= 245 /vg_data/mysqlbin/mysql_bin.000002 > in.sql
3. '进入mysql,中止二进制日志功能'
MariaDB [ ( none) ] > SET sql_log_bin= off;
4. '将备份后生成的二进制文件导入数据库中'
MariaDB [ hi] > SOURCE /data/in.sql
5. '恢复二进制日志记录功能'
MariaDB [ hi] > SET sql_log_bin= on
6. '查看恢复效果'
MariaDB [ hi] > SELECT * FROM teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | a | 20 | M |
| 6 | B | 30 | F |
| 8 | c | 100 | M |
| 10 | A | 40 | M | <= = 备份后数据,恢复成功
| 11 | B | 50 | M |
+-----+---------------+-----+--------+
4.4 误删除文件,致使系统问题
前面步骤相同,在恢复到备份文件点后,须要在二进制日志文件中,找出误删除操做,注释掉或者删除,而后将备份后二进制日志文件追加导出至指定文件,再导入系统
[ root@hai7-6 data
] $mysqlbinlog --start-position
= 245 /vg_data/mysqlbin/mysql_bin.000002
> in.sql
[ root@hai7-6 data
] $mysqlbinlog /vg_data/mysqlbin/mysql_bin.000003
>> in.sql
5. 专业恢复工具xtrabackup
5.1 概述
5.2 旧版(2.2以前)与新版xtrabackup区别
旧版
包括4个可执行文件:
innobackupex:Perl 脚本
脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一层封装实现的
虽然目前通常不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,所以备份基本都经过 innobackupex 命令进行
xtrabackup:C/C++ 编译的二进制 用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互
xbcrypt:加解密
xbstream:支持并发写的流文件格式
新版变化 xtrabackup版本升级到2.4后,相比以前的2.1有了比较大的变化
innobackupex 功能所有集成到 xtrabackup 里面,只有一个 binary程序
为了兼容考虑,innobackupex做为 xtrabackup 的软连接,即xtrabackup如今支持非Innodb表备份,
Innobackupex在下一版本中移除,建议经过xtrabackup替换innobackupex
5.3 xtrabackup语法选项
安装xtrabackup
在EPEL源中 yum install percona-xtrabackup
最新版本下载安装:下载格式为rpm能够直接使用yum安装,须要依赖EPEL源中一些程序 https://www.percona.com/downloads/XtraBackup/LATEST/ 新版将xtrabackup和innobackupex组合在一块儿,显示为软链接
[ root@hai7-6 data] $ll /usr/bin/innobackupex
lrwxrwxrwx 1 root root 10 Oct 14 18:23 /usr/bin/innobackupex -> xtrabackup
Xtrabackup备份
语法格式 innobackupex [option] BACKUP-ROOT-DIR
选项说明 https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html
--user
该选项表示备份帐号
--password
该选项表示备份的密码
--host
该选项表示备份数据库的地址
--databases
该选项接受的参数为数据库名,若是要指定多个数据库,彼此间须要以空格隔开;如:“xtra_test dba_test”,同时,在指定某数据库时,也能够只指定其中的某张表。如:“mydatabase.mytable”。该选项对innodb引擎表无效,仍是会备份全部innodb表
--defaults-file
该选项指定从哪一个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental
该选项表示建立一个增量备份,须要指定–incremental-basedir
--incremental-basedir
该选项指定为前一次全备份或增量备份的目录,与–incremental同时使用
--incremental-dir
该选项表示还原时增量备份的目录
--include=name
指定表名,格式:databasename.tablename
Xtrabackup准备阶段(Prepare)
语法格式 innobackupex --apply-log [option] BACKUP-DIR
选项说明:
--apply-log
通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处理不一致状态。此选项做用是经过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态,最后一次还原须要作的,例以下图中的T3回滚到T4,至关于零时目录的扎口,说明数据补入到此完成
--use-memory
和--apply-log
选项一块儿使用,当prepare 备份时,作crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
--export
表示开启可导出单独的表以后再导入其余Mysql中
--redo-only
此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并,用在T3以前的备份,确保事务不回滚,新版本为--apply-log-only
Xtrabackup还原阶段
语法格式 innobackupex --copy-back [选项] BACKUP-DIR innobackupex --move-back [选项] [–defaults-group=GROUP-NAME] BACKUP-DIR
选项说明
--copy-back
作数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
--move-back
这个选项与–copy-back类似,惟一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须当心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
--force-non-empty-directories
指定该参数时候,使得innobackupex --copy-back
或--move-back
选项转移文件到非空目录,已存在的文件不会被覆盖。若是--copy-back
和--move-back
文件须要从备份目录拷贝一个在datadir已经存在的文件,会报错失败
5.4 Xtrabackup还原原理
5.5 旧版Xtrabackup彻底备份及还原
在原主机
备份数据到目录/backups下 innobackupex --user=root /backups
将备份数据传送到目标主机 scp -r /backups/2018-02-23_11-55-57/ 目标主机:/data/
旧版会自动在备份目录下生成以时间格式命名的目录如2018-02-23_11-55-57
在目标主机
整理数据,将不完整的事务回滚 innobackupex --apply-log /data/2018-02-23_11-55-57/
中止服务 systemctl stop mariadb
删除原数据库数据 rm -rf /var/lib/mysql/*
将整理过的数据复制到数据库工做目录,系统会自动根据配置文件找到工做目录 innobackupex --copy-back /data/2018-02-23_11-55-57/
修改权限是mysql具备写权限 chown -R mysql.mysql /var/lib/mysql/
启动服务 systemctl start mariadb
5.5 新版Xtrabackup彻底备份及还原
在原主机
作彻底备份到/data目录下
[ root@hai7-6 ~] $xtrabackup --backup --target-dir= /data
将备份拷贝到目标目录
[ root@hai7-6 ~] $scp -r /data 192.168.50.111:/data
在目标主机上
模拟故障,中止服务,清空数据库
[ root@hai7-6 ~] $systemctl stop mariadb
[ root@hai7-6 ~] $rm -rf /var/lib/mysql/*
预准备:确保数据一致,提交完成的事务,回滚未完成的事务
[ root@hai7-8 data] $xtrabackup --prepare --target-dir= /data/data
复制到数据库目录 注意:数据库目录必须为空,MySQL服务不能启动
[ root@hai7-8 data] $xtrabackup --copy-back --target-dir= /data/data
还原属性
'拷贝完成后的属性'
[ root@hai7-8 ~] $ll /var/lib/mysql/
drwxr-x--- 2 root root 310 Oct 15 10:04 hi
'还原属性'
[ root@hai7-8 ~] $chown -R mysql:mysql /var/lib/mysql
启动服务 systemctl start mariadb
5.6 旧版Xtrabackup彻底,增量备份及还原
在原主机
彻底备份数据 innobackupex /backups
创建两个目录存放增量备份 mkdir /backups/inc{1,2}
修改数据库内容,作第一增量备份,加--incremental
选项,表示为增量备份
innobackupex --incremental /backups/inc1 --incremental-basedir= /backups/2018-02-23_14-21-42(彻底备份生成的路径)
再次修改数据库内容,基于inc1再次增量备份
innobackupex --incremental /backups/inc2 --incremental-basedir= /backups/inc1/2018-02-23_14-26-17 (上次增量备份生成的路径)
所有备份后,将数据发送给目标端 scp -r /backups/* 目标主机:/data/
在目标主机
不启动mariadb,删除数据库原工做目录下全部文件 rm -rf /var/lib/mysql/*
第一次整理,彻底备份 innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
第二次整理,将增量备份与彻底备份整理在一块儿
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir= /data/inc1/2018-02-23_14-26-17
第三次整理,将第三次增量与第二次整理结果整理在一块儿
innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir= /data/inc2/2018-02-23_14-28-29/
将整理好的数据复制到数据库工做目录 innobackupex --copy-back /data/2018-02-23_14-21-42/
修改权限 chown -R mysql.mysql /var/lib/mysql/
启动服务 systemctl start mariadb
5.6 新版Xtrabackup彻底,增量备份及还原
原主机,备份过程
备份过程,服务器必须启动 创建3各目录,分别存放彻底备份和2次增量备份
[ root@hai7-6 data] $mkdir { base,inc1,inc2}
彻底备份
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/base
第一次修改数据
[ root@hai7-6 data] $mysql -e 'use hi; INSERT teachers VALUES(12,"AB",25,"F")'
第一次基于彻底备份的增量备份inc1
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/inc1 --incremental-basedir= /data/base
第二次修改数据
[ root@hai7-6 data] $mysql -e 'use hi; INSERT teachers VALUES(13,"BB",31,"M")'
基于inc1的二次增量备份
[ root@hai7-6 data] $xtrabackup --backup --target-dir= /data/inc2 --incremental-basedir= /data/inc1
拷贝备份文件到目标主机
[ root@hai7-6 data] $scp -r /data/ 192.168.50.111:/data
目标主机准备阶段(prepare)
整理彻底备份,此选项–apply-log-only阻止回滚未完成的事务
[ root@hai7-8 data] $xtrabackup --prepare --apply-log-only --target-dir= /data/data/base
合并第1次增量备份到彻底备份
[ root@hai7-8 data] $xtrabackup --prepare --apply-log-only --target-dir= /data/data/base --incremental-dir= /data/data/inc1
合并第2次增量备份到彻底备份
:最后一次还原不须要加选项–apply-log-only
[ root@hai7-8 data] $xtrabackup --prepare --target-dir= /data/data/base --incremental-dir= /data/data/inc2
目标主机还原阶段
复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
[ root@hai7-8 data] $xtrabackup --copy-back --target-dir= /data/data/base
还原属性,启动服务
[ root@hai7-8 base] $chown -R mysql:mysql /var/lib/mysql
[ root@hai7-8 base] $systemctl start mariadb
5.7 Xtrabackup单表备份与还原
版本要求 mariadb在5.6以上版本
实验目标 用Xtrabackup备份单表,并恢复
步骤
单表备份hellodb数据库的students表: --include
表示指定哪一个表来备份,后跟导出目录
[ root@hai7-8 ~] $innobackupex -uroot -p123456 --include= 'hellodb.students' /backups
备份表结构,备份文件内有描述信息,还原时须要删除
[ root@hai7-8 ~] $mysql -p123456 -e 'SHOW CREATE TABLE hellodb.students' > students.sql
模拟误操做,删除表
[ root@hai7-8 ~] $mysql -pfree123456 -e 'DROP TABLE hellodb.students'
将备份的表设为导出状态,关键词--export
'导出后会在备份目录多出2个文件students.cfg和students.exp'
[ root@hai7-8 ~] $innobackupex --apply-log --export /backups/2018-10-15_11-19-23/
按照表结构建立表,参考步骤2中的表结构,从CREATE开始日后的内容,建立表后会生成表结构文件students.frm和空的数据文件students.ibd(直接拷贝文件到数据库中,会报错‘doesn’t exist in engine’,系统数据库是识别不了的)
1
2
3
4
5
6
7
8
9
10
11
12
13
MariaDB [ hellodb] > CREATE TABLE ` students`
> ( \n ` StuID` int( 10) unsigned NOT NULL AUTO_INCREMENT,
> \n ` Name` varchar( 50) NOT NULL,
> \n ` Age` tinyint( 3) unsigned NOT NULL,
> \n ` Gender` enum( 'F' ,'M' ) NOT NULL,
> \n ` ClassID` tinyint( 3) unsigned DEFAULT NULL,
> \n ` TeacherID` int( 10) unsigned DEFAULT NULL,
> \n PRIMARY KEY ( ` StuID` ) ,
> \n KEY ` index_age` ( ` Age` ) ,
> \n KEY ` idx_name_age` ( ` Name` ,` Age` ) \n)
> ENGINE= InnoDB
> AUTO_INCREMENT= 26
> DEFAULT CHARSET= utf8;
删除表空间,也就是students.ibd文件,不能直接覆盖,须要执行SQL语句
MariaDB [ hellodb] > ALTER TABLE students DISCARD TABLESPACE;
将备份表下的cfg,exp,ibd三个文件,拷贝到对应数据库工做目录
[ root@hai7-8 ~] $cp /backups/2018-02-23_15-03-23/hellodb/students.{ cfg,exp,ibd} /data/mysql/hellodb/
修改权限属性
[ root@hai7-8 hellodb] $ chown -R mysql.mysql /data/mysql/hellodb
将表空间数据文件恢复回去,只拷贝过去不识别
MariaDB [ hellodb] > ALTER TABLE hellodb.students IMPORT TABLESPACE;
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
</div>