zoukankan      html  css  js  c++  java
  • MySQL MEB常见用法

    1. 备份成镜像

        备份:

    ./mysqlbackup --socket=/usr/local/mysql-advanced-5.6.23-linux-glibc2.5-x86_64/data/mysql.sock --backup-image=/images/20161008.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.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

    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.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文件。

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

       复制

     ./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实例上进行,前提是这些实例中待导入的表并不存在。

    5. 增量复制

        全量复制

    ./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的值。

    6. 其它用法 

    验证镜像是否损坏

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

       

  • 相关阅读:
    CDN使用心得
    IIS6.0实现SSL安全加密
    从print css谈样式表的媒介(media)属性
    ASP.NET文件下载各种方式比较:对性能的影响、对大文件的支持、对断点续传和多线程下载的支持
    “同名Cookie”的分析
    周末部门游玩顺德碧桂园度假村
    Linux特殊文件权限
    周末部门游玩广州长隆欢乐世界
    开个博客
    iOS TableView数据绑定的原则
  • 原文地址:https://www.cnblogs.com/ivictor/p/5913370.html
Copyright © 2011-2022 走看看