MySQL एक विशाल (32 जीबी) sql डंप तेजी से आयात करने का कोई तरीका है?


67

मेरे पास यह 32 जीबी SQL डंप है जिसे मुझे MySQL में आयात करने की आवश्यकता है। मुझे पहले इतने बड़े एसक्यूएल डंप का आयात नहीं करना पड़ा। मैंने हमेशा किया:

mysql -uroot dbname < dbname.sql

इसमें बहुत समय लग रहा है। लगभग 300 मिलियन पंक्तियों के साथ एक तालिका है, यह लगभग 3 घंटे में 1.5 मिलियन हो गई है। तो, ऐसा लगता है कि पूरी चीज़ को 600 घंटे (24 दिन) लगते हैं और यह अव्यवहारिक है। तो मेरा सवाल यह है कि क्या ऐसा करने का एक तेज़ तरीका है?

आगे की जानकारी / निष्कर्ष

  1. टेबल सभी InnoDB हैं और कोई विदेशी कुंजी परिभाषित नहीं है। हालाँकि, कई सूचकांक हैं।
  2. मेरे पास मूल सर्वर और DB तक पहुंच नहीं है, इसलिए मैं एक नया बैकअप नहीं बना सकता या "हॉट" कॉपी आदि नहीं कर सकता।
  3. innodb_flush_log_at_trx_commit = 2जैसा कि यहां बताया गया है कि सेटिंग में सुधार (स्पष्ट रूप से दिखाई देने वाला / घातीय) होने लगता है।
  4. आयात के दौरान सर्वर आँकड़े (MySQL कार्यक्षेत्र से): https://imgflip.com/gif/ed0c8
  5. MySQL संस्करण 5.6.20 समुदाय है।
  6. innodb_buffer_pool_size = 16M और innodb_log_buffer_size = 8M। क्या मुझे इन्हें बढ़ाने की आवश्यकता है?

क्या आप सर्वर में तेजी से घटकों को जोड़ सकते हैं, अर्थात् अधिक रैम और एसएसडी स्टोरेज?

@ बर्ट में सर्वर में 8 जीबी की रैम होती है, जिसमें से ज्यादातर सिर्फ अप्रयुक्त होती है। अधिक संग्रहण नहीं जोड़ सकता है। वह कैसे मदद करेगा? क्या यह वास्तव में लिखने का कार्य इतना धीमा है?

अड़चन क्या है? क्या एक CPU कोर खूंटी है?
क्रिस एस

@ क्रिस नहीं, सीपीयू का उपयोग 3 से 4% है। मुझे यकीन नहीं है कि अड़चन क्या है। मैं सोच रहा हूं कि यह इंडेक्स है। अड़चन कैसे होगी / इसकी पुष्टि कैसे होगी?

1
यदि आपके पास sql है, तो क्या आप क्रिएट इंडेक्स स्टेटमेंट को संपादित कर सकते हैं और देख सकते हैं कि क्या यह तेजी से आगे बढ़ता है? एक बार जब आपके पास डेटा आयात हो जाता है, तो आपको उन्हें पुनः बनाने की आवश्यकता होगी

जवाबों:


84

पर्कोना के वाडिम तकाचेंको ने इनोबीडी के इस बढ़िया पिक्टोरियल रिप्रेजेंटेशन को बनाया

InnoDB वास्तुकला

आपको निश्चित रूप से निम्नलिखित को बदलने की आवश्यकता है

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

ये सेटिंग क्यों?

इस तरह mysql को पुनरारंभ करें

service mysql restart --innodb-doublewrite=0

यह InnoDB Double Write Buffer को निष्क्रिय करता है

अपना डेटा आयात करें। जब किया, mysql को सामान्य रूप से पुनरारंभ करें

service mysql restart

यह InnoDB Double Write Buffer को नया बनाता है

कोशिश करो !!!

ध्यान दें: आपको नवीनतम सुरक्षा पैच के लिए 5.6.21 पर अपग्रेड करना चाहिए


मैं एक linux bash स्क्रिप्ट इसके लिए बनाया है, कम स्मृति के साथ आवारा अंदर काम करने के लिए कुछ मान उतारा gist.github.com/OZZlE/57d550c3cc1c1ff17481e465e4f6d674
Ozzie

9

क्या आपको वास्तव में पूरे डेटाबेस को पुनर्स्थापित करने की आवश्यकता है? यदि आप नहीं, मेरे 2c:

आप "चंक्स" पर अपनी पुनर्स्थापना करने के लिए विशिष्ट तालिकाओं को निकाल सकते हैं। कुछ इस तरह:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

मैंने इसे एक बार किया था और मुझे जिस तालिका की आवश्यकता थी उसे निकालने में 10 मिनट का समय लगा - मेरा पूर्ण पुनर्स्थापना 13 ~ 14 घंटे लगा, जिसमें 35GB (gziped) डंप था।

/pattern/,/pattern/pसाथ -nउन्हें सहित - पैरामीटर "पैटर्न के बीच" एक टुकड़ा बना देता है।

वैसे भी, 35GB को पुनर्स्थापित करने के लिए मैंने AWS EC2 मशीन (c3.8xlarge) का उपयोग किया, Percona को yum (Centos) के माध्यम से स्थापित किया और निम्नलिखित लाइनों को बस जोड़ा / बदल दिया my.cnf:

max_allowed_packet=256M
wait_timeout=30000

मुझे लगता है कि संख्या बहुत अधिक है, लेकिन मेरे सेटअप के लिए काम किया है।


5

अपने डेटाबेस को आयात करने का सबसे तेज़ तरीका है, यदि (या तो .mm, .MYD, .MYI) फ़ाइलों की प्रतिलिपि बनाई जाए तो MyISAM, सीधे / var / lib / mysql / "डेटाबेस नाम" के लिए।

अन्यथा आप कोशिश कर सकते हैं: mysql > use database_name; \. /path/to/file.sql

अपने डेटा को आयात करने का एक और तरीका।


1

आयात को गति देने में मदद करने का एक तरीका आयात करते समय तालिका को लॉक करना है। mysqldump को --add-locks विकल्प का उपयोग करें।

mysqldump --add-drop-table --add-locks --database db > db.sql

या आप के साथ कुछ उपयोगी मानकों के आधार पर बदल सकता है --opt इस डंप के लिए उपयोगी चीजों की एक गुच्छा पर बदल जाता है।

mysqldump --opt --database db > db.sql

यदि आपके पास सर्वर पर एक और स्टोरेज डिवाइस है तो उसका उपयोग करें - एक डिवाइस से दूसरे डिवाइस पर कॉपी करना ट्रांसफर को गति देने का एक तरीका है।

आप उन टेबल को भी फ़िल्टर कर सकते हैं जिनकी आवश्यकता --ignore-table के साथ नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.