mysql - यवस - हिंदी में डेटाबेस डिजाइन की प्रक्रिया
मैं एक MySQL डेटाबेस का नाम बदल सकता हूं(स्कीमा नाम बदलें)? (20)
MySQL पर MySQL मैनुअल इसे शामिल करता है।
आम तौर पर मैं बस डेटाबेस को डंप करता हूं और इसे एक नए नाम से पुनः आयात करता हूं। यह बहुत बड़े डेटाबेस के लिए एक विकल्प नहीं है। स्पष्ट रूप से RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
MySQL ।
इसे InnoDB साथ काम करने की ज़रूरत है, जो चीजों को MyISAM से बहुत अलग तरीके से स्टोर करता है।
सरल तरीका
डेटाबेस निर्देशिका में बदलें:
cd /var/lib/mysql/
MySQL बंद करें ... यह महत्वपूर्ण है!
/etc/init.d/mysql stop
ठीक है, इस तरह InnoDB या बीडीबी-डेटाबेस के लिए काम नहीं करता है।
डेटाबेस का नाम बदलें:
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 या बीडीबी डेटाबेस के साथ काम नहीं करता है। इस मामले में आपको डेटाबेस को डंप करना होगा और इसे फिर से आयात करना होगा।
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
भाग को हटा दें।
साथ ही, यदि आपने प्रक्रियाओं को संग्रहीत किया है, तो आप उन्हें बाद में कॉपी कर सकते हैं:
mysqldump -R old_db | mysql new_db
MySQL में अनुपलब्ध RENAME DATABASE
आदेश को अनुकरण करना:
- नया डेटाबेस बनाएं
इसके साथ नाम बदलें:
SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name, ' TO ','new_schema.',table_name,';') FROM information_schema.TABLES WHERE table_schema LIKE 'old_schema';
उस आउटपुट को चलाएं
- पुराना डेटाबेस हटाएं
यह MySQL में लापता नाम नाम डाटाबेस कमांड को नकल करने से लिया गया था।
TodoInTX की संग्रहीत प्रक्रिया मेरे लिए काफी काम नहीं करती थी। यहां मेरा स्टैब है:
-- stored procedure rename_db: Rename a database my means of table copying. -- Caveats: -- Will clobber any existing database with the same name as the 'new' database name. -- ONLY copies tables; stored procedures and other database objects are not copied. -- Tomer Altman ([email protected]) delimiter // DROP PROCEDURE IF EXISTS rename_db; CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN DECLARE current_table VARCHAR(100); DECLARE done INT DEFAULT 0; DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET @output = CONCAT('DROP SCHEMA IF EXISTS ', new_db, ';'); PREPARE stmt FROM @output; EXECUTE stmt; SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';'); PREPARE stmt FROM @output; EXECUTE stmt; OPEN old_tables; REPEAT FETCH old_tables INTO current_table; IF NOT done THEN SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';'); PREPARE stmt FROM @output; EXECUTE stmt; END IF; UNTIL done END REPEAT; CLOSE old_tables; END// delimiter ;
आप इस शेल स्क्रिप्ट का उपयोग कर सकते हैं:
संदर्भ: 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
आपकी सुविधा के लिए, नीचे एक छोटी शेलस्क्रिप्ट है जिसे दो पैरामीटर के साथ निष्पादित किया जाना है: डीबी-नाम और नया डीबी-नाम।
यदि आप अपनी होम-निर्देशिका में .my.cnf-file का उपयोग नहीं करते हैं तो आपको mysql-lines में लॉगिन-पैरामीटर जोड़ने की आवश्यकता हो सकती है। इस स्क्रिप्ट को निष्पादित करने से पहले कृपया बैकअप लें।
#!/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"
एक पूर्ण नाम बदलने का सरलतम बुलेट-एंड-बेवकूफ तरीका (अंत में पुराने डेटाबेस को छोड़कर, इसलिए यह प्रतिलिपि के बजाय एक नाम है) :
mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname
कदम:
- लाइनों को नोटपैड में कॉपी करें।
- अपने समकक्षों के साथ सभी संदर्भों को "olddbname", "newdbname", "mypassword" (+ वैकल्पिक रूप से "रूट") पर बदलें।
- कमांड लाइन पर एक करके एक निष्पादित करें (संकेत दिए जाने पर "y" दर्ज करना)।
एक पूर्ण डंप और पुनर्स्थापित करने के बिना किसी अन्य डेटाबेस के अंतर्गत डेटाबेस के भीतर सभी तालिकाओं का नाम बदलना संभव है।
DROP PROCEDURE IF EXISTS mysql.rename_db; DELIMITER || CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100)) BEGIN SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`; SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db; SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`; END|| DELIMITER ; $ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot
हालांकि लक्ष्य डीबी में कोई ट्रिगर्स खुश नहीं होंगे। आपको पहले उन्हें छोड़ना होगा और फिर नाम के बाद उन्हें फिर से बनाना होगा।
mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot ERROR 1435 (HY000) at line 4: Trigger in wrong schema
तीन विकल्प:
नया डेटाबेस बनाएं, सर्वर को नीचे लाएं, फ़ाइलों को एक डेटाबेस फ़ोल्डर से दूसरे में ले जाएं, और सर्वर को पुनरारंभ करें। ध्यान दें कि यह केवल तभी काम करेगा यदि आपकी सभी तालिकाएं माईसाम हैं।
नया डेटाबेस बनाएं, तालिका बनाएं ... स्टेटमेंट्स का उपयोग करें, और उसके बाद INSERT का उपयोग करें ... चुनें * विवरण से।
Mysqldump का उपयोग करें और उस फ़ाइल के साथ पुनः लोड करें।
मुझे लगता है कि समाधान सरल है और कुछ डेवलपर्स द्वारा सुझाव दिया गया था। phpMyAdmin के लिए एक ऑपरेशन है।
PhpMyAdmin से, उस डेटाबेस का चयन करें जिसे आप चुनना चाहते हैं। टैब में ऑपरेशंस कहा जाता है, नाम बदलें अनुभाग पर जाएं। बस इतना ही।
जैसा कि कई सुझाव दिए गए हैं, नए नाम के साथ एक नया डेटाबेस बनाएं, पुराने डेटाबेस की सभी तालिकाओं को नए डेटाबेस में डंप करें और पुराने डेटाबेस को छोड़ दें।
मैंने MySQL प्रॉक्सी का उपयोग करके बहुत बड़े डेटाबेस को पुनर्स्थापित करते समय सर्वर फॉल्ट पर डाउनटाइम प्राप्त करने का प्रयास करने पर एक प्रश्न उठाया । मुझे कोई सफलता नहीं मिली, लेकिन मुझे अंत में एहसास हुआ कि मैं क्या चाहता था RENAME डाटाबेस कार्यक्षमता क्योंकि डंप / आयात हमारे डेटाबेस के आकार के कारण एक विकल्प नहीं था।
MySQL में निर्मित एक RENAME तालिका कार्यक्षमता है इसलिए मैंने मेरे लिए नौकरी करने के लिए एक साधारण पायथन लिपि लिखना समाप्त कर दिया। मैंने इसे गिटहब पर पोस्ट किया है यदि यह दूसरों के लिए उपयोग किया जा सकता है।
मैक उपयोगकर्ताओं के लिए, Sequel Pro डेटाबेस डेटाबेस में एक नाम बदलें डेटाबेस विकल्प है। http://www.sequelpro.com/
यहां दिए गए अधिकांश उत्तर दो कारणों में से एक के लिए गलत हैं:
- You cannot just use RENAME TABLE, because there might be views and triggers. If there are triggers, RENAME TABLE fails
- You cannot use mysqldump if you want to "quickly" (as requested in the question) rename a big database
Percona has a blog post about how to do this well: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
and script posted (made?) by Simon R Jones that does what is suggested in that post. I fixed a bug I found in the script. You can see it here:
https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d
Here is a copy of it:
#!/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
Save it to a file called rename_db
and make the script executable with chmod +x rename_db
then use it like ./rename_db localhost old_db new_db
यही है वह जो मेरे द्वारा उपयोग किया जाता है:
$ 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;
सबसे आसान तरीका HeidiSQL सॉफ़्टवेयर का उपयोग करना है। यह मुफ़्त और खुला स्रोत है। यह विंडोज और Wine साथ किसी भी लिनक्स पर चलता है (लिनक्स, बीएसडी, सोलारिस और मैक ओएस एक्स पर विंडोज़ अनुप्रयोग चलाएं)।
HeidiSQL डाउनलोड करने के लिए, goto http://www.heidisql.com/download.php ।
शराब डाउनलोड करने के लिए, goto http://www.winehq.org/ ।
HeidiSQL में डेटाबेस का नाम बदलने के लिए, बस डेटाबेस नाम पर राइट क्लिक करें और 'संपादित करें' का चयन करें। फिर एक नया नाम दर्ज करें और 'ओके' दबाएं।
यह बहुत आसान है।
For mac users, you can use Sequel Pro
(free), which just provide the option to rename Databases. Though it doesn't delete the old DB.
once open the relevant DB just click: Database
--> Rename database...
I did it this way: Take backup of your existing database. It will give you a db.zip.tmp and then in command prompt write following
"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[password] [new db name] < "C:\Backups\db.zip.tmp"
If you are using phpMyAdmin you can go to the "operations" tab once you have selected the database you want to rename. Then go to the last section "copy database to" (or something like that), give a name, and select the options below. In this case, I guess you must select "structure and data" and "create database before copying" checkboxes and, finally, press the "go" button in that section.
By the way, I'm using phpMyAdmin in Spanish so I'm not sure what the names of the sections are in English.
Seems noone mentioned this but here is another way:
create database NewDatabaseName like OldDatabaseName;
then for each table do:
create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;
then, if you want to,
drop database OldDatabaseName;
This approach would have the advantage of doing the entire transfer on server with near zero network traffic, so it will go a lot faster than a dump/restore.
If you do have stored procedures/views/etc you might want to transfer them as well.
This works for all databases and works by renaming each table with maatkit mysql toolkit
Use mk-find to print and rename each table. The man page has many more options and examples
mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"
If you have maatkit installed ( which is very easy ), then this is the simplest way to do it.