MySQL/MariaDB数据库备份与恢复

前言

数据库一般存放着企业最为重要的数据,它关系到企业业务能否正常运转,数据库服务器总会遇到一些不可抗拒因素,导致数据丢失或损坏,而数据库备份可以帮助我们避免由于各种原因造成的数据丢失或着数据库的其他问题。本文将讲解MySQL/MariaDB数据库的几种备份方法。

基础知识

备份类型

完全备份:备份整个数据库

部分备份:仅备份其中的一张表或多张表

增量备份:仅备份从上次完全备份或增量备份之后变化的数据部分

差异备份:备份上次备份后变化的数据部分,和增量备份区别在于差异备份只可以相对完全备份做备份

热备份、温备份和冷备份:

热备份:在线备份,读写操作不受影响

温备份:在线备份,读操作可继续进行,但写操作不允许

冷备份:离线备份,数据库服务器离线,备份期间不能为业务提供读写服务

物理备份和逻辑备份:

物理备份:直接复制数据文件进行的备份

优点:无需额外工具,直接copy即可,恢复直接复制备份文件即可

缺点:与存储引擎有关,跨平台能力较弱

逻辑备份:从数据库中“导出”数据另存而进行的备份

优点: 能使用编辑器处理,恢复简单,能基于网络恢复,有助于避免数据损坏

缺点: 备份文件较大,备份较慢,无法保证浮点数的精度,使用逻辑备份数据恢复后,还需手动重建索引,十分消耗CPU资源

备份对象

数据文件

代码:存储过程,存储函数,触发器等

OS相关的配置文件,如crontab配置计划及相关脚本

跟复制相关的配置信息

二进制日志文件

备份工具

mysqldump: 逻辑备份工具,适用于所有存储引擎,温备、完全备份、部分备份;对InnoDB存储引擎支持热备

cp, tar等文件系统工具:物理备份工具,适用于所有存储引擎,冷备、完全备份、部分备份

lvm2的快照:几乎热备,借助于文件系统工具实现物理备份

mysqlhotcopy: 几乎冷备,仅适用于MyISAM存储引擎

数据库备份

备份方案

①mysqldump+binlog:

完全备份,通过备份二进制日志实现增量备份

②lvm2快照+binlog:

几乎热备,物理备份

③xtrabackup:

对InnoDB:热备,支持完全备份和增量备份

对MyISAM:温备,只支持完全备份

备份须知

备份某一个数据库和备份所有库是有区别的,要备份某一个库要确保所有的InnoDB存储引擎的表都是存放在单个表空间中,否则必须执行全库备份

MariaDB [none]> show global variables like ‘innodb_file_p%‘; #查看是否开启单独表空间
MariaDB [none]> set global innodb_file_per_table=1; #开启单独表空间,也可在配置文件设置

mysqldump+binlog

命令的语法格式

mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]:备份一个或多个库
mysqldump [OPTIONS] --all-databases [OPTIONS]:备份所有库

其他选项

-x, --lock-all-tables:锁定所有表
-l, --lock-tables:锁定备份的表
--single-transaction:启动一个大的单一事务实现备份
-C, --compress:压缩传输
-E, --events:备份指定库的事件调度器
-R, --routines:备份存储过程和存储函数
--triggers:备份触发器
--master-data={0|1|2}
    0:不记录
    1:记录CHANGE MASTER TO语句;此语句未被注释
    2:记录为注释语句
-F,--flush-logs:锁定表之后执行flush logs命令

注意:二进制日志文件与数据文件不应该放置于同一磁盘,这里是实验便不可以修改

备份过程

准备备份目录

准备备份数据库及表

进行完整备份

向表中插入数据

进行增量备份,备份二进制日志

继续插入数据,在没备份的情况下删除数据库,模拟误操作

数据恢复

#建议关闭二进制日志,关闭其它用户连接
MariaDB [(none)]> set session sql_log_bin=0;

由于最后我们没有备份就删除了数据库,所以我们首先需要保护最后的二进制日志,查看删除操作之前的position值

[[email protected] ~]# mysqlbinlog /mydata/data/mysql-bin.000015

将最后操作的二进制日志备份

导入之前的所有备份

查看数据库及数据

OK,至此数据成功恢复

注意:此方法不适用于大型数据库,备份速度太慢

lvm2快照+binlog

备份过程

