अलग नाम के साथ mysql डेटाबेस को पुनर्स्थापित करें


41

हम mysqldump फ़ाइल से अलग नाम के साथ mysql डेटाबेस को कैसे पुनर्स्थापित कर सकते हैं। मैं डंप फ़ाइल खोलना और उसे संपादित नहीं करना चाहता। कोई अन्य बेहतर तरीके?

जवाबों:


58

आप mysqldump को इस तरह से डंप बनाने दे सकते हैं कि वह डेटाबेस नहीं बनाता है या चयन नहीं करता है।

उदाहरण: आप डेटाबेस db1 को डंप कर रहे हैं और इसे डेटाबेस db2 में लोड कर रहे हैं

यह डंप में क्रीएट डबस्ट और यूएसई कमांड में डाल दिया जाएगा

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

यह ड्रेड में क्रीएट डबस्ट और यूएसई कमांड में नहीं डाला जाएगा ( यह वही है जो आप चाहते हैं )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

आप इसे चार (4) तरीकों में से किसी एक डेटाबेस (जैसे db2) में लोड कर सकते हैं:

विकल्प 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

विकल्प 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

विकल्प 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

विकल्प 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

कोशिश तो करो !!!


यदि कोई अन्य व्यक्ति इससे -Ddb2जूझता है, तो उसके सामने एक हाइफ़न नहीं होना चाहिए। जब मैंने इसे शामिल किया, तो कम से कम, मुझे एक MySQL सिंटैक्स त्रुटि मिली।
gwg

यह काम नहीं लगता है। मेरे डंप में कोई क्रिएट या यूएसई डेटाबेस नहीं है, लेकिन इसमें अभी भी ALTER DATABASE ... CHARACTER SET ...यह है जो मेरे आयात को तोड़ रहा है। संपादित करें: ओरेकल मूल रूप से बग की अनदेखी कर रहा है
०18:४५ पर एमपीएन

5

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

mysqldump MYDATABASE > mydump.sql

फिर पुराने डेटाबेस नाम को इस तरह से नए के साथ बदलने के लिए sed का उपयोग करें

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

तब आप बस नया डेटाबेस बना सकते हैं और इसे फिर से आयात कर सकते हैं, और यह नए डेटाबाई MYNEWDABA 'के साथ सभी तालिकाओं का निर्माण करेगा।

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

संपादित करें: जैसे टिप्पणी अनुभाग में कुछ अच्छे लोगों ने इंगित किया है, यह खतरनाक हो सकता है, यदि कुछ डेटा को इसके ऊपर भी बदल दिया जाता है, इसलिए, इससे बचने के तरीकों को बदलना है।

1) डंप में इसे बदलने के लिए, इससे पहले कि आप इसे बदल दें।

cat mydump.sql | grep "MYDATABASE"

तथा

2) हम इसे इस तरह से सुरक्षित बनाने के लिए कुछ `जोड़ सकते हैं:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

अगर किसी और के पास ठोस सुझाव हैं, तो मुझे अपने जवाब को एक और 4 वर्षों में संपादित करने में खुशी होगी।


मुझे लगता है कि सवाल एक एनिट्रे डेटाबेस को बहाल करने के बारे में था, लेकिन एक अलग नाम के साथ, एक मौजूदा डीबी के भीतर सिर्फ एक टेबल की नकल नहीं।
माइकल ग्रीन

3
sed भाग की आवश्यकता है
स्टीव बुज़ोनास

10
यह आदेश एक बुरा विचार है और अगर मैं कर सकता हूं तो मैं वोट डालूंगा। अगर आप स्ट्रिंग रिप्लेसमेंट के लिए जा रहे हैं, तो कम से कम लाइन क्रिएट टेबल और USE से मिलान करें ताकि आप किसी अन्य डेटा को न बदलें।
भिक्षुणी

1
sed कमांड चलाने से पहले ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) MYDATABASE की सभी घटनाओं की जांच करके cat mydump.sql | grep "MYDATABASE"सुनिश्चित करें कि केवल डेटाबेस का नाम बदला गया है, अन्य डेटा अछूता नहीं है।
रफाफ तहसीन

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # संभावित सुरक्षित भाप संपादित करें। मेरे डेटाबेस डंप में कोई USE या CREAT DATABASE स्टेटमेंट नहीं है, लेकिन db नाम sql टिप्पणियों, विचारों और ट्रिगर्स (MySQL 5.7) में है। यह टिप्पणियों में डेटाबेस का नाम नहीं बदलता है, लेकिन परिणामस्वरूप डेटाबेस पर उनका कोई प्रभाव नहीं पड़ता है। इसने मेरे लिए अच्छा काम किया।
जोनाथन

3

मैंने यह एक बार किया है, बहुत समय पहले।

जब आप अपने सभी डेटा को निर्यात करते हैं, तो फ़ाइल के भीग में डेटाबेस का नाम सेट करने का एक विकल्प होता है, कुछ इस प्रकार है: "डेटाबेस का उपयोग करें" 1

तो, आप इस घोषणा को बदल सकते हैं।


3

क्या आप हाथ में है, तो फ़ाइल है और आप एक खोल / कंसोल से यह जोड़ तोड़ कर रहे हैं, मैं का प्रयोग करेंगे sedके साथ शुरू तर्ज पर स्ट्रिंग प्रतिस्थापन करने के लिए CREATE DABATASE, CREATE TABLE, USEऔर optionnally --(mysqldump टिप्पणियाँ)

डेटाबेस बनाएँ, तालिका बनाएँ, उपयोग करें और mysqldump टिप्पणियों से मेल खाता लाइनों पर db नाम को प्रतिस्थापित करना

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


बेशक कई जवाबों की तरह यहाँ उल्लेख किया गया है, यह आसान है अगर mysqldump बैकअप में कोई सृजन तिथि और उपयोग रेखा नहीं होती। मतलब विकल्प --all-databases, --databasesया उनके छोटे संस्करण -Aया -Bउपयोग नहीं किए गए थे।


MySQL 5.7 में, mysqldump में ट्रिगर्स और दृश्यों में डेटाबेस का नाम भी शामिल है, यहां तक ​​कि या इसके --no-create-dbबिना भी । --database--databases
जोनाथन

2

यदि आप निम्नलिखित दो नियमों का उपयोग कर एक डंप करते हैं:

  1. जैसे विकल्पों का उपयोग न करें --databases, --databaseऔर बस सिर्फ इन विकल्पों के बिना आदेश के अंत में डेटाबेस नाम डाल दिया।
  2. विकल्प शामिल करें --no-create-db

यदि आप निम्नलिखित करते हैं तो mysqldump डेटाबेस को संदर्भित किए बिना SQL बनाएगा, तो आप आयात के दौरान अपने mysql कमांड के अंत में नए डेटाबेस नाम का उपयोग कर सकते हैं!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

MySQL 5.7 में, mysqldump में ट्रिगर्स और दृश्यों में डेटाबेस का नाम शामिल है, यहां तक ​​कि या इसके --no-create-dbबिना भी । --database--databases
जोनाथन

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