MySQL备份方案

mysql数据库的几种备份方案:

一、binlog二进制日志通常作为备份的重要资源,所以再说备份方案之前先总结一下binlog日志

1、binlog日志

1.1、引起mysql服务器改变的任何操作( 增 删 改 没有查)
1.2、复制功能依赖于此日志
1.3、slave服务器通过复制master服务器的二进制日志完成主从复制,在执行之前保存于中继日志(relay log)
1.4、slave服务器通常可以关闭二进制日志以提升性能

2、binlog日志文件的文件表现形式

2.1、默认在安装目录下,存在mysql-bin.00001, mysql-bin.00002的二进制文件(binlog日志文件名依据my.cnf配置中的log-bin参数后面的设置为准)


[root@C7-15 ~]# vim /etc/my.cnf
..................
......
server-id=1            #开启二进制日志需要指定一个server-id
log-bin=mysql-bin      #开启二进制日志

保存

 二进制日志在什么时候会重新生成

[root@C7-15 ~]# systemctl restart mysql   #每次重启就会生成一个
[root@C7-15 ~]# systemctl restart mysql

[root@C7-15 ~]#  cd /usr/local/mysql/data/         
[root@C7-15 data]# ls           
auto.cnf            ib_logfile0         mysql-bin.000001    performance_schema/
gs/                 ib_logfile1         mysql-bin.000002    sys/
ib_buffer_pool      ibtmp1              mysql-bin.index     
ibdata1             mysql/              mysqld_safe.pid     


mysql> flush logs;                 #数据库中刷新日志 也会生成一个新日志
Query OK, 0 rows affected (0.00 sec)

2.2、还有mysql-bin.index用来记录被mysql管理的二进制文件列表
2.3、如果需要删除二进制日志时,切勿直接删除二进制文件,这样会使得mysql管理混乱

3、binlog日志文件查看相关mysql命令

3.1、查看正在使用的二进制文件


mysql> show master status;     
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3.2、手动滚动二进制日志


mysql> flush logs;
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.000004 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

滚动以后,mysql重新创建一个新的日志mysql-bin.000004

3.3、显示所有的二进制日志文件


mysql> show binary logs;            
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |       201 |
| mysql-bin.000003 |       201 |
| mysql-bin.000004 |       154 |
+------------------+-----------+
4 rows in set (0.00 sec)

3.4、 以表的形式查看二进制文件


mysql> show binlog events in 'mysql-bin.000002'\G         
*************************** 1. row ***************************
   Log_name: mysql-bin.000002
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.12-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000002
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info: 
*************************** 3. row ***************************
   Log_name: mysql-bin.000002
        Pos: 154
 Event_type: Rotate
  Server_id: 1
End_log_pos: 201
       Info: mysql-bin.000003;pos=4
3 rows in set (0.00 sec)

4、删除二进制日志文件

mysql> reset master;
Query OK, 0 rows affected (0.00 sec)

[root@C7-15 ~]# ls /usr/local/mysql/data/ |grep mysql-bin*
mysql-bin.000001
mysql-bin.index

5、MySQL二进制文件读取工具mysqlbinlog

MySQLbinlog日志结构

[root@C7-15 data]# mysqlbinlog mysql-bin.000001
mysqlbinlog: [Warning] option 'start-position': unsigned value 1 adjusted to 4
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#211212 10:47:25 server id 1  end_log_pos 123 CRC32 0x43e3c4b5  Start: binlog v 4, server v 5.7.12-log created 211212 10:47:25 at startup
ROLLBACK/*!*/;
BINLOG '
vWK1YQ8BAAAAdwAAAHsAAAAAAAQANS43LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9YrVhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AbXE40M=
'/*!*/;
ERROR: Error in Log_event::read_log_event(): 'Event too small', data_len: 0, event_type: 0
ERROR: Could not read entry at offset 39: Error in log format or read error.
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

 以上是没有进行操作查询出来的结果

注意: 需自己进行操作创建或删除

 以下是进行删除wwww库后查询结果

[root@C7-15 data]# mysqlbinlog --start-position='378' mysql-bin.000001
............
......
# at 378
#211216  1:38:23 server id 1  end_log_pos 463 CRC32 0xb125d9dd  Query   thread_id=2     
  exec_time=0     error_code=0
