আমি কীভাবে দ্রুত কোনও মাইএসকিউএল ডাটাবেসটির নাম পরিবর্তন করব (স্কিমার নাম পরিবর্তন করুন)?


958

এ মাইএসকিউএল ম্যানুয়াল মাইএসকিউএল এই জুড়ে।

সাধারণত আমি কেবল ডাটাবেস ডাম্প করি এবং এটি একটি নতুন নাম দিয়ে পুনরায় আমদানি করি। এটি খুব বড় ডাটাবেসের জন্য কোনও বিকল্প নয়। দৃশ্যত RENAME {DATABASE | SCHEMA} db_name TO new_db_name; খারাপ কাজগুলি করে, কেবলমাত্র কয়েকটি মুদ্রা সংস্করণে বিদ্যমান এবং এটি সামগ্রিকভাবে একটি খারাপ ধারণা

এর জন্য InnoDB এর সাথে কাজ করা দরকার , যা মাইআইএসএএম এর চেয়ে খুব আলাদা জিনিস সঞ্চয় করে ।


3
সার্ভারফল্টেও: সার্ভারফল্ট.কোয়েশনস / ১৯৯২২২
ইয়ভেস মার্টিন

5
এই বিবৃতিটির পুনরায় নাম ডেটাবেস সিনট্যাক্স মাইএসকিউএল 5.1.7 এ যুক্ত করা হয়েছিল তবে এটি বিপজ্জনক বলে মনে হয়েছিল এবং এটি মাইএসকিউএল 5.1.23-এ সরানো হয়েছে।
zloctb

11
আশা করি মাইএসকিউএল একটি নতুন, কার্যকারী RENAME DATABASEবিবৃতি কার্যকর করবে যার কোনও ঝুঁকি নেই, কারণ বর্তমানে এই কাজটি করার কোনও সহজ উপায় নেই। ডকুমেন্টেশনে এটি বিপজ্জনক হওয়ার কোনও স্পষ্ট কারণ নেই তাই তাদের প্রতিস্থাপন করতে সক্ষম হওয়া উচিত। কমপক্ষে লোকেরা তাদের ওয়েবসাইটে বৈশিষ্ট্য অনুরোধ বাগগুলি রেখেছেন। উদাহরণস্বরূপ, bugs.mysql.com/bug.php?id=58593 এবং bugs.mysql.com/bug.php?id=1698
এডওয়ার্ড

লিঙ্কগুলি এখন ভেঙে গেছে ...
ওল্ডবয়

উত্তর:


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ত্রুটির ফলস্বরূপ হবে ) যদি এটি হয় তবে একটি ডাটাবেস ক্লোন করতে একটি aতিহ্যগত উপায় ব্যবহার করুন এবং তারপরে পুরানোটি ফেলে দিন:

    mysqldump old_db | mysql new_db

  • আপনার যদি পদ্ধতি সংরক্ষণ থাকে তবে আপনি সেগুলি পরে অনুলিপি করতে পারেন:

    mysqldump -R old_db | mysql new_db


26
আমি এইমাত্র ইনোডিবি ডাটাবেস দিয়ে 30+ টেবিল সহ ফাইল_পার্টি_ট্যাবিল সেটিং ব্যবহার করে করেছি এবং কিছু সারণী 3+ মিলিয়ন সারি হলেও এটি <1 সেকেন্ডে সম্পূর্ণ হয়েছে। এটি আরও জটিল কিছু করার চেয়ে কেবল স্টোরেজে ফাইলগুলি সরিয়ে নিয়েছে বলে মনে হচ্ছে ... সম্ভব হলে +2 :)
ডেভ রিক্স

87
"এ পুনরায় নামকরণ ডেটাবেস বিপজ্জনক হতে দেখা গেছে এবং মাইএসকিউএল 5.1.23 কারণে সরানো হয়" - থেকে dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani

13
দয়া করে মনে রাখবেন এটি দেখার জন্য কাজ করবে না। আপনি একটি ডেটাবেস থেকে অন্যটিতে ঝাঁপিয়ে দেখার জন্য দর্শনগুলির নাম পরিবর্তন করতে পারবেন না। ব্যবহার করুন DROP VIEWএবং CREATE VIEWপরিবর্তে। আনাড়ি, হ্যাঁ mysqldumpপ্রথমে সমস্ত টেবিল সরিয়ে নেওয়ার পরে আপনি ভিউগুলি সরাতে কোনও কাজ করতে চান । এছাড়াও নোট করুন যে SHOW TABLESসারণী এবং দর্শন প্রদর্শন করবে, তাই সাবধান হন।
tuomassalo

9
এছাড়াও এটি ট্রিগার সহ কোনও টেবিলের জন্য কাজ করবে না। টেবিলটি সরিয়ে নেওয়ার আগে আপনাকে অনুসন্ধান, ডাম্প এবং ড্রপ ট্রিগার করতে হবে, তারপরে লক্ষ্য ডিবিতে ফেলে দেওয়া ট্রিগারগুলি আমদানি করতে হবে।
ওলফান

5
আপডেট করা হয়েছে (যেমন পরিশ্রমী) লিঙ্ক দলিল কেন RENAME DATABASEসরানো হয়েছে: dev.mysql.com/worklog/task/?id=4030
Alexis

443

এই কয়েকটি সাধারণ কমান্ড ব্যবহার করুন:

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

বা I / O হ্রাস করতে @ পাবলো মেরিন-গার্সিয়া পরামর্শ অনুসারে নিম্নলিখিতটি ব্যবহার করুন:

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

86
ওপি যেমন বলেছিল, "[টি] খুব বড় ডাটাবেসের জন্য তার বিকল্প নয়" "
পাইলক্রো

3
আসল ডাটাবেসটি ড্রপ করতে ভুলবেন না
পাভেল রদজিভিলভস্কি