#请求锁定所有表
MariaDB [test]> flush tables with read lock;
#滚动日志
MariaDB [test]> flush logs;
#记录二进制日志位置
MariaDB [test]> show master status;
#创建快照卷
[[email protected] ~]# lvcreate -s -L 100M -n mydata-snap /dev/myvg/mydata -p r 
#释放全局锁
MariaDB [test]> unlock tables;
#创建快照挂载点
[[email protected] ~]# mkdir /snap
#挂载快照卷
[[email protected] ~]# mount /dev/myvg/mydata-snap /snap
#备份数据库
[[email protected] ~]# cp -a /snap /backup/
#增量备份,查看完整备份之前的二进制日志位置和最后出错操作前一位置
[[email protected] ~]# mysqlbinlog --start-position=245 --stop-position=534 /mydata/data/mys
ql-bin.000016 > /backup/binlog/binlog-`date +%F_%T`.sql

数据恢复

[[email protected] ~]# service mysqld stop
[[email protected] ~]# rm -rf /mydata/data/*
[[email protected] ~]# cp -a /backup/snap/* /mydata/data
[[email protected] ~]# service mysqld start
[[email protected] ~]# mysql < /backup/binlog/binlog-2015-05-21_20\:23\:41.sql

基于物理备份,数据恢复完成

xtrabackup(推荐)

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。

特点:

(1)备份过程快速、可靠

(2)备份过程不会打断正在执行的事务

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动实现备份检验

(5)还原速度快

安装

[[email protected] ~]# yum install percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm -y

创建最小权限备份用户

备份过程

完全备份

[[email protected] ~]# innobackupex --user=bakupuser --password=bakuppass /backup/
innobackupex: Backup created in directory ‘/backup/2015-05-21_21-55-08‘
innobackupex: MySQL binlog position: filename ‘mysql-bin.000017‘, position 245
150521 21:55:16  innobackupex: Connection to database server closed
150521 21:55:16  innobackupex: completed OK!

如果出现如下错误,请在my.cnf文件[mysqld] 中添加innodb_log_file_size = 5M 并重启服务

InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes
InnoDB: than specified in the .cnf file 50331648 bytes!
innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2672.

增量备份

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

innobackupex命令会在备份目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录

注:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份

添加数据

做增量备份

