备份恢复
mysqldump (MDP)
优点:
1.不需要下载安装
2.备份出来的是SQL,文本格式,可读性高,便于备份处理
3.压缩比较高,节省备份的磁盘空间
缺点:
4.依赖于数据库引擎,需要从磁盘把数据读出
然后转换成SQL进行转储,比较耗费资源,数据量大的话效率较低
建议:
100G以内的数据量级,可以使用mysqldump
超过TB以上,我们也可能选择的是my
xtrabackup(XBK)
优点:
1.类似于直接cp数据文件,不需要管逻辑结构,相对来说性能较高
缺点:
2.可读性差
3.压缩比低,需要更多磁盘空间
建议:
>100G<TB
备份方式:
全备:全库备份,备份所有数据
增量:备份变化的数据
逻辑备份=mysqldump+mysqlbinlog
物理备份=xtrabackup_full+xtrabackup_incr+binlog或者xtrabackup_full+binlog
备份周期:
根据数据量设计备份周期
比如:周日全备,周1-周6增量
mysqldump 参数
-u -p -S -h -P
本地备份:
mysqldump -uroot -p -S /tmp/mysql.sock
远程备份:
mysqldump -uroot -p -h 10.0.0.51 -P3306
mysqldump基本参数
-A
mkdir /data/backup
chown mysql.mysql /data/backup
mysqldump -uroot -p123 -A >/data/backup/full.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
# 补充:
# 1.常规备份是要加 --set-gtid-purged=OFF,解决备份时的警告
# [root@db01 ~]# mysqldump -uroot -p123 -A --set-gtid-purged=OFF >/backup/full.sql
# 2.构建主从时,做的备份,不需要加这个参数
# [root@db01 ~]# mysqldump -uroot -p123 -A --set-gtid-purged=ON >/backup/full.sql
less /data/backup/full.sql
DROP TABLE IF EXISTS `t1`; ##查看表 看到 还原表的时候 是先删除t1表 再创建表t1 导入数据
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
截取
1、获得表结构
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q' full.sql>createtable.sql
2、获得INSERT INTO 语句,用于数据的恢复
# grep -i 'INSERT INTO `city`' full.sqll >data.sql &
3.获取单库的备份
# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql
-B 单库备份
mysqldump -uroot -p123 -B aaa uuu >/data/backup/bak.sql
单库下单表备份
mysqldump -uroot -p123 world city >/data/backup/bak1.sql
例如
备份数据库中单个表命令
select concat('mysqldump -uroot -p123 -S /tmp/mysql.sock ',table_schema," ",table_name," >/data/backup/",table_schema,"_",table_name,".sql") from information_schema.tables where table_schema not in('sys','information_schema','performance_schema')') into outfile '/tmp/mysqldump.sh';
bash /tmp/mysqldump.sh
mysqldump -uroot -p123 world >/data/backup/world1.sql 备份world下的所有表 恢复的时候没有建库语句
mysqldump -uroot -p123 -B world >/data/backup/world.sql 备份world这个库文件
高级参数
mysqldump --help 帮助
-R 备份存储过程及函数
--triggers 备份触发器
-E 备份事件
mysqldump -uroot -p123 -A -R -E --triggers >/data/backup/full1.sql
grep "rand_data" /data/backup/full1.sql 之前的存储过程都有备份
-F 在备份开始时,刷新一个新binlog日志 但是会自动刷新 里面几个库 就刷新几次
mysqldump -uroot -p -A -R -E --triggers -F >/data/backup/full.sql
--master-data=2 备份时保存文件 检查点
mysqldump -uroot -p -A -R -E --triggers --master-data=2 >/data/backup/full.sql
出现 - - CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=194;
功能:
(1)在备份时,会自动记录,二进制日志文件名和位置号
0 默认值
1 以change master to命令形式,可以用作主从复制
2 以注释的形式记录,备份时刻的文件名+postion号
(2) 自动锁表
(3)如果配合--single-transaction,只对非InnoDB表进行锁表备份,InnoDB表进行“热“”备,实际上是实现快照备份。
--single-transaction
innodb 存储引擎开启热备(快照备份)功能
master-data可以自动加锁
(1)在不加--single-transaction ,启动所有表的温备份,所有表都锁定
(1)加上--single-transaction ,对innodb进行快照备份,对非innodb表可以实现自动锁表功能
例子6: 备份必加参数
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
--set-gtid-purged=auto
auto , on
off
使用场景:
1. --set-gtid-purged=OFF,可以使用在日常备份参数中.
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
2. auto , on:在构建主从复制环境时需要的参数配置
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=ON >/data/backup/full.sql
--max-allowed-packet=# 客户端接收的最大文件
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M >/data/backup/full.sql
The maximum packet length to send to or receive from server.
例如
全备:
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql
create database testdb;
create table test1(id int);
commit;
insert into test1 values(1),(2),(3);
commit;
rm -rf /data/mysql/*
pkill mysqld
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
systemctl start mysqld
source /data/backup/full.sql
vim /data/backup/full.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=194;
mysqlbinlog --start-position=194 --skip-gtids /data/binlog/mysql-bin.000015 > /tmp/bin.log
set sql_log_bin=0
source /tmp/bin.log
检查数据完整
压缩备份
例子:
mysqldump -uroot -p123 -A -R --triggers --master-data=2 --set-gtid-purged=OFF --single-transaction|gzip > /backup/full_$(date +%F).sql.gz
mysqldump -uroot -p123 -A -R --triggers --master-data=2 --set-gtid-purged=OFF --single-transaction|gzip > /backup/full_$(date +%F-%T).sql.gz
cd /backup
gunzip full_2018-10-17.sql.gz 解压
mysqldump备份的恢复方式(在生产中恢复要谨慎,恢复会删除重复的表)
set sql_log_bin=0;
source /backup/full_2018-06-28.sql
注意:
1、mysqldump在备份和恢复时都需要mysql实例启动为前提。
2、一般数据量级100G以内,大约15-45分钟可以恢复,数据量级很大很大的时候(PB、EB)
3、mysqldump是覆盖形式恢复的方法。
一般我们认为,在同数据量级,物理备份要比逻辑备份速度快.
逻辑备份的优势:
1、可读性强
2、压缩比很高
mysqldump -uroot -p123 -A -R --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F).sql.gz
例如:
全备
mysqldump -uroot -p -A -R --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction|gzip > /data/backup/full_$(date +%F).sql.gz
use backup
insert into t1 values(11),(22),(33);
commit;
create table t2 (id int);
insert into t2 values(11),(22),(33);
commit;
drop database backup;
恢复 backup 因为 数据库还有其他库正常使用 故 只能在其他测试数据库恢复
cd /data/backup
gunzip full_2020-11-24.sql.gz
mysql登录
set sql_log_bin=0;
source /data/backup/full_2020-11-24.sql
vim /data/backup/full_2020-11-24.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=833;
通过 show binlog events in 'mysql-bin.000018'; 查找gtid
mysql-bin.000018 | 4 | Format_desc | 6 | 123 | Server ver: 5.7.32-log, Binlog ver: 4 |
| mysql-bin.000018 | 123 | Previous_gtids | 6 | 234 | 735827a9-2008-11eb-a242-5254001adc46:1-16,
e3d4355c-2e06-11eb-a048-5254001adc46:1-194 |
| mysql-bin.000018 | 234 | Gtid | 6 | 299 | SET @@SESSION.GTID_NEXT= 'e3d4355c-2e06-11eb-a048-5254001adc46:195' |
| mysql-bin.000018 | 299 | Query | 6 | 399 | create database backup |
| mysql-bin.000018 | 399 | Gtid | 6 | 464 | SET @@SESSION.GTID_NEXT= 'e3d4355c-2e06-11eb-a048-5254001adc46:196' |
| mysql-bin.000018 | 464 | Query | 6 | 566 | use `backup`; create table t2 (id int) |
| mysql-bin.000018 | 566 | Gtid | 6 | 631 | SET @@SESSION.GTID_NEXT= 'e3d4355c-2e06-11eb-a048-5254001adc46:197' |
| mysql-bin.000018 | 631 | Query | 6 | 705 | BEGIN |
| mysql-bin.000018 | 705 | Table_map | 6 | 752 | table_id: 256 (backup.t2) |
| mysql-bin.000018 | 752 | Write_rows | 6 | 802 | table_id: 256 flags: STMT_END_F |
| mysql-bin.000018 | 802 | Xid | 6 | 833 | COMMIT /* xid=2212 */ |
| mysql-bin.000018 | 833 | Gtid | 6 | 898 | SET @@SESSION.GTID_NEXT= 'e3d4355c-2e06-11eb-a048-5254001adc46:198' |
| mysql-bin.000018 | 898 | Query | 6 | 972 | BEGIN |
| mysql-bin.000018 | 972 | Table_map | 6 | 1019 | table_id: 260 (backup.t2) |
| mysql-bin.000018 | 1019 | Write_rows | 6 | 1069 | table_id: 260 flags: STMT_END_F |
| mysql-bin.000018 | 1069 | Xid | 6 | 1100 | COMMIT /* xid=2214 */ |
| mysql-bin.000018 | 1100 | Gtid | 6 | 1165 | SET @@SESSION.GTID_NEXT= 'e3d4355c-2e06-11eb-a048-5254001adc46:199' |
| mysql-bin.000018 | 1165 | Query | 6 | 1263 | drop database backup
mysqlbinlog --skip-gtids --include-gtids='735827a9-2008-11eb-a242-5254001adc46:1-16,e3d4355c-2e06-11eb-a048-5254001adc46:1-198' /data/binlog/mysql-bin.000018 >/tmp/gtid.sql
source
set sql_log_bin=0;
source /tmp/gtid.sql
检查数据
binlog2log
https://github.com/danfengcao/binlog2sql
flashback
MariaDB在10.2.4以上的版本中加入了flashback功能,但是只是针对于DML操作,原理和binlog2sql类似,但是劣势是拥有一定的局限性,优势自然是不需要额外下载软件了
xtrabackup
安装软件
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
备份方式
(1)对于非Innodb表(比如 myisam)是,锁表cp数据文件,属于一种温备份。
(2)对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo一并备走,属于热备方式。
备份原理
0、xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
1、备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
2、在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用
3、恢复过程是cp 备份到原来数据目录下
操作
innobackupex --user=root --password=123 /data/backup ##全备
vim /etc/my.cnf ##默认socket /var/lib/mysql
[client]
socket=/tmp/mysql.sock
[root@db01 2020-11-24_15-38-02]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 480054749
last_lsn = 480054758 这个跟上面那个差9个
compact = 0
recover_binlog_info = 0
[root@db01 2020-11-24_15-38-02]# cat xtrabackup_binlog_info 检查LSN起终点
mysql-bin.000018 1523 735827a9-2008-11eb-a242-5254001adc46:1-16,
e3d4355c-2e06-11eb-a048-5254001adc46:1-200
例如
全部备份
innobackupex --user=root --password=123 --no-timestamp /data/backup/full
模拟故障
rm -rf /data/mysql/
pkill mysqld
全部还原
将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
[root@db01 ~]# innobackupex --apply-log /backup/full
cp -a /backup/full/* /data/mysql/ 拷贝文件到数据目录
chown -R mysql.mysql /data/mysql/
systemctl start mysqld 启动mysqld
例如 增量备份
(2)全备(周日)
[root@db01 backup]# innobackupex --user=root --password --no-timestamp /data/backup/full >&/tmp/xbk_full.log
(3)模拟周一数据变化
db01 [(none)]>create database cs charset utf8;
db01 [(none)]>use cs
db01 [cs]>create table t1 (id int);
db01 [cs]>insert into t1 values(1),(2),(3);
db01 [cs]>commit;
(4)第一次增量备份(周一)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/full /data/backup/day1 &>/tmp/day1.log
(5)模拟周二数据
db01 [cs]>create table t2 (id int);
db01 [cs]>insert into t2 values(1),(2),(3);
db01 [cs]>commit;
(6)周二增量
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/data/backup/day1 /data/backup/day2 &>/tmp/day2.log
(7)模拟周三数据变化
db01 [cs]>create table t3 (id int);
db01 [cs]>insert into t3 values(1),(2),(3);
db01 [cs]>commit;
db01 [cs]>drop database cs; ##模拟故障
查看三个文件LSN 是连接
[root@db01 backup]# cat full/xtrabackup_checkpoints day1/xtrabackup_checkpoints day2/xtrabackup_checkpoints
backup_type = full-backuped 全备
from_lsn = 0
to_lsn = 480126569
last_lsn = 480126578
compact = 0
recover_binlog_info = 0
backup_type = incremental 差备
from_lsn = 480126569
to_lsn = 480132561
last_lsn = 480132570
compact = 0
recover_binlog_info = 0
backup_type = incremental 差备
from_lsn = 480132561
to_lsn = 480138491
last_lsn = 480138500
compact = 0
recover_binlog_info = 0
恢复:
innobackupex --apply-log --redo-only /data/backup/full #使 备份文件日志 不动 不回滚
innobackupex --apply-log --redo-only --incremental-dir=/data/backup/day1 /data/backup/full ##合并第一天跟全备的数据
innobackupex --apply-log --incremental-dir=/data/backup/day2 /data/backup/full ##合并第二天的 日志做redo undo操作
rm /data/mysql/* -rf ##删除之前的数据 或者 在重新配置mysql
innobackupex --apply-log /data/backup/full ##恢复之前的还原状态
cp -a /data/backup/full/* /data/mysql/
chown -R mysql.mysql /data/mysql/
systemctl start mysqld
[root@db01 backup]# cat day2/xtrabackup_binlog_info
mysql-bin.000001 1319 30b767c7-2e2b-11eb-b5f8-5254001adc46:1-6
show master status;
show binlog events in 'mysql-bin.000001';
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 6 | 123 | Server ver: 5.7.32-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 6 | 154 | |
| mysql-bin.000001 | 154 | Gtid | 6 | 219 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:1' |
| mysql-bin.000001 | 219 | Query | 6 | 317 | drop database oldboy |
| mysql-bin.000001 | 317 | Gtid | 6 | 382 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:2' |
| mysql-bin.000001 | 382 | Query | 6 | 483 | create database cs charset utf8 |
| mysql-bin.000001 | 483 | Gtid | 6 | 548 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:3' |
| mysql-bin.000001 | 548 | Query | 6 | 642 | use `cs`; create table t1 (id int) |
| mysql-bin.000001 | 642 | Gtid | 6 | 707 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:4' |
| mysql-bin.000001 | 707 | Query | 6 | 777 | BEGIN |
| mysql-bin.000001 | 777 | Table_map | 6 | 820 | table_id: 224 (cs.t1) |
| mysql-bin.000001 | 820 | Write_rows | 6 | 870 | table_id: 224 flags: STMT_END_F |
| mysql-bin.000001 | 870 | Xid | 6 | 901 | COMMIT /* xid=39 */ |
| mysql-bin.000001 | 901 | Gtid | 6 | 966 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:5' |
| mysql-bin.000001 | 966 | Query | 6 | 1060 | use `cs`; create table t2 (id int) |
| mysql-bin.000001 | 1060 | Gtid | 6 | 1125 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:6' |
| mysql-bin.000001 | 1125 | Query | 6 | 1195 | BEGIN |
| mysql-bin.000001 | 1195 | Table_map | 6 | 1238 | table_id: 340 (cs.t2) |
| mysql-bin.000001 | 1238 | Write_rows | 6 | 1288 | table_id: 340 flags: STMT_END_F |
| mysql-bin.000001 | 1288 | Xid | 6 | 1319 | COMMIT /* xid=61 */ |
| mysql-bin.000001 | 1319 | Gtid | 6 | 1384 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:7' |
| mysql-bin.000001 | 1384 | Query | 6 | 1478 | use `cs`; create table t3 (id int) |
| mysql-bin.000001 | 1478 | Gtid | 6 | 1543 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:8' |
| mysql-bin.000001 | 1543 | Query | 6 | 1613 | BEGIN |
| mysql-bin.000001 | 1613 | Table_map | 6 | 1656 | table_id: 457 (cs.t3) |
| mysql-bin.000001 | 1656 | Write_rows | 6 | 1706 | table_id: 457 flags: STMT_END_F |
| mysql-bin.000001 | 1706 | Xid | 6 | 1737 | COMMIT /* xid=83 */ |
| mysql-bin.000001 | 1737 | Gtid | 6 | 1802 | SET @@SESSION.GTID_NEXT= '30b767c7-2e2b-11eb-b5f8-5254001adc46:9' |
| mysql-bin.000001 | 1802 | Query | 6 | 1888 | drop database cs |
| mysql-bin.000001 | 1888 | Stop | 6 | 1911 | |
mysqlbinlog --skip-gtids --include-gtids='30b767c7-2e2b-11eb-b5f8-5254001adc46:7-8' /data/binlog/mysql-bin.000001 >/tmp/incremental.sql
set sql_log_bin=0;
source /tmp/incremental.sql
检验数据
备份集中单独恢复表
思考:在之前的项目案例中,如果误删除的表只有10M,而备份有500G,该如何快速恢复误删除表?
提示:
drop table city;
create table city like city_bak;
alter table city discard tablespace;
cp /backup/full/world/city.ibd /application/mysql/data/world/
chown -R mysql.mysql /application/mysql/data/world/city.ibd
alter table city import tablespace;