SET TIMESTAMP=1639589903/*!*/;
drop database wwww
/*!*/;
............
.....
事件位置 at 378
时间点 211216  1:38:23
服务器ID server id 1
服务器ID主要用于标记日志产生的服务器,主要用于双主模型中,互为主从,确保二进制文件不会被相互循环复制
事件结束位置 end_log_pos也就是下一事件开始的位置 end_log_pos 463
记录类型 Query
线程号 thread_id = 2
语句的时间戳和写入二进制日志文件的时间差 exec_time=0
事件内容 drop database wwww
/*!*/;
错误代码 error_code=0

如果出现乱码原因:可能是隔离级别的原因,默认隔离级别是READ-COMMITTED,所以将隔离修改为REPEATABLE-READ就好了

[root@C7-15 ~]# vim /etc/my.cnf
[mysqld]
.........
.......
...
transaction_isolation = REPEATABLE-READ
binlog_format=MIXED

保存退出

重启mysql    重启后创建或删除都可以查看到

5、二进制日志格式

由 bin_log_format={ statement | row | mixed } 定义

5.1、statement

基于语句,记录生成数据的语句 

缺点:在于如果当时插入信息为函数生成,有可能不同时间点执行结果不一样

5.2、row

 基于行数据

缺点:有时候数据量会过大

5.3、mixed

 混合模式

mysql自行决定何时使用statement, 何时使用row 模式

 5.4、查看当前二进制日志记录格式


mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)

  5.5、修改二进制日志记录格式


mysql> set session binlog_format=statement;          #修改二进制记录格式
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

 注意:5.7之前是statement,5.7之后是基于行的

6、二进制相关参数总结

log_bin = {ON|OFF}

可以是个文件路径,自定义binlog日志文件名,使用“log_bin=“或“log-bin=“都可以,主要用于控制全局binlog的存放位置和是否开启binlog日志功能

比如:log_bin=mysql-bin 或者 log-bin=mysql-bin,这样binlog日志默认会和mysql数据放在同一目录下

log_bin_trust_function_creators 是否记录在
sql_log_bin = {ON|OFF} 会话级别是否关闭binlog, 如果关闭当前会话内的操作将不会记录
sync_binlog 是否马上同步事务类操作到二进制日志中
binlog_format = {statement|row|mixed} 二进制日志的格式,上面单独提到了
max_binlog_cache_size = 二进制日志缓冲空间大小,仅用于缓冲事务类的语句
max_binlog_stmt_cache_size = 语句缓冲,非事务类和事务类共用的空间大小
max_binlog_size = 二进制日志文件上限,超过上限后则滚动

建议:将binlog日志实时备份到远程设备上,以防出现机器故障进行数据恢复;如果存放在一台机器可能数据将无法恢复

二、binlog二进制日志备份和恢复

1、备份数据的重要性:

①、灾难恢复;②、审计,数据库在过去某一个时间点是什么样的;③、测试

2、备份的目的:

①、用于恢复数据;②、备份结束后,需要周期性的做恢复测试

3、备份类型:

根据备份时,MySQL服务器是否在线
冷备(cold backup) 服务器离线,读写操作都不能进行
温备份 全局施加共享锁,只能读不能写
热备(hot backup) 数据库在线,读写照样进行
根据备份时的数据集分类
完全备份(full backup)
部分备份(partial backup)
物理备份physical backup 直接复制数据文件 ,打包归档
特点:不需要额外工具,直接归档命令即可,但是跨平台能力比较差;如果数据量超过几十个G,则适用于物理备份
逻辑备份(logical backup) 把数据抽取出来保存在sql脚本中
特点:可以使用文本编辑器编辑;导入方便,直接读取sql语句即可;逻辑备份恢复时间慢,占据空间大;无法保证浮点数的精度;恢复完数据库后需要重建索引
备份方式

全量备份

full backup

就是完全备份:每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础
优:备份与恢复操作简单方便
缺:数据存在大量的重复;占用大量的空间;备份与恢复时间长

增量备份

incremental backup

在不同时间点起始备份一段数据,比较节约空间;针对的是上一次备份后有变化的数据,备份数据少,备份快,恢复慢

差异备份

differential backup

备份从每个时间点到上一次全部备份之间的数据,随着时间增多而增多;比较容易恢复;对于很大的数据库,可以考虑主从模型,备份从服务器的内容。针对的是上一次全量备份后有变化的数据,备份数据多,备份慢,恢复快

4、Mysql最常用的三种备份工具

mysqldump 通常为小数据情况下的备份
innodb 热备,温备
MyISAM, Aria 温备
单线程备份恢复比较慢