3
জমকালো উত্তর! এটি আরও উন্নত করার জন্য বেশ কয়েকটি পরামর্শ যা সম্ভবত সমস্ত দক্ষতার দ্বারা গুগল করা হচ্ছে: (1) পাবলো মেরিন-গার্সিয়ার কোড খণ্ডটিকে শীর্ষে স্থানান্তরিত করুন কারণ এটি সর্বোত্তম উত্তর বলে মনে হচ্ছে (২) সর্বত্র -p<password>পরিবর্তে রাখুন -pযাতে কোনও প্রম্পট উপস্থিত না হয়ে বিবৃতি চালিত হয় ।
স্টিভ চেম্বারস

9
পাইপযুক্ত সংস্করণটি ব্যবহার করে আমি দুটি "পাসওয়ার্ড প্রবেশ করান:" পেয়েছি: এরকম অনুরোধ জানানো হয়: Enter password: Enter password: এটি একটি পাসওয়ার্ড নেবে বলে মনে হচ্ছে, তবে উভয়ই নয়। আমি কি একটি বিশদ মিস করছি?
রায়ান

33
আমি অবাক হয়েছি যে এটির কথা কেউ উল্লেখ করেনি, তবে --routinesসঞ্চিত পদ্ধতিগুলি অনুলিপি করা হয়েছে কিনা তা নিশ্চিত করার জন্য আপনার সত্যিকার অর্থেই মাইএসকিल्ड্প কমান্ডগুলিতে পতাকাটি যুক্ত করা উচিত ।
কার্লোস পি

205

আমি মনে করি সমাধানটি সহজ এবং কিছু বিকাশকারী তার দ্বারা পরামর্শ করেছিলেন। phpMyAdmin এর জন্য একটি অপারেশন রয়েছে।

পিএইচপিএমআইএডমিন থেকে আপনি যে ডাটাবেসটি নির্বাচন করতে চান তা নির্বাচন করুন। ট্যাবগুলিতে অপারেশনস নামে একটি রয়েছে, নাম পরিবর্তন বিভাগে যান। এখানেই শেষ.

এটি, যেমন অনেকের পরামর্শ অনুসারে, নতুন নাম দিয়ে একটি নতুন ডাটাবেস তৈরি করে, পুরাতন ডাটাবেসের সমস্ত টেবিলকে নতুন ডাটাবেসে ফেলে দেয় এবং পুরাতন ডাটাবেসটি ফেলে দেয়।

এখানে চিত্র বিবরণ লিখুন


76
ধরে নিচ্ছি আপনার এমনকি আপনার পরিবেশে পিএইচপি আছে বা phpmyadmin ব্যবহার করুন।
ক্রিস

26
আপনার কাছে পিএইচপিএমআইএডমিন থাকলেও বেশ বিপজ্জনক - পিছনের প্রান্তটি দুটি ডাবসকে অজানা অবস্থায় রেখে মাঝের প্রক্রিয়াটিকে ব্যর্থ করতে পারে, বা এটি বেশ দীর্ঘ সময় নিতে পারে, যার ফলে সামনের প্রান্তটি ঝুলন্ত বা পিএইচপি সময় শেষ হয়ে যায়।
মোজবুজ

20
এটি সত্য @ মোজবোজ, তবে আমি এটি 10 ​​বছর ধরে করেছি এবং কখনও কখনও এই সমস্যা হয়নি। যদি আপনার শেলের মাধ্যমে কমান্ডটি চালানো হয় এবং আপনি কম্পিউটার ক্র্যাশ হন তবে একই Is সম্ভাবনা আছে তবে কী? 1 থেকে 1 কোয়াড্রিলিয়ন?
রাফি

24
কনসোলের মাধ্যমে একটি স্ক্রিপ্ট হ'ল একটি ফ্রন্ট-এন্ড যা একই সমস্যাগুলির সাথে স্তব্ধ হতে পারে।
গ্রেগ

11
তবুও কনসোল অপারেশনগুলি পিএইচপিএমএইডমিনের চেয়ে অনেক বেশি নির্ভরযোগ্য, বিশেষত যেখানে বড় ডাটাবেসগুলি জড়িত রয়েছে, এটি ওপি'র ক্ষেত্রে। ব্যক্তিগতভাবে আমি পিএমএর চেয়ে কোনও কনসোল পদ্ধতি দৃ strongly়তার সাথে পরামর্শ করব যদি আপনার কাছে যুক্তিসঙ্গতভাবে বড় ডেটাবেস থাকে। বলা বাহুল্য, ছোট ডাটাবেসে পিএমএ ঠিক তেমন ভাল।
টিওডর স্যান্ডু

107

আপনার উত্স ডাটাবেসের প্রতিটি টেবিলকে গন্তব্য ডেটাবেসে স্থানান্তর করতে আপনি এসকিউএল স্ক্রিপ্ট তৈরি করতে পারেন।

কমান্ড থেকে প্রাপ্ত স্ক্রিপ্টটি চালানোর আগে আপনাকে অবশ্যই গন্তব্য ডাটাবেস তৈরি করতে হবে।

আপনি এই দুটি স্ক্রিপ্টের যে কোনওটি ব্যবহার করতে পারেন (আমি মূলত প্রাক্তনটির পরামর্শ দিয়েছিলাম এবং কেউ আমার উত্তরটি "উন্নত" করেছে GROUP_CONCATyour আপনার চয়ন করুন, তবে আমি আসলটি পছন্দ করি):

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 উত্স এবং লক্ষ্য)

এটি একটি এসকিউএল কমান্ড তৈরি করবে যা আপনাকে তখন চালাতে হবে।

নোট করুন যে GROUP_CONCATএকটি ডিফল্ট দৈর্ঘ্যের সীমা রয়েছে যা প্রচুর টেবিল সহ ডাটাবেসের জন্য অতিক্রম করতে পারে। আপনি SET SESSION group_concat_max_len = 100000000;(বা অন্য কোনও বড় সংখ্যা) চালিয়ে সেই সীমাটি পরিবর্তন করতে পারেন ।


