当前位置:   article > 正文

MySQL备份方案

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参数后面的设置为准)

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

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

  1. [root@C7-15 ~]# systemctl restart mysql #每次重启就会生成一个
  2. [root@C7-15 ~]# systemctl restart mysql
  3. [root@C7-15 ~]# cd /usr/local/mysql/data/
  4. [root@C7-15 data]# ls
  5. auto.cnf ib_logfile0 mysql-bin.000001 performance_schema/
  6. gs/ ib_logfile1 mysql-bin.000002 sys/
  7. ib_buffer_pool ibtmp1 mysql-bin.index
  8. ibdata1 mysql/ mysqld_safe.pid
  1. mysql> flush logs; #数据库中刷新日志 也会生成一个新日志
  2. Query OK, 0 rows affected (0.00 sec)

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

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

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

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

3.2、手动滚动二进制日志

  1. mysql> flush logs;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> show master status;
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. | mysql-bin.000004 | 154 | | | |
  8. +------------------+----------+--------------+------------------+-------------------+
  9. 1 row in set (0.00 sec)

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

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

  1. mysql> show binary logs;
  2. +------------------+-----------+
  3. | Log_name | File_size |
  4. +------------------+-----------+
  5. | mysql-bin.000001 | 177 |
  6. | mysql-bin.000002 | 201 |
  7. | mysql-bin.000003 | 201 |
  8. | mysql-bin.000004 | 154 |
  9. +------------------+-----------+
  10. 4 rows in set (0.00 sec)

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

  1. mysql> show binlog events in 'mysql-bin.000002'\G
  2. *************************** 1. row ***************************
  3. Log_name: mysql-bin.000002
  4. Pos: 4
  5. Event_type: Format_desc
  6. Server_id: 1
  7. End_log_pos: 123
  8. Info: Server ver: 5.7.12-log, Binlog ver: 4
  9. *************************** 2. row ***************************
  10. Log_name: mysql-bin.000002
  11. Pos: 123
  12. Event_type: Previous_gtids
  13. Server_id: 1
  14. End_log_pos: 154
  15. Info:
  16. *************************** 3. row ***************************
  17. Log_name: mysql-bin.000002
  18. Pos: 154
  19. Event_type: Rotate
  20. Server_id: 1
  21. End_log_pos: 201
  22. Info: mysql-bin.000003;pos=4
  23. 3 rows in set (0.00 sec)

4、删除二进制日志文件

  1. mysql> reset master;
  2. Query OK, 0 rows affected (0.00 sec)
  3. [root@C7-15 ~]# ls /usr/local/mysql/data/ |grep mysql-bin*
  4. mysql-bin.000001
  5. mysql-bin.index

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

MySQLbinlog日志结构

  1. [root@C7-15 data]# mysqlbinlog mysql-bin.000001
  2. mysqlbinlog: [Warning] option 'start-position': unsigned value 1 adjusted to 4
  3. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
  4. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
  5. DELIMITER /*!*/;
  6. # at 4
  7. #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
  8. ROLLBACK/*!*/;
  9. BINLOG '
  10. vWK1YQ8BAAAAdwAAAHsAAAAAAAQANS43LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  11. AAAAAAAAAAAAAAAAAAC9YrVhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
  12. AbXE40M=
  13. '/*!*/;
  14. ERROR: Error in Log_event::read_log_event(): 'Event too small', data_len: 0, event_type: 0
  15. ERROR: Could not read entry at offset 39: Error in log format or read error.
  16. SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
  17. DELIMITER ;
  18. # End of log file
  19. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  20. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

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

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

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

  1. [root@C7-15 data]# mysqlbinlog --start-position='378' mysql-bin.000001
  2. ............
  3. ......
  4. # at 378
  5. #211216 1:38:23 server id 1 end_log_pos 463 CRC32 0xb125d9dd Query thread_id=2
  6. exec_time=0 error_code=0
  7. SET TIMESTAMP=1639589903/*!*/;
  8. drop database wwww
  9. /*!*/;
  10. ............
  11. .....
事件位置at 378
时间点211216  1:38:23
服务器IDserver 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就好了

  1. [root@C7-15 ~]# vim /etc/my.cnf
  2. [mysqld]
  3. .........
  4. .......
  5. ...
  6. transaction_isolation = REPEATABLE-READ
  7. binlog_format=MIXED
  8. 保存退出
  9. 重启mysql 重启后创建或删除都可以查看到

