mysql的逻辑备份与物理备份-云计算笔记整理

文章目录

  • 概述
  • MySQL逻辑备份mysqldump
    • 全量备份
    • 全备还原
    • 增量备份
    • 增量还原
  • MySQL物理备份xtrabackup
    • 全量备份
    • 全量还原
    • 增量备份
    • 增量还原

概述

原因:能够防止由于机械故障以及人为误操作带来的数据丢失;冗余: 数据有多份冗余,但不等备份,只能防止机械故障还来的数据丢失,例如主备模式、数据库集群。

备份必须重视的内容:

备份内容 databases Binlog my.conf
所有备份数据都应放在非数据库本地,而且建议有多份副本。
测试环境中做日常恢复演练,恢复较备份更为重要。

备份考虑因素:

  • 数据的一致型
  • 服务的可用性

备份类型:

一、物理备份
对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份又可分为脱机备份(冷备份)和联机备份(热备份)。这种类型的备份适用于出现问题时需要快速恢复的大型重要数据库。

1、热备

  • 在线备份,数据库处于运行状态,这种备份方法依赖于数据库的日志文件
  • 对应用基本无影响(应用程序读写不会阻塞,但是性能还是会有下降,所以尽量不要在主上做备份,在从库上做)

2、冷备

  • 备份数据文件,需要停机,是在关闭数据库的时候进行的
  • 备份 datadir 目录下的所有文件。

3、温备

  • 针对myisam的备份(myisam不支持热备),备份时候实例只读不可写,数据库锁定表格(不可写入但可读)的状态下进行的
  • 对应用影响很大
  • 通常加一个读锁

二、逻辑备份
对数据库逻辑组件(如表等数据库对象)的备份,表示为逻辑数据库结构create database、create table等语句)和内容(insert 语句或分割文本文件)的信息。这种类型的备份适用于可以编辑数据值或表结构较小的数据量,或者在不同机器体系结构上重新创建数据。

三、物理和逻辑备份的区别

mysql的逻辑备份与物理备份-云计算笔记整理_第1张图片

四、备份方式的选择

从以下几个维度考虑备份方式:

备份速度
恢复速度
备份大小
对业务影响

五、mysql备份策略

完全备份

  • 每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。

  • 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份哪些文件。在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份。换言之,清除存档属性。

  • 完全备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。实际应用中就是用一盘磁带对整个系统进行完全备份,包括其中的系统和所有数据。这种备份方式最大的好处就是只要用一盘磁带,就可以恢复丢失的数据。因此大大加快了系统或数据的恢复时间。

  • 优点:备份与恢复操作简单方便. 缺点:数据存在大量的重复;占用大量的空间;备份与恢复时间长。

差异备份

备份那些自从上次完全备份之后被修改过的所有文件,备份的时间起点是从上次完整备份起,备份数据量会越来越大。恢复数据时,只需恢复上次的完全备份与最近的一次差异备份。

mysql的逻辑备份与物理备份-云计算笔记整理_第2张图片

  • 备份自上一次完全备份之后有变化的数据。差异备份过程中,只备份有标记的那些选中的文件和文件夹。它不清除标记,也即备份后不标记为已备份文件。换言之,不清除存档属性。

  • 差异备份是指在一次全备份后到进行差异备份的这段时间内,对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全备份和最后一次差异备份进行恢复。差异备份在避免了另外两种备份策略缺陷的同时,又具备了它们各自的优点。

  • 首先,它具有了增量备份需要时间短、节省磁盘空间的优势;其次,它又具有了全备份恢复所需磁带少、恢复时间短的特点。系统管理员只需要两盘磁带,即全备份磁带与灾难发生前一天的差异备份磁带,就可以将系统恢复。

增量备份

只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份起到最后一次增量备份依次恢复,如中间某次的备份数据损坏,将导致数据的丢失。

mysql的逻辑备份与物理备份-云计算笔记整理_第3张图片

  • 备份自上一次备份(包含完全备份、差异备份、增量备份)之后有变化的数据。增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,既:备份后标记文件,换言之,清除存档属性。

  • 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加和者被修改的文件。这就意味着,第一次增量备份的对象是进行全备份后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。

  • 这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。

