2010-11-15 5 views
11

मेरी MySQL स्थापना में मेरे पास एक InnoDB डेटाबेस है जो मुझे पता है कि बहुत बड़ा हो जाएगा इसलिए मैंने इसे अपनी डिस्क पर ले जाने का निर्णय लिया है। मैं फ़ाइलों को दूसरी डिस्क पर ले जाकर ऐसा करने की उम्मीद कर रहा था और फिर एक सिम्लिंक बनाउंगा लेकिन मैं त्रुटियों में भाग लेता हूं!ड्राइव को अलग करने के लिए MySQL InnoDB डेटाबेस को स्थानांतरित करना

यह मैं क्या किया है:

1) my.cnf में मैं

[mysqld] innodb_file_per_table

(यह काम करता है मैं .frm प्रति एक .ibd में है निर्धारित किया है डेटाबेस फ़ोल्डर।)

2) के साथ मैं SHOW VARIABLES LIKE "have_symlink";

(मैं दस्तावेज है कि अगर सिमलिंक ठीक हैं जाँच कर ली है आयन कहते हैं:

सिम्लिंक पूरी तरह से MyISAM तालिकाओं के लिए पूरी तरह से समर्थित हैं। अन्य स्टोरेज इंजनों के लिए टेबल द्वारा उपयोग की जाने वाली फ़ाइलों के लिए, आपको प्रतीकात्मक लिंक का उपयोग करने का प्रयास करने में अजीब समस्याएं हो सकती हैं।

लेकिन मैं विदेशी कुंजी की आवश्यकता है ...)

3) मैं डेटाबेस फ़ोल्डर में ले जाया गया है और एक सिमलिंक बनाया।

4) को पुनः आरंभ mysql और करने की कोशिश की:

mysql> USE db_name 
Database changed 
mysql> SHOW TABLES; 
ERROR 1018 (HY000): Can't read dir of './db_name/' (errno: 13) 
mysql> exit 
[email protected]# perror 13 
OS error code 13: Permission denied 

सिमलिंक है (के रूप में उम्मीद) lrwxrwxrwx mysql mysql db_name -> /path-to/db_name/

डेटाबेस फ़ोल्डर अनुमतियाँ drwx------ mysql mysql

हैं सभी फाइल अनुमति -rw-rw---- mysql mysql

मैं उपयोग कर रहा हूँ कर रहे हैं MySQL 5.1.41 के साथ उबंटू 10.04 सर्वर (एपीटी से डिफ़ॉल्ट)।

क्या आपने इनमें से कोई भी सफलतापूर्वक किया है?

+0

MySQLldump लेने और फिर स्कीमा परिवर्तन कॉन्फ़िगरेशन ड्रॉप करने और इसे आयात करने का सबसे आसान तरीका है, यदि आपका डीबी वास्तव में बड़ा नहीं है। – vinothkr

+0

मैं शेष डिस्क को सिस्टम डिस्क (ड्रूपल और ऐसी चीजों के लिए) पर रखना चाहता हूं और केवल इस विशिष्ट को डेटा निर्देशिका से बाहर ले जाना चाहता हूं। क्षमा करें अगर यह सवाल से स्पष्ट नहीं था। – Norling

+0

यह http://serverfault.com/ के लिए अधिक उपयुक्त हो सकता है - इसे माइग्रेट करने के लिए मतदान ... – richsage

उत्तर

16

यह काम करता है लेकिन मेरे पुराने दुश्मन ऐपअर्मर ने MySQL को स्थानांतरित निर्देशिका को पढ़ने से अवरुद्ध कर दिया है।

sudo nano /etc/apparmor.d/usr.sbin.mysqld 

ऐड लाइनों:

/new-db-path/ r, 
/new-db-path/** rwk, 

की मदद के लिए धन्यवाद!

+0

पर'/डेटाबेस/new_database' माउंट करें डेटाबेस को स्थानांतरित करने और इसे प्रतीकात्मक लिंक के साथ बदलने के बाद उबंटू 12.04 पर एक ही समस्या। जैसा कि आप सुझाव देते हैं AppArmor प्रोफ़ाइल को संपादित करना। धन्यवाद! –

+0

धन्यवाद। यह मेरा समाधान भी था। – Yada

+0

धन्यवाद! उबंटू 12.10 पर इस –

10

नोर्लिंग जूनियर निकल रहा टिप के साथ मेरा दिन बचाया, लेकिन यह विन्यस्त करने के बाद से मैं कुछ परेशानी थी , मैं एक और विस्तृत उत्तर लिख रहा हूँ। मैं उबंटू 12.04 का उपयोग कर रहा हूँ।

प्रारंभ सब टाइप करने के लिए है कि sudos जरूरत को बचाने के लिए जड़ बनता जा रहा:

mv /var/lib/mysql/yourdatabase /new/path/ 

यहाँ था:

sudo su - 

MySQL docs के बाद, आप पहली बार अपने पहले से बनाए डेटाबेस dir एक और पथ पर ले जाने के मेरा पहला जाल चेक mysql उपयोगकर्ता इस नए मार्ग की पहुंच है यदि:

sudo -u mysql ls /new/path/yourdatabase 

आप मिल गया तो पहुँच से मना, तो आप शायद देना चाहिए हर माता पिता निर्देशिका के लिए अनुमति निष्पादित करें: फिर से फ़ाइल तक पहुँचने का

chmod a+x /new /new/path/ 

टेस्ट।

ln -s /new/path/yourdatabase /var/lib/mysql/ 
chown mysql:mysql /var/lib/mysql/yourdatabase 

आइए संपादित AppArmor स्थानीय विन्यास फाइल: यह अभी भी काम नहीं करता है, नए dir स्थान स्टैक ओवरफ़्लो में एक प्रश्न पूछ :-)

लिंक कोशिश करते हैं और यह सही नियंत्रण दिया जाएगा। आपने /etc/apparmor.d/usr.sbin.mysqld फ़ाइल को shoudn't नहीं बदला है। स्थानीय conf संपादित करें ताकि आप इसे सिस्टम अपडेट के बाद ढीला नहीं होगा:

emacs /etc/apparmor.d/local/usr.sbin.mysqld 

जोड़ने नोर्लिंग जूनियर विन्यास:

/new/path/yourdatabase/ r, 
/new/path/yourdatabase/** rwk, 

पिछले अल्पविराम न चूकें। फ़ाइल सहेजें और निकल रहा विन्यास को फिर से लोड:

apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld 

यह सिर्फ निकल रहा MySql विन्यास को फिर से लोड नहीं होगा, लेकिन यह भी परीक्षण अगर कोई सिंटैक्स त्रुटि (एक बहुत ही महत्वपूर्ण बात यह है) नहीं है। यदि आप पार्सर नहीं चलाते हैं, तो नया conf लागू नहीं किया जाएगा।

अंत में बस mysql क्लाइंट खोलें और SHOW DATABASES टाइप करें। यदि आपका डेटाबेस प्रकट होता है, तो सब कुछ ठीक है। किसी अन्य चेक के लिए 'अपनाडेटाबेस उपयोग करें' टाइप करें।

एक और मजबूत परीक्षण भी MySQL सेवा को पुनः लोड करेगा: 'सेवा mysql पुनरारंभ करें' और अपने डेटाबेस तक पहुंचने का प्रयास करें।

अब मुझे याद होगा कि अगली बार मुझे ऐसा करने की ज़रूरत है। गूगल और इसलिए एक साथ :-)

+2

यह अविश्वसनीय रूप से सहायक था, धन्यवाद! –

1

दुनिया में सबसे अच्छा नोटबुक हैं यह उपयुक्त अनुमतियों वाले स्थानीय माउंट (बाइंडिंग) का उपयोग करें और (SELinux या एपआर्मर संदर्भों सहित) oprions माउंट करने के लिए संभव हो जाना चाहिए:

/dev/sdc on /var/lib/mysql/my-db/ 
/dev/sdd on /var/lib/mysql/her-db/ 
fs.example.com:/path/to/wherever on /var/lib/mysql/my-other-db/ 

हालांकि मैंने इस समाधान का परीक्षण नहीं किया है इसलिए अपने जोखिम पर उपयोग करें।

+0

मैं इस काम की पुष्टि कर सकता हूं। आपको सिर्फ mysql subdir के लिए एक संपूर्ण विभाजन समर्पित करना है, लेकिन एक बार जब आप ऐसा करते हैं और इसे ठीक से आरोहित करते हैं तो यह बहुत अच्छा काम करता है। – GaryO

संबंधित मुद्दे