1. 备份成镜像

备份:

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-image=/images/.mbi --backup-dir=/tmp/backup  backup-to-image

其中,backup-dir是用来存储临时文件的。该目录下的文件可以直接删除掉。每次备份只需要备份这个镜像文件即可。

/images目录本身必须存在。

如果备份的是镜像,则首先必须把镜像恢复到备份目录中

./mysqlbackup --backup-image=/images/20161008.mbi --backup-dir=/backup image-to-backup-dir

应用日志

./mysqlbackup --backup-dir=/backup apply-log

恢复

./mysqlbackup --defaults-file=/backup/server-my.cnf --backup-dir=/backup/ copy-back   

2. 压缩备份

备份

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-dir=/backup --compress --compress-level= backup

应用日志

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-dir=/backup --uncompress apply-log

恢复

./mysqlbackup --defaults-file=/backup/server-my.cnf --backup-dir=/backup/ copy-back

3. 基于库的复制

非innodb表的复制

mysqlbackup中提供了这样一个参数--databases,很多人会想当然的以为这个就是用来实现基于库的复制,但实际上并不是,首先看看--help中的说明

--databases=LIST
This option is used to filter the list of non-innodb
tables that needs to be backed up. To filter innodb tables,
use --include option.
The argument specifies space separated list of database/table
names of the following form:
"db_name[.table_name] db_name1[.table_name1] ...".
If this option is not specified all databases will be
backed up. Also, if the specified database does not match
with any single database/table, then all databases will be
backed up.

意思--database只是用来备份非innodb表的,支持两种方式的写法,--databases=test和--databases=test.test1。

令人意外的是,如果指定了test库进行复制,则其它所有的非innodb库都不会复制,譬如,mysql库中的user表,performance_schema库。

而且,上述说明中还提到了“if the specified database does not match with any single database/table, then all databases will be backed up.”,意思是如果指定的数据库或表实际上不存在,则所有的非innodb表都会备份。但实际测试的恰恰相反,如果指定的不存在,则其它所有的非innodb表都不会被复制。

所以,--databases这种场景基本上可以忽略,因为对于非innodb表来说,可以直接copy,无需用这种方式来备份,而且,指定了特定表,而没有指定mysql库的话,即便执行了恢复操作,也无法启动数据库。如果要复制多个非innodb表,可使用:--databases='test.test mysql'

innodb表的复制

下面重点看一下innodb表的复制,这个涉及到--include参数

  --include=REGEXP
Backup only those per-table innodb data files which match
the regular expression (REGEXP). For each table with a
per-table data file, a string of the form db_name.table_name
is checked against the regular expression (REGEXP). If the
REGEXP matches db_name.table_name, the table is included.
The REGEXP should be of POSIX 1003.2 'extended' form.

可以看出--include参数是用正则表达式来匹配的。

譬如下面备份语句,只备份db1库和test库

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-dir=/backup --include='(db1|test)\..*' backup

我这是只备份了db1库和test库。

但是这种备份方式有点问题,这个在恢复的时候会体现出来。

1. 没有备份mysql库中的几张innodb表。

2. 备份了所有表的frm文件,包括没有备份的innodb表,这样,在恢复的时候会报如下错误,因为只有frm文件,而没有ibd文件。虽然并没有影响数据库的正常启动,但终究不太好。

-- ::  [ERROR] InnoDB: Failed to find tablespace for table '"test1"."test1"' in the cache. Attempting to load the t
ablespace with space id 25.2016-- :: 7fc1ac33e700 InnoDB: Operating system error number in a file operation.
InnoDB: The error means the system cannot find the path specified.
-- :: [ERROR] InnoDB: Could not find a valid tablespace file for 'test1/test1'. See http://dev.mysql.com/doc/refma
n/5.6/en/innodb-troubleshooting-datadict.html for how to resolve the issue.-- :: 7fc1ac33e700 InnoDB: cannot calculate statistics for table "test1"."test1" because the .ibd file is missing. For
help, please refer to http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html

所以,在这种备份方式下,需人为的删除这些表的frm文件。

官方文档中其实还提到了两个参数:--only-innodb和 --only-innodb-with-frm。

如果指定了--only-innodb参数,则只会备份指定表的ibd文件,不会备份指定备份的innodb表的frm文件和任何非innodb表(包括mysql和performance_schema)

如果指定了--only-innodb-with-frm参数,则会备份指定表的ibd文件和frm文件,但是不会备份非innodb表。

个人感觉,这两个参数还是比较鸡肋,如果要实现innodb表的复制,只能指定--include参数,然后人为删除不需要的frm文件。

4. 利用可传输表空间基于部分库的复制

复制

 ./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-dir=/backup --include='db1\.t1' --use-tts backup

在该例中,只备份了一张表db1.t1,也可以备份多张表或库

应用日志

./mysqlbackup --backup-dir=/backup/ apply-log

恢复

./mysqlbackup --defaults-file=/backup/server-my.cnf --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_/data/mysql.sock --backup-dir=/backup/ copy-back

但是,报如下错误

 :: mysqlbackup: INFO: Importing table: db1.t1.
mysqlbackup: ERROR: mysql query: 'ALTER TABLE db1.t1 IMPORT TABLESPACE': Internal error: Cannot reset LSNs in table '"db1"."t1"' : Tablespace not found mysqlbackup: ERROR: Failed to import tablespace db1.t1. mysqlbackup failed with errors!

查看db1目录下t1各文件的权限

