MySQL 8.4 包含一个 ddl_rewriter
插件,它会修改服务器接收到的 CREATE TABLE
语句,然后再解析和执行它们。该插件会删除 ENCRYPTION
、DATA DIRECTORY
和 INDEX DIRECTORY
子句,这在从加密数据库或将表存储在数据目录之外的数据库中创建的 SQL 转储文件中还原表时可能会有用。例如,该插件可以启用将此类转储文件还原到未加密的实例或无法访问数据目录之外路径的环境中。
在使用 ddl_rewriter
插件之前,请按照 第 7.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 Schema memory/rewriter/ddl_rewriter
工具,用于跟踪插件内存使用情况。请参阅 第 29.12.20.10 节,“内存摘要表”