MySQL 完整备份和增量备份

我们两清 提交于 2020-03-10 16:09:31

MySQL完全备份与恢复

  随着自动化办公与电子商务的不断扩展,企业对于信息系统的依赖性越来越重要,而数据库在信息系统中担任着非常重要的角色。尤其一些对数据库可靠性要求非常高的行业,例如银行,证券,电信等,如果发生意外宕机或数据丢失,其损失是非常重要的。为此数据库管理员必须针对具体的业务要求定制详细的数据库备份与灾难恢复的策略,并通过模拟故障对每种可能的情况进行严格的测试。而保障数据的可靠性。

数据备份的重要性

    备份的主要目的是灾难恢复,备份还可以测试应用,回滚数据修改,查询历史数据,审计等。我们将从生产运维的角度了解备份恢复的分类与方法。

    在企业中数据的价值至关重要,数据保障了企业的业务的运行,因此数据的安全性及可靠性是运维的重中之重,任何数据的丢失都有可能会对企业产生严重的后果。造成数据丢失的原因如下:

  ● 程序错误

  ● 人为错误

  ● 运算失败

  ● 磁盘故障

  ● 灾难(如火灾、地震)和盗窃

二、数据库备份的类型

从物理与逻辑的角度:备份可以分为物理备份和逻辑备份

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

1、冷备份:是在关闭数据库的时候进行的

2、热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件

MySQL提供了自带工具mysqlhotcopy 实现了MyISAM引擎的热备份。
percona公司的Xtrabackup工具实现了对InnoDB表的热备份。

3、温备份:数据库锁定表格(不可写入但可读)的状态下进行的

flush tables with read lock;

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

从数据库的备份策略角度:备份可分为完全备份、差异备份和增量备份

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

优点:备份与恢复操作简单方便

缺点:数据存在大量的重复;占用大量的空间;备份与恢复时间长

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

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

逻辑备份与逻辑恢复

逻辑备份与逻辑恢复的最大优点在于,对于不同存储引擎的表,都可以采用同样的逻辑备份方法产生副本文件。采用同样的恢复方法将数据恢复到某个正确的状态中。如果数据库中有多个存储引擎,选用逻辑备份恢复数据会简单一点。逻辑备份常用的有select ... into outfile ,以及mysqldump工具。前者产生的副本文件为指定格式的文本文件,后者产生的副本文件既可以是指定格式的文本文件也可以是SQL脚本文件。逻辑恢复常用的工具有load data in file 以及 mysqlimport

使用select ...into outfile备份数据

语法格式如下: select 语句 into outfile 文本文件 文本文件选项和参数如下:

fields terminated by '字符串' : 字符串分割符,默认是制表符'\t'
fileds escaped by ’字符‘ : 转义字符,默认是’\‘
fileds [optionally] enclose by 字符’‘: 字段引用符,负责向字段值两端加上字段引用符。如果使用optionally 选项,则表示字符串类型上添加字段分隔符。
lines starting by '字符串',每条记录前添加该字段。
lines terminated by ’字符串‘,每条记录后添加该字符串,默认是换行符 ‘\n’

例如:

mysql> select * from classes into outfile 'data_back' fields terminated by '|';

结果会生成在data目录下,对应的数据库目录下面。可以直接使用cat命令查看。

恢复表数据:

1、使用load data infile...快速地从一个指定格式的文本文件中读取数据到一个数据库表中。

使用mysqldump 备份数据库

mysqldump也是MySQL转储数据库常用的自带工具,mysqldump产生副本文件有两种情形:

1、文件是指定格式的文本文件

2、是可以执行的SQL脚本文件

使用方法有以下3种:

1、备份指定的多个数据库。

 mysqldump -u root -p --databases choose test > roverliang.sql

2、备份所有的数据库

mysqldump -u root -p --all-databases choose test > roverliang.sql

3、备份指定数据库中的某些表

mysqldump -u root -p  choose test > roverliang.sql

mysqldump 完整的参数是:

mysqldump -u USER_NAME -p PASSWORD [其他选项] DB [其他数据库库表]

--default-character-set: 设置字符集

