1、 备份类型
热备份、温备份、冷备份 (根据服务器状态) 热备份:读、写不受影响; 温备份:仅可以执行读操作; 冷备份:离线备份;读、写操作均中止; 物理备份与逻辑备份 (从对象来分) 物理备份:复制数据文件; 逻辑备份:将数据导出至文本文件中; 完全备份、增量备份、差异备份 (从数据收集来分) 完全备份:备份全部数据; 增量备份:仅备份上次完全备份或增量备份以后变化的数据; 差异备份:仅备份上次完全备份以来变化的数据;
2、备份案例
2.1 mysqldump(完全)+binlog(增量)实现完全+增量备份
mysql> create database school; Query OK, 1 row affected (0.01 sec) mysql> use school Database changed mysql> 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`) -> ) ; Query OK, 0 rows affected, 2 warnings (0.09 sec) mysql> INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '计算机网络'),(2, 'tom', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子商务'); Query OK, 4 rows affected (0.02 sec) Records: 4 Duplicates: 0 Warnings: 0 #完全备份: [root@localhost mysqlbak]# mysqldump --opt -B school > school.sql -B:恢复时不用创建数据库和删表 #插入数据: INSERT INTO Student values(0005,'xumubin','男',29,'中文专业'),(0006,'wangzhao','男',21,'导弹专业'); #模拟数据损坏: mysql> drop database school; Query OK, 1 row affected (0.04 sec) #刷新日志并保存 mysql> flush logs; Query OK, 0 rows affected (0.03 sec) mysql> show binary logs; +---------------+-----------+-----------+ | Log_name | File_size | Encrypted | +---------------+-----------+-----------+ | binlog.000001 | 1822 | No | | binlog.000002 | 157 | No | +---------------+-----------+-----------+ 2 rows in set (0.00 sec) #将二进制日志进行备份保存,避免二次破坏 mysql> system cp /var/lib/mysql/binlog.000001 /mysqlbak # 查看二进制日志 使用mysqlbinlog 注意5.7版本,insert语句已经加密,默认看不到,查看时加上选项 --base64-output=DECODE-ROWS -vv #1、基于时间点增量恢复 注意:在BEGIN之后的时间点,cCOMMIT之后 [root@localhost mysqlbak]# mysqlbinlog binlog.000001 --start-datetime="2024-02-19 11:34:53" --stop-datetime="2024-02-19 11:36:35" -r time1.sql -r,----result-file=name:此选项指示mysqlbinlog将文本输出写入到的文件 #还原完全备份 mysql> source /mysqlbak/school.sql mysql> select * from school.Student; +-----+--------+------+------+-----------------+ | Sno | Sname | Ssex | Sage | Sdept | +-----+--------+------+------+-----------------+ | 1 | 陆亚 | 男 | 24 | 计算机网络 | | 2 | tom | 男 | 26 | 英语 | | 3 | 张阳 | 男 | 21 | 物流管理 | | 4 | alex | 女 | 22 | 电子商务 | +-----+--------+------+------+-----------------+ 4 rows in set (0.01 sec) #还原增量备份 mysql> source /mysqlbak/time1.sql mysql> select * from school.Student; +-----+----------+------+------+-----------------+ | Sno | Sname | Ssex | Sage | Sdept | +-----+----------+------+------+-----------------+ | 1 | 陆亚 | 男 | 24 | 计算机网络 | | 2 | tom | 男 | 26 | 英语 | | 3 | 张阳 | 男 | 21 | 物流管理 | | 4 | alex | 女 | 22 | 电子商务 | | 5 | xumubin | 男 | 29 | 中文专业 | | 6 | wangzhao | 男 | 21 | 导弹专业 | +-----+----------+------+------+-----------------+ 6 rows in set (0.00 sec) #2、基于位置点恢复 [root@localhost mysqlbak]# mysqlbinlog binlog.000001 --start-position=1392 --stop-position=1591 -r pos1.sql
2.2 binlog新特性--gtid
binlog日志的GTID新特性
1、 GTID 介绍
1> 什么是GTID
GTID(Global Transaction ID),全局事务标识符。是对于一个已提交事务的编号,并且是一个全局唯一的编号。 它是MySQL 5.6加入的一个强大特性,目的在于能够实现主从自动定位和切换,而不像以前需要指定文件和位置。
2> GTID的格式与存储
1) 单个GTID GTID与主库上提交的每个事务相关联。此标识符不仅对发起事务的库是唯一的,而且在给定复制拓扑中的所有库中都是唯一的。GTID用冒号分隔的一对坐标表示,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23 前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1开始。 GTID = server_uuid :transaction_id
2)GTID集 GTID集是包括一个或多个单个GTID或GTID范围的集合。源自同一服务器的一系列GTID可以折叠为单个表达式,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-321 上面的示例表示源自server_uuid为8eed0f5b-6f9b-11e9-94a9-005056a57a4e服务器的第1到第321个事务。源自同一服务器的多个单GTID或GTID范围可以同时包含在由冒号分隔的单个表达式中,例如:
8eed0f5b-6f9b-11e9-94a9-005056a57a4e:1-3:11:47-49
3)mysql.gtid_executed表 mysql.gtid_executed表结构如下:
mysql> desc mysql.gtid_executed; +----------------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------+------+-----+---------+-------+ | source_uuid | char(36) | NO | PRI | NULL | | | interval_start | bigint(20) | NO | PRI | NULL | | | interval_end | bigint(20) | NO | | NULL | | +----------------+------------+------+-----+---------+-------+
mysql.gtid_executed表记录的是服务器上已经执行事务的GTID。三个字段分别表示发起事务的服务器UUID、UUID集的起始和结束事务ID。对于单个GTID,后两个字段的值相同。
3> 版本支持
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 | | | gtid_executed_compression_period | 0 | | gtid_mode | OFF | #8.0默认关闭 | gtid_next | AUTOMATIC | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------+-----------+ 9 rows in set (0.06 sec)
4>开启gtid
vim /etc/my.cnf [mysqld] 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 | | | gtid_executed_compression_period | 0 | | gtid_mode | ON | #已开启 | gtid_next | AUTOMATIC | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------+-----------+ 9 rows in set (0.01 sec)
5>DDL和DML语句查看gtid
DDL一个语句产生一个gtid
mysql> create database db3; Query OK, 1 row affected (0.00 sec) mysql> show master status; #此语句提供有关源服务器二进制日志文件的状态信息,通过该命令可以了解当前主数据库的状态,以及正在写入的二进制日志文件名和位置,方便进行备份和恢复操作。 +------------------+----------+--------------+------------------+----------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+----------------------------------------+ | mysql-bin.000013 | 310 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1 | +------------------+----------+--------------+------------------+----------------------------------------+ 1 row in set (0.00 sec) mysql> use db3 #1.File:当前正在写入的二进制日志文件名。 #2.Position:当前正在写入的二进制日志文件的位置。 #3.Binlog Do DB:指定需要写入二进制日志的数据库名。 #4. Binlog lgnore DB:指定不需要写入二进制日志的数据库名。 Database changed mysql> create table t1 (id int); Query OK, 0 rows affected (0.01 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 471 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-2 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t2 (id int); Query OK, 0 rows affected (0.01 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 632 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-3 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t3 (id int); Query OK, 0 rows affected (0.01 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 793 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-4 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec)
DML一个事务产生一个gtid
DML一个事务产生一个gtid mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(1); Query OK, 1 row affected (0.02 sec) mysql> insert into t1 values(2); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 1128 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-5 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t2 values(1); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 1379 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec)s
6>基于GTID进行查看binlog
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000013'; +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+ | mysql-bin.000013 | 4 | Format_desc | 123 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 | | mysql-bin.000013 | 123 | Previous_gtids | 123 | 154 | | | mysql-bin.000013 | 154 | Gtid | 123 | 219 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:1' | | mysql-bin.000013 | 219 | Query | 123 | 310 | create database db3 | | mysql-bin.000013 | 310 | Gtid | 123 | 375 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:2' | | mysql-bin.000013 | 375 | Query | 123 | 471 | use `db3`; create table t1 (id int) | | mysql-bin.000013 | 471 | Gtid | 123 | 536 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:3' | | mysql-bin.000013 | 536 | Query | 123 | 632 | use `db3`; create table t2 (id int) | | mysql-bin.000013 | 632 | Gtid | 123 | 697 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:4' | | mysql-bin.000013 | 697 | Query | 123 | 793 | use `db3`; create table t3 (id int) | | mysql-bin.000013 | 793 | Gtid | 123 | 858 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:5' | | mysql-bin.000013 | 858 | Query | 123 | 929 | BEGIN | | mysql-bin.000013 | 929 | Table_map | 123 | 973 | table_id: 108 (db3.t1) | | mysql-bin.000013 | 973 | Write_rows | 123 | 1013 | table_id: 108 flags: STMT_END_F | | mysql-bin.000013 | 1013 | Table_map | 123 | 1057 | table_id: 108 (db3.t1) | | mysql-bin.000013 | 1057 | Write_rows | 123 | 1097 | table_id: 108 flags: STMT_END_F | | mysql-bin.000013 | 1097 | Xid | 123 | 1128 | COMMIT /* xid=21 */ | | mysql-bin.000013 | 1128 | Gtid | 123 | 1193 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:6' | | mysql-bin.000013 | 1193 | Query | 123 | 1264 | BEGIN | | mysql-bin.000013 | 1264 | Table_map | 123 | 1308 | table_id: 109 (db3.t2) | | mysql-bin.000013 | 1308 | Write_rows | 123 | 1348 | table_id: 109 flags: STMT_END_F | | mysql-bin.000013 | 1348 | Xid | 123 | 1379 | COMMIT /* xid=26 */ | +------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+ 22 rows in set (0.00 sec)
具备GTID后,截取查看某些事务日志: --include-gtids 包含哪些gtid --exclude-gtids 排除哪些gtid
7>示例:演示跨binlog文件截取日志
1、素材准备
第一次操作:
mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+ | mysql-bin.000013 | 1379 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-6 | +------------------+----------+--------------+------------------+------------------------------------------+ 1 row in set (0.00 sec) mysql> create database gtid; Query OK, 1 row affected (0.01 sec) mysql> use gtid Database changed mysql> create table t1(id int); Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(1); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.00 sec)
第二次操作:
mysql> create table t2(id int); Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t2 values(1); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> flush logs; Query OK, 0 rows affected (0.01 sec)
第三次操作:
mysql> create table t3(id int); Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into t3 values(1); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.01 sec) #数据库误删 mysql> drop database gtid; Query OK, 3 rows affected (0.01 sec)
2、使用binlog日志恢复误删除的gtid数据库
(1)首先要确定gtid的起始和结束
mysql> show binlog events in 'mysql-bin.000013'; ... | mysql-bin.000013 | 1379 | Gtid | 123 | 1444 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:7' | | mysql-bin.000013 | 1444 | Query | 123 | 1538 | create database gtid ... 开始: 文件:mysql-bin.000013 gtid:'6181523d-bc2e-11ea-a78b-000c2921146:7'
mysql> show master status; +------------------+----------+--------------+------------------+-------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------------------------------+ | mysql-bin.000015 | 766 | | | 6181523d-bc2e-11ea-a78b-000c29221146:1-14 | +------------------+----------+--------------+------------------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> show binlog events in 'mysql-bin.000015'; +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+ | mysql-bin.000015 | 4 | Format_desc | 123 | 123 | Server ver: 5.7.14-log, Binlog ver: 4 | | mysql-bin.000015 | 123 | Previous_gtids | 123 | 194 | 6181523d-bc2e-11ea-a78b-000c29221146:1-11 | | mysql-bin.000015 | 194 | Gtid | 123 | 259 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:12' | | mysql-bin.000015 | 259 | Query | 123 | 356 | use `gtid`; create table t3(id int) | | mysql-bin.000015 | 356 | Gtid | 123 | 421 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:13' | | mysql-bin.000015 | 421 | Query | 123 | 493 | BEGIN | | mysql-bin.000015 | 493 | Table_map | 123 | 538 | table_id: 112 (gtid.t3) | | mysql-bin.000015 | 538 | Write_rows | 123 | 578 | table_id: 112 flags: STMT_END_F | | mysql-bin.000015 | 578 | Xid | 123 | 609 | COMMIT /* xid=50 */ | | mysql-bin.000015 | 609 | Gtid | 123 | 674 | SET @@SESSION.GTID_NEXT= '6181523d-bc2e-11ea-a78b-000c29221146:14' | | mysql-bin.000015 | 674 | Query | 123 | 766 | drop database gtid | +------------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+ 11 rows in set (0.00 sec) 确定结束: 文件:mysql-bin.000015 gtid:'6181523d-bc2e-11ea-a78b-000c29221146:14'
(2)其次,binlog使用gtid截取日志
确认范围:7-13
文件:mysql-bin.000013 mysql-bin.000014 mysql-bin.000015
[root@mysql ~]# cd /var/lib/mysql [root@mysql mysql]# mysqlbinlog --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid1.sql -r,----result-file=name:此选项指示mysqlbinlog将文本输出写入到的文件
(3)最后使用binlog日志恢复
mysql> set sql_log_bin=0; #设为0后,在Master数据库上执行的语句都不记录binlog Query OK, 0 rows affected (0.00 sec) mysql> source /tmp/gtid1.sql mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) mysql> show databases like 'gtid'; Empty set (0.00 sec)
发现并没有恢复成功,为什么?
原因是GTID幂等性。
3、GTID幂等性
开启GTID后,MySQL恢复Binlog时,重复GTID的事务不会再执行了 就想恢复?怎么办? --skip-gtids
接着上面,截取日志时添加--skip-gtids
[root@mysql mysql]# mysqlbinlog --skip-gtids --include-gtids='6181523d-bc2e-11ea-a78b-000c29221146:7-13' mysql-bin.000013 mysql-bin.000014 mysql-bin.000015 -r /tmp/gtid2.sql
恢复成功:
mysql> set sql_log_bin=0; Query OK, 0 rows affected (0.00 sec) mysql> source /tmp/gtid2.sql mysql> set sql_log_bin=1; Query OK, 0 rows affected (0.00 sec) mysql> show databases like 'gtid'; +-----------------+ | Database (gtid) | +-----------------+ | gtid | +-----------------+ 1 row in set (0.00 sec) mysql> select * from gtid.t1; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
2.3 第三方工具mydumper备份数据库
[root@localhost mysqlbak]# wget -c https://github.com/mydumper/mydumper/releases/download/v0.15.1-3/mydumper-0.15.1-3.el8.x86_64.rpm 安装: [root@localhost mysqlbak]# dnf install mydumper-0.15.1-3.el8.x86_64.rpm [root@localhost mysqlbak]# mydumper --help Usage: mydumper [OPTION…] multi-threaded MySQL dumping 备份: [root@localhost mysqlbak]# mydumper -B it -o /bak [root@localhost mysqlbak]# ll /bak/ total 16K -rw-r--r-- 1 root root 151 Feb 19 14:23 it-schema-create.sql -rw-r--r-- 1 root root 0 Feb 19 14:23 it-schema-triggers.sql -rw-r--r-- 1 root root 354 Feb 19 14:23 it.Student.00000.sql -rw-r--r-- 1 root root 478 Feb 19 14:23 it.Student-schema.sql -rw-r--r-- 1 root root 308 Feb 19 14:23 metadata 还原: [root@localhost mysqlbak]# myloader -d /bak/ -o
2.4 lvm快照备份
前提: 数据文件要在逻辑卷上; 此逻辑卷所在卷组必须有足够空间使用快照卷; 数据文件和事务日志要在同一个逻辑卷上; 前提:MySQL数据lv和将要创建的快照要在同一vg,vg要有足够的空间存储 优点: 几乎是热备(创建快照前把表上锁,创建完毕后立即释放) 支持所有的存储引擎 备份速度快 无需使用昂贵的商业软件(操作系统级别的) 缺点: 可能需要部门协调(使用操作系统级别的命令,DBA一般没有权限) 无法预计服务停止时间 数据如果分布在多个卷上比较麻烦
操作流程 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)卸载
演示:
一、数据迁移到逻辑卷上 环境:数据文件不在逻辑卷上,那么需要将数据文件迁移到逻辑卷上 1、创建一个逻辑卷 [root@Admin ~]# pvcreate /dev/sdb [root@Admin ~]# vgcreate mysql /dev/sdb1 [root@Admin ~]# lvcreate -n lv_mysql -L 4G mysql [root@Admin ~]# mkfs.ext4 /dev/mysql/lv_mysql 2、将当前的mysql数据库迁移到逻辑卷上 1>先停止应用 2>停止mysql服务 [root@Admin ~]# systemctl stop mysqld 3>备份所有的数据文件到指定的地方 [root@localhost ~]# tar czf /tmp/mysql.tar.gz /var/lib/mysql/* 4>挂载逻辑卷到当前mysql的数据目录里 [root@localhost ~]# mount /dev/mysql/lv_mysql /var/lib/mysql 5>将刚刚备份的数据解压到数据目录里 [root@localhost ~]# tar xf /tmp/mysql.tar.gz -C /var/lib/mysql 6>启动数据库 权限变成了root,更改权限重新启动 [root@Admin ~]# chown mysql. -R /var/lib/mysql/ && service mysqld start 二、快照备份数据库 1、给数据库加锁,只读 mysql>flush table with read lock; 2、给mysql的数据文件所在的的逻辑卷创建快照 [root@Admin ~]# lvcreate -n lv_mysql_s -L 50M -s /dev/vg01/lv_mysql 3、解锁数据库 mysql>unlock tables; 以上1-3需要在一个会话完成 4、将快照挂载到临时目录中 [root@Admin ~]# mkdir /mnt/mysql [root@Admin ~]# mount /dev/vg01/lv_mysql_s /mnt/mysql 5、备份数据 [root@Admin ~]# midir /backup [root@Admin ~]# rsync -av /mnt/mysql /backup 6、卸载快照并删除 [root@Admin ~]# umount /dev/vg01/lv_mysql_s [root@Admin ~]# lvremove /dev/vg01/lv_mysql_s
脚本:
[root@localhost ~]# more bak_mysql.sh #!/bin/bash bak_dir=/bak/$(date +%F) [ -d ${bak_dir} ] || mkdir -p ${bak_dir} echo "flush tables with read lock; system lvcreate -n lv_mysql_s -L 500M -s /dev/mysql/lv_mysql; unlock tables;" | mysql -uroot -p123456 [ -d /mnt/mysql/ ] || mkdir /mnt/mysql mount /dev/mysql/lv_mysql_s /mnt/mysql rsync -az /mnt/mysql/ ${bak_dir} if [ $? -eq 0 ] then umount /mnt/mysql/ && lvremove -f /dev/mysql/lv_mysql_s &>/dev/null fi
2.5 xtrabackup备份(第三方工具)
下载地址:Software Downloads - Percona
参考文档:Percona XtraBackup
1、安装:
[root@Admin ~]# wget -c https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz [root@Admin ~]# tar xf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz -C /opt [root@Admin ~]# ln -sv /opt/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17/bin/xtrabackup /usr/bin/xtrabackup
2、准备工作
官方不推荐使用root用户
#创建数据用户,并设置相关权限 mysql> CREATE USER 'bkpuser'@'%'IDENTIFIED with mysql_native_password BY 'Bak@123.com'; mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'%'; mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'%'; mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'%'; mysql> GRANT SELECT ON performance_schema.replication_group_members TO bkpuser@'%'; mysql> FLUSH PRIVILEGES;
3、备份
完全备份 [root@localhost ~]# mkdir /data [root@localhost ~]# xtrabackup --backup --target-dir=/data/backups/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1 增量备份 插入数据 mysql> insert into it.Student values(7,'john','男',22,'电子商务'); [root@localhost ~]# xtrabackup --backup --target-dir=/data/incr1/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1 --incremental-basedir=/data/backups/ --incremental-basedir=/data/backups/ 基于/data/backups做增量备份 再次插入数据 mysql> insert into it.Student values(8,'bob','女',21,'英语'),(9,'smith','男',20,'计算机网络'); 第二次增量备份 [root@localhost ~]# xtrabackup --backup --target-dir=/data/incr2/ -u'bkpuser' -p'Bak@123.com' -H127.0.0.1 --incremental-basedir=/data/incr1/
4、还原
使用 XtraBackup 产生的备份数据无法直接使用 在数据备份(--backup)后,由于数据文件复制的时间点不同,因此数据不一致而无法使用。另外 InnoDB 会将这些数据文件视为损坏,将拒绝启动。
如何才能使备份数据正常使用,以用于数据库恢复 需要对数据进行“预备”(prepare)操作,使数据文件完全一致,然后才能用于数据恢复及在 InnoDB 中运行。
模拟破坏数据 mysql> drop database it; --apply-log-only //这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。 准备完全备份 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ 应用第一次增量备份到完全备份 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr1/ 应用第二次增量备份到完全备份 [root@node1 ~]# xtrabackup --prepare --apply-log-only --target-dir=/data/backups/ --incremental-dir=/data/incr2/ 最后执行: [root@node1 ~]# xtrabackup --prepare --target-dir=/data/backups/ [root@node1 ~]# systemctl stop mysqld [root@node1 ~]# rm -rf /var/lib/mysql/* [root@node1 ~]# xtrabackup --copy-back --target-dir=/data/backups/ [root@node1 ~]# chown -R mysql:mysql /var/lib/mysql [root@node1 ~]# systemctl start mysqld