Xtrabackup

(通常用innobackupex工具)

备份mysql大数据
InnoDB热备 增量备份
MyISAM温备 不支持增量,只有完全备份
属于物理备份,速度快
lvm-snapshot 接近于热备的工具:因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁
使用cp、tar等工具进行物理备份
备份和恢复速度较快

很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此

工具名称 mysqldump xtrabackup
备份方式 逻辑备份 物理备份
数据保存方式 sq脚本 二进制文件
是否支持热备份
是否支持增量备份
备份过程 会锁表 不锁表
是否影响正常业务 影响较大 影响较小
备份和恢复性能 耗时较长 耗时较短
占用空间 占用空间小 占用空间较大

(一)、mysqldump工具基本使用

格式:mysqldump [OPTIONS] database [tables…]

参数 说明
--all-databases 备份所有库
--databases db1 db2 ... 备份指定的多个库,如果使用此命令,恢复时将不用手动创建库。或者是-B db1 db2 db3 ....
--lock-all-tables 请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备
--lock-table 对正在备份的表加锁,但是不建议使用,如果其它表被修改,则备份后表与表之间将不同步
--single-transaction 能够对InnoDB存储引擎实现热备
启动一个很大的大事物,基于MOCC可以保证在事物内的表版本一致
自动加锁不需要,再加--lock-table, 可以实现热备
备份代码
--events 备份事件调度器代码
--routines 备份存储过程和存储函数
--triggers 备份触发器

备份时滚动日志:
--flush-logs: 备份前、请求到锁之后滚动日志,才能恢复备份时间点以后的内容
复制时的同步位置标记:主从架构中的,主服务器数据。效果相当于标记一个时间点

--master-data=[0|1|2]
 0 不记录
1 记录为CHANGE MASTER语句
2 记录为注释的CHANGE MASTER语句

恢复:

恢复过程无需写到二进制日志中
建议:关闭二进制日志,关闭其它用户连接;

备份策略:基于mysqldump

备份:mysqldump+二进制日志文件;(“mysqldump >”)
周日做一次完全备份:备份的同时滚动日志
周一至周六:备份二进制日志
恢复:(“mysql < ”)或在mysql数据库中直接执行“source sql备份文件;”进行恢复。如果sql执行语句比较多,可以将sql语句放在一个文件内,将文件名命名为.sql结尾,然后在mysql数据库中使用"source 文件.sql;"命令进行执行即可!
完全备份+各二进制日志文件中至此刻的事件

mysql数据库的完全备份

1、gs 数据库的备份

格式: mysqldump     -u用户     -p密码     --databases   数据库名    > /保存路径/名称.sql   (后缀为.sql)

[root@C7-15 ~]# mysqldump -uroot -p111111 --databases gs > /opt/gs.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@C7-15 ~]# ls /opt/
gs.sql
删除  gs 
mysql> drop database gs;
Query OK, 5 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

还原数据库

 
[root@C7-15 ~]# mysql -uroot -p111111 < /opt/gs.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| gs                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

2、数据备份所有的库

还原和上面的单个数据库操作一样


[root@C7-15 ~]# mysqldump -uroot -p111111 --all-databases > /opt/all_data.sql                   
mysqldump: [Warning] Using a password on the command line interface can be insecure.

3、备份 单个表

格式: mysqldump    -u用户     -p密码     数据库名   表名   >    /保存路径/名称.sql   (后缀为.sql)

  备份表
[root@C7-15 ~]# mysqldump -u root -p111111 gs aaa> gs-aaa.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

  删除表
mysql> drop table aaa;
Query OK, 0 rows affected (0.00 sec)



  还原表
[root@C7-15 ~]# mysql -u root -p111111 gs < gs-aaa.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

备份库中的多个表

   备份 gs库 的 aaa 表和 yg 表

备份两个表
[root@C7-15 ~]# mysqldump -u root -p111111 gs aaa yg > aaayg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

 删除
mysql> drop table aaa;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table yg;
Query OK, 0 rows affected (0.01 sec)
 查看
mysql> show tables;
+--------------+
| Tables_in_gs |
+--------------+
| jsb          |
| jsb_1        |
| jsb_2        |
+--------------+
3 rows in set (0.00 sec)

 还原
[root@C7-15 ~]# mysql -u root -p111111 gs < aaayg.sql
mysql: [Warning] Using a password on the command line interface can be insecure.


