मैं जल्दी से एक MySQL डेटाबेस (स्कीमा नाम बदल) का नाम कैसे बदल सकता हूँ?


959

पर MySQL मैनुअल MySQL इस शामिल किया गया।

आमतौर पर मैं सिर्फ डेटाबेस को डंप करता हूं और इसे एक नए नाम के साथ पुन: आयात करता हूं। यह बहुत बड़े डेटाबेस के लिए एक विकल्प नहीं है। जाहिरा तौर पर RENAME {DATABASE | SCHEMA} db_name TO new_db_name; बुरा काम करता है, केवल कुछ मुट्ठी भर संस्करणों में मौजूद है, और कुल मिलाकर एक बुरा विचार है

इसके लिए InnoDB के साथ काम करने की जरूरत है , जो MyISAM की तुलना में चीजों को बहुत अलग तरीके से संग्रहीत करता है ।


3
इसके अलावा सर्वरफॉल्ट पर: serverfault.com/questions/195221/how-to-rename-a-mysql-database
Yves Martin

5
यह कथन RENAME DATABASE सिंटैक्स को MySQL 5.1.7 में जोड़ा गया था, लेकिन यह खतरनाक पाया गया और इसे MySQL 5.1.23 में हटा दिया गया।
जुलैक्टब

11
उम्मीद है कि MySQL एक नया, कार्यशील RENAME DATABASEवक्तव्य लागू करेगा जिसमें कोई खतरा नहीं है, क्योंकि वर्तमान में इस कार्य को करने का कोई आसान तरीका नहीं है। कोई स्पष्ट कारण नहीं है कि यह दस्तावेज में खतरनाक था, इसलिए उन्हें प्रतिस्थापन करने में सक्षम होना चाहिए। कम से कम लोगों ने अपनी वेबसाइट पर फीचर अनुरोध कीड़े डाल दिए हैं। उदाहरण के लिए, bugs.mysql.com/bug.php?id=58593 और bugs.mysql.com/bug.php?id=1698
एडवर्ड

लिंक अब टूट गए हैं ...
Oldboy

जवाबों:


833

के लिए InnoDB , निम्नलिखित काम करने लगता है: नई खाली डाटाबेस बनाने, तो नए डेटाबेस में बारी में प्रत्येक तालिका का नाम बदलने:

RENAME TABLE old_db.table TO new_db.table;

आपको उसके बाद अनुमतियों को समायोजित करने की आवश्यकता होगी।

शेल में स्क्रिप्टिंग के लिए, आप निम्न में से किसी एक का उपयोग कर सकते हैं:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

या

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

टिप्पणियाँ:

  • विकल्प -pऔर पासवर्ड के बीच कोई स्थान नहीं है । यदि आपके डेटाबेस में कोई पासवर्ड नहीं है, तो -u username -ppasswordभाग को हटा दें ।
  • यदि किसी तालिका में एक ट्रिगर है, तो इसे उपरोक्त विधि का उपयोग करके किसी अन्य डेटाबेस में नहीं ले जाया जा सकता (परिणाम में Trigger in wrong schemaत्रुटि होगी )। यदि ऐसा है, तो डेटाबेस को क्लोन करने के लिए पारंपरिक तरीके का उपयोग करें और फिर पुराने को छोड़ दें:

    mysqldump old_db | mysql new_db

  • यदि आपके पास संग्रहीत कार्यविधियाँ हैं, तो आप उन्हें बाद में कॉपी कर सकते हैं:

    mysqldump -R old_db | mysql new_db


26
मैंने अभी 30+ तालिकाओं के साथ एक InnoDB डेटाबेस के साथ ऐसा किया है, file_per_table सेटिंग का उपयोग करते हुए, और भले ही कुछ तालिकाएँ 3+ मिलियन पंक्तियाँ थीं, इसे <1 सेकंड में पूरा किया। यह सिर्फ भंडारण पर फ़ाइलों को स्थानांतरित करने के लिए लगता है, बल्कि और अधिक जटिल कुछ भी करने से ... +2 यदि संभव हो तो :)
डेव रिक्स

87
"RENAME DATABASE को खतरनाक पाया गया और MySQL 5.1.23 में हटा दिया गया" - dev.mysql.com/doc/refman/5.1/en/rename-database.html से
पलानी

13
कृपया ध्यान दें कि यह दृश्यों के लिए काम नहीं करेगा। आप उन्हें डेटाबेस से दूसरे में कूदने के लिए विचारों का नाम नहीं बदल सकते। उपयोग करें DROP VIEWऔर CREATE VIEWइसके बजाय। अनाड़ी, हाँ। आप mysqldumpपहले सभी तालिकाओं को स्थानांतरित करने के बाद, विचारों को स्थानांतरित करने के लिए एक करना चाह सकते हैं । यह भी ध्यान दें कि SHOW TABLESटेबल और दृश्य दिखाएंगे, इसलिए सावधान रहें।
तूउमासालो

9
साथ ही यह ट्रिगर के साथ किसी भी टेबल के लिए काम नहीं करेगा। आपको तालिका को स्थानांतरित करने से पहले ट्रिगर्स को ढूंढना, डंप करना और ड्रॉप करना होगा, फिर डंप किए गए ट्रिगर्स को लक्ष्य डीबी में आयात करना होगा।
ओलेनन

5
अपडेटेड (यानी काम करने वाला) लिंक डॉक्यूमेंटेशन क्यों RENAME DATABASEहटाया गया: dev.mysql.com/worklog/task/?id=4030
एलेक्सिस

443

