MySQL的mysqldump和xtrabackup备份和还原

1、 备份类型

备份的数据集的范围:
完全备份和部分备份
完全备份:整个数据集;
部分备份:数据集的一部分,比如部分数据库或者部分表;

全量备份、增量备份、差异备份:
全量备份:完全备份
增量备份:仅备份自上一次完全备份或增量备份以来变量的那部数据;
差异备份:仅备份自上一次完全备份以来变量的那部数据;
MySQL的mysqldump和xtrabackup备份和还原_第1张图片
物理备份、逻辑备份:
物理备份:用cp或者tar命令复制数据文件进行的备份,物理备份的速度快
逻辑备份:利用客户端工具通过mysql协议连接到数据库,并从数据库导出数据另存在一个或多个文件中;

根据数据服务是否在线:
热备:读写操作均可进行的状态下所做的备份;
温备:可读但不可写状态下进行的备份;
冷备:读写操作均不可进行的状态下所做的备份;

备份策略:
全量+差异 + binlog
全量+增量 + binlog
一般情况下使用物理热备

备份什么?
数据;
二进制日志、InnoDB的事务日志;
代码(存储过程、存储函数、触发器、事件调度器);
服务器的配置文件;

备份工具:
mysqldump:mysql服务自带的备份工具;逻辑备份工具;
支持完全、部分备份;
InnoDB:热备;
MyISAM:温备;

cp/tar

lvm2:逻辑卷,快照(请求一个全局锁),之后立即释放锁,达到几乎热备的效果;物理备份;
注意:不能仅备份数据文件;要同时备份事务日志;
前提:要求数据文件和事务日志位于同一个逻辑卷;

xtrabackup:
由Percona提供,开源工具,支持对InnoDB做热备,物理备份工具;
完全备份、部分备份;
完全备份、增量备份;
完全备份、差异备份;

备份机制:
xtrabackup:
全量+差异+binlog
全量+增量+binlog
mysqldump:数据很小的时候使用
全量+binlog

mysqldump的用法
逻辑备份工具:基于mysql客户端协议
完全备份、部分备份;
InnoDB:热备或温备;
MyISAM:温备;
二次封装工具:
mydumper
phpMyAdmin

Usage:
mysqldump [OPTIONS] database [tables] # 备份单库,可以只备份其中的一部分表(部分备份);表级别备份,还原时不会自动生成数据库;
OR mysqldump [OPTIONS] --databases|-B [OPTIONS] DB1 [DB2 DB3…] # 备份多库;库级别备份,还原时自动生成数据库
OR mysqldump [OPTIONS] --all-databases|-A [OPTIONS] # 备份所有库;全量备份

MyISAM存储引擎:支持温备,备份时要锁定表;
-x, --lock-all-tables:锁定所有库的所有表,读锁;
-l, --lock-tables:锁定指定库所有表;

InnoDB存储引擎:支持温备和热备;
–single-transaction:创建一个事务,基于此事务执行备份,在REPEATABLE-READ(默认隔离级别)下,别人修改了提交了你也看不到,此刻备份时可以保证各事物的时间点一致,不然备份的过程中别人可能在修改数据,就会造成各事物的修改时间不是在同一时间,使备份不可用;

其它选项:
-R, --routines:备份指定库的存储过程和存储函数;
–triggers:备份指定库的触发器;
-E, --events:备份事件调度器

–master-data=1|2:指明备份时二进制日志文件的名字和所处的位置,备份之后的数据就可以从二进制日志文件的此处位置进行重放
1:记录为CHANGE MASTER TO语句,此语句不被注释;
2:记录为CHANGE MASTER TO语句,此语句被注释;

–flush-logs:备份的同时进行滚动二进制日志;

Xtrabackup的用法:
MyISAM:温备,不支持增量备份;
InnoDB:热备,增量;
物理备份,速率快、可靠;备份完成后自动校验备份结果集是否可用;还原速度快;

