【发布时间】:2016-08-26 23:46:16
【问题描述】:
我只需要从 MySQL 中的数据库备份索引。
而且,我只需要备份触发器。
我怎样才能做到这一点?
【问题讨论】:
-
您是否尝试过并查看过官方文档?我的意思是很多东西已经可以通过谷歌搜索 mysql 获得。无论如何,可以在这里查看:stackoverflow.com/questions/4744287/…
我只需要从 MySQL 中的数据库备份索引。
而且,我只需要备份触发器。
我怎样才能做到这一点?
【问题讨论】:
您可以通过运行从 information_schema 生成“CREATE INDEX”语句:
select concat("CREATE UNIQUE INDEX ",INDEX_NAME ," ON ", TABLE_NAME," (",group_concat(COLUMN_NAME ORDER BY SEQ_IN_INDEX),");") from information_schema.STATISTICS where INDEX_NAME!='PRIMARY' and NON_UNIQUE=0 and TABLE_SCHEMA='my_db_name' group by TABLE_NAME,INDEX_NAME order by TABLE_NAME,INDEX_NAME;
select concat("CREATE INDEX ",INDEX_NAME ," ON ", TABLE_NAME," (",group_concat(COLUMN_NAME ORDER BY SEQ_IN_INDEX),");") from information_schema.STATISTICS where INDEX_NAME!='PRIMARY' and NON_UNIQUE=1 and TABLE_SCHEMA='my_db_name' group by TABLE_NAME,INDEX_NAME order by TABLE_NAME,INDEX_NAME;
只需将“my_db_name”替换为您自己的数据库名称即可。
【讨论】:
能够在没有任何索引的情况下创建数据库非常有意义(除了主键,它或多或少决定了物理顺序)。
从单个数据库迁移到新的主/从设置,您不需要主数据库上的任何索引,只需要从服务器上。
此外,如果您使用的是 Amazon 的数据迁移服务 (DMS),那么他们的方法建议您的目标数据库没有任何索引。
我们使用的方法是生成模式转储,后处理从主模式中提取索引(所以现在我们有了初始模式和初始索引)。我们为触发器、存储过程、视图、UDF 使用可重复对象,因此这些也被排除在初始模式之外。
这并不简单。我们有很多支持代码来帮助我们解决这个问题。
但是一旦完成,您可以通过从 2 个系统导出另一个完整架构并比较结果来测试它是否正常工作。
我们意识到的好处是您可以自己命名所有内容。索引、外键约束等。依赖于任何默认命名模式可能会导致进一步迁移令人头疼,因为事物的创建顺序可能不同,因此默认名称可能不同。
【讨论】:
UNIQUE 索引来在插入时检查唯一性。您不能在不等待建立索引的情况下交换主服务器和副本服务器(在双主设置中)。等等。
只备份索引是零意义的。如果没有它们引用的数据,它们就没有用处。
备份只是触发器:也许这个组合会起作用:mysqldump --no-data --triggers
【讨论】:
CREATE TABLE 中的一行,请修改问题以使其清楚。
ADD INDEXs的最快方法。