mysql> show tables;
+--------------+
| Tables_in_gs |
+--------------+
| aaa          |
| jsb          |
| jsb_1        |
| jsb_2        |
| yg           |
+--------------+
5 rows in set (0.00 sec)

mysql的包含关系:
数据(数据表)
数据(表结构+数据)

4、导出结构不导出数据

   默认将 gs 库下所有表的表结构全部导出

 格式: mysqldump    -u用户     -p密码    -d   库表   >   名称.sql


[root@C7-15 ~]# mysqldump -u root -p111111 -d gs > gsjg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

还原表结构
[root@C7-15 ~]# mysql -u root -p111111 gs < gsjg.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

导出单个数据表的表结构


[root@C7-15 ~]# mysqldump -u root -p111111 -d gs aaa yg > aaagsbg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

5、导出数据不导出结构 

 导出数据gs库中所有表的数据

格式: mysqldump   -u用户     -p密码  -t  库名 > 文件名称.sql


[root@C7-15 ~]# mysqldump -u root -p111111 -t gs > sj.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

导出数据 gs 库中  yg  表的数据

备份表中数据   前提是里面要有数据
[root@C7-15 ~]# mysqldump -u root -p111111 -t gs yg > ygsj.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

这里做了一个还原表结构
mysql> select * from yg;
Empty set (0.00 sec)

还原数据
[root@C7-15 ~]# mysql -u root -p111111 gs < ygsj.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

查看
mysql> select * from yg;
+-----------+-----------+--------+-----------+--------+
| 职业      | 姓名      | 编号   | 学历      | 工资   |
+-----------+-----------+--------+-----------+--------+
| 工程师    | 小V       |      5 | 小学      |   5000 |
| 云计算    | 哈哈哈    |      6 | 大专      |   1000 |
| 工程师    | 小林      |      4 | 本科      |  20000 |
| NULL      | NULL      |   NULL | NULL      |   NULL |
| 打杂      | 小二      |    250 | 幼儿园    |     50 |
+-----------+-----------+--------+-----------+--------+
5 rows in set (0.00 sec)

 mysql数据库的增量备份

命令格式:mysqlbinlog [参数] log-files

四种参数说明
--start-datetime 指定二进制日志的起始日期
--stop-datetime 指定二进制日志的结束日期
--start-position 指定二进制日志的起始位置
--stop-position 指定二进制日志的结束位置

1、根据mysql二进制日志文件位置进行备份


[root@C7-15 ~]# mysqlbinlog --start-position='62087' --stop-position='62389' /usr/local/mysql/data/mysql-bin.000001 >hhh.sql             

 使用备份文件还原


[root@C7-15 ~]# mysql -uroot -p111111 < hhh.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

2、根据mysql二进制日志文件位置恢复   


[root@C7-15 ~]# mysqlbinlog --start-position='62087' --stop-position='62389' /usr/local/mysql/data/mysql-bin.000001|mysql -uroot -p111111
mysql: [Warning] Using a password on the command line interface can be insecure.

3、根据mysql二进制日志文件时间恢复

 恢复 10:53:01 之后  10:53:49之前的数据


[root@C7-15 ~]# mysqlbinlog --start-datetime='2021-12-17 10:53:01' --stop-datetime='2021-12-17 10:53:49' /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p111111
mysql: [Warning] Using a password on the command line interface can be insecure.

 刷新日志


[root@C7-15 ~]# mysqladmin -u root -p111111  flush-logs;
mysqladmin: [Warning] Using a password on the command line interface can be insecure.

(二)、lvm-snapshot:基于LVM快照的备份

快照

1、事务日志跟数据文件必须在同一个卷上
2、刚刚创立的快照卷,里面没有任何数据,所有数据均来源于原卷
3、一旦原卷数据发生修改,修改的数据将复制到快照卷中,此时访问数据一部分来自于快照卷,一部分来自于原卷
4、当快照使用过程中,如果修改的数据量大于快照卷容量,则会导致快照卷崩溃
5、快照卷本身不是备份,只是提供一个时间一致性的访问目录
基于快照备份几乎为热备
1、创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁
2、如果是Inoodb引擎, 当flush tables 后会有一部分保存在事务日志中,却不在文件中。 因此恢复时候,需要事务日志和数据文件
但释放锁以后,事务日志的内容会同步数据文件中,因此备份内容并不绝对是锁释放时刻的内容,由于有些为完成的事务已经完成,但在备份数据中因为没完成而回滚。 因此需要借助二进制日志往后走一段
快照备份注意事项
1、事务日志跟数据文件必须在同一个卷上
2、创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁
3、请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行)

