MySQL 8.0.16 及更高版本包含一个ddl_rewriter
插件,可CREATE TABLE
在服务器解析和执行语句之前修改服务器接收到的语句。该插件删除了ENCRYPTION
、
DATA DIRECTORY
和INDEX
DIRECTORY
子句,这在从 SQL 转储文件恢复表时可能会有所帮助,这些文件是从加密的数据库中创建的,或者它们的表存储在数据目录之外。例如,该插件可以将此类转储文件恢复到未加密的实例中,或者恢复到数据目录之外的路径不可访问的环境中。
在使用ddl_rewriter
插件之前,请按照
第 5.6.5.1 节“安装或卸载 ddl_rewriter”中提供的说明进行安装。
ddl_rewriter
在解析之前检查服务器接收到的 SQL 语句,并根据这些条件重写它们:
ddl_rewriter
仅考虑CREATE TABLE
语句,并且仅当它们是出现在输入行开头或准备语句文本开头的独立语句时。ddl_rewriter
不考虑CREATE TABLE
存储程序定义中的语句。语句可以扩展到多行。在考虑重写的语句中,以下子句的实例被重写并且每个实例由一个空格替换:
ENCRYPTION
DATA DIRECTORY
(在表和分区级别)INDEX DIRECTORY
(在表和分区级别)
重写不依赖于字母大小写。
如果ddl_rewriter
重写语句,它会生成警告:
mysql> CREATE TABLE t (i INT) DATA DIRECTORY '/var/mysql/data';
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1105
Message: Query 'CREATE TABLE t (i INT) DATA DIRECTORY '/var/mysql/data''
rewritten to 'CREATE TABLE t (i INT) ' by a query rewrite plugin
1 row in set (0.00 sec)
如果启用了通用查询日志或二进制日志,则服务器将在 重写后出现的语句写入其中
ddl_rewriter
。
安装后,ddl_rewriter
公开 Performance Schemamemory/rewriter/ddl_rewriter
工具以跟踪插件内存使用情况。请参见
第 27.12.20.10 节,“内存汇总表”