5、二进制日志格式

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

5.1、statement

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

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

5.2、row

 基于行数据

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

5.3、mixed

 混合模式

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

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

  1. mysql> show variables like 'binlog_format';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | binlog_format | ROW |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

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

  1. mysql> set session binlog_format=statement; #修改二进制记录格式
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show variables like 'binlog_format';
  4. +---------------+-----------+
  5. | Variable_name | Value |
  6. +---------------+-----------+
  7. | binlog_format | STATEMENT |
  8. +---------------+-----------+
  9. 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等工具进行物理备份
备份和恢复速度较快

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

工具名称mysqldumpxtrabackup
备份方式逻辑备份物理备份
数据保存方式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)

  1. [root@C7-15 ~]# mysqldump -uroot -p111111 --databases gs > /opt/gs.sql
  2. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  3. [root@C7-15 ~]# ls /opt/
  4. gs.sql
  1. 删除 gs
  2. mysql> drop database gs;
  3. Query OK, 5 rows affected (0.01 sec)
  4. mysql> show databases;
  5. +--------------------+
  6. | Database |
  7. +--------------------+
  8. | information_schema |
  9. | aaa |
  10. | mysql |
  11. | performance_schema |
  12. | sys |
  13. +--------------------+
  14. 5 rows in set (0.00 sec)

还原数据库

  1. [root@C7-15 ~]# mysql -uroot -p111111 < /opt/gs.sql
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. mysql> show databases;
  4. +--------------------+
  5. | Database |
  6. +--------------------+
  7. | information_schema |
  8. | aaa |
  9. | gs |
  10. | mysql |
  11. | performance_schema |
  12. | sys |
  13. +--------------------+
  14. 6 rows in set (0.00 sec)

2、数据备份所有的库

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

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

3、备份 单个表

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

  1. 备份表
  2. [root@C7-15 ~]# mysqldump -u root -p111111 gs aaa> gs-aaa.sql
  3. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  4. 删除表
  5. mysql> drop table aaa;
  6. Query OK, 0 rows affected (0.00 sec)
  7. 还原表
  8. [root@C7-15 ~]# mysql -u root -p111111 gs < gs-aaa.sql
  9. mysql: [Warning] Using a password on the command line interface can be insecure.

备份库中的多个表

   备份 gs库 的 aaa 表和 yg 表

  1. 备份两个表
  2. [root@C7-15 ~]# mysqldump -u root -p111111 gs aaa yg > aaayg.sql
  3. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  4. 删除
  5. mysql> drop table aaa;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> drop table yg;
  8. Query OK, 0 rows affected (0.01 sec)
  9. 查看
  10. mysql> show tables;
  11. +--------------+
  12. | Tables_in_gs |
  13. +--------------+
  14. | jsb |
  15. | jsb_1 |
  16. | jsb_2 |
  17. +--------------+
  18. 3 rows in set (0.00 sec)
  19. 还原
  20. [root@C7-15 ~]# mysql -u root -p111111 gs < aaayg.sql
  21. mysql: [Warning] Using a password on the command line interface can be insecure.
  22. mysql> show tables;
  23. +--------------+
  24. | Tables_in_gs |
  25. +--------------+
  26. | aaa |
  27. | jsb |
  28. | jsb_1 |
  29. | jsb_2 |
  30. | yg |
  31. +--------------+
  32. 5 rows in set (0.00 sec)

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

4、导出结构不导出数据

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

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

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

导出单个数据表的表结构

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

