ฉันจะเปลี่ยนชื่อฐานข้อมูล MySQL อย่างรวดเร็ว (เปลี่ยนชื่อสคีมา) ได้อย่างไร


959

คู่มือ MySQL ที่MySQLครอบคลุมสิ่งนี้

ฉันมักจะถ่ายโอนฐานข้อมูลและนำเข้าใหม่ด้วยชื่อใหม่ นี่ไม่ใช่ตัวเลือกสำหรับฐานข้อมูลขนาดใหญ่มาก เห็นได้ชัดว่าไม่สิ่งที่ไม่ดีที่มีอยู่เฉพาะในกำมือของรุ่นและเป็นความคิดที่ไม่ดีโดยรวมRENAME {DATABASE | SCHEMA} db_name TO new_db_name;

ความต้องการนี้จะทำงานร่วมกับInnoDBซึ่งร้านค้าสิ่งที่แตกต่างกันมากกว่าMyISAM



5
คำสั่ง RENAME DATABASE ไวยากรณ์นี้ถูกเพิ่มใน MySQL 5.1.7 แต่พบว่าเป็นอันตรายและถูกลบใน MySQL 5.1.23
zloctb

11
หวังว่า MySQL จะใช้RENAME DATABASEคำสั่งทำงานใหม่ที่ไม่มีอันตรายใด ๆ เนื่องจากไม่มีวิธีที่ง่ายในการทำงานนี้ในขณะนี้ ไม่มีเหตุผลที่ชัดเจนว่าทำไมมันอันตรายในเอกสารดังนั้นพวกเขาควรจะสามารถทดแทนได้ อย่างน้อยก็มีคนใส่บั๊กคำขอคุณสมบัติไว้ในเว็บไซต์ของพวกเขา ยกตัวอย่างเช่นbugs.mysql.com/bug.php?id=58593และbugs.mysql.com/bug.php?id=1698
Edward

การเชื่อมโยงจะเสียตอนนี้ ...
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
ฉันเพิ่งทำสิ่งนี้กับฐานข้อมูล InnoDB ที่มี 30+ ตารางโดยใช้การตั้งค่า file_per_table และแม้ว่าบางตารางมี 3+ ล้านแถวมันจะเสร็จสมบูรณ์ใน <1 วินาที มันก็ดูเหมือนว่าจะย้ายไฟล์ที่จัดเก็บข้อมูลมากกว่าการทำอะไรที่ซับซ้อนมากขึ้น ... 2 ถ้าเป็นไปได้ :)
เดฟ Rix

87
"RENAME DATABASE ถูกพบว่าเป็นอันตรายและถูกลบใน MySQL 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
นอกจากนี้สิ่งนี้จะไม่ทำงานสำหรับตารางใด ๆ ที่มีทริกเกอร์ คุณจำเป็นต้องค้นหาทริกเกอร์และดัมพ์ทริกเกอร์ก่อนที่จะย้ายตารางจากนั้นอิมพอร์ตทริกเกอร์ที่ถูกดัมพ์ไปยังเป้าหมาย db
Olfan

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 ให้ใช้สิ่งต่อไปนี้ตามที่แนะนำโดย @Pablo Marin-Garcia:

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

86
ดังที่ OP กล่าวว่า "[t] เขาไม่ใช่ตัวเลือกสำหรับฐานข้อมูลขนาดใหญ่มาก"
pilcrow

3
อย่าลืมลบฐานข้อมูลต้นฉบับ
Pavel Radzivilovsky

3
คำตอบที่ยอดเยี่ยม! คู่ของคำแนะนำในการปรับปรุงเพิ่มเติมเนื่องจากอาจเป็นความสามารถทั้งหมด: (1) ย้ายส่วนของรหัส Pablo Marin-Garcia ไปด้านบนเนื่องจากดูเหมือนว่าเป็นคำตอบที่ดีที่สุด (2) ใส่-p<password>แทน-pทุกที่เพื่อให้ข้อความทำงานโดยไม่ปรากฏขึ้นทันที .
Steve Chambers

9
การใช้รุ่น piped ฉันได้รับ "ป้อนรหัสผ่าน: สอง" แจ้งดังนี้: Enter password: Enter password: ดูเหมือนว่าจะใช้รหัสผ่านเดียว แต่ไม่ใช่ทั้งสองอย่าง ฉันไม่มีรายละเอียดหรือไม่?
Ryan