[root@localhost db1]# ll
total
-rw-rw---- mysql mysql Sep : db.opt
-rw-r--r-- root root Sep : t1.cfg
-rw-rw---- mysql mysql Sep : t1.frm
-rw-r--r-- root root Sep : t1.ibd

发现,其中两个文件的权限是root。

注意:即便是把备份目录/backup的权限设置为mysql,这两个文件的权限依旧是root

此时,可修改这两个文件的权限

[root@localhost db1]# chown mysql.mysql *

在客户端手动import表空间

mysql> alter table db1.t1 import tablespace;
Query OK, rows affected (1.55 sec) mysql> select * from db1.t1;
+------+
| id |
+------+
| |
+------+
row in set (0.00 sec)

导入成功。

注意:基于可传输表空间的部分表或库的复制,无需在新的实例上恢复,可在任意一个online实例上进行,前提是这些实例中待导入的表并不存在。

5. 增量复制

全量复制

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --backup-dir=/backup backup

第一次增量复制

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --incremental --incremental-backup-dir=/increment_backup_1 --incremental-base=dir:/backup backup

第二次增量复制

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.-linux-glibc2.-x86_64/data/mysql.sock --incremental --incremental-backup-dir=/increment_backup_2 --incremental-base=dir:/increment_backup_1 backup

基于增量复制的恢复

首先要应用日志

./mysqlbackup --backup-dir=/backup apply-log

第一次增量恢复

./mysqlbackup --incremental-backup-dir=/increment_backup_1 --backup-dir=/backup apply-incremental-backup

第二次增量恢复

./mysqlbackup --incremental-backup-dir=/increment_backup_2 --backup-dir=/backup apply-incremental-backup

恢复

./mysqlbackup --defaults-file=/backup/server-my.cnf --backup-dir=/backup copy-back

关于增量备份, mysqlbackup支持两种方式的增量备份

基于数据文件

--incremental --incremental-backup-dir=PATH
--start-lsn=LSN | --incremental-base=BACKUP

基于redo文件

 --incremental-with-redo-log-only --incremental-backup-dir=PATH
--start-lsn=LSN | --incremental-base=BACKUP

基于redo文件的备份有个前提,即指定LSN后的redo log没有被覆盖。

对于基于数据文件的增量备份,除了上述指定--incremental-base的方式外,还可指定--start-lsn,

start-lsn即是上一个备份集中meta目录下backup_variables.txt文件中end_lsn的值。

6. 其它用法

验证镜像是否损坏

./mysqlbackup --backup-dir=/image --backup-image=2016_09_27_image validate

MySQL MEB常见用法的更多相关文章

  1. shell编程系列9--文本处理三剑客之sed概述及常见用法总结

    shell编程系列9--文本处理三剑客之sed概述及常见用法总结 sed的工作模式:对文本的行数据一行行处理,如下图 sed(stream editor),是流编辑器,依据特定的匹配模式,对文本逐行匹 ...

  2. Java反射的常见用法

    反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性方法等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的方法. 1 查看属性的修饰符.类型和名 ...

  3. MySQL同步常见问题解答(自己的小心得)

    前几天刚刚注册了博客园,我想写一些技巧性的教程,今天给大家分享一个MySQL同步常见问题解答. Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器? A:有多种方法.如果你在某时间点做 ...

  4. mysql的DATE_FORMAT用法

    DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的输出格式. mysql的DATE_FORMAT用法 %a 缩写星期名 %b 缩写月名 %c ...

  5. Linux中find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  6. php中的curl使用入门教程和常见用法实例

    摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...

  7. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  8. find常见用法

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  9. iOS 开发多线程篇—GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

随机推荐

  1. Cocos2D iOS之旅:如何写一个敲地鼠游戏(七):弹出地鼠

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  2. 概率论:假设检验-t检验和Augmented Dickey–Fuller test

    http://blog.csdn.net/pipisorry/article/details/51184556 T检验 T检验,亦称student t检验(Student's t test),学生t检 ...

  3. iOS中 基于LBXScan库二维码扫描 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 首先声明这个二维码扫描是借助于zxing. 功能模块都完全封装好了,不过界面合你口味,直接使用就好,如果不合口味,后 ...

  4. 纯CSS箭头,气泡

    原文地址: CSS Triangles 演示地址:CSS Triangles Demo 原文日期: 2013年8月5日 翻译日期: 2013年8月9日 本文两种实现方式: 使用或不使用 before ...

  5. 【Unity Tips】备忘录(扫盲篇)

    写在前面 Unity3D虽然是个非常方便的游戏引擎,但还是有一些地方会产生一些让人莫名其妙的问题,而且debug半天也不知道到底哪里错了.往往在经过了大量的log之后,也许我们才顿悟,原来Unity内 ...

  6. XML跨平台,你懂的

    XML跨平台,你懂的 [引子]       90后小妹,问我,"都说XML跨平台,偶真的,不理解.XML语言的这大优势,倒是深深记在脑海里了."      当然,偶立马应声答到,& ...

  7. STL:deque用法详解

    deque函数: deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素.但它又与vector不同,deque支持高效插入和 ...

  8. Property属性, KVC键值编码OC…

    1.属性:帮你自动生成setter 和 getter 方法      属性的声明:(写在.h中)      格式: @property 数据类型 属性名      属性的实现:(写在.m中)      ...

  9. 理解WebKit和Chromium: Chromium插件和扩展基础

    转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 插件和扩展是一种扩充浏览器功能的技术,在之前我们介绍过NPAPI插件技术,在Chromium中,远远不只是 ...

  10. java工具类(三)之生成若干位随机数

    java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...