mysql的逻辑备份与物理备份-云计算笔记整理_第4张图片

MySQL逻辑备份mysqldump

mysqldump 是 MySQL 自带的逻辑备份工具。可以保证数据的一致性和服务的可用性

它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的 insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。

备份命令

mysqldump [选项] 数据库名 [表名] > 脚本名
mysqldump [选项] --数据库名 [选项 表名] > 脚本名
mysqldump [选项] --all-databases [选项] > 脚本名

mysql的逻辑备份与物理备份-云计算笔记整理_第5张图片

mysql的逻辑备份与物理备份-云计算笔记整理_第6张图片

备份实例

备份所有数据库:
mkdir -p /backup/mysqldump
mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db

备份指定数据库:
mysqldump -uroot -p myedudb > /backup/mysqldump/test.db

备份指定数据库指定表(多个表以空格间隔)
mysqldump -uroot -p myedudb t1 >/backup/mysqldump/myedudb-t1.db
					库名		表名						文件名

备份指定数据库排除某些表
mysql> show tables;
+-------------------+
| Tables_in_myedudb |
+-------------------+
| t1                |
| t2                |
| t3                |
+-------------------+
3 rows in set (0.00 sec)

备份数据库,排除t1,t2
mysqldump -uroot -p myedudb --ignore-table=myedu.t1 --ignore-table=myedudb.t2 > /backup/mysqldump/test2.dbe

还原实例

还原所有数据库
mysql -uroot -pSyw.123com <  /backup/mysqldump/all.db

还原数据库的表
[root@mysql ~]# ls /backup/mysqldump/
all.db  myedudb-t1.db  test2.dbe  test.db
mysql -uroot -pSyw.123com myedudb < /backup/mysqldump/myedudb-t1.db
登录mysql还原
mysql> source /backup/mysqldump/myedudb-t1.db

全量备份

修改配置文件开启二进制日志
vim /etc/my.cnf
[mysqld]
server-id = 2                   # id是做标识,随便填写
log-bin=/var/log/mysql/bin-log  # 设置二进制日志存放的位置

创建存放二进制日志文件的目录并赋权限
mkdir -p /var/log/mysql 
chown -R mysql.mysql /var/log/mysql

创建全量备份文件存放目录并赋权限
mkdir /backup/mysql -p
chown -R mysql.mysql /backup/mysql/

重启数据库
systemctl restart mysqld

进行全量备份
mysqldump -uroot -hlocalhost -p'Syw.123com' -P3306 --all-databases --triggers --routines --events --single-transaction --master-data=1 --flush-logs --set-gtid-purged=OFF > /backup/mysql/$(date +%F%H)-mysql-all.sql
---------------------------------------------------------------------
说明:
--triggers 		触发器
--routines 		存储过程
--events 		事件
--single-transaction 	满足数据的完整性、一致性
--master-data=1  记录二进制的文件内容及文件名到相应的日志里面,2表示不做记录
--flush-logs 	刷新
--set-gtid-purged=OFF 不记录事务的编号,如果开启有相同的gtid编号就会备份失败
---------------------------------------------------------------------
ls /backup/mysql
2021-08-2920-mysql-all.sql

测试数据库遭到破坏

