MySQL MEB常见用法

  1. 备份成镜像

    备份:

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

   
其中,backup-dir是用来囤积临时文件的。该目录下之公文可以一直去掉。每次备份只需要备份这个镜像文件即可。

    /images目录自己要有。

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

./mysqlbackup --backup-image=.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   

 

  1. 减备份

   备份

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

   应用日志

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

   恢复

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

 

  1. 根据库底复制

   非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.23-linux-glibc2.5-x86_64/data/mysql.sock --backup-dir=/backup --include='(db1|test)\..*' backup

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

   但是这种备份方式有点问题,这个当回复的早晚会反映出来。

   1. 没有备份mysql库中之几布置innodb表。

   2.
备份了所有表的frm文件,包括没有备份的innodb表,这样,在还原的时候会报如下错误,因为只有frm文件,而尚未ibd文件。虽然并无影响数据库的正规启动,但总未绝好。

2016-09-28 10:05:16 1989 [ERROR] InnoDB: Failed to find tablespace for table '"test1"."test1"' in the cache. Attempting to load the t
ablespace with space id 25.2016-09-28 10:05:16 7fc1ac33e700  InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
2016-09-28 10:05:16 1989 [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.2016-09-28 10:05:16 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文件。

 

  1. 应用而污染输表空间基于部分库的复制

   复制

 ./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.23-linux-glibc2.5-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.23-linux-glibc2.5-x86_64/data/mysql.sock --backup-dir=/backup/ copy-back

  但是,报如下错误 

160929 11:37:35 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 116
-rw-rw---- 1 mysql mysql    65 Sep 29 11:17 db.opt
-rw-r--r-- 1 root  root    371 Sep 29 11:37 t1.cfg
-rw-rw---- 1 mysql mysql  8556 Sep 29 11:37 t1.frm
-rw-r--r-- 1 root  root  98304 Sep 29 11:37 t1.ibd

  发现,其中有数单文本的权能是root。

 
注意:即便是管备份目录/backup的权杖设置也mysql,这有限单公文的权力依旧是root

  这,可改就半独文本的权

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

  以客户端手动import表空间

mysql> alter table db1.t1 import tablespace;
Query OK, 0 rows affected (1.55 sec)

mysql> select * from db1.t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

   导入成功。

 
 注意:基于可染输表空间的一对表要库底复制,无需在新的实例上过来,可于随机一个online实例上展开,前提是这些实例中待导入的表并不设有。

 

  1. 增量复制

    全量复制

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

   第一浅增量复制   

./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.23-linux-glibc2.5-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.23-linux-glibc2.5-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的值。

  1. 任何用法 

验证镜像是否损坏

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

 

 

   

 

网站地图xml地图