@ ব্ল্যাকফ্রেডরিক এটি পুনরায় নাম ডেটাবেস ব্যবহার করে না তাই সমস্যা কী?
tuxayo

টেবিলের রেফারেন্সিয়াল সীমাবদ্ধতা থাকলে এই কাজ করে? আমি আশা করি না।
ডলম্যান

42

RENAME DATABASEমাইএসকিউএল অনুপস্থিত কমান্ড অনুকরণ :

  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. পুরানো ডাটাবেস মুছুন

এটি মাইএসকিউএল-এ মিসিং রেইনাম ডেটাবেস কমান্ড এমুলেটিং থেকে নেওয়া হয়েছিল ।


1
পারফেক্ট! আমি এটি ইনোডিবি এবং মাইআইএসএএম টেবিল দিয়ে পরীক্ষা করেছি। আমি পরীক্ষিত দ্রুততম সমাধান (টেবিলটির নামকরণ প্রায় তাত্ক্ষণিক, কোনও বিলম্ব নেই)!
ফিলিপ

গ্রেট! কেবল পরে সুবিধাগুলি ঠিক করতে মনে রাখবেন।
অ্যাডাম ফারিনা

পুনশ্চ. আপনি যদি লাইভ ডিবিতে কাজ করে থাকেন তবে পুনরায় নাম অনুসন্ধানগুলি চালানোর আগে এটি করা ভাল।
অ্যাডাম ফারিনা

টেবিলের রেফারেন্সিয়াল সীমাবদ্ধতা থাকলে এই কাজ করে? আমি আশা করি না।
ডলম্যান

24

তিনটি বিকল্প:

  1. নতুন ডাটাবেস তৈরি করুন, সার্ভারটি নামিয়ে আনুন, একটি ডাটাবেস ফোল্ডার থেকে অন্যটিতে ফাইলগুলি সরান এবং সার্ভারটি পুনরায় চালু করুন। মনে রাখবেন এটি কেবল তখনই কাজ করবে যদি আপনার সমস্ত টেবিলগুলি মাইআইএসএএম হয়।

  2. নতুন ডাটাবেস তৈরি করুন, টেবিল তৈরি করুন ... বিবৃতি পছন্দ করুন এবং তারপরে INSERT ব্যবহার করুন ... বিবৃতি থেকে নির্বাচন করুন।

  3. Mysqldump ব্যবহার করুন এবং সেই ফাইলটি দিয়ে পুনরায় লোড করুন।


মাইসাম রেফারেন্সের জন্য। আমি বুঝতে পারি না কেন এটি আমার পক্ষে কাজ করে নি।
খ্রিস্টান পায়েেন

5
প্রশ্নটিতে বলা হয়েছে যে এটি মাইআইএসএএম নয়, ইনোডিবি
-

@ ডি-রক এটিকে গুগলে বলুন, যিনি শিরোনামের ভিত্তিতে লোকদের এখানে আনেন।
jiggunjer

24

সহজ উপায়

ডাটাবেস ডিরেক্টরিতে পরিবর্তন করুন:

cd /var/lib/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

মাইএসকিউএল পুনরায় চালু করুন

/etc/init.d/mysql start

সম্পন্ন...

ঠিক আছে, এইভাবে InnoDB বা BDB ডাটাবেসের সাথে কাজ করে না। এই ক্ষেত্রে আপনাকে ডাটাবেস ডাম্প করে পুনরায় আমদানি করতে হবে।


16
নামকরণ ফোল্ডার খেলনা বিরতি।
ভিনিসিয়াস পিয়ার্স

1
@ রাহলি, এমনকি টেবিলের জন্য একটি ফাইল সেট করা থাকলেও এটি এখনও বিপজ্জনক, সারণীতে প্রতি একটি ফাইল সেট করার আগে তৈরি করা টেবিলগুলি সমস্যায় পড়বে, যদি না আপনি নিশ্চিত হন যে পতাকাটি সেট হওয়ার পরে ডেটাবেস তৈরি হয়েছিল।
কিয়ান চেন

যদিও সাধারণভাবে বলতে গেলে, বেশিরভাগ লোকেরা তাদের সিস্টেমগুলি একরকম বা অন্য কোনও উপায়ে নিতে চলেছে, লোকেরা ফাইলের মধ্যে একটি টেবিল রাখে বা না থাকায় এলোমেলোভাবে ফ্লপ হবে না। তদুপরি, এমনকি আপনার দৃশ্যেও, যদি পতাকাগুলির আগে টেবিলগুলি তৈরি করা হত, তবে তারা প্রথমে পৃথক ফাইল হিসাবে উপস্থিত না থাকায় পদক্ষেপটি কাজ করবে না এবং এটি এখনও নিরাপদ হবে, কোনও বিপদ হবে না। মনে রাখবেন, স্থানান্তর চলাকালীন ডাটাবেস চলছে না।
রাহলি

ওএস এক্স-এ হোমব্রু দিয়ে ইনস্টল করা 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
মাইএসকিএল

22

আপনি এই শেল স্ক্রিপ্টটি ব্যবহার করতে পারেন:

তথ্যসূত্র: একটি মাইএসকিউএল ডাটাবেসটির নতুন নামকরণ কীভাবে?

#!/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

আমি সম্প্রতি এটি করার খুব সুন্দর উপায়টি পেয়েছি, মাইআইএসএএম এবং ইনোডিবিতে কাজ করে এবং খুব দ্রুত:

RENAME TABLE old_db.table TO new_db.table;

আমি কোথায় পড়েছি তা মনে নেই তবে কৃতিত্ব আমার কাছে নয় অন্য কারও কাছে যায়।