5、导出数据不导出结构 

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

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

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

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

  1. 备份表中数据 前提是里面要有数据
  2. [root@C7-15 ~]# mysqldump -u root -p111111 -t gs yg > ygsj.sql
  3. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  4. 这里做了一个还原表结构
  5. mysql> select * from yg;
  6. Empty set (0.00 sec)
  7. 还原数据
  8. [root@C7-15 ~]# mysql -u root -p111111 gs < ygsj.sql
  9. mysql: [Warning] Using a password on the command line interface can be insecure.
  10. 查看
  11. mysql> select * from yg;
  12. +-----------+-----------+--------+-----------+--------+
  13. | 职业 | 姓名 | 编号 | 学历 | 工资 |
  14. +-----------+-----------+--------+-----------+--------+
  15. | 工程师 | 小V | 5 | 小学 | 5000 |
  16. | 云计算 | 哈哈哈 | 6 | 大专 | 1000 |
  17. | 工程师 | 小林 | 4 | 本科 | 20000 |
  18. | NULL | NULL | NULL | NULL | NULL |
  19. | 打杂 | 小二 | 250 | 幼儿园 | 50 |
  20. +-----------+-----------+--------+-----------+--------+
  21. 5 rows in set (0.00 sec)

 mysql数据库的增量备份

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

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

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

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

 使用备份文件还原

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

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

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

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

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

  1. [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
  2. mysql: [Warning] Using a password on the command line interface can be insecure.

 刷新日志

  1. [root@C7-15 ~]# mysqladmin -u root -p111111 flush-logs;
  2. 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卷上

  1. [root@C7-15 ~]# fdisk /dev/sdb
  2. .........
  3. .....
  4. 命令(输入 m 获取帮助):p #查看
  5. 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
  6. Units = 扇区 of 1 * 512 = 512 bytes
  7. 扇区大小(逻辑/物理):512 字节 / 512 字节
  8. I/O 大小(最小/最佳):512 字节 / 512 字节
  9. 磁盘标签类型:dos
  10. 磁盘标识符:0x07712cdc
  11. 设备 Boot Start End Blocks Id System
  12. 命令(输入 m 获取帮助):n #创建
  13. Partition type:
  14. p primary (0 primary, 0 extended, 4 free)
  15. e extended
  16. Select (default p): p #主分区
  17. 分区号 (1-4,默认 1):1
  18. 起始 扇区 (2048-41943039,默认为 2048): #默认
  19. 将使用默认值 2048
  20. Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): #默认
  21. 将使用默认值 41943039
  22. 分区 1 已设置为 Linux 类型,大小设为 20 GiB
  23. 命令(输入 m 获取帮助):w #保存退出
  24. The partition table has been altered!
  25. Calling ioctl() to re-read partition table.
  26. 正在同步磁盘。
  1. [root@C7-15 ~]# pvcreate /dev/sdb1
  2. Physical volume "/dev/sdb1" successfully created.
  3. [root@C7-15 ~]# vgcreate vg0 /dev/sdb1
  4. Volume group "vg0" successfully created
  5. [root@C7-15 ~]# lvcreate -L +10G -n lv0 vg0
  6. Logical volume "lv0" created.
  1. [root@C7-15 ~]# mkfs.xfs /dev/vg0/lv0
  2. meta-data=/dev/vg0/lv0 isize=512 agcount=4, agsize=655360 blks
  3. = sectsz=512 attr=2, projid32bit=1
  4. = crc=1 finobt=0, sparse=0
  5. data = bsize=4096 blocks=2621440, imaxpct=25
  6. = sunit=0 swidth=0 blks
  7. naming =version 2 bsize=4096 ascii-ci=0 ftype=1
  8. log =internal log bsize=4096 blocks=2560, version=2
  9. = sectsz=512 sunit=0 blks, lazy-count=1
  10. realtime =none extsz=4096 blocks=0, rtextents=0
  1. [root@C7-15 ~]# mkdir /var/lv0/
  2. [root@C7-15 ~]# mount /dev/vg0/lv0 /var/lv0/
  3. [root@C7-15 ~]# df -Th
  4. 文件系统 类型 容量 已用 可用 已用% 挂载点
  5. /dev/mapper/centos_c7--15-root xfs 50G 8.9G 42G 18% /
  6. devtmpfs devtmpfs 478M 0 478M 0% /dev
  7. tmpfs tmpfs 489M 0 489M 0% /dev/shm
  8. tmpfs tmpfs 489M 6.7M 482M 2% /run
  9. tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
  10. /dev/sr0 iso9660 4.3G 4.3G 0 100% /media/cdrom
  11. /dev/sda1 xfs 1014M 125M 890M 13% /boot
  12. /dev/mapper/centos_c7--15-home xfs 47G 33M 47G 1% /home
  13. tmpfs tmpfs 98M 0 98M 0% /run/user/0
  14. /dev/mapper/vg0-lv0 xfs 10G 33M 10G 1% /var/lv0
  15. [root@C7-15 ~]# lvs
  16. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  17. home centos_c7-15 -wi-ao---- 46.99g
  18. root centos_c7-15 -wi-ao---- 50.00g
  19. swap centos_c7-15 -wi-ao---- 2.00g
  20. lv0 vg0 -wi-ao---- 10.00g