33
ฉันประหลาดใจที่ไม่มีใครพูดถึงเรื่องนี้ แต่คุณควรเพิ่มการ--routinesตั้งค่าสถานะลงในคำสั่ง mysqldump ด้วยเพื่อให้แน่ใจว่ากระบวนการที่เก็บไว้ถูกคัดลอกไปทั่ว
Carlos P

205

ฉันคิดว่าวิธีแก้ปัญหานั้นง่ายกว่าและได้รับการแนะนำโดยนักพัฒนา phpMyAdmin มีการดำเนินการนี้

จาก phpMyAdmin เลือกฐานข้อมูลที่คุณต้องการเลือก ในแท็บจะมีหนึ่งชื่อปฏิบัติการให้ไปที่ส่วนการเปลี่ยนชื่อ นั่นคือทั้งหมดที่

แนะนำให้สร้างฐานข้อมูลใหม่โดยใช้ชื่อใหม่ดัมพ์ตารางทั้งหมดของฐานข้อมูลเก่าลงในฐานข้อมูลใหม่แล้วปล่อยฐานข้อมูลเก่า

ป้อนคำอธิบายภาพที่นี่


76
สมมติว่าคุณมี php ในสภาพแวดล้อมของคุณหรือใช้ phpmyadmin
Chris

26
ค่อนข้างอันตรายแม้ว่าคุณจะมี phpMyAdmin - แบ็คเอนด์อาจล้มเหลวกลางกระบวนการปล่อยสอง dbs ในสถานะที่ไม่รู้จักหรืออาจใช้เวลานานมากซึ่งนำไปสู่การหยุดทำงานของ front-end หรือ PHP
mozboz

20
นั่นเป็นความจริง @mozboz แต่ฉันทำมา 10 ปีแล้วและไม่เคยมีปัญหานั้น เหมือนกันถ้าคุณใช้คำสั่งผ่านเชลล์และคอมพิวเตอร์คุณขัดข้อง มีความเป็นไปได้ แต่อะไรนะ? 1 ต่อ 1 quadrillion?
raphie

24
สคริปต์ผ่านคอนโซลยังเป็นส่วนหน้าที่สามารถวางกับปัญหาเดียวกัน
เกร็ก

11
แต่การทำงานของคอนโซลนั้นมีความน่าเชื่อถือมากกว่า PhpMyAdmin โดยเฉพาะที่ฐานข้อมูลขนาดใหญ่เข้ามาเกี่ยวข้องซึ่งเป็นกรณีของ OP ส่วนตัวฉันขอแนะนำวิธีคอนโซลใด ๆ มากกว่า PMA ถ้าคุณมีฐานข้อมูลขนาดใหญ่พอสมควร จำเป็นต้องพูดในฐานข้อมูลขนาดเล็ก PMA เป็นสิ่งที่ดี
Teodor Sandu

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 DATABASEคำสั่งที่หายไปใน MySQL:

  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. ลบฐานข้อมูลเก่า

มันถูกนำมาจากการลอกเลียนแบบที่ขาดหายไป RENAME ฐานข้อมูลคำสั่งใน MySQL


1
ที่สมบูรณ์แบบ! ฉันทดสอบสิ่งนี้ด้วยตาราง InnoDB และ MyISAM ทางออกที่เร็วที่สุดที่ฉันทดสอบ (เปลี่ยนชื่อตารางเกือบจะทันทีไม่ล่าช้า)!
ฟิลิปป์

ที่ดี! เพียงจำไว้ว่าต้องแก้ไขสิทธิ์ในภายหลัง
Adam Faryna

PS ทำสิ่งนี้ให้ดีขึ้นก่อนที่คุณจะเรียกใช้คิวรีการเปลี่ยนชื่อถ้าคุณทำงานกับฐานข้อมูลสด
Adam Faryna

ใช้งานได้หรือไม่หากตารางมีข้อ จำกัด ในการอ้างอิง ฉันคาดหวังไม่ได้
dolmen

24

สามตัวเลือก:

  1. สร้างฐานข้อมูลใหม่นำเซิร์ฟเวอร์ลงย้ายไฟล์จากโฟลเดอร์ฐานข้อมูลหนึ่งไปยังอีกโฟลเดอร์หนึ่งแล้วรีสตาร์ทเซิร์ฟเวอร์ โปรดทราบว่านี่จะใช้งานได้หากตารางทั้งหมดของคุณเป็น MyISAM

  2. สร้างฐานข้อมูลใหม่ใช้คำสั่ง CREATE TABLE ... LIKE จากนั้นใช้ INSERT ... SELECT * FROM คำสั่ง

  3. ใช้ mysqldump และโหลดซ้ำกับไฟล์นั้น