1、为什么要基于MySQL做快照备份?

1、几乎是热备 在大多数情况下,可以在应用程序仍在运行的时候执行备份。无需关机,只需设置为只读或者类似只读的限制
2、支持所有基于本地磁盘的存储引擎 它支持MyISAM, Innodb, BDB,还支持 Solid, PrimeXTFalcon
3、快速备份 只需拷贝二进制格式的文件,在速度方面无以匹敌
4、低开销 只是文件拷贝,因此对服务器的开销很细微
5、容易保持完整性 想要压缩备份文件吗?把它们备份到磁带上,FTP或者网络备份软件 -- 十分简单,因为只需要拷贝文件即可
6、快速恢复 恢复的时间和标准的MySQL崩溃恢复或数据拷贝回去那么快,甚至可能更快,将来会更快
7、免费 无需额外的商业软件,只需Innodb热备工具来执行备份

1.1、快照备份mysql的缺点:

1、需要兼容快照 -- 这是明显的
2、需要超级用户(root) 在某些组织,DBA和系统管理员来自不同部门不同的人,因此权限各不一样
3、停工时间无法预计,这个方法通常指热备,但是谁也无法预料到底是不是热备 -- FLUSH TABLES WITH READ LOCK 可能会需要执行很长时间才能完成
4、多卷上的数据问题 如果你把日志放在独立的设备上或者你的数据库分布在多个卷上,这就比较麻烦了,因为无法得到全部数据库的一致性快照。不过有些系统可能能自动做到多卷快照

2、准备LVM卷,并将mysql数据恢复(或者说迁移)到LVM卷上

[root@C7-15 ~]# fdisk /dev/sdb
.........
.....
命令(输入 m 获取帮助):p                                    #查看

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x07712cdc

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n                                  #创建
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p                                   #主分区
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):                  #默认
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): #默认
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):w                                  #保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@C7-15 ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@C7-15 ~]# vgcreate vg0 /dev/sdb1
  Volume group "vg0" successfully created
[root@C7-15 ~]# lvcreate -L +10G -n lv0 vg0
  Logical volume "lv0" created.
[root@C7-15 ~]# mkfs.xfs /dev/vg0/lv0
meta-data=/dev/vg0/lv0           isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@C7-15 ~]# mkdir /var/lv0/
[root@C7-15 ~]# mount /dev/vg0/lv0 /var/lv0/
[root@C7-15 ~]# df -Th
文件系统                       类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos_c7--15-root xfs        50G  8.9G   42G   18% /
devtmpfs                       devtmpfs  478M     0  478M    0% /dev
tmpfs                          tmpfs     489M     0  489M    0% /dev/shm
tmpfs                          tmpfs     489M  6.7M  482M    2% /run
tmpfs                          tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/sr0                       iso9660   4.3G  4.3G     0  100% /media/cdrom
/dev/sda1                      xfs      1014M  125M  890M   13% /boot
/dev/mapper/centos_c7--15-home xfs        47G   33M   47G    1% /home
tmpfs                          tmpfs      98M     0   98M    0% /run/user/0
/dev/mapper/vg0-lv0            xfs        10G   33M   10G    1% /var/lv0


[root@C7-15 ~]# lvs
  LV   VG           Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home centos_c7-15 -wi-ao---- 46.99g                                                    
  root centos_c7-15 -wi-ao---- 50.00g                                                    
  swap centos_c7-15 -wi-ao----  2.00g                                                    
  lv0  vg0          -wi-ao---- 10.00g         

删除创建的lvs

systemctl stop mysqld
umount /dev/vg0/lv0 /usr/local/mysql/data
lvremove /dev/vg0/lv0
vgremove vg0
pvremove /dev/sdb1
lvs

 mysql的数据目录在/usr/local/mysql/data,密码是1111111


[root@C7-15 ~]# ps -ef|grep mysql               
root        929      1  0 17:12 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/logs/mysqld.pid
mysql      1272    929  0 17:12 ?        00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/logs/mysqld.log --pid-file=/usr/local/mysql/logs/mysqld.pid --port=3306
root      93147   1306  0 17:56 pts/0    00:00:00 grep --color=auto mysql