Usage: [innobackupex [–defaults-file=#] --backup | innobackupex [–defaults-file=#] --prepare] [OPTIONS]
备份 --> 应用日志 --> 还原
应用日志:–apply-log
还原:–copy-back
完全备份:
完全+binlog(总结):
备份:innobackupex --user --password= --host= /PATH/TO/BACKUP_DIR
准备:innobackupex --apply-log /PATH/TO/BACKUP_DIR
恢复:innobackupex --copy-back
注意:–copy-back需要在mysqld主机本地进行,mysqld服务不能启动;
innodb_log_file_size可能要重新设定;

日志
二进制日志:binlog
show global variables like ‘binlog_format’;
二进制日志记录的格式,推荐用MIXED
binlog_format={STATEMENT|ROW|MIXED}
查看二进制日志文件列表:
SHOW MASTER|BINARY LOGS;
查看当前正在使用的二进制日志文件:
SHOW MASTER STATUS;
查看二进制日志文件中的事件:
SHOW BINLOG EVENTS [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count]
生成新的二进制日志文件:
FLUSH LOGS;
删除二进制日志文件:
PURGE BINARY|MASTER LOGS TO binary_file;

log_bin=/PATH/TO/BIN_LOG_FILE启动二进制日志,只能写到配置文件中才能启动二进制日志,不能通过命令进行启动,是一个只读变量;
max_binlog_size=1073741824大概1g,超过1g就会滚动
sync_binlog={1|0}是否启用二进制日志同步功能,只要事物commit就触发二进制同步操作,将内存缓冲区的信息写到磁盘上的二进制文件中。

mysqlbinlog: 二进制日志查看工具
-v:详细信息
–start-position=, --stop-position=
–start-datetime=, --stop-datetime=

事务日志:innodb_log
show variables like “%innodb_log%”;
innodb_log_block_size:事务日志块大小
innodb_log_buffer_size:事务日志缓冲区大小
innodb_log_file_size:事务日志文件大小,会生成指定大小的文件,空间满时滚动更新,删除旧的事务记录
innodb_log_files_in_group:事务日志文件个数
innodb_log_group_home_dir:事务日志存放目录,默认/var/lib/mysql/ib_logfile#

中继日志:relay_log
主从复制时,从服务器将主服务器的二进制日志先记录到中继日志中,再从中继日志中调到内存进行重放,完成主从复制。

错误日志:log_error, log_warning
记录如下几类信息:
(1) mysqld启动和关闭过程中输出的信息;
(2) mysqld运行中产生的错误信息;
(3) event scheduler事件调度器运行时产生的信息;事件调度器相当于mysql的计划任务
(4) 主从复制架构中,从服务器复制线程启动时产生的日志;
show variables like ‘%log_error%’;
show variables like ‘%log_warning%’;

慢查询日志:log_slow_queries
存储位置:
文件:FILE
表:mysql.slow_log
long_query_time=10 查询时间超过10s就是慢查询
log_output={FILE|TABLE|NONE}
slow_query_log_file=hostname-slow.log慢查询日志存放的位置,一般存放在数据目录下的此文件
log_slow_queries={ON|OFF}是否启动慢查询日志
slow_query_log={ON|OFF}慢查询日志是否启动;以上两项都要开启才能启动慢查询日志
log_slow_rate_limit慢查询日志的速率,一秒钟记录多少条慢查询日志
log_slow_verbosity慢查询日志记录的详细程度
log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk出现哪种情况的才启动慢慢查询日志
log_slow_rate_limit慢查询日志的速率,一秒钟记录多少条慢查询日志

查询日志: general_log
记录查询语句
文件:file
表:mysql.general_log
general_log={ON|OFF}查询日志开启方式
general_log_file=HOSTNAME.log 查询日志文件的名字
log_output={FILE|TABLE|NONE}查询日志的输出位置,如果这里为none,即使general_log为on也不会开启
查询日志一般是不会开启的

mysqldump对innodb引擎的数据库进行全量+binlog热备
node1,node2两个主机,把node1上的数据在node2上还原
在两个主机上
yum install -y mariadb-server
vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
skip_name_resolve=on		#禁止把ip地址解析为主机名
innodb_file_per_table=on		#把引擎为InnoDB的表的数据分开保存
log_bin=bin-log		#开启二进制日志功能

在node1上创建数据库和表
mysql>create database mydb;
mysql>use mydb
mysql>create table mytable (name VARCHAR(10) NOT NULL,age tinyint,gender CHAR(1));
导入数据

GENDER=('F' 'M')
for i in {1..15};do mysql -e "INSERT INTO mydb.mytable(name,age,gender) 
VALUES ('stu$i','$[$RANDOM%80+18]','${GENDER[$RANDOM%2]}');";done

MySQL的mysqldump和xtrabackup备份和还原_第2张图片
可以在node1上用mysqldump工具进行全备份,然后把备份文件发往node2上
也可以在node2上用mysqldump远程备份,但是需要用户权限

在node2

mysqldump -A -F --flush-privileges --single-transaction -ukej -p122333 -
h192.168.91.139 --master-data=2 -R --triggers -E > all_back_`date "+%F-%T"`.sql

mysql < all_back.sql
MySQL的mysqldump和xtrabackup备份和还原_第3张图片
查看node1上的二进制文件
MySQL的mysqldump和xtrabackup备份和还原_第4张图片
mysql>delete from mytable where name=‘stu10’;
mysql>insert into mytable (name,age) values (mayun,50);
mysql>update mytable set name=‘mahuateng’ where name=‘stu5’;
MySQL的mysqldump和xtrabackup备份和还原_第5张图片
MySQL的mysqldump和xtrabackup备份和还原_第6张图片
mysqlbinlog bin-log.000005 > incr.sql
scp incr.sql 192.168.91.137:/var/lib/mysql/
在node2
mysql < incr.sql
MySQL的mysqldump和xtrabackup备份和还原_第7张图片
使用Xtrabackup对innodb引擎的数据库进行全量+增量+binlog热备
安装xtrabackup
repo仓库安装

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
yum list | grep percona
yum install percona-xtrabackup-24

rpm包安装

 wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/\
binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

在node1:
全量备份
mkdir /data/backup
innobackupex -u root -p 122333 -H 127.0.0.1 /data/backup/(全量备份存放位置)
会在指定目录下生成一个时间格式的文件夹
MySQL的mysqldump和xtrabackup备份和还原_第8张图片

[root@localhost /data/backup/2019-05-16_20-05-09]#cat xtrabackup_info 
uuid = dd0e2353-77d2-11e9-af1c-000c2996ea88
name = 
tool_name = innobackupex
tool_command = /data/backup/
tool_version = 2.4.14
ibbackup_version = 2.4.14
server_version = 5.5.56-MariaDB
start_time = 2019-05-16 20:05:09
end_time = 2019-05-16 20:05:14
lock_time = 0
binlog_pos = filename 'bin-log.000006', position '245'		#现在二进制文件的位置
innodb_from_lsn = 0		#备份起始点
innodb_to_lsn = 1624887		#备份结束点
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

[root@localhost /data/backup/2019-05-16_20-05-09]#cat xtrabackup_checkpoints 
backup_type = full-backuped			#备份类型:全量备份
from_lsn = 0
to_lsn = 1624887
last_lsn = 1624887
compact = 0
recover_binlog_info = 0
flushed_lsn = 1624887

[root@localhost /data/backup/2019-05-16_20-05-09]#cat xtrabackup_binlog_info 
bin-log.000006	245		#全备份后所在的二进制位置

增量备份
在mydb.mytable中生成一些新数据
mkdir /data/incr_backup
innobackupex --incremental /data/incr_backup/(增量备份存放位置) --incremental-basedir=/data/backup/2019-05-16_20-
05-09/(上一次全量备份的位置)

[root@localhost /data/incr_backup/2019-05-16_20-46-59]#cat xtrabackup_checkpoints 
backup_type = incremental			#备份类型:增量备份
from_lsn = 1624887
to_lsn = 1660279
last_lsn = 1660279
compact = 0
recover_binlog_info = 0
flushed_lsn = 1660279

[root@localhost /data/incr_backup/2019-05-16_20-46-59]#cat xtrabackup_binlog_info 
bin-log.000006	10235			#增量备份后所在二进制日志位置

在mydb.mytable中生成一些新数据
innobackupex --incremental /data/incr_backup/(增量备份存放位置) --incremental -basedir=/data/incr_backup/2019-05-16_20-46-59/(上一次增量备份位置)

[root@localhost /data/incr_backup/2019-05-16_20-59-41]#cat xtrabackup_info 
uuid = 7997435b-77da-11e9-af1c-000c2996ea88
name = 
tool_name = innobackupex
tool_command = --incremental /data/incr_backup/ --incremental-basedir=/data/incr_backup/2019-05-16_20-46-59/
tool_version = 2.4.14
ibbackup_version = 2.4.14
server_version = 5.5.56-MariaDB
start_time = 2019-05-16 20:59:41
end_time = 2019-05-16 20:59:43
lock_time = 0
binlog_pos = filename 'bin-log.000006', position '10426'
innodb_from_lsn = 1660279
innodb_to_lsn = 1664339
partial = N
incremental = Y
format = file
compact = N
compressed = N
encrypted = N

还原前准备:
innobackupex --apply-log --redo-only /data/backup/2019-05-16_20-05-09/
innobackupex --apply-log --redo-only /data/backup/2019-05-16_20-05-09/ --incremental-dir=/data/
incr_backup/2019-05-16_20-46-59/
innobackupex --apply-log --redo-only /data/backup/2019-05-16_20-05-09/ --incremental-dir=/data/
incr_backup/2019-05-16_20-59-41/

innobackupex --apply-log /data/backup/2019-05-16_20-05-09/

scp -r /data/backup/2019-05-16_20-05-09/ 192.168.91.137:/root/

在node2还原
systemctl start mariadb
rm -rf /var/lib/mysql/*
innobackupex --copy-back /root/2019-05-16_20-05-09/
chown mysql.mysql /var/lib/mysql/ -R
systemctl restart mariadb

你可能感兴趣的:(MySQL的mysqldump和xtrabackup备份和还原)