MySQL OCP888题解064-通过FLUSH TABLE备份表

Posted oddrock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL OCP888题解064-通过FLUSH TABLE备份表相关的知识,希望对你有一定的参考价值。

文章目录

1、原题

1.1、英文原题

mysql Server is configured with innodb_file_per_table enabled. The table mydata has been created and populated with data. You will be exporting this table to another server.
Mysql> FLUSH TABLES mydata FOR EXPORT;
Query OK, 0 rows affected (0.00 sec)
Before an UNLOCK TABLES is executed, which three components need to be copied to successfully export the mydata table?
A、mydata.frm
B、mydata.err
C、mydata.idb
D、mydata.tar.gz
E、ibdata*
F、mydata.export
G、ib_logfile*
H、mydata.cfg

1.2、中文翻译

MySQL Server配置为启用了innodb_file_per_table。表mydata已经创建并填充了数据。您将要将此表导出到另一台服务器。
Mysql> FLUSH TABLES mydata FOR EXPORT;
Query OK, 0 rows affected (0.00 sec)
在执行UNLOCK TABLES之前,需要复制哪三个组件才能成功导出mydata表?
A、mydata.frm
B、mydata.err
C、mydata.idb
D、mydata.tar.gz
E、ibdata*
F、mydata.export
G、ib_logfile*
H、mydata.cfg

1.3、答案

A、C、H

2、题目解析

2.1、题干解析

本题考察使用FLUSH TABLE+拷贝文件进行表备份的方法。

2.2、选项解析

3、知识点

3.1、知识点1:通过FLUSH TABLE+拷贝文件+导入表空间的方式进行表备份

以下描述了通过FLUSH TABLE+拷贝文件+导入表空间的方式进行表备份的全过程:

  1. 在目标实例上,创建一个与你打算导入的表有相同定义的表。(你可以使用SHOW CREATE TABLE语法获得表的定义。)如果表的定义不匹配,当你尝试导入操作时,会报告一个模式不匹配的错误。
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
  1. 在目标实例上,丢弃你刚刚创建的表的表空间。(在导入之前,你必须丢弃接收表的表空间)。
mysql> ALTER TABLE t1 DISCARD TABLESPACE;
  1. 在源实例上,运行FLUSH TABLES …FOR EXPORT来静止你打算导入的表,这样该表只允许有只读事务。当FLUSH TABLES …FOR EXPORT运行时,InnoDB会在表的模式目录下生成一个.cfg元数据文件。这个.cfg文件包含元数据,在导入操作中用于模式验证。
mysql> USE test;
mysql> FLUSH TABLES t1 FOR EXPORT;
  1. 将.ibd文件和.cfg元数据文件从源实例复制到目标实例。
$> scp /path/to/datadir/test/t1.ibd,cfg destination-server:/path/to/datadir/test
  1. 在源实例上,使用UNLOCK TABLES来释放由FLUSH TABLES获得的锁 …FOR EXPORT 语句获得的锁。UNLOCK TABLES操作也删除了.cfg文件。
mysql> USE test;
mysql> UNLOCK TABLES;
  1. 在目标实例上,导入表空间。
mysql> USE test;
mysql> ALTER TABLE t1 IMPORT TABLESPACE;

官方参考文档

4、总结

  1. 可以通过FLUSH TABLE+拷贝文件+导入表空间的方式进行表备份。方法是第一步在目标服务器上创建空表、丢弃表空间;第二步在源服务器运行FLUSH TABLES …FOR EXPORT,将该表变为只读状态。将.ibd和.cfg文件从源服务器拷贝到目标服务器;第三步是在源服务器运行UNLOCK TABLES来释放由FLUSH TABLES获得的锁;第四步是在目标服务器运行导入表空间的命令。这四步即可完成将某一张表从源服务器备份到目标服务器。

MySQL OCP888题解067-GTID复制模式下的限制

文章目录

1、原题

1.1、英文原题

1.2、答案

E

2、题目解析

2.1、题干解析

本题考察GTID复制模式下的限制。

2.2、选项解析

  1. 当使用GTIDs时,不允许使用CREATE TABLE …SELECT语句:因为当binlog_format被设置为STATEMENT时,一个CREATE TABLE …SELECT语句在二进制日志中被记录为一个GTID的事务,但是如果使用ROW格式,该语句被记录为两个GTID的事务。如果源文件使用STATEMENT格式,而复制文件使用ROW格式,复制文件将无法正确处理该事务,因此GTID模式下就通过不允许使用CREATE TABLE …SELECT来防止这种情况的发生。所以选项E正确。

3、知识点

3.1、知识点1:使用GTIDs时对复制的限制

  • 当使用GTIDs时,对使用非交易性存储引擎(如MyISAM)的表的更新不能与对使用交易性存储引擎(如InnoDB)的表的更新在同一语句或事务中进行:这个限制是由于在同一个事务中,对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合在一起,会导致多个GTIDs被分配到同一个事务中,因此事务和GTID之间的一对一对应关系被打破,其结果是基于GTID的复制不能正常运行。
  • 当使用GTIDs时,不允许使用CREATE TABLE …SELECT语句:当binlog_format被设置为STATEMENT时,一个CREATE TABLE …SELECT语句在二进制日志中被记录为一个GTID的事务,但是如果使用ROW格式,该语句被记录为两个GTID的事务。如果源文件使用STATEMENT格式,而复制文件使用ROW格式,复制文件将无法正确处理该事务,因此GTID模式下就通过不允许使用CREATE TABLE …SELECT来防止这种情况的发生。
  • 当使用GTIDs时,不允许使用临时表:CREATE TEMPORARY TABLE和DROP TEMPORARY TABLE语句在使用GTIDs时,不支持在事务、存储过程、函数和触发器内使用(也就是说,当enforce_gtid_consistency系统变量被设置为ON时)。
  • 当使用GTIDs时,不支持sql_slave_skip_counter:如果你需要跳过交易,使用源的gtid_executed变量的值来代替。

官方参考文档

4、总结

  1. GTID复制模式下,不能将MyISAM表和InnoDB表在同一事务内更新,不能使用CREATE TABLE …SELECT语句。

以上是关于MySQL OCP888题解064-通过FLUSH TABLE备份表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL OCP888题解063-突然变慢的可能原因

MySQL OCP888题解061-库表访问权限的激活时机

MySQL OCP888题解067-GTID复制模式下的限制

OCP题解之SQL语法001

MySQL进程处于Waiting for table flush的分析

MySQL线程处于Waiting for table flush的分析