इन कुछ सरल आदेशों का उपयोग करें:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

या I / O को कम करने के लिए @Pablo Marin-Garcia द्वारा सुझाए गए का उपयोग करें:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

86
जैसा कि ओपी ने कहा, "[t] उसका बहुत बड़े डेटाबेस के लिए कोई विकल्प नहीं है।"
पायलट

3
मूल डेटाबेस DROP को मत भूलना
Pavel Radzivilovsky

3
शानदार जवाब! आगे सुधार करने के लिए सुझावों के जोड़े के रूप में यह संभवतः सभी क्षमताओं द्वारा googled किया जा रहा है: (1) पाब्लो मारिन-गार्सिया के कोड के टुकड़े को शीर्ष पर ले जाएं क्योंकि यह सबसे अच्छा जवाब लगता है (2) हर जगह के -p<password>बजाय रखो -pताकि बयान एक त्वरित दिखने के बिना चलें ।
स्टीव चेम्बर्स

9
पाइप किए गए संस्करण का उपयोग करके मुझे दो "पासवर्ड दर्ज करें:" संकेत मिलता है जैसे: Enter password: Enter password: यह एक पासवर्ड लेने के लिए लगता है, लेकिन दोनों नहीं। क्या मुझे एक डिटेल याद आ रही है?
रयान

33
मुझे आश्चर्य है कि किसी ने भी इसका उल्लेख नहीं किया है, लेकिन आपको वास्तव में --routinesध्वज को mysqldump कमांड में जोड़ना चाहिए , ताकि यह सुनिश्चित हो सके कि संग्रहीत कार्यविधियाँ कॉपी की गई हैं।
कार्लोस पी

205

मुझे लगता है कि समाधान सरल है और कुछ डेवलपर्स द्वारा सुझाया गया था। phpMyAdmin के पास इसके लिए एक ऑपरेशन है।

PhpMyAdmin से, उस डेटाबेस का चयन करें जिसे आप चुनना चाहते हैं। टैब में एक ऑपरेशन कहा जाता है, नाम बदलें अनुभाग पर जाएं। बस इतना ही।

यह, जैसा कि कई ने सुझाव दिया है, नए नाम के साथ एक नया डेटाबेस बनाएं, पुराने डेटाबेस के सभी तालिकाओं को नए डेटाबेस में डंप करें और पुराने डेटाबेस को छोड़ दें।

यहां छवि विवरण दर्ज करें


76
यह मानते हुए कि आपके वातावरण पर भी php है या phpmyadmin का उपयोग करें।
क्रिस

26
अगर आपके पास phpMyAdmin है, तो भी बहुत खतरनाक है - दो छोरों को अज्ञात स्थिति में छोड़ कर मध्य प्रक्रिया विफल हो सकती है, या इसमें बहुत लंबा समय लग सकता है, जिससे फ्रंट-एंड हैंगिंग या PHP टाइमिंग बाहर हो जाएगी।
मोज़बज़

20
यह सच है @mozboz, लेकिन मैंने 10 साल के लिए ऐसा किया है और कभी भी यह समस्या नहीं थी। यदि आपकी कमांड एक शेल के माध्यम से चल रही है और आप कंप्यूटर क्रैश करते हैं तो ऐसा ही होता है। एक संभावना है लेकिन क्या? १ से १ क्वाड्रिलियन?
राफे

24
कंसोल के माध्यम से एक स्क्रिप्ट भी एक फ्रंट-एंड है जो समान समस्याओं के साथ लटका सकती है।
ग्रेग

11
फिर भी कंसोल ऑपरेशन PhpMyAdmin की तुलना में कहीं अधिक विश्वसनीय हैं, खासकर जहां बड़े डेटाबेस शामिल हैं, जो ओपी का मामला है। व्यक्तिगत रूप से मैं पीएमए के बजाय किसी भी कंसोल विधि का दृढ़ता से सुझाव दूंगा यदि आपके पास एक बड़ा डेटाबेस है। कहने की जरूरत नहीं कि छोटे डेटाबेस पर पीएमए उतना ही अच्छा है।
तोडोर सैंडू

107

आप अपने स्रोत डेटाबेस में प्रत्येक तालिका को गंतव्य डेटाबेस में स्थानांतरित करने के लिए SQL स्क्रिप्ट उत्पन्न करने के लिए SQL का उपयोग कर सकते हैं।

कमांड से उत्पन्न स्क्रिप्ट को चलाने से पहले आपको गंतव्य डेटाबेस बनाना होगा।

आप इन दोनों लिपियों में से किसी एक का उपयोग कर सकते हैं (मैंने मूल रूप से पूर्व और किसी ने "सुधारने" का उपयोग करने के लिए मेरे उत्तर का सुझाव दिया था GROUP_CONCAT। अपनी पिक ले लो, लेकिन मैं मूल पसंद करता हूं):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

या

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

($ 1 और $ 2 क्रमशः स्रोत और लक्ष्य हैं)

यह एक SQL कमांड उत्पन्न करेगा जिसे आपको फिर चलाना होगा।

ध्यान दें कि GROUP_CONCATएक डिफ़ॉल्ट लंबाई सीमा है जो बड़ी संख्या में तालिकाओं वाले डेटाबेस के लिए पार हो सकती है। आप SET SESSION group_concat_max_len = 100000000;(या कुछ अन्य बड़ी संख्या) चलाकर उस सीमा को बदल सकते हैं ।


@BlakeFrederick यह RENAME DATABASE का उपयोग नहीं करता है तो क्या समस्या है?
tuxayo