--single-transaction : 将导出设置成事务

--no-data : 导出的SQL脚本中,将只包含创建表的create 语句。

--add-drop-table :导出的脚本中,包含 drop table if exists

--routines导出存储过程及函数

--events导出事件

--triggers导出触发器

导入mysqldump 的数据文件

一句命令就能搞定,在mysql终端下执行:
命令格式:
source FILE_PATH
source ~/demo.sql 

MySQL物理备份与热备份

这一部分介绍两款热备份工具:mysqlhotcopy 与 Xtrabackup;

其中mysqlhotcopy 是mysql自带的热备份工具,但仅能够备份MyISAM引擎的数据,而Xtrabackup 则可以备份InnoDB引擎和MyISAM引擎的数据,操作复杂。

MySQL数据库中,表的存储引擎不同,与之对应的文件类型也不相同。以MyISAM存储引擎为例,每张表有都会有3个文件,分别是表结构定义文件(frm),表索引文件(MYI),表数据文件(MYD)。那么备份的时候只需要物理的复制这三个文件就能完成备份。而InnoDB引擎为了维护事务安全,则要复杂的多。如果你看过前文的日志的话,就明白每个InnoDB都会存在frm表定义文件,InnoDB的数据和索引是在一个文件里面,称作表空间文件(共享表空间文件,独享表空间)。重做日志(redo)记录在iblogfile0 和iblogfile1中。回滚日志(undo)则记录在表空间文件中,共享表空间文件(ibdata1)或者独享表空间文件(ibd)中。关于InnoDB事务日志详情可查看MySQL系统日志。因此备份InnoDB表引擎的表时,上面提到的几个文件都要备份到。

有前文提到,冷、热、温备份的本质在于是否能够继续提供服务,根据提供服务的级别,才有了冷、热、温之分。

 

    MySQL数据库的常见备份方法

1.物理冷备份
2.专用备份工具
   mysqldump、mysqlhotcopy
3.二进制日志增量备份
4.第三方工具备份
   Percona XtraBackup

 

物理冷备份与恢复:

物理冷备份一般用tar命令直接打包数据库文件夹(数据目录),而在备份前需要先停库。

