如何使用 bash 工具从 sql 文件中删除全文?
我需要克隆 myisam 表并将其转换为 INNODB,因此我无法使用
DROP FULLTEXT INDEX ON table_name
我试过的
sed -i 's@FULLTEXT.*.)@@g' post.sql
由于至少三个原因,这很难实现自动化:
CREATE TABLE `foo` (
`c` TEXT,
FULLTEXT KEY `c` (`c`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
删除 FULLTEXT KEY 行还需要删除前一行末尾的逗号。或者用其他行替换 FULLTEXT KEY 行。
字符串“FULLTEXT KEY”可能出现在您的 SQL 脚本的其他地方、字符串文字内或注释中。所以你必须小心误报匹配。
我们可以简单地将“FULLTEXT KEY”更改为“KEY”,但是在长 VARCHAR 或 TEXT 列上声明全文索引是相当常见的,这对于传统索引的 1000 字节限制来说太长了。您可以使用索引前缀,但在正则表达式中选择前缀长度和处理多列索引很困难。
我将通过在创建 SQL 脚本之前删除所有 FULLTEXT 索引来解决这个问题。您可以查询所有 FULLTEXT 索引并从信息模式中生成删除语句。
例如:
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` DROP KEY `',
index_name, '`;') AS ddl
FROM INFORMATION_SCHEMA.STATISTICS
WHERE table_schema='test' and index_type='FULLTEXT';
我的第二个选择是,如果您无法更改原始数据库并且需要更改脚本,则将是在文本编辑器中手动编辑 SQL 脚本,而不是尝试将其自动化。这使您有机会检查每个案例并以正确的方式对其进行编辑。
如果您的 SQL 脚本是一个非常大的文件,您可能必须仔细选择您的文本编辑器。
我使用 PHP 片段自动执行此操作,但我确信 perl 或 sed 可以以类似的方式执行此操作。我在 c 风格的注释中包围了全文索引,所以什么都没有丢失。
php -r 'file_put_contents("schema.sql", preg_replace("/(,\s+FULLTEXT KEY [^)]+\))/", "/*$1*/", file_get_contents("schema.sql")));'
这适用于 MySQL 模式文件 (CREATE TABLE)。
正如 Bill Karwin 所指出的,如果您针对包含可能与正则表达式匹配的数据的完整 SQL 转储运行此程序,那么它将修改该数据。