[[email protected] ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/201
5-05-21_21-55-08/
innobackupex: Backup created in directory ‘/backup/2015-05-21_22-26-42‘
innobackupex: MySQL binlog position: filename ‘mysql-bin.000017‘, position 788
150521 22:26:57  innobackupex: Connection to database server closed
150521 22:26:57  innobackupex: completed OK!

再次添加数据

再次做增量备份

[[email protected] ~]# innobackupex --incremental /backup/ --incremental-basedir=/backup/201
5-05-21_22-26-42/ #在第一次增量备份的基础上做增量备份
innobackupex: Backup created in directory ‘/backup/2015-05-21_22-32-01‘
innobackupex: MySQL binlog position: filename ‘mysql-bin.000017‘, position 1056
150521 22:32:10  innobackupex: Connection to database server closed
150521 22:32:10  innobackupex: completed OK!

数据恢复

准备阶段

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

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。

于是,操作就变成了:

# innobackupex --apply-log --redo-only BASE-DIR

接着执行:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

而后是第二个增量:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作

完整备份准备

[[email protected] ~]# innobackupex --apply-log /backup/2015-05-21_21-55-08/
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2766618
150521 23:02:43  innobackupex: completed OK!

增量备份准备

[[email protected] ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/
[[email protected] ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/ 
--incremental-dir=/backup/2015-05-21_22-26-42/
[[email protected] ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/ 
--incremental-dir=/backup/2015-05-21_22-32-01/

恢复阶段

还原备份,即完全备份

[[email protected] ~]# innobackupex --copy-back /backup/2015-05-21_21-55-08/
[[email protected] ~]# chown -R mysql.mysql /mydata/data/
[[email protected] ~]# service mysqld start

测试数据是否恢复

OK,数据恢复成功

The end

好了,MySQL/MariaDB数据库备份与恢复就总结到这里了,以上总结的三种方法各有各的特色,读者可根据实际需求进行选择,再啰嗦一句,实际生产环境中数据和二进制日志文件一定要分开存放。以上仅为个人学习整理,如有错漏,大神勿喷~~~

时间: 2024-10-16 14:35:58

MySQL/MariaDB数据库备份与恢复的相关文章

CentOS 6.5 MySQL/MariaDB数据备份与恢复备份详解

MySQL/MariaDB数据备份与恢复备份 数据对我们来说再重要不过了,那我们如何做到对数据尽可能的安全呢,当我们的数据丢失了那又该怎么做呢,所以说数据备份对我们的数据安全性来说太重要了. 数据对我们来说再熟悉不过了,也最平常不过了,我们每天都在接触各色各样的数据,数据记录了我们平常相关的业务信息,所以数据对于我们来说是很重要的,这么重要的数据如果我们的数据丢失了那我们是不是相关的业务都没法进行了呢,这应该是个很麻烦的问题,那我们怎么保护我们的数据的安全呢,这就要用到我们的数据备份了. 如何执

MySQL/MariaDB数据库基于SSL实现主从复制

前言 备份数据库是生产环境中的首要任务,有时候不得不通过网络进行数据库的复制,由于MySQL/MariaDB的主从复制是明文传送的,如果在生产环境中跨网络传送,数据的安全性就无法完全保证,为了解决这一问题,我们需要一种安全的方式进行传送,即基于SSL加密进行数据传输. 部署配置 实验拓扑 实验环境 系统环境:CentOS6.6 数据库版本:mariadb-5.5.36 #注意:主从服务器数据库版本须一致:主从服务器时间须同步 #此实验从服务器只做一组为例 配置主从复制 安装mariadb [[e

EA逆向生成数据库E-R图(mysql,mariadb数据库-->ER图) v13 及以后的版本处理方式(xjl456852原创)

处理er图需要先将数据库逆向到EA中. 需要电脑上安装mysql 的 odbc可以在官网下载mysql的odbc版本,如果是mariadb的需要下载mariadb的odbc 需要注意,这个EA是32位的软件,一定要下载32位的odbc,否则EA识别不了mysql的驱动. 我安装了mysql odbc驱动32位 下载地址: https://dev.mysql.com/downloads/connector/odbc/ 也可在页面中点击 Looking for the latest GA versi

MySQL/MariaDB数据库主从复制

MySQL数据库复制概述 MySQL的主从复制是指从服务器向主服务器获取二进制日志文件,然后在从服务器上对这些日志重新执行,从而使从服务器和主服务器保持同步.但由于是异步的复制,从服务器在一定程度上落后于主服务器,刚写入到主服务器上的数据可能服务在从服务器上查询得到. MySQL的复制原理: (1)从服务器创建I/O线程连接主数据库,向主数据库请求二进制日志文件. (2)主库上启动Binlog Dump,将二进制日志文件发送给I/O线程,I/O线程获取数据后将数据写在从库的中继日志中(relay

linux架构学习第二十八天之Mysql/MariaDB数据库入门

内容: 1.数据库简介以及mysql/mariadb背景介绍 2.数据库的一些名词 3.mysql的服务结构 4.mysql客户端的使用 5.数据类型 6.SQL语句介绍 7.mysql的事务机制 一.数据库简介以及mysql/mariadb背景介绍 数据可以存放在多种位置,如普通文件.专门的数据库中,而两者有什么区别,而为什么选择数据库存储?我们知道,假如数据存在普通文件中,当我们要查找其中的一个数据时,要把整个文件加载到内存中,再进行检索,这样速度慢不说,一旦文件较大,直接把内存撑爆了,而数

mysql/mariadb 数据库配置

1.  启动mariadb systemctl start mariadb 2. 设置开机启动mariadb systemctl enable mariadb 一.修改用户密码,以root为例 1. 知道root密码,需要修改 方法a. 登入数据库来修改 # mysql -uroot -p /*输入密码进入*/   /*第一个方式:直接编辑数据库字段*/   MariaDB [(none)]> use mysql;   MariaDB [mysql]> UPDATE user SET pass

MySQL/MariaDB的备份与恢复

二进制日志简介 mysql的二进制日志从本质上来讲就是重做日志,它记录了mysql服务器上此前所发生的所有引起了数据改变或潜在会影响数据改变的相关的操作.这个在恢复数据时非常有用,可以基于备份,通过二进制日志文件将数据恢复至某一个具体的时间点.当然二进制日志文件不能和数据文件放在同一块磁盘上. 查看当前服务器的二进制日志文件 MariaDB [(none)]> show binary logs; +------------------+-----------+ | Log_name       

MySQL/MariaDB数据库备份与恢复之mysqlpump入门操作

创建测试用表:MariaDB [music]>  create table summary(id int,info char(128));Query OK, 0 rows affected (0.05 sec) MariaDB [music]> show tables;+-----------------+| Tables_in_music |+-----------------+| summary         || test            |+-----------------+

Linux下对MySQL/MariaDB数据库的基本操作以及linux mysql添加用户,删除用户,以及用户权限的授予

文章引用地址:https://www.cnblogs.com/Glory-D/p/7518541.html.https://www.cnblogs.com/zhchoutai/p/6929103.html mysql -u root -p + 回车 -u后跟用户名,-p表示需要密码登录,首次进入mysql用root用户 如: MariaDB>>status; -列出当前mysql的相关状态信息,注意要加分号';' MariaDB>>show databases;  -显示数据库列表