备份数据库;创建一个/backup目录作为备份数据库路径,使用tar创建备份文件。整个数据库文件夹备份属于完全备份
[root@localhost ~]# systemctl stop mysqld.service
[root@localhost ~]# mkdir /backup
[root@localhost ~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
[root@localhost ~]# ls -l /backup/
总用量 736
-rw-r--r-- 1 root root 751542 8月 15 08:40 mysql_all-2018-08-15.tar.gz

恢复数据库;执行下面操作将数据库文件/usr/local/mysql/data/转移至bak目录下,模拟故障。
[root@localhost ~]# mkdir /bak
[root@localhost ~]# mv /usr/local/mysql/data/ /bak/
执行下面操作可以从备份文件恢复数据
[root@localhost ~]# mkdir restore/
[root@localhost ~]# tar zxf /backup/mysql_all-2018-08-15.tar.gz -C restore/
[root@localhost ~]# mv restore/usr/local/mysql/data/ /usr/local/mysql/
[root@localhost ~]# systemctl start mysqld.service

1、直接打包数据库文件夹,源码包的位置/usr/local/mysql/data/,rpm包的位置 /var/lib/mariadb/

示例:

[root@localhost ~]# /usr/local/mysql/bin/mysqld.sh start

Starting MySQL............... SUCCESS!

[root@localhost ~]# netstat -lnpt | grep :3306

tcp6       0      0 :::3306                 :::*                    LISTEN      1630/mysqld        

[root@localhost ~]# mysql -u root -p123456

mysql> create database auth;

Query OK, 1 row affected (0.00 sec)

 

mysql> use auth;

Database changed

mysql> create table user(name char(10) not null,ID int(48));

Query OK, 0 rows affected (0.04 sec)

 

mysql> insert into user values('crushlinux','123');

Query OK, 1 row affected (0.01 sec)

 

mysql> select * from user;

+------------+------+

| name       | ID   |

+------------+------+

| crushlinux |  123 |

+------------+------+

1 row in set (0.00 sec)

 

mysql> exit

Bye

 

[root@localhost ~]# /usr/local/mysql/bin/mysqld.sh stop

Shutting down MySQL.. SUCCESS!

 

[root@localhost ~]# yum -y install xz  #压缩综合性能更好

[root@localhost ~]# mkdir backup

[root@localhost ~]# tar Jcf backup/mysql_all-$(date +%F).tar.xz /usr/local/mysql/data/

tar: Removing leading `/' from member names

[root@localhost ~]# ls -l backup/

总用量 728

-rw-r--r-- 1 root root 742476 12月 14 23:31 mysql_all-2018-12-14.tar.xz

模拟数据丢失:

[root@localhost ~]# mkdir bak

[root@localhost ~]# mv /usr/local/mysql/data/* bak/

恢复数据:

[root@localhost ~]# mkdir restore

[root@localhost ~]# tar xf backup/mysql_all-2018-12-14.tar.xz -C restore/

[root@localhost ~]# mv restore/usr/local/mysql/data/* /usr/local/mysql/data/

[root@localhost ~]# /usr/local/mysql/bin/mysqld.sh start

Starting MySQL......... SUCCESS!

[root@localhost ~]# mysql -u root -p123456

mysql> select * from auth.user;

+------------+------+

| name       | ID   |

+------------+------+

| crushlinux |  123 |

+------------+------+

1 row in set (0.00 sec)



完整备份与恢复

使用专用备份工具mysqldump

         MySQL自带的备份工具mysqldump,可以很方便的对MySQL进行备份。通过该命令工具可以将数据库、数据表或全部的库导出为SQL脚本,便于该命令在不同版本的MySQL服务器上使用。例如,当需要升级MySQL服务器时,可以先使用mysqldump命令将原有库信息到导出,然后直接在升级后的MySQL服务器中导入即可。

(1)对单个库进行完整备份

格式:mysqldump -u用户名 -p[密码] [选项] --databases [数据库名] > /备份路径/备份文件名

示例:

[root@localhost ~]# mysqldump -uroot -p123456 --databases auth > backup/auth-$(date +%Y%m%d).sql

mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@localhost ~]# cat backup/auth-20181214.sql

(2)对多个库进行完整备份

格式:mysqldump -u用户名 -p [密码] [选项] --databases 库名1 [库名2]… > /备份路径/备份文件名

示例:

[root@localhost ~]# mysqldump -uroot -p123456 --events --databases mysql auth > backup/mysql+auth-$(date +%Y%m%d).sql

[root@localhost ~]# cat backup/mysql+auth-20181214.sql

(3)对所有库进行完整备份

格式:mysqldump -u用户名 -p [密码] [选项] --opt --all-databases > /备份路径/备份文件名

示例:

[root@localhost ~]# mysqldump -uroot -p123456 --events --opt --all-databases > backup/mysql_all.$(date +%Y%m%d).sql

[root@localhost ~]# cat backup/mysql_all.20181214.sql

//--opt 加快备份速度,当备份数据量大时使用

[root@localhost ~]# cat backup/mysql_all.20160505.sql

(4)对库中的部分表进行完整备份

格式:mysqldump -u用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名

示例:

[root@localhost ~]# mysqldump -uroot -p123456 auth user > backup/auth_user-$(date +%Y%m%d).sql

[root@localhost ~]# cat backup/auth_user-20181214.sql

(5)对表结构的备份

格式:mysqldump -u用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名

示例:

[root@localhost ~]# mysqldump -uroot -p123456 -d mysql user > backup/desc_mysql_user-$(date +%Y%m%d).sql

[root@localhost ~]# cat backup/desc_mysql_user-20181214.sql

使用mysqldump备份后,恢复数据库

1、source命令

登录到MySQL数据库,执行source 备份sql脚本路径

示例:

[root@localhost ~]# mysql -uroot -p123456

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| mysql              |

| performance_schema |

| test               |

| usr                |

+--------------------+

6 rows in set (0.00 sec)

 

mysql> drop database auth;

Query OK, 1 row affected (0.12 sec)

 

mysql> source backup/mysql_all.20181214.sql

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| mysql              |

| performance_schema |

| test               |

| usr                |

+--------------------+

6 rows in set (0.00 sec)

 

2、mysql命令

格式:mysql -u用户名 -p [密码] < 库备份脚本的路径

           mysql -u用户名 -p [密码] 库名 < 表备份脚本的路径

示例:

[root@localhost ~]# mysql -uroot -p123456 -e 'show databases;'

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| mysql              |

| performance_schema |

| test               |

| usr                |

+--------------------+

[root@localhost ~]# mysql -uroot -p123456 -e 'drop database auth;'

[root@localhost ~]# mysql -uroot -p123456 < backup/mysql_all.20181214.sql

[root@localhost ~]# mysql -uroot -p123456 -e 'show databases;'

+--------------------+

| Database           |

+--------------------+

| information_schema |

| auth               |

| mysql              |

| performance_schema |

| test               |

| usr                |

+--------------------+

 

[root@localhost ~]# mysql -uroot -p123456 -e 'drop table auth.user;'

[root@localhost ~]# mysql -uroot -p123456 auth< backup/auth_user-20181214.sql

[root@localhost ~]# mysql -uroot -p123456 -e 'select * from auth.user;'

+------------+------+

| name       | ID   |

+------------+------+

| crushlinux |  123 |

+------------+------+

增量备份

特点:
与完整备份不同,增量备份没有重复数据,备份量不大,时间短,但恢复麻烦,需要上次完整备份及完整备份之后的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复,mysql中没有提供直接增量备份的方法,可以通过MySQL提供的我二进制日志(binary logs)间接实现增量备份。
二进制日志:
要进行MySQL的增量备份,首先要开启二进制功能,开启MySQL的二进制日志功能的实现方法有很多种,最常用的是在MySQL配置文件的mysqld项下加入“log-bin=/文件路径/文件名”前缀,如;log-bin=/usr/local/mysql/mysql-bin,然后重启mysqld.service服务,就可以看到指定路径下的二进制文件文件了。默认情况下,二进制日志文件的扩展名是一个六位的数字,如;mysql-bin.000001

[root@localhost ~]# vim /etc/my.cnf
##修改配置文件,启用二进制功能

server-id=1
log-bin=/usr/local/mysql/mysql-bin
:wq!
[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# ls -l /usr/local/mysql/mysql-bin.*
-rw-rw---- 1 mysql mysql 120 8月 15 10:35 /usr/local/mysql/mysql-bin.000001
-rw-rw---- 1 mysql mysql 34 8月 15 10:35 /usr/local/mysql/mysql-bin.index
MySQL增量恢复:
常用的增量恢复方法有三种:
一般恢复,基于位置的恢复,基于时间点的恢复

一般恢复:
将所有备份的二进制日志内容全部恢复,格式命令如下

mysqlbinlog [–no-defaults] 增量备份文件 | mysql -u root -p

基于位置的恢复:
数据库管理员在操作数据库时可能在同一时间点既有错误的操作也有正确的操作,通过基于位置进行恢复可以更加精准,
命令格式如下所示。
格式一:恢复数据到指定位置

mysqlbinlog --stop-position=‘459’ 二进制日志 | mysql -u root -p ******

格式二:从指定的位置开始恢复数据

mysqlbinlog --start-position=‘459’ 二进制日志 | mysql -u root -p ******

基于时间点的恢复:
跳过某个发生错误的时间点实现数据恢复,而基于时间点的恢复可以分成三种情况。
格式1:从日志开头截止到某个时间点恢复

mysqlbinlog [–no-defaults] --stop-datetime=‘年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户 -p 密码

格式2:从某个时间点到日志结尾恢复

mysqlbinlog [–no-defaults] --start-datetime=‘年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户 -p 密码

格式3:从某个时间点到某个时间点恢复

mysqlbinlog [–no-defaults] --start-datetime=‘年-月-日 小时:分钟:秒’ --stop-datetime=‘年-月-日 小时:分钟:秒’ 二进制日志 | mysql -u 用户 -p 密码

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!