+ สำหรับการอ้างอิง myisam ฉันนึกไม่ออกว่าทำไมสิ่งนี้ถึงไม่ได้ผลสำหรับฉัน
Christian Payne

5
คำถามระบุว่าสิ่งนี้จะต้องใช้กับ InnoDB ไม่ใช่ MyISAM
D-Rock

@ D-Rock บอกสิ่งนั้นกับ Google ผู้ซึ่งนำผู้คนมาที่นี่ตามชื่อ
jiggunjer

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
การเปลี่ยนชื่อโฟลเดอร์จะทำให้ของเล่นแตก
ViniciusPires

1
@Rahly แม้ว่าจะมีการตั้งค่าไฟล์หนึ่งไฟล์ต่อหนึ่งตาราง แต่มันก็ยังอันตรายอยู่ตารางที่สร้างขึ้นก่อนที่ไฟล์หนึ่งไฟล์ต่อหนึ่งตารางจะมีปัญหาเว้นแต่คุณจะรู้ว่าฐานข้อมูลนั้นถูกสร้างขึ้นหลังจากตั้งค่าสถานะนั้นแล้ว
Qian Chen

โดยทั่วไปแล้วแม้ว่าคนส่วนใหญ่จะมีระบบของพวกเขาไม่ทางใดก็ทางหนึ่งผู้คนจะไม่ได้รับการสุ่มฟุบอยู่ว่าจะมีหรือไม่มีหนึ่งตารางต่อไฟล์ นอกจากนี้แม้ในสถานการณ์ของคุณหากตารางถูกสร้างขึ้นก่อนที่จะตั้งค่าสถานะพวกเขาจะไม่อยู่เป็นไฟล์แยกต่างหากในสถานที่แรกดังนั้นการย้ายจะไม่ทำงานและยังคงปลอดภัยไม่มีอันตราย จำไว้ว่าฐานข้อมูลไม่ทำงานเมื่อมีการย้าย
Rahly

สิ่งที่เทียบเท่ากับ mysql ติดตั้งกับ homebrew ใน OS X: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
ระวังด้วยนะ หากคุณไม่ได้ลงชื่อเข้าใช้ด้วยผู้ใช้รูทคุณอาจมีสิทธิ์ จำกัด ทำให้การเปลี่ยนชื่อล้มเหลว แต่การดร็อปเป็นผลสำเร็จทำให้ฐานข้อมูลถูกดร็อป สคริปต์ที่ดีเป็นอย่างอื่น
Lex

3
ฉันเพิ่มset -eไปยังจุดเริ่มต้นของสคริปต์ซึ่งจะทำให้การดำเนินการเพื่อยุติความล้มเหลวและควรลดปัญหานั้น
มิคเคล

19

ฉันเพิ่งเจอวิธีที่ดีมากที่จะทำงานกับ MyISAM และ InnoDB และเร็วมาก:

RENAME TABLE old_db.table TO new_db.table;

ฉันจำไม่ได้ว่าอ่านแล้ว แต่เครดิตไปกับคนอื่นไม่ใช่ฉัน


@ArkadijKuzhel ไม่คิดอย่างนั้น ฉันคิดว่าคุณกำลังพูดถึง RENAME DATABASE
Rob Grant

สิ่งนี้ช่วยได้จริงๆฉันสร้างฐานข้อมูลเปล่าใหม่แล้วใช้รหัสตารางทั้งหมดถูกนำเข้าด้วยชื่อที่ต้องการ
JulyOrdinary

3
ปัญหานี้เกิดจากปัญหาเดียวกับคำตอบที่ยอมรับ - "พบว่าชื่อฐานข้อมูลเป็นอันตรายและถูกลบใน MySQL 5.1.23" - จาก dev.mysql.com/doc/refman/5.1/th/rename-database.html
Blake Frederick

16

วิธีกระสุนที่ง่ายที่สุดในการเปลี่ยนชื่อเสร็จสมบูรณ์(รวมถึงการทิ้งฐานข้อมูลเก่าในตอนท้ายดังนั้นจึงเป็นการเปลี่ยนชื่อแทนสำเนา) :

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

ขั้นตอน:

  1. คัดลอกบรรทัดลงใน Notepad
  2. แทนที่การอ้างอิงทั้งหมดไปที่ "olddbname", "newdbname", "mypassword" (+ เลือก "root") ด้วยการเทียบเท่าของคุณ
  3. ดำเนินการทีละบรรทัดบนคำสั่ง (ป้อน "y" เมื่อได้รับแจ้ง)