[root@C7-15 ~]# systemctl stop mysqld                               
[root@C7-15 ~]# cd /usr/local/mysql/data/                                             
[root@C7-15 data]# tar -cf - . | tar xf - -C /var/lv0/                       
[root@C7-15 data]# umount /var/lv0/                            
[root@C7-15 data]# mount /dev/vg0/lv0 /usr/local/mysql/data/                                
[root@C7-15 data]# df -Th                 
文件系统                        容量  已用  可用 已用% 挂载点
/dev/mapper/centos_c7--15-root   50G  8.9G   42G   18% /
devtmpfs                        478M     0  478M    0% /dev
tmpfs                           489M     0  489M    0% /dev/shm
tmpfs                           489M  6.7M  482M    2% /run
tmpfs                           489M     0  489M    0% /sys/fs/cgroup
/dev/sr0                        4.3G  4.3G     0  100% /media/cdrom
/dev/sda1                      1014M  125M  890M   13% /boot
/dev/mapper/centos_c7--15-home   47G   33M   47G    1% /home
tmpfs                            98M     0   98M    0% /run/user/0
/dev/mapper/vg0-lv0              10G  167M  9.9G    2% /usr/local/mysql/data

[root@C7-15 data]# systemctl start mysqld    #开启mysql
[root@C7-15 data]# mysql -uroot -p111111                      

mysql> show master status;                             
Empty set (0.00 sec)

mysql> flush logs;                                   
Query OK, 0 rows affected (0.00 sec)

mysql> flush tables with read lock;                                            
Query OK, 0 rows affected (0.00 sec)

    -----重新打开一个窗口

[root@C7-15 ~]# lvcreate -L +4G -s -n mysql /dev/vg0/lv0                                               
  Using default stripesize 64.00 KiB.
  Logical volume "mysql" created.

[root@C7-15 ~]# lvs                    
  LV    VG           Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home  centos_c7-15 -wi-ao---- 46.99g                                                    
  root  centos_c7-15 -wi-ao---- 50.00g                                                    
  swap  centos_c7-15 -wi-ao----  2.00g                                                    
  lv0   vg0          owi-aos--- 10.00g                                                    
  mysql vg0          swi-a-s---  4.00g      lv0    0.00        

mysql> unlock tables;                        
Query OK, 0 rows affected (0.00 sec)

开启mysql的二进制日志。然后重启mysql

[root@C7-15 ~]# vim /etc/my.cnf                              
........  
server-id=1
log-bin=mysqlbin

保存

[root@C7-15 ~]# systemctl restart mysqld                      

mysql> create database user;                   
Query OK, 1 row affected (0.00 sec)

mysql> use user;                                              
Database changed

mysql> create table user(id int(40),name varchar(40));                              
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;                                        
+----------------+
| Tables_in_user |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> insert into user values(1,'小V'),(10,'小Q');                                
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0


[root@C7-15 ~]# cp /usr/local/mysql/data/mysqlbin.000001 /opt/                  

——————模拟数据库故障

[root@C7-15 ~]# systemctl stop mysqld             
[root@C7-15 ~]# umount /dev/vg0/lv0                    
[root@C7-15 ~]# lvconvert --merge /dev/vg0/mysql                                    
  Merging of volume vg0/mysql started.
  lv0: Merged: 100.00%

[root@C7-15 ~]# mount /dev/vg0/lv0 /usr/local/mysql/data/                     
[root@C7-15 ~]# systemctl start mysqld                                            

--------------------------
mysql> use user;
ERROR 1049 (42000): Unknown database 'user'

mysqslbinlog /opt/mysqlbin.000001    #查看二进制日志
..................
# at 740
#211221 17:02:15 server id 1  end_log_pos 771 CRC32 0x4f2b152e  Xid = 10


数据恢复根据二进制日志进行恢复

[root@C7-15 ~]# mysqlbinlog --start-position='4' --stop-position='771' /opt/mysqlbin.000001|mysql -uroot -p111111                         
mysql: [Warning] Using a password on the command line interface can be insecure.

mysql> use user;                        
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;                                    
+----------------+
| Tables_in_user |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql> select * from user;                                           
+------+------+
| id   | name |
+------+------+
|    1 | 小V  |
|   10 | 小Q  |
+------+------+
2 rows in set (0.00 sec)

-----------------------
快照一次性

[root@C7-15 ~]# lvs                   
  LV   VG           Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home centos_c7-15 -wi-ao---- 46.99g                                                    
  root centos_c7-15 -wi-ao---- 50.00g                                                    
  swap centos_c7-15 -wi-ao----  2.00g                                                    
  lv0  vg0          -wi-ao---- 10.00g                        

 (三)、Percona XtraBackup

Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQlOracle)、Percona ServerMariaDB,并且全部开源