क्या यह काम करता है यदि तालिका में संदर्भ संबंधी बाधाएँ हैं? मुझे उम्मीद नहीं है।
dolmen

42

RENAME DATABASEMySQL में गुम कमांड का अनुकरण करना :

  1. एक नया डेटाबेस बनाएँ
  2. इसके साथ नाम बदलें क्वेरी बनाएँ:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. उस आउटपुट को चलाएं

  4. पुराने डेटाबेस को हटाएं

इसे MySQL में इमिंग द मिसिंग रेंडम डेटाबेस कमांड से लिया गया था ।


1
उत्तम! मैंने इसे InnoDB और MyISAM तालिकाओं के साथ परीक्षण किया। सबसे तेज़ समाधान जो मैंने परीक्षण किया (तालिका का नाम बदलना लगभग तुरंत है, कोई देरी नहीं)!
फिलिप

महान! बाद में विशेषाधिकारों को ठीक करने के लिए याद रखें।
एडम फ़ेरना

ps। यदि आप लाइव DB पर काम कर रहे हैं, तो पुनर्नामित प्रश्नों को चलाने से पहले बेहतर करें।
एडम फ्रैना

क्या यह काम करता है यदि तालिका में संदर्भ संबंधी बाधाएँ हैं? मुझे उम्मीद नहीं है।
dolmen

24

तीन विकल्प:

  1. नया डेटाबेस बनाएं, सर्वर को नीचे लाएं, फ़ाइलों को एक डेटाबेस फ़ोल्डर से दूसरे में ले जाएं और सर्वर को पुनरारंभ करें। ध्यान दें कि यह केवल तभी काम करेगा जब आपकी सभी तालिकाएँ MyISAM हों।

  2. नया डेटाबेस बनाएं, क्रिएट टेबल का उपयोग करें ... LIKE स्टेटमेंट्स का उपयोग करें, और फिर INSERT ... का चयन करें * FROM स्टेटमेंट्स से।

  3. Mysqldump का उपयोग करें और उस फ़ाइल के साथ पुनः लोड करें।


+ मायसम संदर्भ के लिए। मैं यह पता नहीं लगा सका कि इसने मेरे लिए काम क्यों नहीं किया।
क्रिश्चियन पायने

5
प्रश्न में कहा गया है कि यह InnoDB के लिए काम करना चाहिए, न कि MyISAM
D-Rock

@ डी-रॉक Google को बताते हैं, जो शीर्षक के आधार पर लोगों को यहां लाता है।
जिगगंजर 15

24

सरल तरीका है

डेटाबेस निर्देशिका में बदलें:

cd /var/lib/mysql/

MySQL को शट डाउन करें ... यह महत्वपूर्ण है!

/etc/init.d/mysql stop

ठीक है, यह तरीका InnoDB या BDB- डेटाबेस के लिए काम नहीं करता है।

डेटाबेस का नाम बदलें:

mv old-name new-name

... या मेज ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

MySQL को पुनरारंभ करें

/etc/init.d/mysql start

किया हुआ...

ठीक है, यह तरीका InnoDB या BDB डेटाबेस के साथ काम नहीं करता है। इस मामले में आपको डेटाबेस को डंप करना होगा और इसे फिर से आयात करना होगा।


16
फ़ोल्डर का नाम बदलने से खिलौने टूट जाते हैं।
विनिकियसपायर

1
@ फिर भी, भले ही प्रति तालिका एक फ़ाइल सेट की गई हो, यह अभी भी खतरनाक है, प्रति तालिका एक फ़ाइल सेट करने से पहले बनाई गई तालिकाएँ मुसीबत में होंगी, जब तक आप यह नहीं जानते कि डेटाबेस उस ध्वज के सेट होने के बाद बना है।
कियान चेन

आम तौर पर बोल रहा हूँ, ज्यादातर लोगों को अपने सिस्टम या तो एक या दूसरे तरीके से जा रहे हैं, लोग बेतरतीब ढंग से फ्लिप फ्लॉप होने जा रहे हैं या नहीं, प्रति फ़ाइल एक टेबल नहीं है या नहीं। इसके अलावा, यहां तक ​​कि आपके परिदृश्य में, अगर झंडे से पहले तालिकाओं का निर्माण किया गया था, तो वे पहले स्थान पर अलग-अलग फ़ाइलों के रूप में मौजूद नहीं होंगे, इसलिए यह कदम काम नहीं करेगा और अभी भी सुरक्षित, कोई खतरा नहीं है। याद रखें, जब कदम चल रहा हो, डेटाबेस नहीं चल रहा हो।
रहली

ओएस एक्स पर होमब्रे के साथ स्थापित mysql के बराबर:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
coberlin

22

आप इस शेल स्क्रिप्ट का उपयोग कर सकते हैं:

संदर्भ: MySQL डेटाबेस का नाम कैसे बदला जाए?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

यह काम कर रहा है:

$ sh rename_database.sh oldname newname

6
इससे सावधान। यदि आप रूट उपयोगकर्ता के साथ लॉग इन नहीं कर रहे हैं, तो आपके पास सीमित अनुमति हो सकती है। असफलता का कारण बनता है, लेकिन ड्रॉप करने के लिए सफल होने के लिए ड्रॉप एक डेटाबेस में जिसके परिणामस्वरूप। अच्छी स्क्रिप्ट है अन्यथा।
लेक्स

3
मैंने set -eस्क्रिप्ट की शुरुआत में जोड़ा , जो विफलता पर समाप्त करने के लिए निष्पादन का कारण बनेगा और उस समस्या को कम करना चाहिए।
मिकेल