หลีกเลี่ยงการเพิ่มรหัสผ่านของคุณในคอนโซลเนื่องจากไม่ปลอดภัย หากคุณทำสิ่งนี้แล้วให้ใช้ประวัติ -cw เพื่อลบ แทนที่จะปล่อยให้รหัสผ่านว่างเปล่าและป้อนรหัสผ่านหลังพรอมต์
Tommie C.

ใช้เวลานานผิดปกติมากกว่า 20 นาทีโดยไม่เสร็จสิ้น ยกเลิกได้ไหม?
Sigu Magwa

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
ไม่สามารถใช้งานได้กับฐานข้อมูลขนาดใหญ่
mikesl

14

MySQL ไม่รองรับการเปลี่ยนชื่อฐานข้อมูลผ่านส่วนต่อประสานคำสั่งในขณะนี้ แต่คุณสามารถเปลี่ยนชื่อฐานข้อมูลได้หากคุณเข้าถึงไดเรกทอรีที่ MySQL จัดเก็บฐานข้อมูลไว้ สำหรับการติดตั้ง MySQL เริ่มต้นมักจะอยู่ในไดเรกทอรีข้อมูลภายใต้ไดเรกทอรีที่ติดตั้ง MySQL ค้นหาชื่อของฐานข้อมูลที่คุณต้องการเปลี่ยนชื่อภายใต้ไดเรกทอรีข้อมูลและเปลี่ยนชื่อ การเปลี่ยนชื่อไดเรกทอรีอาจทำให้เกิดปัญหาสิทธิ์บางอย่าง ระวัง.

หมายเหตุ:คุณต้องหยุด MySQL ก่อนจึงจะสามารถเปลี่ยนชื่อฐานข้อมูลได้

ฉันขอแนะนำให้สร้างฐานข้อมูลใหม่ (ใช้ชื่อที่คุณต้องการ) และส่งออก / นำเข้าข้อมูลที่คุณต้องการจากฐานข้อมูลเก่าไปยังใหม่ ค่อนข้างง่าย


13

เมื่อคุณเปลี่ยนชื่อฐานข้อมูลใน PHPMyAdmin จะสร้างการถ่ายโอนข้อมูลจากนั้นลดลงและสร้างฐานข้อมูลใหม่ด้วยชื่อใหม่


4
โปรดทราบว่าคุณลักษณะนี้จะซ่อนอยู่เล็กน้อยภายใต้แท็บ "การดำเนินการ" เมื่อคุณคลิกที่ฐานข้อมูล
Maris B.

13

มี 2 ​​วิธี:

วิธีที่ 1:วิธีที่รู้จักกันดีสำหรับการเปลี่ยนชื่อสคีมาฐานข้อมูลคือการดัมพ์สกีมาโดยใช้ Mysqldump และกู้คืนในสคีมาอื่นแล้วปล่อยสคีมาเก่า (ถ้าจำเป็น)

จากเชลล์

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

แม้ว่าวิธีการข้างต้นนั้นง่าย แต่ก็ใช้เวลาและพื้นที่มาก เกิดอะไรขึ้นถ้าคีมามีขนาดเกิน100GB มีวิธีที่คุณสามารถไพพ์คำสั่งข้างต้นเข้าด้วยกันเพื่อประหยัดพื้นที่ได้อย่างไรก็ตามมันจะไม่ประหยัดเวลา

เพื่อแก้ไขสถานการณ์ดังกล่าวมีวิธีการอื่นที่รวดเร็วในการเปลี่ยนชื่อสกีมาอย่างไรก็ตามต้องใช้ความระมัดระวังในขณะที่ทำ

วิธีที่ 2: MySQL มีคุณสมบัติที่ดีมากสำหรับการเปลี่ยนชื่อตารางที่ใช้งานได้กับ schema ที่แตกต่างกัน การดำเนินการเปลี่ยนชื่อนี้เป็นแบบอะตอมมิกและไม่มีใครสามารถเข้าถึงตารางได้ในขณะที่กำลังถูกเปลี่ยนชื่อ การดำเนินการนี้ใช้เวลาสั้น ๆ เนื่องจากการเปลี่ยนชื่อของตารางหรือสคีมาเป็นการเปลี่ยนแปลงข้อมูลเมตาเท่านั้น นี่คือวิธีการขั้นตอนในการเปลี่ยนชื่อ:

สร้างสกีมาฐานข้อมูลใหม่ด้วยชื่อที่ต้องการ เปลี่ยนชื่อตารางจากสคีมาเก่าไปเป็นสคีมาใหม่โดยใช้คำสั่ง“ RENAME TABLE” ของ MySQL ปล่อยคีมาฐานข้อมูลเก่า If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. “ RENAME TABLE” ของ MySQL ล้มเหลวหากมีทริกเกอร์อยู่บนตาราง เพื่อแก้ไขปัญหานี้เราสามารถทำสิ่งต่อไปนี้:

1) Dump the triggers, events and stored routines in a separate file.สิ่งนี้ทำได้โดยใช้แฟล็ก -E, -R (นอกเหนือจาก -t -d ซึ่งดัมพ์ทริกเกอร์) ไปยังคำสั่ง mysqldump เมื่อทริกเกอร์ถูกทิ้งเราจะต้องดรอปจาก schema เพื่อให้คำสั่ง RENAME TABLE ทำงานได้

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

2)สร้างรายการเฉพาะตาราง“ BASE” สิ่งเหล่านี้สามารถพบได้โดยใช้แบบสอบถามในinformation_schema.TABLESตาราง

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

3)ทิ้งมุมมองในไฟล์ out สามารถดูมุมมองได้โดยใช้แบบสอบถามใน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)วางทริกเกอร์ในตารางปัจจุบันใน old_schema

mysql> DROP TRIGGER <trigger_name>;
...

5)กู้คืนไฟล์ดัมพ์ข้างต้นเมื่อตาราง“ Base” ทั้งหมดที่พบในขั้นตอนที่ 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 สำหรับผู้ใช้เพื่อให้ตรงกับ schema_name ที่ถูกต้อง สิ่งเหล่านี้สามารถแก้ไขได้ด้วยการอัพเดทง่ายๆบน mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, ตาราง mysql.db ที่อัปเดตชื่อ old_schema เป็น new_schema และเรียก“ สิทธิ์ล้างข้อมูล”; แม้ว่า "วิธีที่ 2" ดูเหมือนจะซับซ้อนกว่า "วิธีที่ 1" เพียงเล็กน้อย แต่ก็สามารถเขียนสคริปต์ได้อย่างสมบูรณ์ สคริปต์ทุบตีง่าย ๆ ที่จะทำตามขั้นตอนข้างต้นตามลำดับที่เหมาะสมสามารถช่วยคุณประหยัดพื้นที่และเวลาในขณะที่เปลี่ยนชื่อสกีมาฐานข้อมูลในครั้งต่อไป

ทีม Percona Remote DBA ได้เขียนสคริปต์ชื่อ“ rename_db” ซึ่งทำงานในวิธีต่อไปนี้:

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

ในการสาธิตการใช้งานสคริปต์นี้ให้ใช้ตัวอย่าง schema“ emp” ที่สร้างทริกเกอร์ทดสอบสร้างรูทีนที่เก็บไว้ใน schema นั้น จะพยายามเปลี่ยนชื่อสกีมาฐานข้อมูลโดยใช้สคริปต์ซึ่งใช้เวลาสักครู่ในการดำเนินการให้ตรงข้ามกับวิธีการถ่ายโอนข้อมูล / คืนค่าที่ใช้เวลานาน

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               |
+--------------------+

ดังที่คุณเห็นในผลลัพธ์ข้างต้นสกีมาฐานข้อมูล“ emp” ถูกเปลี่ยนชื่อเป็น“ emp_test” ในเวลาน้อยกว่าหนึ่งวินาที สุดท้ายนี้คือสคริปต์จาก Percona ที่ใช้ด้านบนสำหรับ“ วิธีที่ 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: // localhost / phpmyadmin /
  2. เลือก DB ของคุณ
  3. คลิกที่แท็บปฏิบัติการ
  4. จะมีแท็บเป็น "เปลี่ยนชื่อฐานข้อมูลเป็น" เพิ่มชื่อใหม่และทำเครื่องหมายปรับสิทธิ์
  5. คลิกที่ไป

ป้อนคำอธิบายรูปภาพที่นี่


1
โซลูชัน phpMyAdmin มักเป็นโซลูชันที่ไม่ดีเนื่องจากสภาพแวดล้อมบางอย่างมีสภาพแวดล้อมที่ จำกัด
Daniel Antunes Pinto

ไม่ใช่ทางออกที่ "ดี" แต่ขอบคุณที่ไม่เป็นอย่างที่ฉันต้องการ
jamie

1
กรุณาลงคะแนนถ้ามันเหมาะกับคุณ .. มันจะช่วย .. ขอบคุณ
Shubham Jain

1
สิ่งนี้ใช้ได้กับฉันในสภาพแวดล้อม phpMyAdmin +1
วิลเลียม

12

