2011-01-20 18 views
8

मैं अपने विकास डेटाबेस पर काम कर रहा हूं और इसके प्रदर्शन को बदल दिया है।MySQL, मैं अपने उत्पादन डेटाबेस से अपने उत्पादन डेटाबेस से इंडेक्स कैसे निर्यात कर सकता हूं?

हालांकि, मेरे आश्चर्य के लिए मुझे अपने उत्पादन डेटाबेस में इंडेक्स निर्यात करने का कोई तरीका नहीं मिल रहा है।

मैंने सोचा कि ऐसा करने का एक आसान तरीका होगा। मैं अपने उत्पादन डेटाबेस में डेटा को प्रतिस्थापित नहीं करना चाहता हूं।

मुख्य समस्या यह है कि मैं इंडेक्स में सॉर्टिंग नहीं देख पा रहा हूं, इसलिए इसे मैन्युअल रूप से करने में भी मुश्किल हो रही है।

उत्तर

10

शायद आपका मतलब है "मैं अपने (मौजूदा) लाइव डेटाबेस पर अपनी विकास अनुक्रमणिका कैसे बना सकता हूं"?

यदि ऐसा है, तो मुझे लगता है कि SQL आदेश जो आप ढूंढ रहे हैं;

तालिका बनाएं {tablename};

ALTER तालिका जोड़ें सूचकांक {INDEX_NAME} (col1, col2)

ALTER तालिका ड्रॉप सूचकांक {INDEX_NAME}

आप "कुंजी" और "बाधा" पंक्तियों "दिखाएं टेबल बनाएं" कॉपी कर सकते हैं उत्पादन और इसे "वैकल्पिक तालिका जोड़ें 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; 

आशा है कि इससे मदद मिलती है!

3

सबसे पहले, यहां how-to Export MySQL Indexes using a SQL query के बारे में ट्यूटोरियल पढ़ें। इसके अलावा:

  1. आप अपने डेटाबेस की पूरी DUMP करते हैं और किसी अन्य के लिए यह आयात (PHPMyAdmin, आदि का उपयोग), तो अनुक्रमणिका पुनर्जीवित कर दिया जाएगा।

  2. यदि संभव हो, तो आप अपने पूरे MySQL डेटाबेस फ़ोल्डर की सामग्री को डेटाबेस डेटाबेस में कॉपी कर सकते हैं। यह जल्दी से चाल भी करेगा। Read more here at MySQL docs.

1

आप एक डंप

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

और सूचियों को स्वचालित रूप से कॉपी किया जायेगा लेने के लिए निम्न आदेश का उपयोग कर सकते हैं।

1

मेरा मानना ​​है कि आप खुद को इंडेक्स निर्यात करने की कोशिश कर रहे हैं न कि केवल उन्हें उत्पादन में पुन: उत्पन्न करने के लिए कोड, सही? (मुझे यह माना जा रहा है क्योंकि इन इंडेक्स को उत्पन्न करने का भार अधिकांश उत्पादन वातावरण में अनुकूल नहीं है।)

प्रदर्शन की आपकी मुख्य चिंता नहीं होने पर mysqldump उपयोगिता उपयोगी है, और मैं इसे हर समय उपयोग करता हूं। यदि आप एक बहुत तेज़ विधि की तलाश में हैं, तो मैं सुझाव दूंगा कि वास्तविक इनओडीबी फ़ाइलों को एक ठंडे डेटाबेस से दूसरे में कॉपी करना (मान लीजिए कि वे वही माइक्रोसॉफ्ट संस्करण बिल्कुल वही कॉन्फ़िगरेशन के साथ हैं और बिल्कुल वही उम्मीद है व्यवहार, आदि)। सिस्टम के बीच कोई अंतर होने पर यह विधि खतरनाक है।

ऐसा लगता है कि आपकी स्थिति में, आप अपने अच्छे डेटा को अपने परीक्षण वातावरण में पहले कॉपी करना चाहते हैं।मेरा विकास चक्र आमतौर पर इस दृष्टिकोण का पालन करता है: डीडीएल प्रोग्रामिंग के माध्यम से परीक्षण से उत्पादन तक बहती है, और डीएमएल उत्पादन से प्रवाह के लिए सिस्टम के वास्तविक उपयोग के माध्यम से परीक्षण करता है।

+3

मान्यताओं के बजाय उत्तर प्रदान करें, इस टिप्पणी के अंतर्गत आता है। – Tom

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:

का तरीका यहां बताया, सभी तालिकाओं के लिए अनुक्रमित निर्यात सभी डेटाबेस और कैसे को फ़िल्टर और उनकी तुलना करने के लिए है -> सभी कॉलम हटाएं लेकिन "डेटाबेस_नाम टेबल_नाम इंडेक्स कॉलम वैल्यू"

छोड़ें, फिर डेटाबेस द्वारा फ़िल्टर करें।

डेटाबेस 1 से सभी को नोटपैड + स्क्रीन 1 में कॉपी करें, एक्सेल डेटाबेस 2 फ़िल्टर करें, सभी को नोटपैड + स्क्रीन 2 पर कॉपी करें -> तुलना करें!

0

@ मूल के उत्तर पर विस्तार। एक ऐसा मामला है जहां मुझे इंडेक्स के समूह के लिए डीडीएल निकालने की आवश्यकता थी। यह स्क्रिप्ट नौकरी करता है।

स्रोत: 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; 
संबंधित मुद्दे