1

如何使用 bash 工具从 sql 文件中删除全文?

我需要克隆 myisam 表并将其转换为 INNODB,因此我无法使用

DROP FULLTEXT INDEX ON table_name

我试过的

sed -i 's@FULLTEXT.*.)@@g' post.sql
4

2 回答 2

1

由于至少三个原因,这很难实现自动化:

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 脚本是一个非常大的文件,您可能必须仔细选择您的文本编辑器。

于 2012-12-25T18:02:05.923 回答
1

我使用 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 转储运行此程序,那么它将修改该数据。

于 2014-08-07T20:17:05.523 回答