สำหรับผู้ที่เป็นผู้ใช้ Mac นั้น Sequel Pro มีตัวเลือก Rename Database ในเมนูฐานข้อมูล http://www.sequelpro.com/


5
ระวังตัวเลือกนี้หากคุณมีมุมมองหรือทริกเกอร์ในฐานข้อมูลของคุณ เบื้องหลังตัวเลือกเมนูนี้คือสคริปต์ที่จะสร้างฐานข้อมูลใหม่และย้ายตารางทั้งหมด สิ่งนี้จะไม่ทำงานสำหรับการดูหรือทริกเกอร์ดังนั้นจะถูกทิ้งไว้ในฐานข้อมูลเก่าของคุณ ผลลัพธ์คือฐานข้อมูลที่เสียหายสองฐานที่ต้องการแก้ไข
Olfan

10

คำตอบส่วนใหญ่ที่นี่ผิดด้วยหนึ่งในสองเหตุผล:

  1. คุณไม่สามารถใช้ RENAME TABLE เนื่องจากอาจมีมุมมองและทริกเกอร์ หากมีทริกเกอร์ RENAME TABLE จะล้มเหลว
  2. คุณไม่สามารถใช้ mysqldump หากคุณต้องการ "เร็ว" (ตามที่ร้องขอในคำถาม) เปลี่ยนชื่อฐานข้อมูลขนาดใหญ่

Percona มีบล็อกโพสต์เกี่ยวกับวิธีการทำเช่นนี้: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

และสคริปต์โพสต์ (ทำ?) โดย Simon R Jones ที่ทำสิ่งที่แนะนำในโพสต์นั้น ฉันแก้ไขข้อบกพร่องที่พบในสคริปต์ คุณสามารถดูได้ที่นี่:

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


ฉันชอบสคริปต์นี้มันเกือบจะเป็นสากล อย่างไรก็ตามมันล้มเหลวในการประมวลผลกรณีและปัญหาเมื่อมี VIEW ที่ถูกโยงโซ่หลายตัวโดยที่ definer ไม่ใช่รูท
เพิ่ม

9

เป็นไปได้ที่จะเปลี่ยนชื่อตารางทั้งหมดภายในฐานข้อมูลให้อยู่ภายใต้ฐานข้อมูลอื่นโดยไม่ต้องทำการดัมพ์และกู้คืนแบบเต็ม