19

मैं हाल ही में इसे करने के लिए एक बहुत अच्छा तरीका भर आया हूँ, MyISAM और InnoDB के साथ काम करता है और बहुत तेज़ है:

RENAME TABLE old_db.table TO new_db.table;

मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है लेकिन इसका श्रेय किसी और को नहीं मुझे जाता है।


@ArkadijKuzhel ऐसा नहीं लगता। मुझे लगता है कि आप RENAME DATABASE के बारे में बात कर रहे हैं।
रोब ग्रांट

यह वास्तव में मदद करता है, मैंने एक नया रिक्त डेटाबेस बनाया और फिर कोड का उपयोग किया, सभी तालिकाओं को वांछित नामों के साथ आयात किया गया।
'

3
यह स्वीकार किए गए उत्तर के समान समस्या से ग्रस्त है - "RENAME DATABASE को खतरनाक पाया गया और MySQL 5.1.23 में हटा दिया गया" - dev.mysql.com/doc/refman/5.1/en/rename-database.html से
ब्लेक फ्रेडरिक

16

एक पूरा नाम बदलने का सबसे सरल बुलेट-एंड-फुलप्रूफ तरीका (अंत में पुराने डेटाबेस को छोड़ना भी शामिल है, इसलिए यह एक कॉपी के बजाय एक नाम है) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

कदम:

  1. नोटपैड में लाइनों को कॉपी करें।
  2. अपने समकक्षों के साथ सभी संदर्भों को "पुराने नाम", "न्यूडबनाम", "माइगवर्ड" (+ वैकल्पिक रूप से "रूट") में बदलें।
  3. कमांड लाइन पर एक-एक करके निष्पादित करें (जब संकेत दिया जाए तो "y" दर्ज करें)।

कंसोल में अपना पासवर्ड जोड़ने से बचें क्योंकि यह सुरक्षित नहीं है। यदि आपने ऐसा किया है तो हटाने के लिए पहले से ही इतिहास का उपयोग करें। इसके बजाय पासवर्ड खाली छोड़ दें और प्रॉम्प्ट के बाद इसे दर्ज करें।
टॉमी सी।

यह असामान्य रूप से लंबे समय तक ले रहा है, बिना परिष्करण के 20 मिनट से अधिक। रद्द करना ठीक है?
सिगू मगवा

15

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;

14
विशाल डेटाबेस के लिए उल्लेखनीय नहीं है।
माइक

14

MySQL इस समय अपने कमांड इंटरफेस के माध्यम से डेटाबेस के नाम बदलने का समर्थन नहीं करता है, लेकिन आप डेटाबेस का नाम बदल सकते हैं यदि आपके पास उस निर्देशिका तक पहुंच है जिसमें MySQL अपने डेटाबेस को संग्रहीत करता है। डिफ़ॉल्ट MySQL स्थापनाओं के लिए यह आमतौर पर उस निर्देशिका के अंतर्गत डेटा निर्देशिका में होता है जहाँ MySQL स्थापित किया गया था। उस डेटाबेस का नाम पता लगाएँ जिसे आप डेटा निर्देशिका के तहत नाम बदलना चाहते हैं और उसका नाम बदलें। निर्देशिका का नाम बदलने से कुछ अनुमतियाँ समस्याएँ हो सकती हैं। जागरूक रहें।

नोट: डेटाबेस का नाम बदलने से पहले आपको MySQL को बंद कर देना चाहिए

मैं एक नया डेटाबेस बनाने की सलाह दूंगा (आप चाहते हैं नाम का उपयोग करके) और पुराने से नए डेटा की आवश्यकता / निर्यात करें। बहुत साधारण।


13

जब आप PHPMyAdmin में एक डेटाबेस का नाम बदलते हैं तो यह एक डंप बनाता है, फिर नए नाम के साथ डेटाबेस को ड्राप और फिर से बनाता है।


4
ध्यान दें कि यह सुविधा "ऑपरेशन" टैब के तहत थोड़ी सी छिपी हुई है, जब आप डेटाबेस पर क्लिक करते हैं।
मारिस बी।

13

वैसे 2 विधियाँ हैं:

विधि 1: डेटाबेस स्कीमा का नाम बदलने के लिए एक अच्छी तरह से जाना जाने वाला तरीका है स्कीमा को मैसकल्म्प का उपयोग करके और दूसरे स्कीमा में पुनर्स्थापित करना, और फिर पुराने स्कीमा को छोड़ देना (यदि आवश्यक हो)।

शैल से

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

यद्यपि उपरोक्त विधि आसान है, यह समय और स्थान लेने वाली है। यदि स्कीमा 100GB से अधिक हो तो क्या होगा ?ऐसे तरीके हैं जहां आप अंतरिक्ष पर सहेजने के लिए उपरोक्त आदेशों को एक साथ पाइप कर सकते हैं, हालांकि यह समय नहीं बचाएगा।

ऐसी स्थितियों को मापने के लिए, स्कीमा का नाम बदलने का एक और त्वरित तरीका है, हालांकि, इसे करते समय कुछ ध्यान रखना चाहिए।

विधि 2: MySQL में टेबल्स का नाम बदलने के लिए एक बहुत अच्छी सुविधा है जो विभिन्न स्कीमाओं में भी काम करती है। यह नाम बदलने का कार्य परमाणु है और कोई अन्य व्यक्ति तालिका का उपयोग नहीं कर सकता है जबकि इसका नाम बदला जा रहा है। तालिका का नाम बदलने के बाद से इसे पूरा करने में थोड़ा समय लगता है या इसका स्कीमा केवल मेटाडेटा परिवर्तन है। नाम बदलने के लिए प्रक्रियात्मक दृष्टिकोण यहां दिया गया है:

वांछित नाम के साथ नया डेटाबेस स्कीमा बनाएं। MySQL के "RENAME TABLE" कमांड का उपयोग करके पुराने स्कीमा से नए स्कीमा में तालिकाओं का नाम बदलें। पुराना डेटाबेस स्कीमा छोड़ें। If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too। यदि मेज पर ट्रिगर मौजूद हैं तो MySQL का “RENAME TABLE” विफल हो जाता है। इसे मापने के लिए हम निम्नलिखित बातें कर सकते हैं:

1) Dump the triggers, events and stored routines in a separate file. यह -s -R झंडे (-d -d के अलावा जो ट्रिगर चलाता है) को mysqldump कमांड में उपयोग करता है। एक बार ट्रिगर्स डंप होने के बाद, हमें RENAME TABLE कमांड को काम करने के लिए स्कीमा से उन्हें छोड़ना होगा।

 $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) केवल "आधार" तालिकाओं की एक सूची तैयार करें। इन्हें information_schema.TABLESटेबल पर एक क्वेरी का उपयोग करके पाया जा सकता है ।

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) आउट फाइल में विचार डंप करें। उसी information_schema.TABLESतालिका पर क्वेरी का उपयोग करके दृश्य देखे जा सकते हैं ।

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2>  > views.out

4) पुराने ताल में मौजूदा तालिकाओं पर ट्रिगर छोड़ें।

mysql> DROP TRIGGER <trigger_name>;
...

5) एक बार उपरोक्त डंप फ़ाइलों को पुनर्स्थापित करें, चरण # 2 में पाए गए सभी "आधार" तालिकाओं का नाम बदला गया है।

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

उपरोक्त तरीकों से पेचीदगियां: हमें उपयोगकर्ताओं के लिए GRANTS को अपडेट करने की आवश्यकता हो सकती है जैसे कि वे सही स्कीमा_नाम से मेल खाते हों। ये mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db तालिकाओं पर पुराने_काँटा नाम को new_schema को अपडेट करने और "फ्लश विशेषाधिकारों" को कॉल करने के लिए एक सरल अद्यतन के साथ तय किया जा सकता है; यद्यपि "विधि 2“ "विधि 1 method की तुलना में थोड़ी अधिक जटिल लगती है, यह पूरी तरह से स्क्रिप्ट योग्य है। उपरोक्त चरणों को उचित अनुक्रम में करने के लिए एक सरल बैश स्क्रिप्ट, अगली बार डेटाबेस स्कीमा का नाम बदलने के दौरान आपको स्थान और समय बचाने में मदद कर सकती है।

पर्कोना रिमोट डीबीए टीम ने "rename_db" नामक एक स्क्रिप्ट लिखी है जो निम्नलिखित तरीके से काम करती है:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

इस स्क्रिप्ट के उपयोग को प्रदर्शित करने के लिए, एक नमूना स्कीमा "एम्प" का उपयोग किया, परीक्षण ट्रिगर्स बनाया, उस स्कीमा पर संग्रहीत दिनचर्या। स्क्रिप्ट का उपयोग करते हुए डेटाबेस स्कीमा का नाम बदलने की कोशिश करेंगे, जो डंप / पुनर्स्थापना विधि के समय के विपरीत पूरा करने के लिए कुछ सेकंड लेता है।

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

जैसा कि आप उपरोक्त आउटपुट में देख सकते हैं कि डेटाबेस स्कीमा "एंपायर" का नाम बदलकर एक सेकंड से भी कम समय में "एम्प_टेस्ट" कर दिया गया था। अन्त में, यह पेरकोना की पटकथा है जिसका उपयोग "विधि 2" के लिए ऊपर किया गया है।

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

संदर्भ संबंधी बाधाओं के बारे में क्या?
dolmen

13

कदम :

  1. हिट http: // लोकलहोस्ट / phpmyadmin /
  2. अपना DB चुनें
  3. ऑपरेशंस टैब पर क्लिक करें
  4. "डेटाबेस का नाम बदलें" के रूप में एक टैब होगा। नया नाम जोड़ें और विशेषाधिकारों को समायोजित करें।
  5. Go पर क्लिक करे।

यहां छवि विवरण दर्ज करें


1
एक phpMyAdmin समाधान आमतौर पर एक खराब समाधान है क्योंकि कुछ वातावरण में पर्यावरण प्रतिबंधित है।
डेनियल एंट्यून्स पिंटो

"अच्छा" समाधान नहीं है, लेकिन धन्यवाद कोई भी कम नहीं है जैसा कि मैं देख रहा था।
जैमी

1
कृपया वोट करें अगर यह आपके लिए काम करता है .. तो इससे मदद मिलेगी .. धन्यवाद
शुभम जैन

1
यह मेरे लिए काम करता है, phpMyAdmin वातावरण में, +1
विलियम

12

जो मैक उपयोगकर्ता हैं, उनके लिए सीक्वल प्रो में डेटाबेस मेनू में एक नाम डेटाबेस विकल्प है। http://www.sequelpro.com/


5
यदि आपके डेटाबेस में कोई दृश्य या ट्रिगर है तो इस विकल्प से सावधान रहें। इस मेनू विकल्प के पीछे एक स्क्रिप्ट है जो एक नया डेटाबेस बनाएगी और सभी तालिकाओं को स्थानांतरित करेगी। यह दृश्य या ट्रिगर के लिए काम नहीं करेगा, इसलिए वे आपके पुराने डेटाबेस में पीछे रह जाएंगे। परिणाम फिक्सिंग की जरूरत में दो टूट डेटाबेस है।
ओल्फान

