2011-01-20 63 views
8

Tôi đã làm việc trên cơ sở dữ liệu phát triển của mình và đã tinh chỉnh hiệu suất của nó.MySql, làm cách nào tôi có thể xuất chỉ mục từ cơ sở dữ liệu phát triển sang cơ sở dữ liệu sản xuất của mình?

Tuy nhiên, với sự ngạc nhiên của mình, tôi không thể tìm cách xuất các chỉ mục sang cơ sở dữ liệu sản xuất của mình.

Tôi nghĩ rằng sẽ có một cách dễ dàng để thực hiện việc này. Tôi không muốn thay thế dữ liệu trong cơ sở dữ liệu sản xuất của mình.

Vấn đề chính là tôi không thể thấy sắp xếp trong các chỉ mục, do đó sẽ khó khăn để thực hiện thủ công.

Trả lời

10

Có thể bạn muốn nói "Làm cách nào để tạo lại chỉ mục phát triển trên cơ sở dữ liệu trực tiếp (hiện tại) của tôi"?

Nếu có, tôi nghĩ rằng các lệnh SQL bạn đang tìm là;

HIỂN THỊ TẠO BẢNG {tablename};

ALTER TABLE ADD INDEX {INDEX_NAME} (col1, col2)

ALTER TABLE DROP INDEX {INDEX_NAME}

Bạn có thể sao chép "KEY" và "CONSTRAINT" hàng từ "HIỂN THỊ CREATE TABLE" đầu ra và đặt nó trở lại trong "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; 

Hy vọng điều này sẽ hữu ích!

3

Trước tiên, hãy đọc hướng dẫn tại đây về how-to Export MySQL Indexes using a SQL query. Hơn nữa:

  1. Nếu bạn hoàn thành DUMP của cơ sở dữ liệu và nhập DUMP vào cơ sở dữ liệu khác (sử dụng PHPMyAdmin, vv), các chỉ mục sẽ được tạo lại.

  2. Nếu có thể, bạn có thể sao chép nội dung của toàn bộ thư mục cơ sở dữ liệu MySQL vào cơ sở dữ liệu sản xuất. Điều này cũng sẽ làm điều này một cách nhanh chóng. Read more here at MySQL docs.

1

bạn có thể sử dụng lệnh sau để có một bãi chứa

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

và lập chỉ mục sẽ được sao chép tự động.

1

Tôi tin rằng bạn đang cố xuất các chỉ mục và không chỉ là mã để tạo lại các chỉ mục đó trong sản xuất, đúng không? (Tôi giả định điều này vì tải của việc tạo ra các chỉ mục này không thuận lợi trong hầu hết các môi trường sản xuất.)

Tiện ích mysqldump hữu ích nếu hiệu suất không phải là mối quan tâm chính của bạn và tôi luôn sử dụng nó. Tuy nhiên, nếu bạn đang tìm kiếm một phương pháp rất nhanh, tôi khuyên bạn nên sao chép các tệp InnoDB thực tế từ cơ sở dữ liệu lạnh này sang cơ sở dữ liệu khác (giả sử chúng chính xác là cùng một phiên bản MySQL với cùng cấu hình và chính xác như vậy hành vi, v.v.) Phương pháp này là nguy hiểm nếu có bất kỳ sự khác biệt nào giữa các hệ thống.

Có vẻ như, trong trường hợp của bạn, trước tiên bạn có thể muốn sao chép dữ liệu tốt của mình vào môi trường thử nghiệm.Chu kỳ phát triển của tôi thường tuân theo phương pháp này: DDL chảy từ thử nghiệm đến sản xuất thông qua lập trình và DML chảy từ sản xuất đến thử nghiệm thông qua việc sử dụng thực tế của hệ thống.

+3

vui lòng cung cấp câu trả lời thay vì giả định, này thuộc về ý kiến. – Tom

1

Tôi cũng có các máy chủ phát triển và sản xuất có cấu trúc cơ sở dữ liệu giống nhau.

Tôi đã sửa đổi các chỉ mục trên cả hai người để tôi muốn hợp nhất tất cả. Vì vậy, tôi cần so sánh dữ liệu với Notepad +.

Sau đây là cách bạn xuất chỉ số cho tất cả các bảng, tất cả các cơ sở dữ liệu và làm thế nào để lọc và so sánh chúng:

--- 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; 

Bây giờ, phpMyAdmin -> Xuất sang CSV-Excel:

thêm một dòng tiêu đề -> xóa tất cả các cột nhưng để lại "giá trị cột chỉ mục database_name table_name"

Sau đó, lọc theo cơ sở dữ liệu.

Sao chép tất cả từ cơ sở dữ liệu1 sang màn hình notepad + 1, lọc cơ sở dữ liệu excel2, sao chép tất cả sang notepad + screen 2 -> COMPARE!

0

Mở rộng câu trả lời của @ origo. Có một trường hợp tôi cần trích xuất DDL cho một loạt các chỉ mục. Kịch bản này thực hiện công việc.

nguồn: 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; 
Các vấn đề liên quan