วางกระบวนการหากมีอยู่ mysql.rename_db;
DELIMITER ||
สร้างกระบวนการ mysql.rename_db (ใน old_db VARCHAR (100), ใน new_db VARCHAR (100))
เริ่ม
เลือก CONCAT ('สร้างฐานข้อมูล', new_db, ';') `# สร้างฐานข้อมูลใหม่`;
เลือก CONCAT ('RENAME Table `', old_db, '` .`, table_name,' to to '', new_db, '' .`, table_name, '`;')` # แก้ไข table` จาก information_schema.tables table_schema = old_db;
เลือก CONCAT ('ฐานข้อมูล DROP `', old_db, '`;') `# วางฐานข้อมูลเก่า ';
END ||
DELIMERER;

$ เวลา mysql -uroot -e "โทร mysql.rename_db ('db1', 'db2');" | mysql -root

อย่างไรก็ตามทริกเกอร์ใด ๆ ใน db เป้าหมายจะไม่พอใจ คุณจะต้องวางพวกเขาก่อนแล้วสร้างมันใหม่หลังจากเปลี่ยนชื่อ

mysql -root -e "เรียก mysql.rename_db ('ทดสอบ', 'blah2');" | mysql -root
ข้อผิดพลาด 1435 (HY000) ที่บรรทัด 4: ทริกเกอร์ในแบบแผนที่ไม่ถูกต้อง

ปรับแต่งขนาดเล็กซึ่งทำให้งาน w / mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot แจ้งให้ทราบนี้คุณต้องใช้ - ชุดเพื่อเปลี่ยนการจัดรูปแบบการจัดรูปแบบดิบซึ่งผลลัพธ์ผลลัพธ์ w / ศูนย์การจัดรูปแบบ
mikesl

8

นี่คือไฟล์แบตช์ที่ฉันเขียนเพื่อทำให้เป็นแบบอัตโนมัติจากบรรทัดคำสั่ง แต่สำหรับ Windows / MS-DOS

ไวยากรณ์คือฐานข้อมูล rename_mysqldb ฐานข้อมูลใหม่ -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: เปลี่ยนชื่อฐานข้อมูลด้วยวิธีการคัดลอกตารางของฉัน
- Caveats: 
- จะปิดบังฐานข้อมูลใด ๆ ที่มีอยู่ด้วยชื่อเดียวกันกับชื่อฐานข้อมูล 'ใหม่'
- คัดลอกตารางเท่านั้น กระบวนงานที่เก็บไว้และวัตถุฐานข้อมูลอื่น ๆ จะไม่ถูกคัดลอก
- Tomer Altman (taltman@ai.sri.com)

ตัวคั่น //
วางกระบวนการถ้ามีอยู่ rename_db;
สร้าง PROCEDURE rename_db (ใน old_db VARCHAR (100), ใน new_db VARCHAR (100))
เริ่ม
    DECLARE current_table VARCHAR (100);
    ประกาศทำค่าเริ่มต้น INT 0;
    DECLARE old_tables CURSOR สำหรับเลือก table_name จาก data_schema.tables โดยที่ table_schema = old_db;
    ประกาศจัดการต่อเนื่องสำหรับการไม่พบตลาดหลักทรัพย์ = 1;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
    เตรียมความพร้อมจาก @output;
    ดำเนินการ stmt;

    SET @output = CONCAT ('สร้าง SCHEMA IF NOT EXISTS', new_db, ';');
    เตรียมความพร้อมจาก @output;
    ดำเนินการ stmt;

    OPEN old_tables;
    ซ้ำ
        FETCH old_tables เข้าสู่ current_table;
        ถ้าไม่ทำแล้ว
        SET @output = CONCAT ('แก้ไขตาราง', old_db, '.', current_table, 'เปลี่ยนชื่อ', new_db, '.', current_table, ';');
        เตรียมความพร้อมจาก @output;
        ดำเนินการ stmt;

        สิ้นสุดถ้า;
    จนกว่าจะเสร็จสิ้น REPEAT;

    ปิด old_tables;

END //
ตัวคั่น;

สิ่งนี้จะใช้ได้กับตารางเท่านั้นและหากตารางเหล่านี้ไม่มีทริกเกอร์ใด ๆ การดูและทริกเกอร์จะไม่ถูกย้ายโดยสิ่งนี้
Olfan

7

วิธีที่ง่ายที่สุดคือการใช้ซอฟต์แวร์ HeidiSQL ฟรีและโอเพนซอร์ส มันทำงานบน Windows และ Linux ใด ๆ ที่มีไวน์ (รันแอปพลิเคชัน Windows บน Linux, BSD, Solaris และ Mac OS X)

ในการดาวน์โหลด HeidiSQL โกโตะhttp://www.heidisql.com/download.php

ในการดาวน์โหลดไวน์, โกโตะhttp://www.winehq.org/

หากต้องการเปลี่ยนชื่อฐานข้อมูลใน HeidiSQL เพียงคลิกขวาที่ชื่อฐานข้อมูลและเลือก 'แก้ไข' จากนั้นป้อนชื่อใหม่และกด 'ตกลง'

มันง่ายมาก


1
หากมีขั้นตอนการจัดเก็บจะไม่สามารถเปลี่ยนชื่อได้
abksharma

@abksharma ที่จริงแล้วคุณจะได้รับข้อความDatabase "database_name" contains stored routine(s) which cannot be moved.ทริกเกอร์ (อย่างน้อยสำหรับฐานข้อมูล MariDB) จะถูกนับเป็นรูทีนที่เก็บไว้ ฉันไม่มีขั้นตอนการจัดเก็บใด ๆ แต่ไม่สามารถเปลี่ยนชื่อฐานข้อมูลได้จนกว่าจะทริกเกอร์ทั้งหมดหายไป
izogfif

7

สำหรับผู้ใช้ mac คุณสามารถใช้Sequel Pro(ฟรี) ซึ่งเพิ่งมีตัวเลือกให้เปลี่ยนชื่อฐานข้อมูล แม้ว่ามันจะไม่ลบฐานข้อมูลเก่า

เมื่อเปิดฐานข้อมูลที่เกี่ยวข้องเพียงคลิก: Database->Rename database...


บางครั้งมันก็ทำให้ DB เก่ายังมีชีวิตอยู่ แต่มันก็ว่างเปล่า อย่างไรก็ตามหากทำสำเนาคุณสามารถทำสำเนาและลบสำเนาเก่าได้ แต่ก็ยังคงเป็น 2 ขั้นตอนง่าย ๆ
Roee Gavirel

6

ฉันโพสต์คำถามเกี่ยวกับ Server Faultพยายามหลีกเลี่ยงการหยุดทำงานเมื่อกู้คืนฐานข้อมูลขนาดใหญ่มากโดยใช้ MySQL Proxy ฉันไม่ประสบความสำเร็จ แต่ฉันก็ตระหนักได้ในท้ายที่สุดสิ่งที่ฉันต้องการก็คือฟังก์ชั่น RENAME DATABASE เพราะการถ่ายโอนข้อมูล / การนำเข้าไม่ใช่ตัวเลือกเนื่องจากขนาดของฐานข้อมูลของเรา

มีฟังก์ชั่น RENAME TABLE ที่ติดตั้งอยู่ใน MySQL ดังนั้นฉันเลยเขียนสคริปต์ Python เพื่อทำงานให้ฉัน ฉันโพสต์ไว้บน GitHubในกรณีที่ผู้อื่นสามารถใช้งานได้



2
RENAME DATABASE ถูกดร็อปจากไวยากรณ์ไม่ใช่ RENAME Table
Duke

6

เพื่อความสะดวกของคุณด้านล่างเป็น shellscript ขนาดเล็กที่ต้องดำเนินการด้วยสองพารามิเตอร์: db-name และ db-name ใหม่

คุณอาจต้องเพิ่ม login-parameters เข้ากับ mysql-line หากคุณไม่ใช้ไฟล์. my.cnf ในโฮมไดเร็กตอรี่ของคุณ กรุณาทำการสำรองข้อมูลก่อนที่จะดำเนินการสคริปต์นี้


#!/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
สิ่งนี้จะไม่ทำงานสำหรับตารางที่แนบทริกเกอร์หรือมุมมองที่ไม่สามารถเปลี่ยนชื่อเป็นฐานข้อมูลอื่นได้
Olfan

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 ไม่รองรับคำหลัก "like" ในcreate databaseคำสั่ง? คุณได้รับมาจากไหน
Dragas

นี่คือลิงค์สำหรับcreate table likeไวยากรณ์: dev.mysql.com/doc/refman/5.7/en/create-table-like.html สำหรับการสร้างฐานข้อมูลเช่นนั้นดูเหมือนว่า MySQL ได้ลดคำสั่งตั้งแต่นั้นเป็นต้นมา
Tuncay Göncüoğlu

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 DATABASE เป็นวิธีที่เสนอโดย MySQL และ RENAME DATABASEนี้ถูกทิ้งไว้

จาก13.1.32 RENAME DATABASE ไวยากรณ์ :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

คำสั่งนี้ถูกเพิ่มใน MySQL 5.1.7 แต่พบว่าเป็นอันตรายและถูกลบใน MySQL 5.1.23


7
คุณมีตัวอย่างของไวยากรณ์หรือไม่? ฉันไม่รู้ว่าจะใช้วิธีใดในการalter databaseเปลี่ยนชื่อฐานข้อมูลเองและเอกสารที่คุณลิงก์ไปไม่แนะนำว่าเป็นไปได้
Jordan

@ จอร์แดนฉันก็สนใจเช่นกัน ฉันลองและลองและพบว่ามันใช้ได้เฉพาะกับรุ่น> 5.1 แต่ฉันไม่สามารถอัปเดตได้ในขณะนี้
fancyPants

5
-1: สำหรับการเขียนเกี่ยวกับวิธีที่เสนอแล้วให้ตัวอย่างของวิธีที่ไม่ได้เสนอในขณะที่หายไปโดยสิ้นเชิงแม้กระทั่งจะแสดงตัวอย่าง
hakre

3
นี่เป็นสิ่งที่ผิด เอกสารประกอบการเปลี่ยนชื่อฐานข้อมูล MySQLบอกว่า rename_database มีไว้สำหรับงานการเปลี่ยนชื่อที่เฉพาะเจาะจงมาก (ไม่ใช่กรณีทั่วไปของการเปลี่ยนชื่อฐานข้อมูล) ซึ่งขณะนี้มีการจัดการกับฐานข้อมูลแก้ไข: 'ในการดำเนินการอัพเกรดชื่อฐานข้อมูลด้วยการเข้ารหัสใหม่ให้ใช้ ALTER DATABASE db_name DATA DIRECTORY NAME แทน 'คุณไม่สามารถใช้สิ่งนี้เพื่อเปลี่ยนชื่อฐานข้อมูลตามที่คุณต้องการแม้จะไม่มีชื่อ db ใหม่ในคำสั่งนี้!
Kanat Bolazar

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 เป็นภาษาสเปนดังนั้นฉันจึงไม่แน่ใจว่าชื่อของส่วนต่าง ๆ เป็นภาษาอังกฤษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.