10

यहां अधिकांश उत्तर दो कारणों में से एक के लिए गलत हैं:

  1. आप सिर्फ RENAME TABLE का उपयोग नहीं कर सकते, क्योंकि इसमें व्यू और ट्रिगर हो सकते हैं। यदि ट्रिगर होते हैं, तो RENAME TABLE विफल हो जाता है
  2. आप mysqldump का उपयोग नहीं कर सकते हैं यदि आप "जल्दी" करना चाहते हैं (जैसा कि प्रश्न में अनुरोध किया गया है) एक बड़े डेटाबेस का नाम बदलें

Percona के पास ब्लॉग पोस्ट है कि यह कैसे करना है: https://www.percona.com/blog/2013/12/12/24/renaming-database-schema-mysql/

और साइमन आर जोन्स द्वारा पोस्ट की गई (बनाई गई?) जो उस पोस्ट में सुझाई गई है। मैंने स्क्रिप्ट में पाया एक बग तय किया। आप इसे यहां देख सकते हैं:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

इसकी एक प्रति इस प्रकार है:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

इसे नामक एक फ़ाइल में सहेजें rename_dbऔर स्क्रिप्ट को निष्पादन योग्य बना दें और chmod +x rename_dbफिर इसका उपयोग करें./rename_db localhost old_db new_db


मुझे यह स्क्रिप्ट पसंद है, यह लगभग सार्वभौमिक है। हालांकि यह एक मामले को संसाधित करने में विफल रहा जब कई जंजीर दृश्य हैं जहां निश्चित जड़ नहीं है।
इंदरजीत

9

एक पूर्ण डंप और पुनर्स्थापना किए बिना डेटाबेस के भीतर सभी तालिकाओं को फिर से नाम देना संभव है।

DROP प्रक्रिया यदि Isql.rename_db से बाहर निकलती है;
DELIMITER ||
सृजित प्रक्रिया mysql.rename_db (in old_db VARCHAR (100), new_db VARCHAR (100))
शुरू
चुनें कॉनसैट ('सृजन DATABASE', new_db, ';') `# नया डेटाबेस बनाएँ;
चयन करें CONCAT ('RENAME TABLE `', old_db, '` .`', table_name, '`TO`', new_db, '`.`', table_name, '`;' '' '' Change table '' से 'info_schema.tables WHERE table_schema = old_db;
चयनित कॉनसैट ('ड्रॉप डेटैस `', ओल्ड_डब, '`;') `# ड्रॉप डेटाबेस डेटाबेस ';
अंत ||
DELIMITER;

$ समय mysql -uroot -e "call mysql.rename_db ('db1', 'db2');" | mysql -uroot

हालाँकि लक्ष्य db में कोई भी ट्रिगर खुश नहीं होगा। आपको नाम बदलने के बाद पहले उन्हें फिर से छोड़ना होगा।

mysql -uroot -e "call mysql.rename_db ('परीक्षण', 'blah2);" | mysql -uroot
ERROR 1435 (HY000) पंक्ति 4 में: गलत स्कीमा में ट्रिगर

छोटा mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot ट्विक जो इस काम को w / mysql 5.x नोटिस करता है, आपको कच्चे प्रारूपण में स्वरूपण को बदलने के लिए --batch का उपयोग करना होगा जो परिणाम w / शून्य स्वरूपण को आउटपुट करता है।
mikesl

8

यहां एक बैच फ़ाइल है जिसे मैंने कमांड लाइन से इसे स्वचालित करने के लिए लिखा था, लेकिन यह विंडोज / एमएस-डॉस के लिए है।

सिंटैक्स का नाम है rename_mysqldb डेटाबेस newdatabase -u [उपयोगकर्ता] -p [पासवर्ड]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=

7

TodoInTX की संग्रहीत कार्यविधि मेरे लिए काफी काम की नहीं थी। यहाँ पर मेरा छुरा है:

- संग्रहीत कार्यविधि rename_db: एक डेटाबेस का नाम बदलें मेरी प्रतिलिपि प्रतिलिपि बनाने का साधन है।
- कैविट्स: 
- किसी भी मौजूदा डेटाबेस को उसी नाम के साथ 'नया' डेटाबेस नाम के साथ जोड़ देगा।
- केवल प्रतियां टेबल; संग्रहीत कार्यविधियाँ और अन्य डेटाबेस ऑब्जेक्ट्स की प्रतिलिपि नहीं बनाई गई है।
- तोमर अल्टमैन (taltman@ai.sri.com)

सीमांकक //
DROP प्रक्रिया यदि EXISTS का नाम बदल देती है;
सृजित प्रक्रिया का नाम बदलें_db (in old_db VARCHAR (100), IN new_db VARCHAR (100))
शुरू
    DECLARE करेंट_टेबल वर्कर (100);
    DECLARE INT INTFAULT 0 किया;
    DEC_ARE old_tables CURSOR के लिए select_name से जानकारी_schema.tables जहां table_schema = old_db;
    सेट नहीं किया गया है = 1 के लिए डिक्लेयर हैन्डलर;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, '?'); 
    PREPARE stmt FROM @output से;
    निकास stmt;

    SET @output = CONCAT ('क्रिएट स्कीम इफ़ नॉट एक्ज़िट्स', new_db, ';');
    PREPARE stmt FROM @output से;
    निकास stmt;

    OPEN old_tables;
    दोहराएं
        FETCH old_tables INTO current_table;
        अगर नहीं किया
        SET @output = CONCAT ('परिवर्तन तालिका', old_db, '।', current_table, 'rename', new_db, '।', Current_table, '');
        PREPARE stmt FROM @output से;
        निकास stmt;

        अगर अंत;
    UNTIL ने किया END REPEAT;

    बंद करें old_tables;

