मैं MySQL डेटा निर्देशिका को कैसे स्थानांतरित करूं?


57

मैं अपने MySQL डेटाबेस की डेटा डायरेक्टरी को एक दूसरी डिस्क सरणी पर ले जाने की कोशिश कर रहा हूं, जो मेरे पास एक आरोह बिंदु के रूप में है /array2/

मेरे पास जो समस्या है वह यह है कि मैंने सब कुछ करने की कोशिश की है और मेरे द्वारा my.cqf में डेटादिर के स्थान को संशोधित करने के बाद फिर से शुरू नहीं होगा।

मुझे बस यही मिलेगा:

start: Job failed to start

जवाबों:


62

ऐप कवच के बारे में भूल गए।

किसी के लिए भी दिलचस्पी है कि मैंने फ़ोल्डर को स्थानांतरित करने के लिए निम्न कार्य किया।

Mysql सर्वर बंद करें:

stop mysql

नई निर्देशिका बनाएँ:

mkdir /array2/mysql

केवल डेटाबेस फ़ोल्डरों पर कॉपी करें:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

my.cnfफ़ाइल का बैकअप लें :

cp /etc/mysql/my.cnf /root/my.cnf.backup

my.cnfफ़ाइल संपादित करें :

nano /etc/mysql/my.cnf

पुराने डेटादिर और सॉकेट के सभी उल्लेखों को अपने नए स्थान पर बदलें

मेरा बन गया:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

निर्देशिका अनुमतियां अपडेट करें:

chown -R mysql:mysql /array2/mysql

पुरानी निर्देशिका का नाम बदलें:

mv /var/lib/mysql /var/lib/mysql-old

सिर्फ़ एक सिमिलिंक बनाएं, बस:

ln -s /array2/mysql /var/lib/mysql 

बता दें कि AppArmor ने नई डेटादिर के बारे में बताया:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

ऐपमोरर प्रोफाइल को पुनः लोड करें

sudo /etc/init.d/apparmor reload

फिर शुरू करें mysql:

start mysql

यह एक अच्छा जवाब है, लेकिन आपको ग्राहकों को mysql से जुड़ने की अनुमति देने के लिए एक और कदम की आवश्यकता हो सकती है। इसके अंतर्गत एक पंक्ति के साथ एक नया समूह जोड़ें ... [क्लाइंट] सॉकेट = / array2 / mysql / mysql.sock जहां सॉकेट = भाग आपकी mysql.sock फ़ाइल के नए स्थान पर इंगित करता है।
नाइट उल्लू

1
आप मर्ज करना परेशान होना नहीं चाहते, तो /etc/apparmor.d/usr.sbin.mysqldहर बार mysql एक अद्यतन प्राप्त करता है, आप जोड़ सकते हैं /array2/mysql/** rwk,करने के लिए /etc/apparmor.d/local/usr.sbin.mysqldके बजाय। मैसकल के पास अभी भी पुराने डेटा की पहुंच होगी, लेकिन शायद यह कोई मुद्दा नहीं है।
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf। केवल डेटाबेस फ़ोल्डर क्यों?
int_ua

ZFS (जैसे मैंने किया) के लिए अपने डेटादिर को स्थानांतरित करने वाले किसी के लिए, सुनिश्चित करें कि आप भी जोड़ते हैं: आपकी फ़ाइल innodb_use_native_aio=0के [mysqld]अनुभाग में my.cnf, क्योंकि लिनक्स पर ZFS AIO का समर्थन नहीं करता है। dev.mysql.com/doc/refman/5.5/en/…
एंड्रयू

23

मैंने पाया कि AppArmor की जांच करके अपराधी था syslog, और mysqlइस प्रक्रिया का पालन करके डेटा स्थान को सफलतापूर्वक बदलने में सक्षम था ।

कृपया ध्यान दें कि, नीचे दी गई फाइलों में, शुरू की गई लाइनों +को जोड़ा गया था, और शुरू होने वाली लाइनों -को हटा दिया गया था। +इन फ़ाइलों में लाइनें जोड़ते समय आपको वास्तव में संकेतों को टाइप / पेस्ट नहीं करना चाहिए ।

मैंने mysqlनिर्देशिका को नए स्थान पर क्लोन किया :

sudo rsync -av /var/lib/mysql /new_dir

फिर मैंने datadirलाइन को इसमें संपादित किया /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

फिर मैंने संपादित किया /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

फिर मैं फिर से शुरू हुआ mysql


13

जागरूक रहें।

यदि आपके पास InnoDB टेबल है, तो आप पर ibdata*और ib_logfile*फ़ाइलों पर प्रतिलिपि बनाना होगा या आप तालिकाओं का उपयोग नहीं कर पाएंगे। आपको मिल जायेगा:

'तालिका' डेटाबेस 'NameNable.tame' मौजूद नहीं है '

त्रुटियों।

फ़ाइलों ibdata*और ib_logfile*फ़ाइलों की प्रतिलिपि बनाने के लिए इस प्रतिलिपि आदेश को चलाएँ ।

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

यह एक टिप्पणी होनी चाहिए, यह एक पूर्ण उत्तर नहीं है
पोस्टडैमगा 3

4

मैंने सिर्फ एक और तरीका आजमाया है, जो कुछ उपयोगी हो सकता है:

अनुमतियों के साथ प्रतिलिपि बरकरार:

rsync -avzh /var/lib/mysql /path/to/new/place

बैक अप (मामले में कुछ गलत होने पर):

mv /var/lib/mysql /var/lib/_mysql

पुराने के स्थान पर एक नई खाली निर्देशिका बनाएं:

mkdir /var/lib/mysql

पुराने के लिए नए स्थान को बांधें:

mount -B /path/to/new/place /var/lib/mysql

आशा है कि किसी की मदद करता है, क्योंकि सहानुभूति मेरे लिए काम नहीं करती थी, और यह सबसे सरल तरीका था


3

यदि आप अपना डेटाडिर स्थानांतरित करते हैं, तो आपको न केवल नई डेटाडिर अनुमति देने की आवश्यकता है, बल्कि आपको यह सुनिश्चित करने की आवश्यकता है कि सभी मूल निर्देशिकाओं की अनुमति है।

मैंने अपने डेटाडिर को एक हार्ड ड्राइव में स्थानांतरित किया, जो उबंटू में घुड़सवार था:

/media/*user*/Data/

