0
点赞
收藏
分享

微信扫一扫

Mysql备份恢复

南柯Taylor 2021-09-25 阅读 93
Mysql

备份恢复

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;
举报

相关推荐

0 条评论