阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL MEB常见用法

109次阅读
没有评论

共计 6251 个字符,预计需要花费 16 分钟才能阅读完成。

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

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-05/143432.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计6251字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中