删除创建的lvs

  1. systemctl stop mysqld
  2. umount /dev/vg0/lv0 /usr/local/mysql/data
  3. lvremove /dev/vg0/lv0
  4. vgremove vg0
  5. pvremove /dev/sdb1
  6. lvs

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

  1. [root@C7-15 ~]# ps -ef|grep mysql
  2. 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
  3. 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
  4. root 93147 1306 0 17:56 pts/0 00:00:00 grep --color=auto mysql
  5. [root@C7-15 ~]# systemctl stop mysqld
  6. [root@C7-15 ~]# cd /usr/local/mysql/data/
  7. [root@C7-15 data]# tar -cf - . | tar xf - -C /var/lv0/
  8. [root@C7-15 data]# umount /var/lv0/
  9. [root@C7-15 data]# mount /dev/vg0/lv0 /usr/local/mysql/data/
  10. [root@C7-15 data]# df -Th
  11. 文件系统 容量 已用 可用 已用% 挂载点
  12. /dev/mapper/centos_c7--15-root 50G 8.9G 42G 18% /
  13. devtmpfs 478M 0 478M 0% /dev
  14. tmpfs 489M 0 489M 0% /dev/shm
  15. tmpfs 489M 6.7M 482M 2% /run
  16. tmpfs 489M 0 489M 0% /sys/fs/cgroup
  17. /dev/sr0 4.3G 4.3G 0 100% /media/cdrom
  18. /dev/sda1 1014M 125M 890M 13% /boot
  19. /dev/mapper/centos_c7--15-home 47G 33M 47G 1% /home
  20. tmpfs 98M 0 98M 0% /run/user/0
  21. /dev/mapper/vg0-lv0 10G 167M 9.9G 2% /usr/local/mysql/data
  22. [root@C7-15 data]# systemctl start mysqld #开启mysql
  1. [root@C7-15 data]# mysql -uroot -p111111
  2. mysql> show master status;
  3. Empty set (0.00 sec)
  4. mysql> flush logs;
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> flush tables with read lock;
  7. Query OK, 0 rows affected (0.00 sec)
  8. -----重新打开一个窗口
  9. [root@C7-15 ~]# lvcreate -L +4G -s -n mysql /dev/vg0/lv0
  10. Using default stripesize 64.00 KiB.
  11. Logical volume "mysql" created.
  12. [root@C7-15 ~]# lvs
  13. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  14. home centos_c7-15 -wi-ao---- 46.99g
  15. root centos_c7-15 -wi-ao---- 50.00g
  16. swap centos_c7-15 -wi-ao---- 2.00g
  17. lv0 vg0 owi-aos--- 10.00g
  18. mysql vg0 swi-a-s--- 4.00g lv0 0.00
  19. mysql> unlock tables;
  20. Query OK, 0 rows affected (0.00 sec)
  21. 开启mysql的二进制日志。然后重启mysql
  22. [root@C7-15 ~]# vim /etc/my.cnf
  23. ........
  24. server-id=1
  25. log-bin=mysqlbin
  26. 保存
  27. [root@C7-15 ~]# systemctl restart mysqld
  1. mysql> create database user;
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> use user;
  4. Database changed
  5. mysql> create table user(id int(40),name varchar(40));
  6. Query OK, 0 rows affected (0.01 sec)
  7. mysql> show tables;
  8. +----------------+
  9. | Tables_in_user |
  10. +----------------+
  11. | user |
  12. +----------------+
  13. 1 row in set (0.00 sec)
  14. mysql> insert into user values(1,'小V'),(10,'小Q');
  15. Query OK, 2 rows affected (0.00 sec)
  16. Records: 2 Duplicates: 0 Warnings: 0
  1. [root@C7-15 ~]# cp /usr/local/mysql/data/mysqlbin.000001 /opt/
  2. ——————模拟数据库故障
  3. [root@C7-15 ~]# systemctl stop mysqld
  4. [root@C7-15 ~]# umount /dev/vg0/lv0
  5. [root@C7-15 ~]# lvconvert --merge /dev/vg0/mysql
  6. Merging of volume vg0/mysql started.
  7. lv0: Merged: 100.00%
  8. [root@C7-15 ~]# mount /dev/vg0/lv0 /usr/local/mysql/data/
  9. [root@C7-15 ~]# systemctl start mysqld
  10. --------------------------
  11. mysql> use user;
  12. ERROR 1049 (42000): Unknown database 'user'
  13. mysqslbinlog /opt/mysqlbin.000001 #查看二进制日志
  14. ..................
  15. # at 740
  16. #211221 17:02:15 server id 1 end_log_pos 771 CRC32 0x4f2b152e Xid = 10
  17. 数据恢复根据二进制日志进行恢复
  18. [root@C7-15 ~]# mysqlbinlog --start-position='4' --stop-position='771' /opt/mysqlbin.000001|mysql -uroot -p111111
  19. mysql: [Warning] Using a password on the command line interface can be insecure.
  20. mysql> use user;
  21. Reading table information for completion of table and column names
  22. You can turn off this feature to get a quicker startup with -A
  23. Database changed
  24. mysql> show tables;
  25. +----------------+
  26. | Tables_in_user |
  27. +----------------+
  28. | user |
  29. +----------------+
  30. 1 row in set (0.00 sec)
  31. mysql> select * from user;
  32. +------+------+
  33. | id | name |
  34. +------+------+
  35. | 1 | 小V |
  36. | 10 | 小Q |
  37. +------+------+
  38. 2 rows in set (0.00 sec)
  39. -----------------------
  40. 快照一次性
  41. [root@C7-15 ~]# lvs
  42. LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
  43. home centos_c7-15 -wi-ao---- 46.99g
  44. root centos_c7-15 -wi-ao---- 50.00g
  45. swap centos_c7-15 -wi-ao---- 2.00g
  46. 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

  1. [root@C7-15 ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/
  2. [root@C7-15 ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
  3. [root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/
  4. [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
  5. ......................
  6. .............
  7. 可以使用yum安装 percona-toolkit-2.2.19-1.noarch.rpm
  8. [root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cd
  9. [root@C7-15 ~]# yum localinstall percona-toolkit-2.2.19-1.noarch.rpm

工具集

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

  1. [root@C7-15 ~]# ll /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/bin/
  2. 总用量 225988
  3. lrwxrwxrwx 1 root root 10 1125 2016 innobackupex -> xtrabackup
  4. -rwxr-xr-x 1 root root 5179300 1125 2016 xbcloud
  5. -rwxr-xr-x 1 root root 3020 1125 2016 xbcloud_osenv
  6. -rwxr-xr-x 1 root root 5001985 1125 2016 xbcrypt
  7. -rwxr-xr-x 1 root root 5071619 1125 2016 xbstream
  8. -rwxr-xr-x 1 root root 216142648 1125 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

备份过程

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

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

1、完全备份

  1. [root@C7-15 ~]# mkdir /backups
  2. [root@C7-15 ~]# innobackupex --user=root --password=111111 /backups/
  3. 211221 03:53:17 innobackupex: Starting the backup operation
  4. [root@C7-15 ~]# ls /backups/
  5. 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、恢复

  1. 合并数据,使数据文件处于一致性的状态
  2. [root@C7-15 ~]# innobackupex --user=root --password=111111 --addly-log /backups/2021-12-21_17-58-40/
  3. .................
  4. ........
  5. [root@C7-15 ~]# ls /usr/local/mysql/data/
  6. aaa auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema sys
  7. [root@C7-15 ~]# rm -rf /usr/local/mysql/data/*
  8. [root@C7-15 ~]# ls /usr/local/mysql/data/
  9. [root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_17-58-40/
  10. ......................
  11. ............
  12. ...
  13. [root@C7-15 ~]# ll /usr/local/mysql/data/
  14. 总用量 12324
  15. drwxr-x--- 2 root root 6 1221 18:25 2021-12-21_18-23-50
  16. drwxr-x--- 2 root root 6 1221 18:25 2021-12-21_18-23-59
  17. drwxr-x--- 2 root root 51 1221 18:25 2021-12-21_18-24-11
  18. drwxr-x--- 2 root root 137 1221 18:25 aaa
  19. -rw-r----- 1 root root 323 1221 18:25 ib_buffer_pool
  20. -rw-r----- 1 root root 12582912 1221 18:25 ibdata1
  21. drwxr-x--- 2 root root 4096 1221 18:25 mysql
  22. drwxr-x--- 2 root root 8192 1221 18:25 performance_schema
  23. drwxr-x--- 2 root root 8192 1221 18:25 sys
  24. drwxr-x--- 2 root root 52 1221 18:25 user
  25. -rw-r----- 1 root root 464 1221 18:25 xtrabackup_info
  26. 修改属主属组
  27. [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、增量备份案例

  1. [root@C7-15 ~]# systemctl restart mysqld
  2. [root@C7-15 ~]# rm -rf /backups/*
  3. [root@C7-15 ~]# innobackupex --user=root --password=111111 /backups/
  1. mysql> create database ku1;
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> use ku1;
  4. Database changed
  5. mysql> create table bnent(name int(10));
  6. Query OK, 0 rows affected (0.01 sec)
  7. mysql> insert into bnent values(1),(2),(3),(40);
  8. Query OK, 4 rows affected (0.00 sec)
  9. Records: 4 Duplicates: 0 Warnings: 0
  10. mysql> select * from bnent;
  11. +------+
  12. | name |
  13. +------+
  14. | 1 |
  15. | 2 |
  16. | 3 |
  17. | 40 |
  18. +------+
  19. 4 rows in set (0.00 sec)
  20. mysql> quit
  21. Bye

使用innobackupex进行增量备份

  1. [root@C7-15 ~]# innobackupex --user=root --password=111111 --incremental /backups/ --incremental-basedir=/backups/2021-12-21_18-33-06/
  2. [root@C7-15 ~]# ll /backups/
  3. 总用量 4
  4. drwxr-x--- 9 root root 300 1221 18:33 2021-12-21_18-33-06 #全量备份数据目录
  5. drwxr-x--- 10 root root 4096 1221 18:35 2021-12-21_18-35-43 #增量备份数据目录
  6. ————————————————————————————————————————————————————————————————
  7. [root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints #查看全量备份的
  8. backup_type = full-backuped #备份类型为全量备份
  9. from_lsn = 0 #lsn从0开始
  10. to_lsn = 2546737 #lsn到2546737结束
  11. last_lsn = 2546746
  12. compact = 0
  13. recover_binlog_info = 0
  14. ——————————————————————————————————————————————————————
  15. [root@C7-15 ~]# cat /backups/2021-12-21_18-35-43/xtrabackup_checkpoints #查看增量备份的
  16. backup_type = incremental #备份类型为增量备份
  17. from_lsn = 2546737 #lsn从2546737开始
  18. to_lsn = 2552779 #lsn到啊2552779结束
  19. last_lsn = 2552788
  20. compact = 0
  21. recover_binlog_info = 0

3.3、增量恢复

  1. [root@C7-15 ~]# rm -rf /usr/local/mysql/data/* #删除数据目录所有数据
  2. ———————————— #合并全备数据目录,确保数据的一致性
  3. [root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/
  4. .............
  5. ....
  6. —————————————— #将增量备份数据合并到全备数据目录当中
  7. [root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/ --incremental-dir=/backups/2021-12-21_18-35-43/
  8. ...........
  9. ...
  10. ——————————————————
  11. [root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints
  12. backup_type = log-applied #查看到数据备份类型是增加
  13. from_lsn = 0 #lsn从0开始
  14. to_lsn = 2552779 #lsn结束号为最新的lsn
  15. last_lsn = 2552788
  16. compact = 0
  17. recover_binlog_info = 0

3.4、进行恢复

  1. [root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_18-33-06/
  2. [root@C7-15 ~]# chown -R mysql.mysql /usr/local/mysql/data
  3. [root@C7-15 ~]# mysql -uroot -p111111 -e "show databases;"
  4. mysql: [Warning] Using a password on the command line interface can be insecure.
  5. +------------------------------+
  6. | Database |
  7. +------------------------------+
  8. | information_schema |
  9. | #mysql50#2021-12-21_18-23-50 |
  10. | #mysql50#2021-12-21_18-23-59 |
  11. | aaa |
  12. | ku1 |
  13. | mysql |
  14. | performance_schema |
  15. | sys |
  16. | user |
  17. +------------------------------+

结论

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/410308
推荐阅读
相关标签
  

闽ICP备14008679号