समाप्त//
सीमांकक;

यह केवल तालिकाओं के लिए काम करेगा, और केवल अगर इन तालिकाओं में कोई ट्रिगर नहीं है। इसके द्वारा दृश्य और ट्रिगर्स स्थानांतरित नहीं किए जाएंगे।
ओल्फान

7

HeidiSQL सॉफ्टवेयर का उपयोग करने के लिए सबसे सरल विधि है। यह स्वतंत्र और खुला स्रोत है। यह वाइन के साथ विंडोज और किसी भी लिनक्स पर चलता है (लिनक्स, बीएसडी, सोलारिस और मैक ओएस एक्स पर विंडोज एप्लिकेशन चलाएं)।

HeidiSQL डाउनलोड करने के लिए, goto http://www.heidisql.com/download.php

वाइन डाउनलोड करने के लिए, गोटो http://www.winehq.org/

हेइडीएसक्यूएल में एक डेटाबेस का नाम बदलने के लिए, बस डेटाबेस के नाम पर राइट क्लिक करें और 'एडिट' चुनें। फिर एक नया नाम दर्ज करें और 'ओके' दबाएं।

यह बहुत सरल है।


1
यदि यह संग्रहीत कार्यविधियाँ हैं तो इसका नाम बदला नहीं जा सकता।
अबशर्मा

@abksharma वास्तव में आपको संदेश Database "database_name" contains stored routine(s) which cannot be moved.ट्रिगर मिलेगा (कम से कम मारीडीबी डेटाबेस के लिए) संग्रहीत रूटीन के रूप में गिना जाता है। मेरे पास कोई संग्रहीत प्रक्रिया नहीं थी, लेकिन जब तक मैंने सभी ट्रिगर नहीं हटा दिए तब तक डेटाबेस का नाम बदलने में असमर्थ था।
izogfif

7

मैक उपयोगकर्ताओं के लिए, आप Sequel Pro(मुक्त) का उपयोग कर सकते हैं , जो सिर्फ डेटाबेस का नाम बदलने का विकल्प प्रदान करते हैं। हालांकि यह पुराने DB को नष्ट नहीं करता है।

एक बार संबंधित DB खोलने के बाद बस क्लिक करें: Database->Rename database...


यह कभी-कभी पुराने डीबी को जीवित छोड़ देता है लेकिन यह खाली है। फिर भी, यदि यह प्रतिलिपि बनाता है, तो आप प्रतिलिपि बना सकते हैं और पुराने को हटा सकते हैं, यह अभी भी 2 सरल चरण हैं।
रोई गेवियरल

6

जब मैंने MySQL प्रॉक्सी का उपयोग करके बहुत बड़े डेटाबेस को पुनर्स्थापित करने की कोशिश कर रहा था, तो मैंने सर्वर फाल्ट पर एक सवाल किया । मेरे पास कोई सफलता नहीं थी, लेकिन मुझे अंत में एहसास हुआ कि मैं जो चाहता था, वह था रेनमैट डबएबसे कार्यक्षमता क्योंकि हमारे डेटाबेस के आकार के कारण डंप / आयात एक विकल्प नहीं था।

MySQL में निर्मित एक RENAME TABLE कार्यक्षमता है इसलिए मैंने अपने लिए काम करने के लिए एक साधारण पायथन स्क्रिप्ट लिखी। मैंने इसे GitHub पर पोस्ट किया है अगर यह दूसरों के लिए उपयोग की जा सकती है।


हालाँकि RENAME TABLE, इस
पीटर वी। मॉर्क

2
RENAME DATABASE को सिंटैक्स से हटा दिया गया, RENAME TABLE को नहीं।
ड्यूक

6

आपकी सुविधा के लिए, नीचे एक छोटी सी शेलस्क्रिप्ट है जिसे दो मापदंडों के साथ निष्पादित किया जाना है: db-name और new db-name।

यदि आप अपने घर-निर्देशिका में .my.cnf-file का उपयोग नहीं करते हैं तो आपको mysql- लाइनों में लॉगिन-पैरामीटर जोड़ने की आवश्यकता हो सकती है। कृपया इस स्क्रिप्ट को निष्पादित करने से पहले एक बैकअप बनाएं।


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"

1
यह भी, संलग्न ट्रिगर के साथ तालिकाओं के लिए काम नहीं करेगा, या उन विचारों के लिए जिन्हें अन्य डेटाबेस में नाम नहीं दिया जा सकता है।
ओलेनन

6

किसी ने इसका उल्लेख नहीं किया, लेकिन यहां एक और तरीका है:

create database NewDatabaseName like OldDatabaseName;

फिर प्रत्येक तालिका के लिए करें:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

फिर, यदि आप चाहते हैं,

drop database OldDatabaseName;

इस दृष्टिकोण के पास शून्य नेटवर्क ट्रैफ़िक के साथ सर्वर पर संपूर्ण हस्तांतरण करने का लाभ होगा, इसलिए यह डंप / पुनर्स्थापना की तुलना में बहुत तेज़ी से आगे बढ़ेगा।