और मेरा डेटाडायर डेटाबेस था ।

मुझे मीडिया, उपयोगकर्ता और डेटा निर्देशिकाओं में से प्रत्येक के लिए 771 की अनुमति निर्धारित करनी थी :

sudo chmod 771 *DIR*

यदि यह काम नहीं करता है, तो आप mysql को काम करने का दूसरा तरीका उपयोगकर्ता को /etc/mysql/my.cnf में रूट में बदल सकते हैं; हालांकि सुरक्षा के नजरिए से ऐसा करने में कुछ समस्याएँ नहीं हैं।


2

मैं बाइंड विकल्प के साथ माउंट का उपयोग करना पसंद करता हूं, इसलिए मैं अप्पर्मोर और मैसकल कॉन्फ़िगरेशन में किसी भी अन्य परिवर्तन से बचता हूं।


उदाहरण के लिए:

मान लीजिए कि मैं सब कुछ अंदर ले जाना चाहता हूं /var/www। आइए कहते हैं कि यह डायर मेरा देव वातावरण है और यह एक अलग विभाजन में आरोहित है

  1. पहले हमें mysql को रोकना होगा :

    sudo systemctl stop mysql.service
    
  2. हम फ़ाइलें स्थानांतरित करते हैं (अनुमति को संरक्षित करते हुए)

    sudo rsync -av /var/lib/mysql /var/www
    

    यह /var/www/mysql/सभी सामग्री के साथ एक निर्देशिका उत्पन्न करेगा ।

  3. हम पुरानी निर्देशिका में सब कुछ हटा देते हैं:

    sudo rm -r /var/lib/mysql/*
    
  4. हम bindपुरानी निर्देशिका में विकल्प के साथ नई निर्देशिका को माउंट करते हैं । इस पंक्ति को
    संपादित करें /etc/fstabऔर जोड़ें:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    यह /var/www/mysqlहमारे खाली डायर में आरोहित करेगा /var/lib/mysql
    bindयहां विकल्प जादू करता है, यह mysql और apparmor के लिए इतनी /var/lib/mysqlकी सामग्री के साथ आबाद /var/www/mysqlहोगा यह ऐसा होगा जैसे कुछ भी नहीं बदला है।

  5. अब हम माउंट करते हैं:

    sudo mount -a
    

    और mysql को पुनरारंभ करें।


0

आपको लगता है कि अगर आप स्वीकार किए गए उत्तर से आज्ञाओं का पालन करते हैं तो यह विफल हो जाएगा?

cp -R / var / lib / mysql / array2 / mysql

/ Var / lib / mysql को / array2 / mysql / mysql पर कॉपी करेगा।

जब आप अपनी कॉन्फ़िगरेशन फ़ाइल सेट करते हैं तो आप बेहतर रूप से / array2 / mysql / mysql में निर्देशिका के रूप में डालते हैं अन्यथा आपका mysqld प्रारंभ करने में विफल होगा।

बेहतर कॉपी कमांड होंगे:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

मेरी तुच्छ राय में।

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