前言

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

基础知识

备份类型

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

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

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

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

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

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

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

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

物理备份和逻辑备份:

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

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

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

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

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

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

备份对象

数据文件

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

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

跟复制相关的配置信息

二进制日志文件

备份工具

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

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

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

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

数据库备份

备份方案

①mysqldump+binlog:

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

②lvm2快照+binlog:

几乎热备,物理备份

③xtrabackup:

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

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

备份须知

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

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

mysqldump+binlog

命令的语法格式

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

其他选项

1
2
3
4
5
6
7
8
9
10
11
12
-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命令

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

备份过程

准备备份目录

准备备份数据库及表

进行完整备份

向表中插入数据

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

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

数据恢复

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

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

1
[root@MariaDB ~]# mysqlbinlog /mydata/data/mysql-bin.000015

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

导入之前的所有备份

查看数据库及数据

OK,至此数据成功恢复

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

lvm2快照+binlog

备份过程

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

数据恢复

1
2
3
4
5
[root@MariaDB ~]# service mysqld stop
[root@MariaDB ~]# rm -rf /mydata/data/*
[root@MariaDB ~]# cp -a /backup/snap/* /mydata/data
[root@MariaDB ~]# service mysqld start
[root@MariaDB ~]# mysql < /backup/binlog/binlog-2015-05-21_20\:23\:41.sql

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

xtrabackup(推荐)

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

特点:

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

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

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

(4)自动实现备份检验

(5)还原速度快

安装

1
[root@MariaDB ~]# yum install percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm -y

创建最小权限备份用户

备份过程

完全备份

1
2
3
4
5
[root@MariaDB ~]# 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 并重启服务

1
2
3
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表而言,执行增量备份时其实进行的是完全备份

添加数据

做增量备份

1
2
3
4
5
6
[root@MariaDB ~]# 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!

再次添加数据

再次做增量备份

1
2
3
4
5
6
[root@MariaDB ~]# 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)基于所有的备份将未提交的事务进行“回滚”。

于是,操作就变成了:

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

接着执行:

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

而后是第二个增量:

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

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

完整备份准备

1
2
3
4
5
[root@MariaDB ~]# 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!

增量备份准备

1
2
3
4
5
[root@MariaDB ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/
[root@MariaDB ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/ 
--incremental-dir=/backup/2015-05-21_22-26-42/
[root@MariaDB ~]# innobackupex --apply-log --redo-only /backup/2015-05-21_21-55-08/ 
--incremental-dir=/backup/2015-05-21_22-32-01/

恢复阶段

还原备份,即完全备份

1
2
3
[root@MariaDB ~]# innobackupex --copy-back /backup/2015-05-21_21-55-08/
[root@MariaDB ~]# chown -R mysql.mysql /mydata/data/
[root@MariaDB ~]# service mysqld start

测试数据是否恢复

OK,数据恢复成功

The end

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

本文转自 北城书生  51CTO博客,原文链接:http://blog.51cto.com/scholar/1653792

MySQL/MariaDB数据库备份与恢复相关推荐

  1. MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南

    MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库. 有关 MySQL 远程管理软件,你可以选择 ...

  2. MySQL/MariaDB数据库

    指令 终端指令 mysql -uroot -p 回车 输入密码后再回车 source 全路径/xxx.sql;//导入*.sql批处理文件 show variables like '%collatio ...

  3. centos中用C/C++语言连接MySQL/MariaDB数据库

    centos中用C/C++语言连接MySQL/MariaDB数据库 安装MariaDB 设置字符集(别管是什么,干就完事了) 设置远程链接MariaDB 上C语言 安装MariaDB yum inst ...

  4. 设置MySQL/MariaDB 数据库默认编码为utf8mb4 (推荐)

    MySQL/MariaDB中的UTF-8并不是真正的UTF-8,其中的UTF8MB4才是真正的UTF-8.因此推荐使用UTF8MB4. 先查看自己数据库的默认字符集: MariaDB [(none)] ...

  5. MySQL/MariaDB数据库主从复制

    MySQL数据库复制概述 MySQL的主从复制是指从服务器向主服务器获取二进制日志文件,然后在从服务器上对这些日志重新执行,从而使从服务器和主服务器保持同步.但由于是异步的复制,从服务器在一定程度上落 ...

  6. Mysql之数据库备份与恢复

    一.数据库备份与恢复 在数据库的实际使用过程中,可能会因下列各种因素导致数据部分或全部丢失: (1)计算机硬件故障 (2)计算机软件故障 (3)病毒 (4)人为误操作 (5)自然灾害 (6)盗窃 所以 ...

  7. mariab修改mysql端口_修改mysql/MariaDB数据库的端口号+远程

    1.修改端口 2.远程+开放端口 (1)设置远程账号:xxx和密码yyyyyyy grant all privileges on *.* to 'xxx'@'%' identified by 'yyy ...

  8. mariadb数据库备份与恢复

    1.查询日志: 记录每一条sql语句,建议不开启,因为如果访问量较大,会占用相当大的资源,影响性能; vim /etc/my.cnf.d/server.cnf general_log = ON| OF ...

  9. HikariPool使用MySQL/MariaDB数据库报错解决:java.sql.SQLException: Access denied for user 'root'@'localhost' (u

    在使用HikariPool连接到我的数据库时报错如下,完整的报错放在最后: 2019-06-25 20:24:26.048 ERROR 18204 --- [nio-8080-exec-9] com. ...

  10. [MYSQL / Mariadb]数据库学习-库、表管理

    数据库基础的库.表管理 数据库基础 库管理 MySQL中加上system,可以执行Linux命令 一行写多个命令 表管理 建表 例: 查表架构 创建表记录 查表的创建命令和属性 加\G,可分行显示 修 ...

最新文章

  1. 蓝桥杯 【基础练习】 特殊回文数
  2. 简单的REST的框架实现
  3. Spring如何解决循环依赖问题
  4. setXxx()和getXxx()的作用
  5. php删除垃圾文件,Python删除windows垃圾文件的方法
  6. windows phone 8 使用页面传对象的方式 实现页面间的多值传递
  7. 启迪公交:DRDS助力城市公交系统智能化
  8. IndentationError: expected an indented block --python报错 or IndentationError:unexpected indent
  9. android 架构份额,Android 架构设计比较分析
  10. csh远程登录服务器,ubuntu远程连接服务器某一个用户(非root用户)出现sh: 1: source: not found...
  11. 8104网站服务器返回错误,关于 来源: volmgr Event ID: 46 故障转储初始化未成功 的问题...
  12. 将多个markdown文件发布为一个html或pdf文件的方法梳理
  13. SQLAlchemy简单入门
  14. 数据库性能优化之SQL语句优化(下)
  15. 正在与拖延症病魔抗争中
  16. Springboot+Vue实现仿课堂派
  17. coreldraw怎么画猴子_小猴子的画法
  18. 饥荒联机版服务器搭建教程-WeGame
  19. python dataframe是什么_什么是Pandas的DataFrame?
  20. 使用javascript实现植物大战僵尸部分功能

热门文章

  1. jquery省市插件
  2. 第二章作业-第1题-万世想
  3. poj 2499第K短路模板
  4. WinForm实现只打开一个窗口的代码
  5. HDU4578 Transformation(多标记线段树)题解
  6. SPOJ REPEATS Repeats (后缀数组 + RMQ:子串的最大循环节)题解
  7. 学习JavaScript原型应用
  8. 列出1-100的所有质数的两种方法
  9. Python str内部功能介绍
  10. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介