删除数据库
systemctl stop mysqld.service
systemctl status mysqld.service
ls /var/lib/mysql	数据库存放位置
rm -rf /var/lib/mysql/*		删除所有数据库

重新登录发现原来的密码已经不能登录数据库
找回默认密码
grep 'password' /var/log/mysqld.log 
mysql -uroot -p'uM1)i&S3.-bU'
修改密码
mysql> alter user 'root'@'localhost' identified by 'As123.com';
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;		没有原来创建的数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

全备还原

向全量备份文件里面追加不记录二进制日志的命令(原因是因为我们要恢复的时候要重新执行一次sql语句,
这个语句没有记录的必要,如果记录的话还可能导致恢复失败。)
[root@mysql ~]# sed -i '23a set sql_log_bin=0;' /backup/mysql/2021-08-2920-mysql-all.sql
[root@mysql ~]# mysql -uroot -p'As123.com' < /backup/mysql/2021-08-2920-mysql-all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
---------------------------------------------------------------------
或者内部执行恢复
mysql> set sql_log_bin=0;
mysql> source /backup/mysql/2021-08-2920-mysql-all.sql 
mysql> set sql_log_bin=1;

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

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

增量备份

全备之后,再次写入新数据,数据库崩溃,要求恢复到新数据的节点。

测试准备:创建一个test2的数据库有t1表,表里有两条数据
mysql> create database test2;
Query OK, 1 row affected (0.00 sec)

mysql> use test2;
Database changed
mysql> create table t1(id int,name varchar(32));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(1,'test1');

Query OK, 1 row affected (0.07 sec)

mysql> insert into t1 values(2,'test2');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
+------+-------+
2 rows in set (0.00 sec)
[root@mysql ~]# mysql -uroot -p'As123.com'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
密码错误提示
原因是:之前的全量备份恢复后,密码也恢复为原来的密码,所以使用新修改的密码会报错,所以需要重新修改密码。
增量备份前进行全备
[root@mysql ~]# mysqldump -uroot -hlocalhost -p'As123.com' -P3306 --all-databases --triggers --routines --events --single-transaction --master-data=1 --flush-logs --set-gtid-purged=OFF > /backup/mysql/$(date +%F%H)-mysql1-all.sql

新数据的写入
mysql> insert into t1 values(3,'test3');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values(4,'test4');
Query OK, 1 row affected (0.01 sec)

mysql> select * from test2.t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
|    3 | test3 |
|    4 | test4 |
+------+-------+
4 rows in set (0.00 sec)
---------------------------------------------------------------------
假如数据库被破坏
[root@mysql ~]# systemctl stop mysqld
[root@mysql ~]# ls /var/lib/mysql
auto.cnf        ib_logfile0   mysql-relay-bin.000004  server-key.pem
ca-key.pem       ib_logfile1    mysql-relay-bin.index   sys
ca.pem           master.info    performance_schema      test1
client-cert.pem  mysql          private_key.pem         test2
client-key.pem   mysql-relay-bin.000001  public_key.pem
ib_buffer_pool   mysql-relay-bin.000002  relay-log.info
ibdata1          mysql-relay-bin.000003  server-cert.pem
[root@mysql ~]# rm -rf /var/lib/mysql/*

重新启动后,发现test2丢失,只有初始状态的数据库。
同样需要使用默认密码登录,进入数据库后修改密码。

增量还原

[root@mysql ~]# sed -i '23a set sql_log_bin=0;' /backup/mysql/2021-08-2922-mysql1-all.sql 
[root@mysql ~]# mysql -uroot -p'As123.com' < /backup/mysql/2021-08-2922-mysql1-all.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
登录数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
6 rows in set (0.01 sec)

mysql> select * from test2.t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
+------+-------+
2 rows in set (0.00 sec)
发现只有全备的数据,新写入的数据并没有得到还原。

全备的数据只备份到154的000013的节点
[root@mysql ~]# sed -n '22p' /backup/mysql/2021-08-2922-mysql1-all.sql 
CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000013', MASTER_LOG_POS=154;

查看日志文件
[root@mysql ~]# ls /var/log/mysql
bin_log.000001  bin-log.000004  bin-log.000009  bin-log.000014    mysql_log.000002
bin-log.000001  bin-log.000005  bin-log.000010  bin-log.000015    mysql_log.000003
bin_log.000002  bin-log.000006  bin-log.000011  bin_log.index     mysql_log.index
bin-log.000002  bin-log.000007  bin-log.000012  bin-log.index
bin-log.000003  bin-log.000008  bin-log.000013  mysql_log.000001

只要恢复bin-log.000013 bin-log.000014 bin-log.000015即可
[root@mysql ~]# mysqlbinlog --start-position=154 /var/log/mysql/bin-log.000013 /var/log/mysql/bin-log.000014 /var/log/mysql/bin-log.000015 | mysql -uroot -p'As123.com'
mysql: [Warning] Using a password on the command line interface can be insecure.

mysql> select * from t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
|    3 | test3 |
|    4 | test4 |
+------+-------+
4 rows in set (0.00 sec)

MySQL物理备份xtrabackup

1、xtrabackup介绍

Xtrabackup 是一个开源的免费的热备工具,在 Xtrabackup 包中主要有 Xtrabackup 和innobackupex 两个工具。其中 Xtrabackup 只能备份 InnoDB 和 XtraDB 两种引擎; innobackupex则是封装了Xtrabackup,同时增加了备份MyISAM引擎的功能。

Xtrabackup备份时不能备份表结构、触发器等等,也不能智能区分.idb 数据文件。另外 innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能。

全量备份

Xtrabackup 下载地址 https://www.percona.com/downloads/ 选择自己的版本下载。

依赖包下载,下载地址 http://rpmfifind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm

[root@mysql src]# ls
libev-4.04-2.el6.x86_64.rpm
Percona-XtraBackup-2.4.23-r3320f39-el7-x86_64-bundle.tar
[root@mysql src]# tar xf Percona-XtraBackup-2.4.23-r3320f39-el7-x86_64-bundle.tar 
[root@mysql src]# yum localinstall libev-4.04-2.el6.x86_64.rpm 

使用yum,需要安装依赖
[root@mysql src]# yum -y install percona-xtrabackup-24-2.4.23-1.el7.x86_64.rpm

xtrabackup的备份

innobackupex --user=root --password=As123.com /backup/mysql/
查看备份的数据
[root@mysql ~]# cd /backup/mysql
[root@mysql mysql]# ls
2021-08-2922-mysql1-all.sql  2021-08-29_23-21-58
[root@mysql mysql]# cd 2021-08-29_23-21-58/
[root@mysql 2021-08-29_23-21-58]# ls
backup-my.cnf      mysql   test1               xtrabackup_checkpoints
ib_buffer_pool     performance_schema test2    xtrabackup_info
ibdata1   sys      xtrabackup_binlog_info      xtrabackup_logfile
使用物理备份进行了全量备份

备份信息
[root@mysql 2021-08-29_23-21-58]# cat xtrabackup_checkpoints 
backup_type = full-backuped		#全备
from_lsn = 0			#从0开始备份
to_lsn = 4271969		#到4271969
last_lsn = 4271978		#总共备份了多少
compact = 0
recover_binlog_info = 0
flushed_lsn = 4271978
---------------------------------------------------------------------
或者
# 不使用时间戳创建目录,可自动创建目的地址test,并把输出的日志输入
到backup.log,不显示在终端。
 innobackupex --user=root --password=Qfedu.123com --no-timestamp /backup/mysql/test/ 2>>/backup/mysql/backup.log 

全量还原

注意:innobackupex -copy-back不会覆盖已存在的文件。而且还原时需要先关闭服务,如果服务是启动的,那么就不能还原到 datadir (vim /etc/my.cnf的datadir路径)

模拟操作,请在测试环境下测试

[root@mysql ~]# systemctl stop mysqld
[root@mysql ~]# rm -rf  /var/lib/mysql/*	

还原全备
[root@mysql ~]# innobackupex --copy-back /backup/mysql/2021-08-29_23-21-58/
[root@mysql ~]# ls /var/lib/mysql
ib_buffer_pool  ibdata1  mysql 
performance_schema  sys  
test1  test2  xtrabackup_info

使用ll /var/lib/mysql 发现文件的属主和属组都是root,
如果用mysql内部用户启动mysql,则会失败。

修改目录权限
[root@mysql ~]# chown -R mysql.mysql /var/lib/mysql

登录发现数据已恢复
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
+--------------------+
6 rows in set (0.01 sec)

mysql> select * from test2.t1;
+------+-------+
| id   | name  |
+------+-------+
|    1 | test1 |
|    2 | test2 |
|    3 | test3 |
|    4 | test4 |
+------+-------+
4 rows in set (0.02 sec)

增量备份

对数据进行全备
innobackupex --user=root --password=As123.com /backup/mysql/
继续往数据库添加数据
mysql> create database test_db;
mysql> use test_db;
Database changed
mysql> create table user_tb(id int,name varchar(20));
mysql> insert into user_tb values(1,'zhangsan');
Query OK, 1 row affected (0.02 sec)

mysql> select * from user_tb;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.01 sec)

增备
[root@mysql mysql]# innobackupex --user=root --password=As123.com --incremental /backup/mysql --incremental-basedir=/backup/mysql/2021-08-30_00-00-44/
----------------------------------------------------------------------------------------------------------------
--user # 以什么用户身份进行操作
--password   # 数据库用户的密码
--port       # 数据库的端口号,默认3306
--stream   # 打包(数据流)
--defaults-file   # 指定默认配置文件,默认读取/etc/my.cnf
--no-timestamp   # 不创建时间戳文件,而改用目的地址(可以自动创建)
--copy-back           # 备份还原的主要选项
--incremental         # 使用增量备份,默认使用的完整备份
--incremental-basedir # 与--incremental选项联合使用,该参数指定上一级备份的地址来做增量备份
---------------------------------------------------------------------------------------------------------------------
[root@mysql mysql]# ls
2021-08-30_00-00-449(全备)  2021-08-30_00-14-19(增备)

全备信息
[root@mysql mysql]# cat 2021-08-30_00-00-44/xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
**to_lsn = 2748968
last_lsn = 2748977
compact = 0
recover_binlog_info = 0
flushed_lsn = 2748977

增备信息
[root@mysql mysql]# cat 2021-08-30_00-14-19/xtrabackup_checkpoints 
backup_type = incremental
**from_lsn = 2748968
to_lsn = 2753600
last_lsn = 2753609
compact = 0
recover_binlog_info = 0
flushed_lsn = 2753609
对比两个备份文件信息,发现增量备份的起始值是全量备份的结束值,
得知想要恢复全部的数据则需要恢复全量备份+增量备份

增量还原

恢复全量备份的数据
[root@mysql mysql]# innobackupex --apply-log --redo-only /backup/mysql/2021-08-30_00-00-44/

恢复全备+增备,还原的数据则全部整合到全备里
[root@mysql mysql]# innobackupex --apply-log --redo-only /backup/mysql/2021-08-30_00-00-44/ --incremental-dir=/backup/mysql/2021-08-30_00-14-19/

[root@mysql mysql]# cat 2021-08-30_00-00-44/xtrabackup_checkpoints 
backup_type = log-applied
from_lsn = 0
to_lsn = 2753600
last_lsn = 2753609
compact = 0
recover_binlog_info = 0
flushed_lsn = 2753609
发现增量备份已经应用到全量备份里了
如果之后的数据库崩溃,则恢复全备数据即可
删除数据库
[root@mysql mysql]# cd /var/lib/mysql
[root@mysql mysql]# ls
auto.cnf         client-key.pem  ib_logfile1         public_key.pem   test1
ca-key.pem       ib_buffer_pool  mysql               server-cert.pem  test2
ca.pem           ibdata1         performance_schema  server-key.pem   test_db
client-cert.pem  ib_logfile0     private_key.pem     sys              xtrabackup_info
[root@mysql mysql]# rm -rf ./*

恢复
[root@mysql mysql]# innobackupex --copy-back /backup/mysql/2021-08-30_00-00-44/

[root@mysql mysql]# ls
ib_buffer_pool  mysql               test_db
ibdata1         performance_schema  xtrabackup_binlog_pos_innodb
ib_logfile0     sys                 xtrabackup_info
ib_logfile1     test1               xtrabackup_master_key_id
ibtmp1          test2

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
| test2              |
| test_db            |
+--------------------+
7 rows in set (0.00 sec)

mysql> select * from test_db.user_tb;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.01 sec)
数据已恢复

下一章笔记 mysql的主从复制及读写分离

作者:月光染衣袂
转发请加上该地址 : https://blog.csdn.net/weixin_46860149/article/details/119991275
如果笔记对您有用,请帮忙点个赞!

你可能感兴趣的:(MySQL,mysql,数据库)