यदि आपके पास संग्रहीत कार्यविधियाँ / विचार / आदि हैं, तो आप उन्हें भी स्थानांतरित करना चाह सकते हैं।


2
जहाँ तक मैं जानता हूँ कि 5.x create databaseकथन में "like" कीवर्ड का समर्थन नहीं करता है ? तुम कहाँ से मिलेगा?
ड्रैगस

यहाँ create table likeसिंटैक्स के लिए लिंक दिया गया है: dev.mysql.com/doc/refman/5.7/en/create-table-like.html । जैसे डेटाबेस बनाने के लिए, ऐसा लगता है कि MySQL ने उस क्लॉज को छोड़ दिया है।
टुनके गोनकुओलू

4

यदि आप को स्थानांतरित करने के लिए कई तालिकाओं हैं, तो नाम बदलने के लिए sql स्क्रिप्ट बनाने का एक त्वरित तरीका है।

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;

अच्छा लग रहा है, लेकिन यह संग्रहीत प्रक्रियाओं या विचारों को स्थानांतरित नहीं करता है।
davidpricedev

आपको संभवतः तालिका नाम और स्कीमा नाम के चारों ओर लपेटने के लिए हैश अंक जोड़ना चाहिए
Funkodebat

4

ALTER DATABASEMySQL द्वारा इसके आसपास प्रस्तावित तरीका है और RENAME DATABASEइसे गिरा दिया गया है।

से 13.1.32 RENAME डेटाबेस सिंटेक्स :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

यह कथन MySQL 5.1.7 में जोड़ा गया था, लेकिन यह खतरनाक पाया गया और इसे MySQL 5.1.23 में हटा दिया गया।


6
क्या आपके पास कोई उदाहरण वाक्यविन्यास है? मुझे alter databaseडेटाबेस का नाम बदलने के लिए उपयोग करने के किसी भी तरीके के बारे में नहीं पता है, और आपके द्वारा जुड़ा हुआ दस्तावेज़ यह नहीं बताता है कि यह संभव है।
जॉर्डन

@ जोर्डन मुझे भी दिलचस्पी होगी। मैंने कोशिश की और कोशिश की और पता चला, कि यह केवल संस्करण> 5.1 के साथ काम करता है, लेकिन मैं अभी अपडेट नहीं कर सकता।
फैंसीपैंट

5
-1: प्रस्तावित तरीकों के बारे में लिखने के लिए, फिर गैर-प्रस्तावित तरीके का उदाहरण देते हुए भी पूरी तरह से गायब होने का उदाहरण दिखाने के लिए।
हैकर

3
ये गलत है। MySQL का नाम बदलने वाले डेटाबेस के दस्तावेज़ का कहना है कि rename_database का उद्देश्य एक बहुत ही विशिष्ट नामकरण कार्य (DB नामकरण का सामान्य मामला नहीं) के लिए था, जिसे अब परिवर्तन डेटाबेस के साथ संभाला गया है: 'नए एन्कोडिंग के साथ डेटाबेस नामों को अपग्रेड करने के कार्य को करने के लिए, DATABASE db_name UPGRADE का उपयोग करें DATA DIRECTORY NAME के ​​बजाय 'आप डेटाबेस का नाम बदलने के लिए इसका उपयोग नहीं कर सकते, जैसा कि आप चाहते हैं, इस कमांड में नए db नाम की कोई जगह भी नहीं है!
कनाट बोलज़ार

3

MySQL व्यवस्थापक में निम्न कार्य करें:

  1. कैटलॉग के तहत, एक नया डेटाबेस स्कीमा बनाएं।
  2. बैकअप पर जाएं और पुराने स्कीमा का बैकअप बनाएं।
  3. बैकअप निष्पादित करें।
  4. पुनर्स्थापना पर जाएं और चरण 3 में बनाई गई फ़ाइल खोलें।
  5. लक्ष्य स्कीमा के तहत 'एक और स्कीमा' चुनें और नया डेटाबेस स्कीमा चुनें।
  6. पुनर्स्थापना प्रारंभ करें।
  7. नया स्कीमा सत्यापित करें और, यदि यह अच्छा लगता है, तो पुराने को हटा दें।

MySQL एडमिनिस्ट्रेटर बड़े डेटाबेस को संभाल नहीं सकता है और इसके बारे में कुछ भी जल्दी नहीं है
deadprogrammer

3

में phpmyadmin आप आसानी से डेटाबेस का नाम बदल सकते

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

पुरानी तालिका छोड़ने और तालिका डेटा पुनः लोड करने के लिए कहें, दोनों में ठीक क्लिक करें

आपके डेटाबेस का नाम बदला गया है


3

यदि आप phpMyAdmin का उपयोग कर रहे हैं एक बार डेटाबेस का चयन करने के बाद "ऑपरेशंस" टैब पर जा सकते हैं जिसका आप नाम बदलना चाहते हैं। फिर अंतिम अनुभाग "कॉपी डेटाबेस" (या ऐसा कुछ) पर जाएं, एक नाम दें, और नीचे दिए गए विकल्पों का चयन करें। इस स्थिति में, मुझे लगता है कि आपको "संरचना और डेटा" का चयन करना होगा और "चेकबॉक्स की प्रतिलिपि बनाने से पहले डेटाबेस बनाना होगा" और अंत में, उस अनुभाग में "गो" बटन दबाएं।

वैसे, मैं स्पेनिश में phpMyAdmin का उपयोग कर रहा हूं, इसलिए मुझे यकीन नहीं है कि वर्गों के नाम अंग्रेजी में क्या हैं।

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