备份的类型
服务器状态分类
热备份:读写操作不受影响
温备份:仅能执行读操作
冷备份:又名(离线备份),读写操作终止情况下
按对象分类
物理备份:复制数据文件
逻辑备份:将数据导出至文本文件中
按数据收集分类
完全备份:备份全部数据
增量备份:仅备份上次完全备份或增量备份以后变化的数据,备份速度快
差异备份:仅备份上次完全备份以来变化的数据,恢复速度快
逻辑备份与物理备份的比较
1、两个备份速度上取决于不同的存储引擎
2、物理备份的的还原速度快,但是其最小备份只到表
3、逻辑备份保存结构通常为纯ASCII,可以使用文本工具处理修改
4、逻辑备份有非常强的兼容性,而物理备份对版本的要求高
5、逻辑备份对保持数据的安全性有保证
6、逻辑备份要对RDBMS产生额外的压力,而裸备份无压力
7、逻辑备份的结果可能比源文件大,所以通常对其进行压缩
8、逻辑备份可能会丢失浮点数的精度信息
备份内容
数据文件
日志文件
存储过程,存储函数,触发器
配置文件
用于实现数据库备份的脚本,数据库自身清理的Crontab(计划任务)等
备份工具
MYSQL自带的备份工具
1、mysqldump逻辑备份工具
- 支持所有引擎
MYISAM是温备份,INNODB是热备份,备份速度中速,还原速度非常慢,但是在还原时,有较大的操作余地,有很好的的弹性
2、mysqlhotcopy物理备份工具(冷备份)
- 仅支持MYISAM,冷备份,备份速度快
文件系统备份工具
1、cp备份(物理备份,冷备份)
- 支持所有引擎,复制命令,冷备份。
- 使用归档工具,cp命令,对其进行备份,备份速度快,还原速度最快,但灵活性低,支持跨系统,跨平台能力较差。
2、lvm备份(物理备份,基本热备份)
- 支持所有引擎,基于快照(LVM,ZFS)备份
- 速度很快,恢复速度较快,没有什么弹性空间。
- LVM限制:不能对多个逻辑卷同一时间进行备份,所以数据文件和事务日志必须存放在同一个lvm上;
- ZFS可以实现多逻辑卷之间的备份
其他备份工具
1、ibbackup(商业)
- MYISAM是温备份,INNODB是热备份
- 备份和还原速度都快
2、xtrabackup(开源)
- MYISAM是温备份,INNODB是热备份,相当于ibbackup的替代工具
3、mysqlbackup(Oracle公司的备份工具)
4、mysql企业备份工具
- 执行在线“热备”,无阻塞的数据库备份
- 全备份可在所有INNODB上执行,无需中断mysql的查询或更新
- 支持增量备份,只备份自上次备份后的变化的数据
- 另外部分备份,支持特定的表或空间按需备份
备份策略
1、拷贝数据库文件备份
- 保证拷贝过程中表不在使用,需要保证拷贝完整性要关闭服务器进行
- 要确保文件是MYIASM格式或两台机器有相同的硬件结构。
2、CP文件系统备份工具备份(适合小型数据库)
- 停止Mysql服务器
- 直接复制整个数据库目录,需要保证还原到相同版本服务器中,不同版本可能不兼容
- 目标服务器上还原
- 目标服务器数据库目录授权,重启服务测试
例子
服务器A上的操作:
1、关闭数据库服务器
[root@localhost ~]# systemctl stop mysqld
2、将需要备份的数据打包
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# tar czf /opt/all_db.tar.gz *
3、用cp命令将打包文件复制到服务器B的某个目录文件下
[root@localhost mysql]# scp /opt/all_db.tar.gz 192.168.16.130:/opt
The authenticity of host '192.168.16.130 (192.168.16.130)' can't be established.
ECDSA key fingerprint is SHA256:trLa/WlV/AdOh1Af2iYRrmCNlgag29lJ8r3BJomI+QQ.
ECDSA key fingerprint is MD5:11:ef:16:37:1a:06:98:0a:c6:ad:78:c3:ec:c3:ad:8a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.16.130' (ECDSA) to the list of known hosts.
[email protected]'s password:
all_db.tar.gz 100% 1573KB 22.3MB/s 00:00
服务器B上的操作:
1、开启二进制日志文件
[root@mysql02 ~]# vim /etc/my.cnf
log_bin=mysql-bin
server_id=130
2、停止数据库服务
[root@mysql02 ~]# systemctl stop mysqld
3、删除原有的数据库目录数据
[root@mysql02 ~]# rm -rf /var/lib/mysql/*
4、将复制过来的文件解压到数据库文件目录下
[root@mysql02 ~]# tar xf /opt/all_db.tar.gz -C /var/lib/mysql/
5、重启数据库服务
[root@mysql02 ~]# systemctl start mysqld
6、进入数据库进行测试
[root@mysql02 ~]# mysql -u root -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| duo_school |
| mysql |
| performance_schema |
| school |
| sys |
| text |
| woker |
+--------------------+
3、mysqldump备份数据库(逻辑备份,适合中小型数据库)
- 完全备份+增加备份
- 速度相对较慢,适合中小型数据库
- MyISAM是温备份,InnoDB是热备份
- 采用SQL级别的备份机制,将数据表导成SQL脚本文件。兼容性较高,不同版本可以导入
备份数据库的格式
1、备份数据库(数据库中的表)
mysqldump [OPTIONS] database [tables]
2、备份多个数据库
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
3、备份所有数据库
mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump的常用选项
--defaults-file= 指定默认配置文件
-B, --databases 在备份数据库时包含创建数据库与切换数据库的语句
-F, --flush-logs 刷新日志
-l, --lock-tables 锁表
-x, --lock-all-tables 锁所有的表
-n, --no-create-db 在备份时不创建数据库
-d, --no-data 备份时不包含数据
-P, --port= 备份时指定端口 ,默认3306
-p, --password[=name] 密码
-q, --quick 备份时不在屏幕做任何输出
-A, --all-databases 针对所有的数据库
-Y, --all-tablespaces 包含所有表空间
--flush-privileges 刷新权限表
--ignore-error=name 忽略错误
--ignore-table=name 忽略表
--set-charset 设置字符集
--single-transaction 保持事务的一致性,只支持INNODB
-S, --socket=name 套接字
--tables 指定表(会覆盖-B选项)
例子
数据库的备份
完全备份
1、创建备份数据存放的目录
[root@localhost ~]# mkdir /backup/mysql -p
[root@localhost ~]# systemctl start mysqld
2、备份shcool数据库
[root@localhost ~]# mysqldump -uroot -p123456 school > /backup/mysql/school_1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
3、备份数据库时压缩
[root@localhost ~]# mysqldump -uroot -p123456 school -B | gzip > /backup/mysql/school_1.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
4、备份多个数据库并压缩
[root@localhost ~]# mysqldump -uroot -p123456 -B school woker | gzip > /backup/mysql/school_woker_1.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
5、备份所有的数据库
[root@localhost mysql]# mysqldump -uroot -p123456 -B -A > /backup/mysql/all_1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
6、只备份结构不包含数据
[root@localhost mysql]# mysqldump -uroot -p123456 -B school -d > school_no_data.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
7、备份数据库中的表
[root@localhost mysql]# mysqldump -uroot -p123456 school student > school_student.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure
8、备份时加上时间 $(date +%F)
[root@localhost mysql]# mysqldump -uroot -p123456 school student > school_student_$(date +%F).sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
增量备份实例
建表并插入数据
create database it DEFAULT CHARACTER SET utf8;
CREATE TABLE `Student` (
`Sno` int(10) NOT NULL COMMENT '学号',
`Sname` varchar(16) NOT NULL COMMENT '姓名',
`Ssex` char(2) NOT NULL COMMENT '性别',
`Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '学生年龄',
`Sdept` varchar(16) DEFAULT 'NULL' COMMENT '学生所在系别',
PRIMARY KEY (`Sno`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '计算机网络'),(2, 'tom', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子商务');
1、开启二进制日志
[root@localhost ~]# vim /etc/my.cnf
log_bin
server_id=128
[root@localhost ~]# systemctl restart mysqld
2、进入数据库查看是否开启
mysql> show variables like 'log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
3、先对数据库进行全局备份
[root@localhost mysql]# mysqldump -uroot -p123456 -F -B it | gzip > /backup/mysql/it_backup_`date +%F`.sql.gz
插入新数据:
INSERT INTO Student values(0005,'xumubin','男',29,'中文专业'), (0006,'wangzhao','男',21,'导弹专业');
删除了数据:
mysql> drop database it;
Query OK, 1 row affected (0.01 sec)
4、检查全备后的所有binlog
[root@localhost mysql]# ls -lrt /var/lib/mysql/mysql-bin*
5、立即刷新并备份出要恢复的数据的binlog
[root@localhost mysql]# mysqladmin -uroot -p flush-logs
[root@localhost mysql]# cp /var/lib/mysql/mysql-bin.000007 /backup/mysql
6、恢复binlog生成sql语句
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 > bin_log.sql
7、将完全备份还原
[root@localhost mysql]# zcat it_backup_2021-01-18.sql.gz | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
8、进入数据库查看完全备份是否还原。
mysql> select *from it.Student;
+-----+--------+------+------+-----------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+-----------------+
| 1 | 陆亚 | 男 | 24 | 计算机网络 |
| 2 | tom | 男 | 26 | 英语 |
| 3 | 张阳 | 男 | 21 | 物流管理 |
| 4 | alex | 女 | 22 | 电子商务 |
+-----+--------+------+------+-----------------+
9、去除日志中的错误语句
(1)将日志中错误的语句注释掉
[root@localhost mysql]# vim bin_log.sql
#drop database it
注释有影响的语句
:% s /^SET @@SESSION.GTID_NEXT/# SET @@SESSION.GTID_NEXT/
(2)或者使用位置信息筛选要恢复的日志信息
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --stop-position=476 > pos1.sql
10、将备份的日志文件的恢复
[root@localhost mysql]# mysql -uroot -p123456 < bin_log.sql
11、查看所有数据是否恢复
mysql> select *from it.Student;
+-----+----------+------+------+-----------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+----------+------+------+-----------------+
| 1 | 陆亚 | 男 | 24 | 计算机网络 |
| 2 | tom | 男 | 26 | 英语 |
| 3 | 张阳 | 男 | 21 | 物流管理 |
| 4 | alex | 女 | 22 | 电子商务 |
| 5 | xumubin | 男 | 29 | 中文专业 |
| 6 | wangzhao | 男 | 21 | 导弹专业 |
+-----+----------+------+------+-----------------+
数据库的还原
数据库外恢复
[root@localhost ~]# cd /backup/mysql/
(1)解压恢复数据
[root@localhost mysql]# gzip -d school_woker_1.sql.gz
[root@localhost mysql]# ls
school school_1.sql school_1.sql.gz school_woker_1.sql
[root@localhost mysql]# mysql -uroot -p123456 < school_woker_1.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
(2)不解压恢复数据
[root@localhost mysql]# zcat school_woker_1.sql.gz | mysql -uroot -p123456
(3)进入数据库查看是否恢复
mysql> select *from school.student;
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id | stu_name | stu_sex | stu_age | stu_major | stu_college |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎 | 男 | 22 | 计科 | 信工学院 |
数据库里恢复
1、先解压
[root@localhost mysql]# gzip -d school_1.sql.gz
2、用source语句恢复
mysql> source /backup/mysql/school_1.sql
3、查看是否恢复
mysql> select *from school.student;
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id | stu_name | stu_sex | stu_age | stu_major | stu_college |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎 | 男 | 22 | 计科 | 信工学院 |
| 201804550102 | 吕宇航 | 男 | 18 | 计科 | 信工学院 |
mysqlbinlog增量恢复方式
基于时间点恢复
1)指定开始时间到结束时间
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-datetime='2021-01-18 20:24:20' --stop-datetime='2021-01-18 20:25:51' > time1.sql
or
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-datetime'2021-01-18 20:24:20' --stop-datetime='2021-01-18 20:25:51' -r time1.sql
2)指定开始时间到文件结束
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-datetime='2021-01-18 20:24:20' -r time.sql
3)从文件开头到指定结束时间
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-datetime'2021-01-18 20:24:20' -r time.sql
恢复全局备份
[root@localhost mysql]# zcat it_backup_2021-01-18.sql.gz | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
恢复日志备份
[root@localhost mysql]# mysql -uroot -p123456 < time1.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
基于位置点的增量恢复
1)指定开始位置到结束位置
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-position=289 --stop-position=476 -r pos_1.sql
2)指定开始位置到文件结束
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --start-position=289 -r pos_1.sql
3)从文件开始位置到指定结束位置
[root@localhost mysql]# mysqlbinlog mysql-bin.000007 --stop-position=476 -r pos_1.sql
恢复全局备份
[root@localhost mysql]# zcat it_backup_2021-01-18.sql.gz | mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
恢复日志备份
[root@localhost mysql]# mysql -uroot -p123456 < pos_1.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
备份参数
-R 备份存储过程及函数
--triggers 备份触发器
-E 备份事件
-F 在备份开始时,刷新一个新binlog日志
--master-data=2 以注释的形式,保存备份开始时间点的binlog的状态信息
--single-transaction 保持事务的一致性
--set-gtid-purged=auto 开启gtid新特性
--max-allowed-packet= 最大允许传输的包(--max-allowed-packet=256M)
--master-data=功能:
(1)在备份时,会自动记录,二进制日志文件名和位置号
0 默认值
1 以change master to命令形式,可以用作主从复制
2 以注释的形式记录,备份时刻的文件名+postion号
(2)自动锁表
(3)如果配合--single-transaction,只对非InnoDB表进行锁表备份,InnoDB表进行“热“”备, 实际上是实现快照备份。
--single-transaction:
innodb 存储引擎开启热备(快照备份)功能
(1)在不加--single-transaction ,启动所有表的温备份,所有表都锁定
(2)加上--single-transaction ,对innodb进行快照备份,对非innodb表可以实现自动锁表功能
--set-gtid-purged=:
auto/on ,off
使用场景:
1. --set-gtid-purged=OFF,可以使用在日常备份参数中.
2. --set-gtid-purged=auto/on,在构建主从复制环境时需要的参数配置
GTID新特性
定义:
GTID(Global Transaction ID),全局事务标识符。是对于一个已提交事务的编号,并且是一个全局唯一的编号。
它是MySQL 5.6加入的一个强大特性,目的在于能够实现主从自动定位和切换,而不像以前需要指定文件和位置。
格式
1、单个GTID
GTID = server_uuid :transaction_id
GTID与主库上提交的每个事务相关联。此标识符不仅对发起事务的库是唯一的,而且在给定复制拓扑中的所有库中都是唯一的。GTID用冒号分隔的一对坐标表示
eg:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23
前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1 开始。
2、GTID集
GTID集是包括一个或多个单个GTID或GTID范围的集合。 源自同一服务器的一系列GTID可以折叠为单个表达式。
eg:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-321
上面的示例表示源自server_uuid为8eed0f5b-6f9b-11e9-94a9-005056a57a4e服务器的第1到第321个事务。
源自同一服务器的多个单GTID或GTID范围可以同时包含在由冒号分隔的单个表达式中。
eg:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-3:11:47-49
3、mysql.gtid_executed表
(1)表结构:
mysql> desc mysql.gtid_executed;
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| source_uuid | char(36) | NO | PRI | NULL | | 服务器UUID
| interval_start | bigint(20) | NO | PRI | NULL | | UUID集的起始
| interval_end | bigint(20) | NO | | NULL | | 结束事务ID
+----------------+------------+------+-----+---------+-------+
mysql.gtid_executed表记录的是服务器上已经执行事务的GTID。
三个字段分别表示发起事务的服务器UUID、UUID集的起始和结束事务ID。对于单个GTID,后两个字段的值相同。
(2)版本支持:
5.6 版本新加的特性,5.7中做了加强
5.6 中不开启,没有这个功能.
5.7 中的GTID,即使不开也会有自动生成SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | OFF |
| gtid_executed_compression_period | 1000 |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
开启
[root@localhost mysql]# vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=true
重启服务查看:
mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery | ON |
| enforce_gtid_consistency | ON |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
| session_track_gtids | OFF |
+----------------------------------+-----------+
查看
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000009 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
DDL一个语句产生一个gtid
mysql> create database db1;
mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000009 | 310 | | | a74aedab-554e-11eb-b297-000c296550da:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
DML一个事务产生一个gtid(默认一个语句产生一个gtid)
mysql> begin; 事务的开始
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);
mysql> commit; 事务的结束
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000009 | 805 | | | a74aedab-554e-11eb-b297-000c296550da:1-3
+------------------+----------+--------------+------------------+------------------------------------------+
基于GTID查看binlogshow binlog events in 'mysql-bin.000009';
mysql> mysql> show binlog events in 'mysql-bin.000009';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000009 | 4 | Format_desc | 128 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 |
| mysql-bin.000009 | 123 | Previous_gtids | 128 | 154 | |
| mysql-bin.000009 | 154 | Gtid | 128 | 219 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:1' |
| mysql-bin.000009 | 219 | Query | 128 | 310 | create database db1 |
| mysql-bin.000009 | 310 | Gtid | 128 | 375 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:2' |
| mysql-bin.000009 | 375 | Query | 128 | 470 | use `db1`; create table t1(id int) |
| mysql-bin.000009 | 470 | Gtid | 128 | 535 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:3' |
| mysql-bin.000009 | 535 | Query | 128 | 606 | BEGIN |
| mysql-bin.000009 | 606 | Table_map | 128 | 650 | table_id: 108 (db1.t1) |
| mysql-bin.000009 | 650 | Write_rows | 128 | 690 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000009 | 690 | Table_map | 128 | 734 | table_id: 108 (db1.t1) |
| mysql-bin.000009 | 734 | Write_rows | 128 | 774 | table_id: 108 flags: STMT_END_F |
| mysql-bin.000009 | 774 | Xid | 128 | 805 | COMMIT /* xid=13 */ |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
gtid恢复数据
测试操作:
mysql> create database gtid;
mysql> use gtid
mysql> create table t1(id int);
mysql> insert into t1 values(1);
mysql> flush logs;
mysql> create table t2(id int);
mysql> insert into t2 values(2);
mysql> drop database gtid;
使用binlog日志恢复误删除的gitd数据库,确定gtid的起始和结束
mysql> show binlog events in 'mysql-bin.000009';
...
| mysql-bin.000009 | 870 | Query | 128 | 964 | create database gtid |
| mysql-bin.000009 | 964 | Gtid | 128 | 1029 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:5' |
...
开始:mysql-bin.000009
gtid:SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:5'
mysql> show binlog events in 'mysql-bin.000011';
...
| mysql-bin.000011 | 194 | Gtid | 128 | 259 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:9' |
| mysql-bin.000011 | 259 | Query | 128 | 351 | drop database gtid |
...
查找删除的上一个log文件及gtid
mysql> show binlog events in 'mysql-bin.000010';
...
| mysql-bin.000010 | 259 | Query | 128 | 356 | use `gtid`; create table t2(id int) |
| mysql-bin.000010 | 356 | Gtid | 128 | 421 | SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:8' |
...
结束:mysql-bin.000010
gtid:SET @@SESSION.GTID_NEXT= 'a74aedab-554e-11eb-b297-000c296550da:8'
binlog使用gtid截取日志
--include-gtids 开始
--exclude-gtids 结束
GTID的幂等性
开启GTID后,MySQL恢复Binlog时,重复GTID的事务不会再执行了,需要加入--skip-gtids
语句
[root@localhost mysql]# cd /var/lib/mysql
[root@localhost mysql]# mysqlbinlog --skip-gtids --include-gtids='a74aedab-554e-11eb-b297-000c296550da:5-8' mysql-bin.000009 mysql-bin.000010 -r /backup/mysql/gtid1.sql
恢复数据
mysql> set sql_log_bin=0; 设置恢复数据时不产生gtid
mysql> source /backup/mysql/gtid1.sql; 恢复数据
4、mydump备份数据库
Mydumper主要特性
• 轻量级C语言写的
• 执行速度比mysqldump快10倍
• 事务性和非事务性表一致的快照(适用于0.2.2以上版本)
• 快速的文件压缩
• 支持导出binlog
• 多线程恢复(适用于0.2.1以上版本)
• 以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
• 开源 (GNU GPLv3)
Mydumper安装
[root@localhost ~]# tar xf mydumper-0.9.1.tar.gz -C /usr/local/src/
[root@localhost src]# cd /usr/local/src/mydumper-0.9.1/
[root@localhost mydumper-0.9.1]# yum install gcc gcc-c++ make cmake zlib-devel glib2-devel pcre-devel -y
[root@localhost ~]# yum install mysql-community-devel-5.7.14-1.el7.x86_64.rpm
[root@localhost mydumper-0.9.1]# rm -f CMakeCache.txt
[root@localhost mydumper-0.9.1]# cmake .
[root@localhost mydumper-0.9.1]# make
[root@localhost mydumper-0.9.1]# make install
Mydumper常用选项
-B, --database 数据库
-T, --tables-list 表
-o, --outputdir 存放位置
-c, --compress 压缩
-d, --no-data 不要数据
-G, --triggers 触发器
-E, --events 事件
-R, --routines 存储过程
-u, --user 用户
-p, --password 密码
-h, --host 本地
-t, --threads 线程(默认4个)
-s, --statement-size 套接字
-C, --compress-protocol 压缩协议
mydumper备份数据库
[root@localhost ~]# mydumper -u root -p 123456 -B db1 -o /mysqlbak
[root@localhost ~]# ls /mysqlbak/
db1-schema-create.sql db1.t1-schema.sql db1.t1.sql metadata
mydumper备份数据表
[root@localhost ~]# mydumper -u root -p 123456 -B db1 -T t1 -o /mysqlbak
mydumper输出文件
metadata:
元数据 记录备份开始和结束时间,以及binlog日志文件位置。
table data:
每个表一个文件
table schemas:
表结构文件
binary logs:
启用–binlogs选项后,二进制文件存放在binlog_snapshot目录下
daemon mode
:在这个模式下,有五个目录0,1,binlogs,binlog_snapshot,last_dump。
备份目录是0和1,间隔备份,如果mydumper因某种原因失败而仍然有一个好的快照, 当快照完成后,last_dump指向该备份。
myloader恢复数据库
-d, --directory 目录
-o, --overwrite-tables 覆盖表
-B, --database 数据库
-s, --source-db 源数据库
-h, --host 主机
-u, --user 用户
-p, --password 密码
-P, --port 端口
-C, --compress-protocol 压缩协议
-t, --threads 线程(默认4个)
恢复备份
[root@localhost ~]# myloader -u root -p 123456 -B db1 -o -d /mysqlbak/
5、LVM快照备份
要求:
1、数据文件要在逻辑卷上
2、该逻辑卷所在卷组必须有足够空间使用快照卷
3、数据文件和事务日志要在同一个逻辑卷上
4、MYSQL数据LV和将要创建的快照要在同用一个vg,VG要有足够的空间存储
优点:
1、几乎是热备
2、支持所有的存储引擎
3、备份速度快
4、无需使用昂贵的商业软件(操作系统级别)
缺点:
1、会使用操作系统级别的命令,DBA一般没有权限
2、无法预计服务停止时间
3、数据如果分布在多个卷上比较麻烦
操作流程
1)锁表 flush table with read lock
2)查看position号并记录,便于后期恢复 show master status
3)创建snapshot快照 create snapshop
4)解表 unlock tables
5)挂载snapshot
6)拷贝snapshot数据,进行备份。备份整个数据库之前,要关闭mysql服务(保护ibdata1文件)
7)卸载
8)移除快照
实例
1、添加一块10G硬盘
2、查看添加的硬盘是否成功
[root@mysql02 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 942M 0 rom
3、创建一个逻辑卷
[root@mysql02 ~]# vgcreate mysql /dev/sdb
Physical volume "/dev/sdb" successfully created.
Volume group "mysql" successfully created
[root@mysql02 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb mysql lvm2 a-- <10.00g <10.00g
[root@mysql02 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
mysql 1 0 0 wz--n- <10.00g <10.00g
创建LV
[root@mysql02 ~]# lvcreate -n lv_mysql -L 4G mysql
Logical volume "lv_mysql" created.
[root@mysql02 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
lv_mysql mysql -wi-a----- 4.00g
格式化lv
[root@mysql02 ~]# mkfs.xfs /dev/mysql/lv_mysql
4、将当前的mysql数据库迁移到逻辑卷上
关闭数据库服务
[root@mysql02 ~]# systemctl stop mysqld.service
创建一个放备份的目录
[root@mysql02 ~]# mkdir /backup/mysql/ -p
将数据库数据打包并存储到/backup/mysql/ 下
[root@mysql02 ~]# tar czf /backup/mysql/mysql.tar.gz /var/lib/mysql/*
查看/backup/mysql/下的压缩包文件
[root@mysql02 ~]# tar tf /backup/mysql/mysql.tar.gz
在备份时压缩包文件前不添加路径,进入要压缩的文件目录下进行压缩
[root@mysql02 ~]# rm -rf /backup/mysql/mysql.tar.gz
[root@mysql02 ~]# cd /var/lib/mysql
[root@mysql02 mysql]# tar czf /backup//mysql/mysql.tar.gz *
挂载逻辑卷到当前mysql的数据目录中
[root@mysql02 mysql]# mount /dev/mysql/lv_mysql /var/lib/mysql
将刚刚备份的数据解压到数据目录里
[root@mysql02 ~]# tar xf /backup/mysql/mysql.tar.gz -C /var/lib/mysql
查看是否数据文件放在逻辑卷上
[root@mysql02 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 2.1G 0 2.1G 0% /dev
tmpfs 2.1G 0 2.1G 0% /dev/shm
tmpfs 2.1G 12M 2.1G 1% /run
tmpfs 2.1G 0 2.1G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 7.5G 9.6G 45% /
/dev/sda1 1014M 137M 878M 14% /boot
tmpfs 422M 0 422M 0% /run/user/0
/dev/mapper/mysql-lv_mysql 4.0G 220M 3.8G 6% /var/lib/mysql
修改权限
[root@mysql02 ~]# chown mysql.mysql /var/lib/mysql
重启服务
[root@mysql02 ~]# systemctl start mysqld
测试:-e (不进入数据库搜索信息)
[root@mysql02 ~]# mysql -u root -p123456 -e 'select *from school.student';
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------+-----------+---------+---------+-----------+--------------+
| stu_id | stu_name | stu_sex | stu_age | stu_major | stu_college |
+--------------+-----------+---------+---------+-----------+--------------+
| 201804550101 | 郭奎 | 男 | 22 | 计科 | 信工学院 |
| 201804550102 | 吕宇航 | 男 | 18 | 计科 | 信工学院 |
| 201804550103 | 张豪辉 | 女 | 19 | 计科 | 信工学院 |
| 201804550107 | 丁志杰 | 男 | 17 | 金融学 | 金贸学院 |
快照备份数据库
1、命令备份
给数据库加只读锁
mysql> flush table with read lock;
给数据库所在的逻辑卷创建快照
[root@mysql02 ~]# lvcreate -n lv_mysql_s -L 500M -s /dev/mysql/lv_mysql
解锁数据库
mysql> unlock tables;
以上3个语句需要在一个会话中完成
或者用以下语句写入
[root@mysql02 ~]# echo 'flush tables with read lock;system lvcreate -n lv_mysql_s -L 500M -s /dev/mysql/lv_mysql;unlock tables;' | mysql -uroot -p123456
创建挂载目录
[root@mysql02 ~]# mkdir /mnt/mysql
将备份数据挂载到目录下
[root@mysql02 ~]# mount -o nouuid /dev/mysql/lv_mysql_s /mnt/mysql/
卸载快照
[root@Admin ~]# umount /mnt/mysql/
2、编写脚本备份
安装rsync包
[root@mysql02 ~]# yum install -y rsync
[root@mysql02 ~]# vim /backup/mysql/bak_mysql.sh
#!/bin/bash
back_dir=/backup/`date +%F`
[ -d $back_dir ]|| mkdir -p $back_dir
echo "flush tables with read lock; system lvcreate -n mysql_snap -L 500M -s /dev/mysql/lv_mysql;unlock tables;" | mysql -uroot -p123456 &>/dev/null
[ -d /mnt/mysql/ ] || mkdir -p /mnt/mysql/
mount -o nouuid /dev/mysql/mysql_snap /mnt/mysql/
rsync -a /mnt/mysql/ $back_dir
if [ $? -eq 0 ];then
umount /mnt/mysql/ && lvremove -f /dev/mysql/mysql_snap &>/dev/null
fi
给脚本文件添加执行权限
[root@mysql02 ~]# chmod +x /backup/mysql/bak_mysql.sh
执行脚本
[root@mysql02 ~]# /backup/mysql/bak_mysql.sh
[root@mysql02 ~]# cd /backup/
[root@mysql02 backup]# ll
总用量 4
drwxr-xr-x. 9 mysql mysql 4096 1月 20 09:58 2021-01-20
drwxr-xr-x. 2 root root 46 1月 20 10:39 mysql
6、图形化工具管理数据库
给登录用户授权
[root@mysql02 ~]# mysql -uroot -p123456 -e 'grant all on *.* to admin@"%" identified by "123456"'
关闭防火墙
[root@mysql02 ~]# systemctl stop firewalld.service
SQLyog连接数据库备份
点击该项,按“F5”刷新,出现导入的数据库
7、xtrabackup 备份数据库
1、Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写)
2、**Xtrabackup有两个主要的工具**:xtrabackup、innobackupex
3、xtrabackup 只能备份**InnoDB**和**XtraDB**两种数据表,而**不能备份MyISAM**数据表。
4、innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后作为slave需要的一些信 息,根据这些信息,可以很方便的利用备份来重做slave。
5、支持完全备份和增量备份
优点:
备份过程快速、可靠;
备份过程不会打断正在执行的事务;
能够基于压缩等功能节约磁盘空间和流量;
自动实现备份检验;
还原速度快;
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文 件(.frm)、以及MyISAM、
MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相 关的文件。这些文件会被保存至一个以时间命令的目录中
``
#### (1) 安装相应的包
```powershell
[root@mysql02 ~]# yum install mysql-community-libs-compat-5.7.14-1.el7.x86_64.rpm -y
[root@mysql02 ~]# yum install perl-DBD-MySQL-4.023-6.el7.x86_64.rpm -y
[root@mysql02 ~]# yum install percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm -y
常用选项:
--apply-log 应用日志
--redo-only 只读
--incremental 增量备份
--no-timestamp 不使用时间戳
--decompress 解压
-u, --user=name 用户
-H, --host=name 主机
-p, --password=name 密码
-P, --port= 端口号
(2)完全备份
[root@mysql02 ~]# innobackupex -u root -p 123456 --no-timestamp /backup/mysql/full_$(date +%F)
[root@mysql02 ~]# ll /backup/mysql/full_2021-01-20/
总用量 77876
-rw-r-----. 1 root root 426 1月 20 12:00 backup-my.cnf
drwxr-x---. 2 root root 128 1月 20 12:00 duo_school
-rw-r-----. 1 root root 509 1月 20 12:00 ib_buffer_pool
-rw-r-----. 1 root root 79691776 1月 20 12:00 ibdata1
drwxr-x---. 2 root root 4096 1月 20 12:00 mysql
drwxr-x---. 2 root root 8192 1月 20 12:00 performance_schema
drwxr-x---. 2 root root 94 1月 20 12:00 school
drwxr-x---. 2 root root 8192 1月 20 12:00 sys
drwxr-x---. 2 root root 232 1月 20 12:00 text
drwxr-x---. 2 root root 20 1月 20 12:00 woker
-rw-r-----. 1 root root 22 1月 20 12:00 xtrabackup_binlog_info
-rw-r-----. 1 root root 113 1月 20 12:00 xtrabackup_checkpoints
-rw-r-----. 1 root root 492 1月 20 12:00 xtrabackup_info
-rw-r-----. 1 root root 2560 1月 20 12:00 xtrabackup_logfile
备份产生的部分文件说明:
xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状 态)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN 是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
backup-my.cnf —— 备份命令用到的配置选项信息;
(3)完全备份中恢复数据
[root@mysql02 ~]# innobackupex -u root -p 123456 --apply-logs /backup/mysql/full_2021-01-20/
停止数据库:
[root@mysql02 ~]# systemctl stop mysqld.service
清除原有数据:
[root@mysql02 ~]# rm -rf /var/lib/mysql/*
还原数据库到默认目录:
[root@mysql02 ~]# innobackupex -u root -p 123456 --copy-back /backup/mysql/full_2021-01-20/
修改恢复的数据权限
[root@mysql02 ~]# chown -R mysql.mysql /var/lib/mysql
[root@mysql02 mysql]# systemctl start mysqld
测试:
mysql> show databases;
+------------------------------+
| Database |
+------------------------------+
| information_schema |
| #mysql50#2021-01-20_15-00-27 |
| mysql |
| performance_schema |
| school |
| sys |
+------------------------------+
(4)增量备份
必须要有未压缩的全量备份文件目录,先全量再增量,此次使用前面全量备份
插入数据进行测试
第一次插入数据:
mysql> INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
第一次增量备份:
[root@mysql02 ~]# innobackupex --incremental -u root -p 123456 --no-timestamp /backup/mysql/incr_1 --incremental-basedir=/backup/mysql/full_2021-01-20/
查看备份的目录文件incr_1
[root@mysql02 ~]# ls /backup/mysql/
2021-01-20_11-56-10 bak_mysql.sh full_2021-01-20 incr_1 mysql.tar.gz
--incremental-basedir 上一次的备份路径
第二次插入数据:
mysql>INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');
第二次增量备份
[root@mysql02 ~]# innobackupex --incremental -u root -p 123456 --no-timestamp /backup/mysql/incr_2 --incremental-basedir=/backup/mysql/incr_1/
(5)恢复增量备份
首先恢复完全备份
[root@mysql02 ~]# innobackupex -u root -p 123456 --apply-log --redo-only /backup/mysql/full_2021-01-20/
恢复第一次增量备份
[root@mysql02 ~]# innobackupex -u root -p 123456 --apply-log --redo-only /backup/mysql/full_2021-01-20/ --incremental-dir=/backup/mysql/incr_1
恢复第二次增量备份
[root@mysql02 ~]# innobackupex -u root -p 123456 --apply-log --redo-only /backup/mysql/full_2021-01-20/ --incremental-dir=/backup/mysql/incr_2
关闭数据库服务
[root@mysql02 ~]# systemctl stop mysqld
删除原有的数据
[root@mysql02 ~]# rm -rf /var/lib/mysql/*
将数据还原到默认目录中
[root@mysql02 ~]# innobackupex -u root -p 123456 --copy-back /backup/mysql/full_2021-01-20/
修改数据文件所属组与所属者
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
重启服务
[root@localhost ~]# systemctl start mysqld