2011-01-20 58 views

回答

10

也许你的意思是“如何在我的(现有)实时数据库上重新创建我的开发索引”?

如果是这样,我认为你正在寻找的SQL命令是;

SHOW CREATE TABLE {tablename};

ALTER TABLE添加索引{INDEX_NAME}(COL1,COL2)

ALTER TABLE DROP INDEX {INDEX_NAME}

可以复制的 “钥匙” 和 “约束” 行 “SHOW CREATE TABLE” 输出并将其放回“ALTER TABLE ADD INDEX”中。

dev mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `region_idx` (region_id), 
    CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB; 

live mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

live mysql> ALTER TABLE `city` ADD KEY `region_idx` (region_id); 
live mysql> ALTER TABLE `city` ADD CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT; 

希望这有助于!

1

可以使用下面的命令来拉屎

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz 

和索引将被自动复制。

1

我相信你试图导出索引本身,而不仅仅是在生产中重新生成它们的代码,对吧? (我假设这是因为在大多数生产环境中生成这些索引的负载不利。)

如果性能不是您主要关心的话,那么mysqldump实用程序非常有用,并且我一直都在使用它。但是,如果您正在寻找一种非常快速的方法,我会建议将实际的InnoDB文件从一个冷数据库拷贝到另一个冷数据库(假设它们完全相同的MySQL版本,配置完全相同,并且期望完全相同行为等)。如果系统之间存在任何差异,则此方法很危险。

听起来像,在您的情况下,您可能首先需要将良好的数据复制到测试环境。我的开发周期通常采用这种方法:DDL从测试流程通过编程流向生产流程,DML从生产流程通过实际使用系统流向测试流程。

+3

请提供答案,而不是假设,这属于意见。 – Tom 2012-09-20 05:03:07

1

我也有开发和生产服务器具有相同的数据库结构。

我修改了两个索引,所以我想合并在一起。所以我需要将数据与记事本+进行比较。

这里是你如何导出索引的所有表,所有数据库和如何筛选并加以比较:

--- Single table: 
    SHOW INDEX FROM mydb.mytable; 
    SHOW INDEX FROM mytable; 

--- Multi tables, databases: 
    USE information_schema; 
    SELECT * FROM `statistics` ORDER BY TABLE_SCHEMA ASC, TABLE_NAME ASC, INDEX_NAME ASC; 

现在,phpMyAdmin的 - >导出为CSV,Excel中:

添加标题行 - >删除所有列,但保留“database_name table_name索引列值”

然后,按数据库进行过滤。

全部从database1复制到记事本+屏幕1,过滤excel database2,全部复制到记事本+屏幕2 - > COMPARE!

0

扩展@ origo的答案。有一种情况我需要为一堆索引提取DDL。这个脚本完成这项工作。

来源:https://rogerpadilla.wordpress.com/2008/12/02/mysql-export-indexes/

SELECT 
CONCAT(
'ALTER TABLE ' , 
TABLE_NAME, 
' ', 
'ADD ', 
IF(NON_UNIQUE = 1, 
CASE UPPER(INDEX_TYPE) 
WHEN 'FULLTEXT' THEN 'FULLTEXT INDEX' 
WHEN 'SPATIAL' THEN 'SPATIAL INDEX' 
ELSE CONCAT('INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
END, 
IF(UPPER(INDEX_NAME) = 'PRIMARY', 
CONCAT('PRIMARY KEY USING ', 
INDEX_TYPE 
), 
CONCAT('UNIQUE INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
) 
), 
'(', 
GROUP_CONCAT(
DISTINCT 
CONCAT('', COLUMN_NAME, '') 
ORDER BY SEQ_IN_INDEX ASC 
SEPARATOR ', ' 
), 
');' 
) AS 'Show_Add_Indexes' 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA = 'PLEASE CHANGE HERE' 
GROUP BY TABLE_NAME, INDEX_NAME 
ORDER BY TABLE_NAME ASC, INDEX_NAME ASC; 
相关问题