安装

上传:percona-toolkit-2.2.19-1.noarch.rpm 和 percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz


[root@C7-15 ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/                         
[root@C7-15 ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/                                  
[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/                       
[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5                        
......................
.............                 
可以使用yum安装   percona-toolkit-2.2.19-1.noarch.rpm

[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cd             
[root@C7-15 ~]# yum localinstall percona-toolkit-2.2.19-1.noarch.rpm                         

工具集

软件包安装完后一共有4个可执行文件:innobackupex、xbcrypt、xbstream、xtrabackup


[root@C7-15 ~]# ll /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/bin/                      
总用量 225988
lrwxrwxrwx 1 root root        10 11月 25 2016 innobackupex -> xtrabackup
-rwxr-xr-x 1 root root   5179300 11月 25 2016 xbcloud
-rwxr-xr-x 1 root root      3020 11月 25 2016 xbcloud_osenv
-rwxr-xr-x 1 root root   5001985 11月 25 2016 xbcrypt
-rwxr-xr-x 1 root root   5071619 11月 25 2016 xbstream
-rwxr-xr-x 1 root root 216142648 11月 25 2016 xtrabackup

其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互
innobackupex 脚本用来备份 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等;简单来说,innobackupexxtrabackup 之上做了一层封装

一般情况下,我们是希望能备份 MyISAM 表的,虽然我们可能自己不用 MyISAM 表,但是 mysql 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行;另外一个原因是我们可能需要保存位点信息

--host

指定主机

--user

指定用户名

--password

指定密码

--port

指定端口

--databases

指定数据库

--incremental

创建增量备份

--incremental-basedir

指定包含完全备份的目录

--incremental-dir

指定包含增量备份的目录

--apply-log

对备份进行预处理操作

--redo-only

不回滚未提交事务

--copy-back

恢复备份目录

 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态

通信原理

2个工具之间的交互和协调是通过控制文件的创建和删除来实现的,主要文件有:xtrabackup_suspended_1、xtrabackup_suspended_2、xtrabackup_log_copied

备份过程

MySQL备份方案_第1张图片

innodb有两个文件:redo文件 +  lbd文件

Redo文件:存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性
Ibd文件:Inodb引擎开启的表空间,用来存储表的数据和索引

1、完全备份


[root@C7-15 ~]# mkdir /backups

[root@C7-15 ~]# innobackupex --user=root --password=111111 /backups/
211221 03:53:17 innobackupex: Starting the backup operation

[root@C7-15 ~]# ls /backups/
2021-12-21_17-58-40

注意: 保证mysql是开启状态要不然会报错

 2、查看备份数据

ls /backups/2021-12-21_17-58-40

backup-my.cnf                    备份用到的配置选项信息文件
xtrabackup_binlog_info   mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
xtrabackup_checkpoints  备份的类型、状态和LSN状态信息文件
xtrabackup_logfile        备份的日志文件

2.1、恢复

   合并数据,使数据文件处于一致性的状态

[root@C7-15 ~]# innobackupex --user=root --password=111111 --addly-log /backups/2021-12-21_17-58-40/
.................
........
[root@C7-15 ~]# ls /usr/local/mysql/data/
aaa  auto.cnf  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  sys

[root@C7-15 ~]# rm -rf /usr/local/mysql/data/*
[root@C7-15 ~]# ls /usr/local/mysql/data/
[root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_17-58-40/
......................
............
...
[root@C7-15 ~]# ll /usr/local/mysql/data/
总用量 12324
drwxr-x--- 2 root root        6 12月 21 18:25 2021-12-21_18-23-50
drwxr-x--- 2 root root        6 12月 21 18:25 2021-12-21_18-23-59
drwxr-x--- 2 root root       51 12月 21 18:25 2021-12-21_18-24-11
drwxr-x--- 2 root root      137 12月 21 18:25 aaa
-rw-r----- 1 root root      323 12月 21 18:25 ib_buffer_pool
-rw-r----- 1 root root 12582912 12月 21 18:25 ibdata1
drwxr-x--- 2 root root     4096 12月 21 18:25 mysql
drwxr-x--- 2 root root     8192 12月 21 18:25 performance_schema
drwxr-x--- 2 root root     8192 12月 21 18:25 sys
drwxr-x--- 2 root root       52 12月 21 18:25 user
-rw-r----- 1 root root      464 12月 21 18:25 xtrabackup_info


              修改属主属组
[root@C7-15 ~]# chown -R mysql:mysql /usr/local/mysql/data/

总结

1、innobackupex全量备份,并指定备份目录路径
2、在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求
3、恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径

3、xtrabackup增量备份与恢复

3.1、增量备份

使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推

PXB 是支持增量备份的,但是只能对 InnoDB 做增量,InnoDB 每个 page 有个 LSN 号,LSN 是全局递增的,page 被更改时会记录当前的 LSN 号,page中的 LSN 越大,说明当前page越新(最近被更新)。每次备份会记录当前备份到的LSNxtrabackup_checkpoints 文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每个 ibd 文件最终备份出来的是增量 delta 文件

MyISAM 是没有增量的机制的,每次增量备份都是全部拷贝的
增量备份过程和全量备份一样,只是在 ibd 文件拷贝上有不同

3.2、增量备份案例

[root@C7-15 ~]# systemctl restart mysqld
[root@C7-15 ~]# rm -rf /backups/*

[root@C7-15 ~]# innobackupex --user=root --password=111111  /backups/
mysql> create database ku1;
Query OK, 1 row affected (0.00 sec)

mysql> use ku1;
Database changed

mysql> create table bnent(name int(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into bnent values(1),(2),(3),(40);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from bnent;
+------+
| name |
+------+
|    1 |
|    2 |
|    3 |
|   40 |
+------+
4 rows in set (0.00 sec)

mysql> quit
Bye

使用innobackupex进行增量备份


[root@C7-15 ~]# innobackupex --user=root --password=111111  --incremental /backups/ --incremental-basedir=/backups/2021-12-21_18-33-06/

[root@C7-15 ~]# ll /backups/
总用量 4
drwxr-x---  9 root root  300 12月 21 18:33 2021-12-21_18-33-06    #全量备份数据目录
drwxr-x--- 10 root root 4096 12月 21 18:35 2021-12-21_18-35-43    #增量备份数据目录
————————————————————————————————————————————————————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints         #查看全量备份的
backup_type = full-backuped         #备份类型为全量备份
from_lsn = 0                        #lsn从0开始
to_lsn = 2546737                    #lsn到2546737结束
last_lsn = 2546746
compact = 0
recover_binlog_info = 0
——————————————————————————————————————————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-35-43/xtrabackup_checkpoints          #查看增量备份的
backup_type = incremental           #备份类型为增量备份
from_lsn = 2546737                  #lsn从2546737开始
to_lsn = 2552779                    #lsn到啊2552779结束
last_lsn = 2552788
compact = 0
recover_binlog_info = 0

3.3、增量恢复

[root@C7-15 ~]# rm -rf /usr/local/mysql/data/*            #删除数据目录所有数据

   ————————————                  #合并全备数据目录,确保数据的一致性
[root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/
.............
....

 ——————————————                  #将增量备份数据合并到全备数据目录当中
[root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/ --incremental-dir=/backups/2021-12-21_18-35-43/
...........
...
——————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints 
backup_type = log-applied         #查看到数据备份类型是增加
from_lsn = 0                      #lsn从0开始
to_lsn = 2552779                  #lsn结束号为最新的lsn
last_lsn = 2552788
compact = 0
recover_binlog_info = 0

3.4、进行恢复


[root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_18-33-06/

[root@C7-15 ~]# chown -R mysql.mysql /usr/local/mysql/data

[root@C7-15 ~]# mysql -uroot -p111111 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------------------+
| Database                     |
+------------------------------+
| information_schema           |
| #mysql50#2021-12-21_18-23-50 |
| #mysql50#2021-12-21_18-23-59 |
| aaa                          |
| ku1                          |
| mysql                        |
| performance_schema           |
| sys                          |
| user                         |
+------------------------------+

结论

1、增量备份使用参数 --incremental 指定需要备份到哪个目录,使用 --incremental-dir 定全备目录
2、进行数据备份时,使用参数 --apply-log redo-only 先合并全备数据目录数据,确保全备数据目录数据的一致性
3、再将增量备份数据使用参数 --incremental-dir 合并到全备数据当中
4、再使用全备数据进行恢复数据

注意:如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复

你可能感兴趣的:(mysql,数据库,MySQL备份方案,基于LVM快照的备份)