@ আরকাদিজকুজেল এমনটি ভাবেন না। আমি মনে করি আপনি RENAME DATABASE সম্পর্কে কথা বলছেন।
রব গ্রান্ট

এটি সত্যই সহায়তা করেছে, আমি একটি নতুন ফাঁকা ডাটাবেস তৈরি করেছি এবং তারপরে কোডটি ব্যবহার করেছি, সমস্ত টেবিলগুলি কাঙ্ক্ষিত নামের সাথে আমদানি করা হয়েছিল।
জুলাইআরডিনারি

3
এটি স্বীকৃত উত্তরের মতো একই সমস্যায় ভুগছে - "পুনরায় নামকরণের ডেটাবেস বিপজ্জনক বলে প্রমাণিত হয়েছিল এবং মাইএসকিউএল 5.1.23 এ অপসারণ করা হয়েছে" - থেকে dev.mysql.com/doc/refman/5.1/en/rename-datedia.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" প্রবেশ করুন)।

আপনার পাসওয়ার্ডটি সুরক্ষিত না হওয়ার কারণে কনসোলে যোগ করা থেকে বিরত থাকুন। আপনি যদি ইতিমধ্যে এটি ব্যবহার করে থাকেন তবে মুছে ফেলার জন্য ইতিহাস ব্যবহার করুন w পরিবর্তে পাসওয়ার্ডটি ফাঁকা রেখে প্রম্পটের পরে প্রবেশ করুন।
টমি সি।

এটি শেষ না করে অস্বাভাবিক দীর্ঘ, 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

এই মুহুর্তে মাইএসকিউএল তার কমান্ড ইন্টারফেসের মাধ্যমে একটি ডাটাবেসটির নাম পরিবর্তনের পক্ষে সমর্থন করে না, তবে মাইএসকিউএল যে ডিরেক্টরিতে এটির ডাটাবেস সংরক্ষণ করে সেই ডিরেক্টরিতে অ্যাক্সেস থাকলে আপনি ডাটাবেসটির নাম পরিবর্তন করতে পারেন। ডিফল্ট মাইএসকিউএল ইনস্টলেশনের জন্য এটি সাধারণত মাইএসকিউএল ইনস্টল করা ডিরেক্টরিটির অধীনে ডেটা ডিরেক্টরিতে থাকে। আপনি যে ডিরেক্টরিতে ডাটাবেজটির নাম পরিবর্তন করতে চান সেটি ডেটা ডিরেক্টরিতে অন্তর্ভুক্ত করুন এবং এর নাম পরিবর্তন করুন। ডিরেক্টরিটির নামকরণের কারণে কিছু অনুমতি সংক্রান্ত সমস্যার কারণ হতে পারে। সচেতন থাকা.

দ্রষ্টব্য: আপনি ডাটাবেসটির নাম পরিবর্তন করার আগে আপনাকে অবশ্যই মাইএসকিউএল বন্ধ করতে হবে

আমি একটি নতুন ডাটাবেস তৈরি করতে (আপনার নামটি ব্যবহার করে) তৈরি করার পরামর্শ দিচ্ছি এবং পুরানো থেকে নতুন থেকে আপনার প্রয়োজনীয় ডেটা রফতানি / আমদানি করব। বেশ সহজ.


13

আপনি যখন পিএইচপিএমআইএডমিনে কোনও ডাটাবেসটির নাম পরিবর্তন করেন এটি একটি ডাম্প তৈরি করে, তারপরে নতুন নাম দিয়ে ডাটাবেসটি ড্রপ করে পুনরায় তৈরি করে।


4
মনে রাখবেন যে আপনি যখন ডাটাবেসে ক্লিক করেন তখন এই বৈশিষ্ট্যটি "অপারেশনস" ট্যাবের অধীনে কিছুটা আড়াল।
মারিস বি।

13

ঠিক আছে 2 পদ্ধতি আছে:

পদ্ধতি 1: ডাটাবেস স্কিমাটির নামকরণের জন্য একটি সুপরিচিত পদ্ধতি হ'ল মাইস্ক্লডম্প ব্যবহার করে স্কিমাটি ডাম্প করে অন্য স্কিমায় পুনরুদ্ধার করে এবং তারপরে পুরাতন স্কিমাটি (যদি প্রয়োজন হয়) বাদ দেওয়া হয়।

শেল থেকে

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

যদিও উপরের পদ্ধতিটি সহজ তবে এটি সময় এবং স্থান ব্যয় করে। যদি স্কিমাটি 100 গিগাবাইটের বেশি হয় ? এমন কয়েকটি পদ্ধতি রয়েছে যেখানে আপনি স্থান বাঁচাতে উপরের কমান্ডগুলি একসাথে পাইপ করতে পারেন তবে এটি সময় সাশ্রয় করবে না।

এই ধরনের পরিস্থিতিতে প্রতিকারের জন্য, স্কিমার নামকরণের জন্য আরও একটি দ্রুত পদ্ধতি রয়েছে তবে এটি করার সময় কিছুটা যত্ন নিতে হবে।

পদ্ধতি 2: মাইএসকিউএলে টেবিলগুলির নামকরণের জন্য খুব ভাল বৈশিষ্ট্য রয়েছে যা এমনকি বিভিন্ন স্কিমা জুড়ে কাজ করে। এই নামকরণের অপারেশনটি পারমাণবিক এবং অন্য নামকরণের সময় অন্য কেউ টেবিলটি অ্যাক্সেস করতে পারবেন না। কোনও টেবিলের নাম বা এর স্কিমা পরিবর্তন করা কেবলমাত্র একটি মেটাডেটা পরিবর্তন হওয়ার কারণে এটি সম্পূর্ণ হতে স্বল্প সময় নেয়। পুনরায় নামকরণের পদ্ধতিগত পদ্ধতি এখানে দেওয়া হয়েছে:

পছন্দসই নাম সহ নতুন ডাটাবেস স্কিমা তৈরি করুন। পুরানো স্কিমা থেকে নতুন স্কিমে টেবিলগুলির নতুন নামকরণ করুন, মাইএসকিউএলএর "পুনরায় নাম টেবিল" কমান্ডটি ব্যবহার করুন। পুরানো ডাটাবেস স্কিমাটি ফেলে দিন। If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too। টেবিলগুলিতে ট্রিগার উপস্থিত থাকলে মাইএসকিউএলের "পুনরায় নামকরণ" ব্যর্থ হয়। এর প্রতিকারের জন্য আমরা নিম্নলিখিত জিনিসগুলি করতে পারি:

1) Dump the triggers, events and stored routines in a separate file. এটি mysqldump কমান্ড -E, -R পতাকা ব্যবহার করে (-t -d যা ট্রিগারগুলি ডাম্প করে) ব্যবহার করে। ট্রিগারগুলি ডাম্প করা হয়ে গেলে, পুনরায় নাম টেবিলটি কাজ করার জন্য আমাদের এগুলি স্কিমা থেকে বাদ দিতে হবে।

 $ 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

উপরোক্ত পদ্ধতিগুলির সাথে অন্তর্ভুক্তি: আমাদের ব্যবহারকারীদের জন্য গ্রান্টগুলি আপডেট করার প্রয়োজন হতে পারে যেমন তারা সঠিক স্কিমা_নামের সাথে মেলে। এগুলি mysql.collines_priv, mysql.procs_priv, mysql.tables_priv, mysql.db টেবিলগুলিতে পুরানো_স্কেমার নামটিকে নতুন_স্কেমায় আপডেট করে এবং "ফ্লাশ সুবিধাগুলি;" কল করে একটি সাধারণ আপডেটের সাথে ঠিক করা যেতে পারে। যদিও "পদ্ধতি 2" পদ্ধতি 1 than এর চেয়ে কিছুটা জটিল বলে মনে হচ্ছে, এটি সম্পূর্ণ স্ক্রিপ্টযোগ্য। উপরের ধাপগুলি যথাযথ ক্রমে চালিত করার জন্য একটি সরল বাশ স্ক্রিপ্ট, পরবর্তী সময় ডাটাবেস স্কিমার নাম পরিবর্তন করার সময় স্থান এবং সময় সাশ্রয় করতে আপনাকে সহায়তা করতে পারে।

পারকোনা রিমোট ডিবিএ দলটি "পুনঃনাম_বিবি" নামে একটি স্ক্রিপ্ট লিখেছিল যা নিম্নলিখিত উপায়ে কাজ করে:

[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 for" এর জন্য ব্যবহৃত হয় ″

#!/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

রেফারেন্সিয়াল সীমাবদ্ধতা সম্পর্কে কি?
ডলম্যান

13

পদক্ষেপ:

  1. হিট http: // লোকালহোস্ট / phpmyadmin /
  2. আপনার ডিবি নির্বাচন করুন
  3. অপারেশনস ট্যাবে ক্লিক করুন
  4. "পুনরায় নামকরণ ডাটাবেস" হিসাবে একটি ট্যাব থাকবে। নতুন নাম যুক্ত করুন এবং সুবিধাগুলি সামঞ্জস্য করুন check
  5. গো ক্লিক করুন।

এখানে চিত্র বর্ণনা লিখুন


1
একটি পিএইচপিএমওয়াই অ্যাডমিন সমাধান সাধারণত একটি দুর্বল সমাধান কারণ কিছু পরিবেশের পরিবেশ সীমাবদ্ধ থাকে।
ড্যানিয়েল অ্যান্টুনস পিন্টো

একটি "ভাল" সমাধান নয় তবে ধন্যবাদ-তেমন কিছু নয় কারণ আমি যা খুজছিলাম।
জ্যামি

1
দয়া করে ভোট দিন যদি এটি আপনার পক্ষে কাজ করে .. এটি সাহায্য করবে .. ধন্যবাদ
শুভম জৈন

1
এটি আমার জন্য পিএইচপিএমএইডমিন পরিবেশে কাজ করে, +1
উইলিয়াম

12

যারা ম্যাক ব্যবহারকারী তাদের জন্য, সিকোয়েল প্রো-এর ডেটাবেস মেনুতে একটি পুনর্নবীকরণ ডাটাবেস বিকল্প রয়েছে। http://www.sequelpro.com/


5
আপনার ডাটাবেসে কোনও মতামত বা ট্রিগার থাকলে এই বিকল্প থেকে সাবধান থাকুন। এই মেনু বিকল্পের পিছনে একটি স্ক্রিপ্ট যা একটি নতুন ডাটাবেস তৈরি করবে এবং সমস্ত টেবিলের উপরে চলে যাবে। এটি দর্শন বা ট্রিগারগুলির জন্য কাজ করবে না, তাই তারা আপনার পুরানো ডাটাবেসে পিছনে থাকবে। ফলাফল ঠিক করার প্রয়োজনে দুটি ভাঙা ডাটাবেস।
ওলফান

10

এখানে বেশিরভাগ উত্তর দুটি কারণে একটিতে ভুল:

  1. আপনি কেবল পুনরায় নাম টেবিল ব্যবহার করতে পারবেন না কারণ দেখা এবং ট্রিগার থাকতে পারে। যদি ট্রিগার থাকে তবে পুনরায় নাম টেবিল ব্যর্থ হয়
  2. আপনি যদি "দ্রুত" (প্রশ্নের অনুরোধ হিসাবে) একটি বড় ডাটাবেসটির নাম পরিবর্তন করতে চান তবে আপনি mysqldump ব্যবহার করতে পারবেন না

কীভাবে এটি করা যায় সে সম্পর্কে পারকোনার একটি ব্লগ পোস্ট রয়েছে: https://www.percona.com/blog/2013/12/24/renaming-datedia-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

সম্পূর্ণ ডাম্প না করে এবং পুনরুদ্ধার না করেই কোনও ডাটাবেসের মধ্যে থাকা সমস্ত টেবিলের নতুন নামকরণ করা সম্ভব।

ড্রপ প্রক্রিয়া যদি বিদ্যমান থাকে mysql.rename_db;
DELIMITER ||
ক্রিয়েট প্রক্রিয়াটি mysql.rename_db (পুরাতন_ডিবি ভর্চার (100), নতুন_ডিবি ভর্চারে (100))
BEGIN
কনক্যাট নির্বাচন করুন ('ডেটাবেস তৈরি করুন', নতুন_ডিবি, ';') `# নতুন ডাটাবেস তৈরি করুন`;
কনক্যাট নির্বাচন করুন ('পুনরায় টেবিল RE', ওল্ড_ডিবি, '`.`', টেবিল_নাম, '` টু `', নতুন_ডিবি, '` .`', টেবিলের নাম, '`;') টেবিল_স্কেমা = ওল্ড_ডিবি;
কনক্যাট নির্বাচন করুন ('ড্রপ ডেটাবেস `', ওল্ড_ডিবি, '`;') `# ড্রপ পুরানো ডাটাবেস`;
END টি ||
DELIMITER;

$ সময় mysql -uroot -e "কল করুন mysql.rename_db ('db1', 'db2');" | mysql -uroot

তবে লক্ষ্য ডিবিতে কোনও ট্রিগার খুশি হবেনা। আপনাকে প্রথমে এগুলি ফেলে দিতে হবে এবং পুনরায় নামকরণের পরে পুনরায় তৈরি করতে হবে।

mysql -uroot -e "কল করুন mysql.rename_db ('পরীক্ষা', 'blah2');" | mysql -uroot
লাইন 4 এ ERROR 1435 (HY000): ভুল স্কিমায় ট্রিগার

ছোট কাজ করে যা এই mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot কাজটিকে ডাব্লু / মাইএসকিএল ৫.x করে তোলে , আপনাকে কাঁচা বিন্যাসে ফর্ম্যাটিং পরিবর্তন করতে --batch ব্যবহার করতে হবে যা ফলাফলকে ডাব্লু / জিরো ফর্ম্যাটিংয়ের ফলাফল দেয়।
মাইক্সেল

8

কমান্ড লাইন থেকে এটি স্বয়ংক্রিয় করতে আমি একটি ব্যাচের ফাইল লিখেছি, তবে এটি উইন্ডোজ / এমএস-ডস-এর জন্য।

সিনট্যাক্সটি নতুন নামকরণ করা হয়েছে_মিজ্যকিএলডিবি ডাটাবেস নতুন ডেটাবেস-ইউ [ব্যবহারকারী] -পি [পাসওয়ার্ড]

:: ***************************************************************************
:: 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

টডোআইএনটিএক্স এর সঞ্চিত পদ্ধতিটি আমার পক্ষে বেশিরভাগই কার্যকর হয়নি। এখানে আমার ছুরিকাঘাত:

- সঞ্চিত প্রক্রিয়া পুনর্নবীকরণ_ডিবি: আমার ডাটাবেস টেবিল অনুলিপি করার জন্য একটি ডাটাবেস নামকরণ করুন।
- গুহাত: 
- 'নতুন' ডাটাবেসের নাম হিসাবে একই নামের সাথে যে কোনও বিদ্যমান ডাটাবেস ক্লোবার করবে।
- কেবলমাত্র অনুলিপি টেবিল; সঞ্চিত পদ্ধতি এবং অন্যান্য ডাটাবেস অবজেক্টগুলি অনুলিপি করা হয় না।
- টোমর আল্টম্যান (টালটম্যান@ই.এসআর.কম)

ডিলিমিটার //
ড্রপ প্রক্রিয়া যদি বিদ্যমান থাকে পুনরায় নামকরণ_ডিবি;
নতুন প্রক্রিয়া পুনর্নবীকরণ_ডিবি তৈরি করুন (পুরানো_ডিবি ভর্চার (100), নতুন_ডিবি ভর্চার (100)
BEGIN
    বর্তমান_সামগ্রী ডিসিএলএইচআরচার (100);
    মর্যাদাবোধ 0 সম্পন্ন করুন;
    তথ্য_সেমি.টিবল থেকে টেবিলের নাম নির্বাচন করার জন্য পুরানো_ সারণী সারণি সারণি যেখানে টেবিল_সেমিমা = পুরাতন_ডিবি;
    নির্ধারিত কাজটি সম্পন্ন না করার জন্য হ্যান্ডলারটি অবিরত করুন = 1;

    সেট @ আউটপুট = কনক্যাট ('ড্রপ স্কেমা যদি উপস্থিত থাকে', নতুন_ডিবি, ';'); 
    @ আউটপুট থেকে স্ট্যামিট প্রস্তুত করুন;
    এক্সকিউটি স্টেমিট;

    সেট @ আউটপুট = কনক্যাট ('উপস্থিত না থাকলে স্কিম তৈরি করুন', নতুন_ডিবি, ';');
    @ আউটপুট থেকে স্ট্যামিট প্রস্তুত করুন;
    এক্সকিউটি স্টেমিট;

    ওপেন পুরানো_ টেবিল;
    পুনরাবৃত্তি
        বর্তমানের_পরিচক্রমে পুরানো_ টেবিলগুলি FETCH;
        যদি না হয়ে থাকে তবে
        এসইটি @ আউটপুট = কনক্যাট ('পরিবর্তিত টেবিল', ওল্ড_ডিবি, '।', বর্তমান_সারণযোগ্য, 'পুনর্নামকরণ', নতুন_ডিবি, '।', বর্তমান_সারণী, ';');
        @ আউটপুট থেকে স্ট্যামিট প্রস্তুত করুন;
        এক্সকিউটি স্টেমিট;

        শেষ যদি;
    শেষ না হওয়া পর্যন্ত পুনরায় করা হবে;

    পুরানো_ টেবিলগুলি বন্ধ করুন;

শেষ//
সীমানা;

এটি কেবল টেবিলগুলির জন্যই কাজ করবে এবং কেবলমাত্র যদি এই টেবিলগুলিতে কোনও ট্রিগার না থাকে। দর্শন এবং ট্রিগারগুলি এর দ্বারা সরানো হবে না।
ওলফান

7

সবচেয়ে সহজ পদ্ধতি হেইডিএসকিউএল সফ্টওয়্যার ব্যবহার করা। এটি বিনামূল্যে এবং মুক্ত উত্স। এটি উইন্ডোতে এবং ওয়াইন সহ যে কোনও লিনাক্সে চলে (লিনাক্স, বিএসডি, সোলারিস এবং ম্যাক ওএস এক্সে উইন্ডোজ অ্যাপ্লিকেশনগুলি চালনা করে)।

হাইডিএসকিউএল ডাউনলোড করতে, http://www.heidisql.com/download.php এ যান

ওয়াইন ডাউনলোড করতে, http://www.winehq.org/ এ যান

হেইডিএসকিউএলে একটি ডাটাবেসটির নতুন নামকরণ করতে, ডাটাবেসের নামটিতে ডান ক্লিক করুন এবং 'সম্পাদনা' নির্বাচন করুন। তারপরে একটি নতুন নাম লিখুন এবং 'ওকে' টিপুন।

এটা খুব সহজ।


1
যদি এটি সংরক্ষণের পদ্ধতি থাকে তবে এটির নামকরণ করা যাবে না।
অবসর্মা

@ আবক্ষর্মা আসলে আপনি বার্তাটি পাবেন Database "database_name" contains stored routine(s) which cannot be moved.ট্রিগার (কমপক্ষে মেরিডিবি ডাটাবেসের জন্য) সঞ্চিত রুটিন হিসাবে গণনা করা হয়। আমার কোনও সঞ্চিত প্রক্রিয়া ছিল না, তবে আমি সমস্ত ট্রিগারগুলি বাদ না দেওয়া পর্যন্ত ডাটাবেসটির নাম পরিবর্তন করতে পারিনি।
izogfif

7

ম্যাক ব্যবহারকারীদের জন্য, আপনি Sequel Pro(ফ্রি) ব্যবহার করতে পারেন , যা কেবল ডাটাবেসগুলির নাম পরিবর্তনের বিকল্প সরবরাহ করে। যদিও এটি পুরানো ডিবি মুছে দেয় না।

একবার সম্পর্কিত ডিবি খুলুন কেবল ক্লিক করুন: Database->Rename database...


এটি কখনও কখনও পুরানো ডিবিটিকে জীবিত রাখে তবে এটি খালি। তবুও, যদি এটি একটি অনুলিপি তৈরি করে, আপনি অনুলিপি তৈরি করতে এবং পুরানোটিকে মুছতে পারেন, এটি এখনও 2 সাধারণ পদক্ষেপ।
রই গাভিরেল

6

আমি মাইএসকিউএল প্রক্সি ব্যবহার করে খুব বড় ডেটাবেসগুলি পুনরুদ্ধার করার সময় সার্ভার ফল্টকে ডাউনটাইম প্রায় পাওয়ার চেষ্টা করার বিষয়ে একটি প্রশ্ন রেখেছিলাম । আমার কোনও সাফল্য ছিল না, তবে আমি শেষ পর্যন্ত বুঝতে পেরেছিলাম যে আমি যা চাইছিলাম তা নামকরণের ড্যাটাবেসের কার্যকারিতা ছিল কারণ আমাদের ডাটাবেসের আকারের কারণে ডাম্প / আমদানি কোনও বিকল্প ছিল না।

মাইএসকিউএলে একটি পুনরায় নামকরণ কার্যকারিতা অন্তর্নির্মিত রয়েছে তাই আমার কাজটি করার জন্য আমি একটি সাধারণ পাইথন স্ক্রিপ্ট লিখে শেষ করেছি। এটি অন্যের কাজে লাগতে পারে সে ক্ষেত্রে আমি এটি গিটহাবে পোস্ট করেছি ।



2
পুনরায় নাম টেবিল নয়, সিনট্যাক্স থেকে পুনর্নবীকরণের নামটি হ'ল।
ডিউক

6

আপনার সুবিধার জন্য, নীচে একটি ছোট শেলসক্রিপ্ট যা দুটি পরামিতি: ডিবি নাম এবং নতুন ডিবি-নাম দিয়ে সম্পাদন করতে হবে।

আপনি যদি নিজের হোম ডিরেক্টরিতে .my.cnf-file ব্যবহার না করেন তবে আপনাকে মাইএসকিএল-লাইনগুলিতে লগইন-প্যারামিটার যুক্ত করতে হবে। এই স্ক্রিপ্টটি কার্যকর করার আগে দয়া করে একটি ব্যাকআপ তৈরি করুন।


#!/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বিবৃতিতে কীওয়ার্ডটি "লাইক" সমর্থন করে না ? তুমি কোথা থেকে এলে?
ড্রাগস

এখানে create table likeসিনট্যাক্সের লিঙ্কটি রয়েছে : dev.mysql.com/doc/refman/5.7/en/create-table- Like.html । যেমন ডাটাবেস তৈরি হিসাবে, মনে হয় যে MySQL সেই ধারাটি বাদ দিয়েছে।
টুনচে Göncüoğlu

4

আপনার কাছে সরানোর মতো অনেকগুলি টেবিল থাকলে এখানে স্কেল স্ক্রিপ্টটির নামকরণের একটি দ্রুত উপায়।

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' ;

দেখতে দেখতে দুর্দান্ত, তবে এটি সঞ্চিত পদ্ধতি বা দৃষ্টিভঙ্গি সরিয়ে দেয় না।
ডেভিডপ্রিডেদেভ

আপনার সম্ভবত টেবিলের নাম এবং স্কিমা নামটি
গুটিয়ে

4

ALTER DATABASEএটি মাইএসকিউএল দ্বারা প্রস্তাবিত উপায় এবং RENAME DATABASEবাদ দেওয়া হয়।

১৩.১.৩২ থেকে ডেটাবেসের সিনট্যাক্সটির পুনরায় নামকরণ করুন :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

এই বিবৃতিটি মাইএসকিউএল 5.1.7 এ যুক্ত করা হয়েছিল তবে এটি বিপজ্জনক বলে মনে হয়েছিল এবং এটি মাইএসকিউএল 5.1.23-এ সরানো হয়েছে।


6
আপনার কি কোনও উদাহরণ বাক্য গঠন আছে? আমি alter databaseনিজেই ডাটাবেসটির নতুন নামকরণের জন্য কোনও উপায় ব্যবহার করতে জানি না এবং আপনি যে ডকুমেন্টেশনের সাথে লিঙ্ক করেছেন সেটি এটি সম্ভব কিনা তা বোঝায় না।
জর্ডান

@ জর্ডান আমিও আগ্রহী হব আমি চেষ্টা করেছি এবং চেষ্টা করেছি এবং জানতে পেরেছি যে এটি কেবল সংস্করণ> 5.1 এর সাথে কাজ করে তবে আমি এখনই আপডেট করতে পারি না।
অভিনব প্যান্ট

5
-১: প্রস্তাবিত উপায়গুলি সম্পর্কে লেখার জন্য, তারপরে প্রস্তাবিত অ-প্রস্তাবিত উপায়ের উদাহরণ দেওয়ার জন্য এমনকি পুরোপুরি উদাহরণ দেখাও নিখোঁজ।
hakre

3
এটা ভুল. মাইএসকিউএল পুনর্নবীকরণ ডাটাবেস ডকুমেন্টেশন বলছে যে পুনর্নামকরণ_ডেটাব্যাস একটি খুব নির্দিষ্ট নামকরণের কাজ (ডিবি নামকরণের সাধারণ ক্ষেত্রে নয়) এর জন্য তৈরি করা হয়েছিল, যা এখন পরিবর্তিত ডাটাবেস সহ পরিচালিত হয়: 'নতুন এনকোডিংয়ের মাধ্যমে ডাটাবেসের নাম আপগ্রেড করার কাজটি সম্পাদন করতে, ALTER DATABASE db_name UPGRADE ব্যবহার করুন পরিবর্তে ডেটা ডিরেক্টরি নাম 'আপনি এটি হিসাবে আপনার ইচ্ছা মতো ডাটাবেসটির নাম পরিবর্তন করতে এটি ব্যবহার করতে পারবেন না, এই কমান্ডে নতুন ডিবি নামের কোনও স্থানও নেই!
কানাত বোলাজার

3

মাইএসকিউএল প্রশাসকের মধ্যে নিম্নলিখিতটি করুন:

  1. ক্যাটালগগুলির অধীনে একটি নতুন ডাটাবেস স্কিমা তৈরি করুন।
  2. ব্যাকআপে যান এবং পুরানো স্কিমাটির একটি ব্যাকআপ তৈরি করুন।
  3. ব্যাকআপ কার্যকর করুন।
  4. পুনরুদ্ধারে যান এবং পদক্ষেপ 3-এ তৈরি ফাইলটি খুলুন।
  5. লক্ষ্য স্কীমার অধীনে 'অন্য স্কিমা' নির্বাচন করুন এবং নতুন ডাটাবেস স্কিমা নির্বাচন করুন।
  6. পুনরুদ্ধার শুরু করুন।
  7. নতুন স্কিমা যাচাই করুন এবং যদি এটি দেখতে ভাল লাগে তবে পুরানোটি মুছুন।

মাইএসকিউএল প্রশাসক বড় ডেটাবেস পরিচালনা করতে পারবেন না এবং এ সম্পর্কে দ্রুত কিছুই নেই
ডেডপ্রোগ্রাম

3

মধ্যে phpMyAdmin আপনি সহজেই ডাটাবেসের নাম পরিবর্তন করতে পারেন

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

পুরানো টেবিলটি ছেড়ে দিতে এবং টেবিলের ডেটা পুনরায় লোড করতে জিজ্ঞাসা করুন উভয় ঠিক আছে

আপনার ডাটাবেসটির নতুন নামকরণ করা হয়েছে


3

আপনি যদি phpMyAdmin ব্যবহার করছেন নাম পরিবর্তন করতে চান ডাটাবেসটি নির্বাচন করার পরে আপনি "অপারেশনস" ট্যাবে যেতে পারেন। তারপরে "বিভাগে অনুলিপি করুন" (বা এর মতো কিছু) শেষ বিভাগে যান, একটি নাম দিন এবং নীচের বিকল্পগুলি নির্বাচন করুন। এই ক্ষেত্রে, আমি অনুমান করি আপনাকে অবশ্যই "কাঠামো এবং ডেটা" নির্বাচন করতে হবে এবং "চেকবাক্সগুলি অনুলিপি করার আগে" ডাটাবেস তৈরি করতে হবে এবং অবশেষে section বিভাগের "গো" বোতামটি টিপুন।

যাইহোক, আমি স্পেনীয় ভাষায় পিএইচপিএমআইএডমিন ব্যবহার করছি তাই বিভাগগুলির নামগুলি ইংরেজিতে কী তা আমি নিশ্চিত নই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.