Làm cách nào để nhanh chóng đổi tên cơ sở dữ liệu MySQL (thay đổi tên lược đồ)?


959

Hướng dẫn sử dụng MySQL tại MySQL bao gồm điều này.

Thông thường tôi chỉ đổ cơ sở dữ liệu và nhập lại nó với một tên mới. Đây không phải là một lựa chọn cho cơ sở dữ liệu rất lớn. Rõ ràng là RENAME {DATABASE | SCHEMA} db_name TO new_db_name; làm những điều xấu, chỉ tồn tại trong một số ít các phiên bản, và là một ý tưởng tồi tổng thể .

Điều này cần phải hoạt động với InnoDB , nơi lưu trữ mọi thứ rất khác so với MyISAM .



5
Tuyên bố này RENAME DATABASE Cú pháp đã được thêm vào MySQL 5.1.7 nhưng được phát hiện là nguy hiểm và đã bị xóa trong MySQL 5.1.23.
zloctb

11
Hy vọng rằng MySQL sẽ thực hiện một RENAME DATABASEtuyên bố mới, hoạt động mà không có bất kỳ nguy hiểm nào, vì hiện tại không có cách nào dễ dàng để thực hiện nhiệm vụ này. Không có lý do rõ ràng tại sao nó nguy hiểm trong tài liệu để họ có thể thay thế. Ít nhất mọi người đã đặt các lỗi yêu cầu tính năng trên trang web của họ. Ví dụ: bug.mysql.com/orms.php?id=58593bug.mysql.com/orms.php?id=1698 .
Edward

các liên kết hiện đã bị hỏng ...
oldboy

Câu trả lời:


833

Đối với InnoDB , dường như hoạt động sau đây: tạo cơ sở dữ liệu trống mới, sau đó đổi tên từng bảng thành cơ sở dữ liệu mới:

RENAME TABLE old_db.table TO new_db.table;

Bạn sẽ cần phải điều chỉnh các quyền sau đó.

Để tạo kịch bản lệnh trong trình bao, bạn có thể sử dụng một trong các cách sau:

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

HOẶC LÀ

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;

Ghi chú:

  • Không có khoảng cách giữa tùy chọn -pvà mật khẩu. Nếu cơ sở dữ liệu của bạn không có mật khẩu, hãy xóa -u username -ppasswordphần đó.
  • Nếu một số bảng có một kích hoạt, nó không thể được chuyển sang cơ sở dữ liệu khác bằng phương pháp trên (sẽ dẫn đến Trigger in wrong schemalỗi). Nếu đó là trường hợp, sử dụng một cách truyền thống để sao chép cơ sở dữ liệu và sau đó loại bỏ cơ sở dữ liệu cũ:

    mysqldump old_db | mysql new_db

  • Nếu bạn đã lưu trữ các thủ tục, bạn có thể sao chép chúng sau đó:

    mysqldump -R old_db | mysql new_db


26
Tôi vừa mới thực hiện điều này với cơ sở dữ liệu InnoDB với hơn 30 bảng, sử dụng cài đặt file_per_table và mặc dù một số bảng có hơn 3 triệu hàng, nhưng nó đã hoàn thành trong <1 giây. Nó dường như chỉ di chuyển các tệp trên bộ lưu trữ, thay vì làm bất cứ điều gì phức tạp hơn ... +2 nếu có thể :)
Dave Rix

87
"RENAME DATABASE bị phát hiện là nguy hiểm và đã bị xóa trong MySQL 5.1.23" - từ dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani

13
Xin lưu ý rằng điều này sẽ không hoạt động cho lượt xem. Bạn không thể đổi tên các khung nhìn để làm cho chúng nhảy từ cơ sở dữ liệu sang một cơ sở dữ liệu khác. Sử dụng DROP VIEWCREATE VIEWthay vào đó. Vụng về, vâng. Bạn có thể muốn thực hiện mysqldumpđể di chuyển các khung nhìn, sau lần đầu tiên di chuyển tất cả các bảng. Cũng lưu ý rằng SHOW TABLESsẽ hiển thị bảng VÀ lượt xem, vì vậy hãy cẩn thận.
tuomassalo

9
Ngoài ra, điều này sẽ không hoạt động cho bất kỳ bảng có kích hoạt. Bạn cần tìm, kết xuất và loại bỏ các kích hoạt trước khi di chuyển bảng, sau đó nhập các kích hoạt được kết xuất vào db mục tiêu.
Olfan

5
Tài liệu liên kết RENAME DATABASEđược cập nhật (tức là đang hoạt động) tại sao bị xóa: dev.mysql.com/worklog/task/?id=4030
alexis

443

Sử dụng một vài lệnh đơn giản sau:

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

Hoặc để giảm I / O, hãy sử dụng các mục sau theo đề xuất của @Pablo Marin-Garcia:

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

86
Như OP đã nói, "[t] của anh ấy không phải là một lựa chọn cho cơ sở dữ liệu rất lớn."
hương

3
Đừng quên DROP cơ sở dữ liệu gốc
Pavel Radzivilovsky

3
Câu trả lời rực rỡ! Một vài gợi ý để cải thiện hơn nữa vì điều này có lẽ đang bị thu hút bởi tất cả các khả năng: (1) Di chuyển đoạn mã của Pablo Marin-Garcia lên đầu vì đây có vẻ là câu trả lời hay nhất (2) -p<password>Thay vì -pở khắp mọi nơi để các câu lệnh chạy mà không xuất hiện kịp thời .
Steve Chambers

9
Sử dụng phiên bản đường ống, tôi nhận được hai lời nhắc "Nhập mật khẩu:" như vậy: Enter password: Enter password: Có vẻ như lấy một mật khẩu, nhưng không phải cả hai. Tôi có thiếu một chi tiết không?
Ryan

33
Tôi ngạc nhiên khi không ai đề cập đến điều này, nhưng bạn thực sự nên thêm --routinescờ vào các lệnh mysqldump, để đảm bảo rằng các thủ tục được lưu trữ được sao chép qua.
Carlos P

205

Tôi nghĩ rằng giải pháp đơn giản hơn và được đề xuất bởi một số nhà phát triển. phpMyAdmin có một hoạt động cho việc này.

Từ phpMyAdmin, chọn cơ sở dữ liệu bạn muốn chọn. Trong các tab có một hoạt động được gọi là Hoạt động, đi đến phần đổi tên. Đó là tất cả.

Nó, như nhiều người đề xuất, tạo ra một cơ sở dữ liệu mới với tên mới, kết xuất tất cả các bảng của cơ sở dữ liệu cũ vào cơ sở dữ liệu mới và bỏ cơ sở dữ liệu cũ.

Nhập mô tả hình ảnh ở đây


76
Giả sử bạn thậm chí có php trên môi trường của bạn hoặc sử dụng phpmyadmin.
Chris

26
Khá nguy hiểm ngay cả khi bạn có phpMyAdmin - phần cuối có thể thất bại giữa quá trình khiến hai dbs ở trạng thái không xác định hoặc có thể mất một thời gian rất dài, dẫn đến việc treo mặt trước hoặc hết thời gian PHP.
mozboz

20
Đó là sự thật @mozboz, nhưng tôi đã làm điều này trong 10 năm và chưa bao giờ gặp phải vấn đề đó. Cũng giống như vậy nếu bạn chạy lệnh thông qua trình bao và máy tính của bạn gặp sự cố. Có khả năng nhưng cái gì? 1 đến 1 triệu triệu?
raphie

24
Một tập lệnh thông qua bảng điều khiển cũng là một giao diện người dùng có thể gặp vấn đề tương tự.
Greg

11
Tuy nhiên, các hoạt động của bàn điều khiển đáng tin cậy hơn nhiều so với PhpMyAdmin, đặc biệt là khi có các cơ sở dữ liệu lớn, đó là trường hợp của OP. Cá nhân tôi sẽ đề nghị mạnh mẽ bất kỳ phương pháp giao diện điều khiển nào hơn là PMA nếu bạn có một cơ sở dữ liệu lớn. Không cần phải nói, trên cơ sở dữ liệu nhỏ PMA cũng tốt như vậy.
Teodor Sandu

107

Bạn có thể sử dụng SQL để tạo tập lệnh SQL để chuyển từng bảng trong cơ sở dữ liệu nguồn của bạn sang cơ sở dữ liệu đích.

Bạn phải tạo cơ sở dữ liệu đích trước khi chạy tập lệnh được tạo từ lệnh.

Bạn có thể sử dụng một trong hai tập lệnh này (ban đầu tôi đã đề xuất câu hỏi trước và ai đó đã "cải thiện" câu trả lời của tôi để sử dụng GROUP_CONCAT. Hãy chọn, nhưng tôi thích bản gốc hơn):

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

hoặc là

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

($ 1 và $ 2 tương ứng là nguồn và đích)

Điều này sẽ tạo ra một lệnh SQL mà sau đó bạn sẽ phải chạy.

Lưu ý rằng GROUP_CONCATcó giới hạn độ dài mặc định có thể vượt quá đối với cơ sở dữ liệu có số lượng bảng lớn. Bạn có thể thay đổi giới hạn đó bằng cách chạy SET SESSION group_concat_max_len = 100000000;(hoặc một số số lớn khác).


@BlakeFrederick Nó không sử dụng RENAME DATABASE, vậy vấn đề là gì?
tuxayo

Điều này có hoạt động nếu bảng có các ràng buộc tham chiếu? Tôi mong đợi không.
heo

42

Giả lập RENAME DATABASElệnh bị thiếu trong MySQL:

  1. Tạo một cơ sở dữ liệu mới
  2. Tạo các truy vấn đổi tên bằng:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Chạy đầu ra đó

  4. Xóa cơ sở dữ liệu cũ

Nó được lấy từ Mô phỏng Lệnh RENAME DATABASE trong MySQL .


1
Hoàn hảo! Tôi đã thử nghiệm điều này với các bảng InnoDB và MyISAM. Giải pháp nhanh nhất tôi đã thử nghiệm (đổi tên bảng gần như ngay lập tức, không chậm trễ)!
Philipp

Tuyệt quá! Chỉ cần nhớ để sửa đặc quyền sau đó.
Adam Faryna

ps. Tốt hơn nên làm điều này trước khi bạn chạy các truy vấn đổi tên nếu bạn đang làm việc trên DB trực tiếp.
Adam Faryna

Điều này có hoạt động nếu bảng có các ràng buộc tham chiếu? Tôi mong đợi không.
heo

24

Ba lựa chọn:

  1. Tạo cơ sở dữ liệu mới, đưa máy chủ xuống, di chuyển các tệp từ thư mục cơ sở dữ liệu này sang thư mục khác và khởi động lại máy chủ. Lưu ý rằng điều này sẽ chỉ hoạt động nếu TẤT CẢ các bảng của bạn là MyISAM.

  2. Tạo cơ sở dữ liệu mới, sử dụng các câu lệnh CREATE TABLE ... THÍCH, sau đó sử dụng các câu lệnh INSERT ... CHỌN * TỪ.

  3. Sử dụng mysqldump và tải lại với tập tin đó.


+ để tham khảo myisam. Tôi không thể hiểu tại sao điều này đã không làm việc cho tôi.
Christian Payne

5
Câu hỏi nói rằng điều này phải hoạt động cho InnoDB, không phải MyISAM
D-Rock

@ D-Rock nói điều đó với Google, người đưa mọi người đến đây dựa trên tiêu đề.
jiggunjer

24

Cách đơn giản

Thay đổi thư mục cơ sở dữ liệu:

cd /var/lib/mysql/

Tắt MySQL ... Điều này rất quan trọng!

/etc/init.d/mysql stop

Được rồi, cách này không hoạt động đối với InnoDB hoặc BDB-Cơ sở dữ liệu.

Đổi tên cơ sở dữ liệu:

mv old-name new-name

... hoặc cái bàn ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Khởi động lại MySQL

/etc/init.d/mysql start

Làm xong...

OK, cách này không hoạt động với cơ sở dữ liệu InnoDB hoặc BDB. Trong trường hợp này, bạn phải kết xuất cơ sở dữ liệu và nhập lại nó.


16
Đổi tên thư mục phá vỡ đồ chơi.
ViniciusPires

1
@Rahly, ngay cả khi một tệp trên mỗi bảng được đặt, nó vẫn nguy hiểm, các bảng được tạo trước khi một tệp trên mỗi bảng được đặt sẽ gặp sự cố, trừ khi bạn biết chắc chắn rằng cơ sở dữ liệu được tạo sau khi cờ đó được đặt.
Qian Chen

Nói chung, mặc dù, hầu hết mọi người sẽ có hệ thống của họ bằng cách này hay cách khác, mọi người sẽ không được lật ngẫu nhiên về việc có hoặc không có một bảng cho mỗi tệp. Ngoài ra, ngay cả trong kịch bản của bạn, nếu các bảng được tạo trước cờ, chúng sẽ không tồn tại dưới dạng các tệp riêng biệt ở vị trí đầu tiên, do đó, di chuyển sẽ không hoạt động và nó vẫn an toàn, không gây nguy hiểm. Hãy nhớ rằng, cơ sở dữ liệu KHÔNG chạy khi di chuyển đang diễn ra.
Rahly

Tương đương với mysql được cài đặt với homebrew trên 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

Bạn có thể sử dụng tập lệnh shell này:

Tham khảo: Làm thế nào để đổi tên cơ sở dữ liệu 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"

Nó đang hoạt động:

$ sh rename_database.sh oldname newname

6
Cẩn thận với điều này. Nếu bạn không đăng nhập bằng người dùng root, bạn có thể bị hạn chế quyền. Làm cho việc đổi tên không thành công nhưng sự sụt giảm thành công dẫn đến cơ sở dữ liệu bị hủy. Kịch bản đẹp khác.
Lex

3
Tôi đã thêm set -evào phần đầu của tập lệnh, điều này sẽ khiến việc thực thi chấm dứt khi thất bại và sẽ giảm thiểu vấn đề đó.
Mikkel

19

Gần đây tôi mới bắt gặp một cách rất hay để làm điều đó, hoạt động với MyISAM và InnoDB và rất nhanh:

RENAME TABLE old_db.table TO new_db.table;

Tôi không nhớ mình đã đọc nó ở đâu nhưng tín dụng dành cho người khác chứ không phải tôi.


@ArkadijKuzhel đừng nghĩ vậy. Tôi nghĩ rằng bạn đang nói về RENAME DATABASE.
Rob Grant

Điều này thực sự hữu ích, tôi đã tạo một Cơ sở dữ liệu trống mới và sau đó sử dụng mã, tất cả các bảng được nhập với tên mong muốn.
JulyOrdinary

3
Điều này gặp phải vấn đề tương tự như câu trả lời được chấp nhận - "RENAME DATABASE bị phát hiện là nguy hiểm và đã bị xóa trong MySQL 5.1.23" - từ dev.mysql.com/doc/refman/5.1/en/rename-database.html
Blake Frederick

16

Cách đơn giản nhất để thực hiện đổi tên hoàn toàn (bao gồm bỏ cơ sở dữ liệu cũ ở cuối để đổi tên thay vì sao chép) :

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

Các bước:

  1. Sao chép các dòng vào Notepad.
  2. Thay thế tất cả các tham chiếu thành "olddbname", "newdbname", "mypassword" (+ tùy chọn "root") bằng các tương đương của bạn.
  3. Thực hiện từng cái một trên dòng lệnh (nhập "y" khi được nhắc).

Tránh thêm mật khẩu của bạn vào bàn điều khiển vì nó không an toàn. Nếu bạn đã làm điều này đã sử dụng lịch sử -cw để loại bỏ. Thay vào đó hãy để trống mật khẩu và nhập nó sau dấu nhắc.
Tommie C.

Nó mất nhiều thời gian bất thường, hơn 20 phút mà không hoàn thành. Có thể hủy bỏ không?
Sigu Magwa

15

Đây là những gì tôi sử dụng:

$ 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
Không thể làm cho cơ sở dữ liệu lớn.
mikel

14

Hiện tại, MySQL không hỗ trợ đổi tên cơ sở dữ liệu thông qua giao diện lệnh của nó, nhưng bạn có thể đổi tên cơ sở dữ liệu nếu bạn có quyền truy cập vào thư mục lưu trữ cơ sở dữ liệu của MySQL. Đối với cài đặt MySQL mặc định, điều này thường nằm trong thư mục Dữ liệu trong thư mục cài đặt MySQL. Xác định tên của cơ sở dữ liệu bạn muốn đổi tên trong thư mục Dữ liệu và đổi tên nó. Đổi tên thư mục có thể gây ra một số vấn đề quyền mặc dù. Hãy nhận biết.

Lưu ý: Bạn phải dừng MySQL trước khi có thể đổi tên cơ sở dữ liệu

Tôi khuyên bạn nên tạo một cơ sở dữ liệu mới (sử dụng tên bạn muốn) và xuất / nhập dữ liệu bạn cần từ cũ sang mới. Khá đơn giản.


13

Khi bạn đổi tên cơ sở dữ liệu trong PHPMyAdmin, nó sẽ tạo một kết xuất, sau đó loại bỏ và tạo lại cơ sở dữ liệu với tên mới.


4
Lưu ý rằng tính năng này được ẩn một chút trong tab "Hoạt động", khi bạn nhấp vào cơ sở dữ liệu.
Maris B.

13

Vâng, có 2 phương pháp:

Phương pháp 1: Một phương pháp nổi tiếng để đổi tên lược đồ cơ sở dữ liệu là bằng cách loại bỏ lược đồ bằng Mysqldump và khôi phục nó trong một lược đồ khác, sau đó bỏ lược đồ cũ (nếu cần).

Từ Shell

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

Mặc dù phương pháp trên là dễ dàng, nhưng nó tốn thời gian và không gian. Điều gì xảy ra nếu lược đồ lớn hơn 100GB? Có những phương pháp mà bạn có thể ghép các lệnh trên lại với nhau để tiết kiệm không gian, tuy nhiên nó sẽ không tiết kiệm thời gian.

Để khắc phục các tình huống như vậy, có một phương pháp nhanh chóng khác để đổi tên các lược đồ, tuy nhiên, một số lưu ý phải được thực hiện trong khi thực hiện.

Phương pháp 2: MySQL có một tính năng rất tốt để đổi tên các bảng thậm chí hoạt động trên các lược đồ khác nhau. Hoạt động đổi tên này là nguyên tử và không ai khác có thể truy cập vào bảng trong khi nó được đổi tên. Điều này mất một thời gian ngắn để hoàn thành vì việc thay đổi tên của bảng hoặc lược đồ của nó chỉ là thay đổi siêu dữ liệu. Đây là cách tiếp cận thủ tục khi thực hiện đổi tên:

Tạo lược đồ cơ sở dữ liệu mới với tên mong muốn. Đổi tên các bảng từ lược đồ cũ thành lược đồ mới, sử dụng lệnh RENAME TABLE của MySQL. Bỏ lược đồ cơ sở dữ liệu cũ. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. Bẻ khóa RENAME TABLE của MySQL không thành công nếu có các trình kích hoạt tồn tại trên các bảng. Để khắc phục điều này, chúng ta có thể làm những điều sau đây:

1) Dump the triggers, events and stored routines in a separate file. Điều này được thực hiện bằng cách sử dụng các cờ -E, -R (ngoài -t -d để loại bỏ các kích hoạt) cho lệnh mysqldump. Khi các kích hoạt được kết xuất, chúng ta sẽ cần loại bỏ chúng khỏi lược đồ, để lệnh RENAME TABLE hoạt động.

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

2) Tạo danh sách các bảng duy nhất của BASE. Chúng có thể được tìm thấy bằng cách sử dụng một truy vấn trên information_schema.TABLESbảng.

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

3) Kết xuất các khung nhìn trong một tập tin. Lượt xem có thể được tìm thấy bằng cách sử dụng một truy vấn trên cùng một information_schema.TABLESbảng.

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) Thả các kích hoạt trên các bảng hiện tại trong old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Khôi phục các tệp kết xuất ở trên một khi tất cả các bảng cơ sở cơ sở được tìm thấy trong bước # 2 được đổi tên.

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

Những rắc rối với các phương thức trên: Chúng tôi có thể cần cập nhật GRANTS cho người dùng sao cho khớp với tên_bảng chính xác. Chúng có thể được sửa với một CẬP NHẬT đơn giản trên các bảng mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db cập nhật tên old_schema thành new_schema và gọi các đặc quyền của Flush; Mặc dù phương thức 2 “có vẻ phức tạp hơn một chút so với phương pháp 1“, nhưng điều này hoàn toàn có thể viết được. Một tập lệnh bash đơn giản để thực hiện các bước trên theo trình tự phù hợp, có thể giúp bạn tiết kiệm không gian và thời gian trong khi đổi tên các lược đồ cơ sở dữ liệu vào lần tới.

Nhóm DBA từ xa Percona đã viết một tập lệnh có tên là rename_db 'hoạt động theo cách sau:

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

Để thể hiện việc sử dụng tập lệnh này, đã sử dụng một lược đồ mẫu, emp emp, đã tạo các trình kích hoạt thử nghiệm, các thói quen được lưu trữ trên lược đồ đó. Sẽ cố gắng đổi tên lược đồ cơ sở dữ liệu bằng cách sử dụng tập lệnh, mất vài giây để hoàn thành trái ngược với phương pháp kết xuất / khôi phục tốn thời gian.

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

Như bạn có thể thấy trong kết quả đầu ra ở trên, lược đồ cơ sở dữ liệu, có thể đổi tên thành tên emp empestest trong chưa đầy một giây. Cuối cùng, đây là tập lệnh từ Percona được sử dụng ở trên cho phương thức 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

Điều gì về các ràng buộc tham chiếu?
heo

13

Các bước:

  1. Lượt http: // localhost / phpmyadmin /
  2. Chọn DB của bạn
  3. Nhấp vào tab hoạt động
  4. Sẽ có một tab là "Đổi tên cơ sở dữ liệu thành". Thêm tên mới và kiểm tra Điều chỉnh đặc quyền.
  5. Bấm vào Đi.

nhập mô tả hình ảnh ở đây


1
Một giải pháp phpMyAdmin thường là một giải pháp kém vì một số môi trường có môi trường hạn chế.
Daniel Antunes Pinto

Không phải là một giải pháp "tốt" nhưng cảm ơn không kém vì đó là những gì tôi đang tìm kiếm.
jamie

1
Vui lòng bỏ phiếu nếu nó hiệu quả với bạn .. nó sẽ giúp ích .. cảm ơn
Shubham Jain

1
Điều này hoạt động với tôi, trong môi trường phpMyAdmin, +1
William

12

Đối với những người dùng Mac, Sequel Pro có tùy chọn Đổi tên cơ sở dữ liệu trong menu Cơ sở dữ liệu. http://www.fterelpro.com/


5
Cảnh giác với tùy chọn này nếu bạn có bất kỳ chế độ xem hoặc kích hoạt nào trong cơ sở dữ liệu của mình. Đằng sau tùy chọn menu này là một tập lệnh sẽ tạo ra một cơ sở dữ liệu mới và di chuyển tất cả các bảng. Điều này sẽ không hoạt động cho lượt xem hoặc kích hoạt, vì vậy chúng sẽ bị bỏ lại trong cơ sở dữ liệu cũ của bạn. Kết quả là hai cơ sở dữ liệu bị hỏng cần sửa chữa.
Olfan

10

Hầu hết các câu trả lời ở đây đều sai vì một trong hai lý do:

  1. Bạn không thể chỉ sử dụng RENAME TABLE, vì có thể có lượt xem và trình kích hoạt. Nếu có kích hoạt, RENAME TABLE thất bại
  2. Bạn không thể sử dụng mysqldump nếu bạn muốn "nhanh chóng" (như được yêu cầu trong câu hỏi) đổi tên một cơ sở dữ liệu lớn

Percona có một bài đăng trên blog về cách làm tốt điều này: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

và kịch bản được đăng (thực hiện?) bởi Simon R Jones, đó là những gì được đề xuất trong bài viết đó. Tôi đã sửa một lỗi tôi tìm thấy trong kịch bản. Bạn có thể thấy nó ở đây:

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

Đây là một bản sao của nó:

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

Lưu nó vào một tệp được gọi rename_dbvà làm cho tập lệnh thực thi với chmod +x rename_dbsau đó sử dụng nó như./rename_db localhost old_db new_db


Tôi thích kịch bản này, nó gần như phổ quát. Tuy nhiên, nó đã thất bại trong việc xử lý một trường hợp khi có một số VIEW bị xiềng xích trong đó definer không phải là root.
Tham gia

9

Có thể đổi tên tất cả các bảng trong cơ sở dữ liệu thành cơ sở dữ liệu khác mà không phải thực hiện kết xuất và khôi phục đầy đủ.

THỦ TỤC DROP NẾU EXISTS mysql.rename_db;
GIAO HÀNG | |
TẠO QUY TRÌNH mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
BẮT ĐẦU
CHỌN CONCAT ('TẠO cơ sở dữ liệu', new_db, ';') `# tạo cơ sở dữ liệu mới`;
CHỌN CONCAT ('RENAME TABLE `', old_db, '` .`', tên_bảng, '`TO`', new_db, '`.`', tên_bảng, '`;') `# làm thay đổi bảng` TỪ thông tin bảng_schema = old_db;
CHỌN CONCAT ('DROP DATABASE `', old_db, '`;') `# thả cơ sở dữ liệu cũ`;
KẾT THÚC | |
GIAO HÀNG;

$ thời gian mysql -uroot -e "gọi mysql.rename_db ('db1', 'db2');" | mys -uroot

Tuy nhiên, bất kỳ kích hoạt nào trong db mục tiêu sẽ không được hạnh phúc. Bạn sẽ cần bỏ chúng trước sau đó tạo lại chúng sau khi đổi tên.

mysql -uroot -e "gọi mysql.rename_db ('kiểm tra', 'blah2');" | mys -uroot
LRI 1435 (HY000) ở dòng 4: Kích hoạt trong lược đồ sai

tinh chỉnh nhỏ làm cho công việc này w / mysql 5.x mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Lưu ý, bạn phải sử dụng --batch để thay đổi định dạng thành định dạng thô, điều này dẫn đến kết quả định dạng w / zero.
mikel

8

Đây là một tệp bó tôi đã viết để tự động hóa nó từ dòng lệnh, nhưng nó dành cho Windows / MS-DOS.

Cú pháp là rename_mysqldb cơ sở dữ liệu newdatabase -u [user] -p [password]

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

Thủ tục lưu trữ của TodoInTX không thực sự hiệu quả đối với tôi. Đây là cú đâm của tôi vào nó:

- thủ tục lưu trữ rename_db: Đổi tên cơ sở dữ liệu phương tiện sao chép bảng của tôi.
- Hãy cẩn thận: 
- Sẽ ghi đè bất kỳ cơ sở dữ liệu hiện có nào có cùng tên với tên cơ sở dữ liệu 'mới'.
- CHỈ sao chép bảng; thủ tục lưu trữ và các đối tượng cơ sở dữ liệu khác không được sao chép.
- Tomer Altman (Taltman@ai.sri.com)

dấu phân cách //
THỦ TỤC DROP NẾU EXISTS rename_db;
TẠO QUY TRÌNH rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
BẮT ĐẦU
    KHAI THÁC hiện tại VableAR VARCHAR (100);
    KHAI THÁC thực hiện INT DEFAULT 0;
    KHAI THÁC old_tables HIỆN TẠI CHO chọn tên_bảng từ information_schema.tables trong đó table_schema = old_db;
    KHAI THÁC TAY TIẾP TỤC TIẾP TỤC ĐỂ KHÔNG TÌM ĐƯỢC THIẾT LẬP = 1;

    SET @output = CONCAT ('DROP SCHema NẾU EXISTS', new_db, ';'); 
    CHUẨN BỊ stmt TỪ @output;
    EXECUTE stmt;

    SET @output = CONCAT ('TẠO SCHema NẾU KHÔNG EXISTS', new_db, ';');
    CHUẨN BỊ stmt TỪ @output;
    EXECUTE stmt;

    MỞ old_tables;
    NÓI LẠI
        FETCH old_tables VÀO current_table;
        NẾU KHÔNG xong
        SET @output = CONCAT ('bảng thay đổi', old_db, '.', Current_table, 'đổi tên', new_db, '.', Current_table, ';');
        CHUẨN BỊ stmt TỪ @output;
        EXECUTE stmt;

        HẾT NẾU;
    UNTIL đã thực hiện REPEAT END;

    ĐÓNG old_tables;

KẾT THÚC//
dấu phân cách;

Điều này sẽ chỉ hoạt động cho các bảng và chỉ khi các bảng này không có bất kỳ kích hoạt nào. Lượt xem và kích hoạt sẽ không được di chuyển bởi điều này.
Olfan

7

Phương pháp đơn giản nhất là sử dụng phần mềm HeidiQuery. Nó là nguồn mở và miễn phí. Nó chạy trên Windows và trên mọi Linux với Wine (chạy các ứng dụng Windows trên Linux, BSD, Solaris và Mac OS X).

Để tải xuống HeidiSQL, goto http://www.heidisql.com/doad.php .

Để tải về Rượu, hãy xem http://www.winehq.org/ .

Để đổi tên cơ sở dữ liệu trong HeidiSQL, chỉ cần nhấp chuột phải vào tên cơ sở dữ liệu và chọn 'Chỉnh sửa'. Sau đó nhập tên mới và bấm 'OK'.

Nó thật đơn giản


1
Nếu nó có các thủ tục lưu trữ, nó không thể được đổi tên.
abksharma

@abksharma Trên thực tế, bạn sẽ nhận được thông báo Database "database_name" contains stored routine(s) which cannot be moved.Kích hoạt (ít nhất là cho cơ sở dữ liệu MariDB) được tính là các thói quen được lưu trữ. Tôi không có bất kỳ thủ tục được lưu trữ nào, nhưng không thể đổi tên cơ sở dữ liệu cho đến khi tôi bỏ tất cả các kích hoạt.
izogfif

7

Đối với người dùng mac, bạn có thể sử dụng Sequel Pro(miễn phí), chỉ cung cấp tùy chọn đổi tên Cơ sở dữ liệu. Mặc dù nó không xóa DB cũ.

Sau khi mở DB có liên quan, chỉ cần nhấp: Database->Rename database...


Nó đôi khi để DB cũ còn sống nhưng nó trống rỗng. Tuy nhiên, nếu nó tạo một bản sao, bạn có thể tạo bản sao và xóa bản cũ, đây vẫn là 2 bước đơn giản.
Roee Gavirel

6

Tôi đã đặt ra một câu hỏi trên Server Fault khi cố gắng khắc phục thời gian chết khi khôi phục cơ sở dữ liệu rất lớn bằng cách sử dụng MySQL Proxy. Tôi đã không có bất kỳ thành công nào, nhưng cuối cùng tôi nhận ra điều tôi muốn là chức năng RENAME DATABASE vì kết xuất / nhập không phải là một tùy chọn do kích thước của cơ sở dữ liệu của chúng tôi.

Có một chức năng RENAME TABLE được tích hợp trong MySQL nên cuối cùng tôi đã viết một tập lệnh Python đơn giản để thực hiện công việc cho tôi. Tôi đã đăng nó trên GitHub trong trường hợp nó có thể được sử dụng cho người khác.



2
RENAME DATABASE đã bị loại bỏ khỏi cú pháp, không phải RENAME TABLE.
Công tước

6

Để thuận tiện cho bạn, bên dưới là một shellscript nhỏ phải được thực thi với hai tham số: tên db và tên db mới.

Bạn có thể cần phải thêm các tham số đăng nhập vào dòng mysql nếu bạn không sử dụng tệp .my.cnf trong thư mục chính của mình. Vui lòng tạo một bản sao lưu trước khi thực hiện kịch bản này.


#!/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
Điều này cũng vậy, sẽ không hoạt động đối với các bảng có kích hoạt được đính kèm hoặc cho các chế độ xem không thể đổi tên thành các cơ sở dữ liệu khác.
Olfan

6

Có vẻ như không ai đề cập đến điều này nhưng đây là một cách khác:

create database NewDatabaseName like OldDatabaseName;

sau đó cho mỗi bảng làm:

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

sau đó, nếu bạn muốn,

drop database OldDatabaseName;

Cách tiếp cận này sẽ có lợi thế là thực hiện toàn bộ chuyển trên máy chủ với lưu lượng mạng gần như bằng không, vì vậy nó sẽ nhanh hơn rất nhiều so với kết xuất / khôi phục.

Nếu bạn có các thủ tục lưu trữ / lượt xem / vv, bạn cũng có thể muốn chuyển chúng.


2
Theo như tôi biết 5.x không hỗ trợ từ khóa "thích" trong create databasecâu lệnh? Bạn lấy nó từ đâu vậy?
Dragas

Đây là liên kết cho create table likecú pháp: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Đối với việc tạo cơ sở dữ liệu như thế, có vẻ như MySQL đã bỏ điều khoản đó kể từ đó.
Tuncay Göncüoğlu

4

Đây là một cách nhanh chóng để tạo đổi tên tập lệnh sql, nếu bạn có nhiều bảng để di chuyển.

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

Có vẻ tốt, nhưng điều này không di chuyển các thủ tục hoặc lượt xem được lưu trữ.
davidpricedev

có lẽ bạn nên thêm dấu băm để bọc quanh tên bảng và tên lược đồ
Funkodebat

4

ALTER DATABASElà cách đề xuất xung quanh vấn đề này bởi MySQL và RENAME DATABASEbị loại bỏ.

Từ 13.1.32 RENAME DATABASE Cú pháp :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Tuyên bố này đã được thêm vào trong MySQL 5.1.7, nhưng nó đã bị phát hiện là nguy hiểm và đã bị xóa trong MySQL 5.1.23.


7
Bạn có bất kỳ cú pháp ví dụ? Tôi không biết cách nào để sử dụng alter databaseđể đổi tên cơ sở dữ liệu và tài liệu bạn liên kết đến không gợi ý rằng nó có thể.
Jordan

@Jordan tôi cũng sẽ quan tâm. Tôi đã thử và thử và phát hiện ra rằng nó chỉ hoạt động với phiên bản> 5.1 nhưng tôi không thể cập nhật ngay bây giờ.
FancyPants

5
-1: Để viết về các cách được đề xuất, sau đó đưa ra một ví dụ về cách không được đề xuất trong khi hoàn toàn thiếu để hiển thị ví dụ.
hakre

3
Cái này sai. MySQL đổi tên tài liệu cơ sở dữ liệu cho biết rename_database được dành cho một nhiệm vụ đổi tên rất cụ thể (không phải trường hợp chung là đổi tên DB), hiện được xử lý với cơ sở dữ liệu thay đổi: 'Để thực hiện nhiệm vụ nâng cấp tên cơ sở dữ liệu bằng mã hóa mới, hãy sử dụng ALTER DATABASE db_name UPGRADE Thay vào đó, TÊN DỮ LIỆU DỮ LIỆU thay vào đó 'Bạn không thể sử dụng điều này để đổi tên cơ sở dữ liệu như bạn muốn, thậm chí không có chỗ nào cho tên db mới trong lệnh này!
Kanat Bolazar

3

Trong Quản trị viên MySQL, hãy làm như sau:

  1. Trong Danh mục, tạo một lược đồ cơ sở dữ liệu mới.
  2. Đi đến Sao lưu và tạo một bản sao lưu của lược đồ cũ.
  3. Thực hiện sao lưu.
  4. Chuyển đến Khôi phục và mở tệp được tạo ở bước 3.
  5. Chọn 'Lược đồ khác' trong Lược đồ đích và chọn lược đồ cơ sở dữ liệu mới.
  6. Bắt đầu khôi phục.
  7. Xác minh lược đồ mới và nếu nó trông tốt, hãy xóa lược đồ cũ.

MySQL Administrator không thể xử lý cơ sở dữ liệu lớn và không có gì là nhanh chóng về nó
deadprogrammer

3

trong phpmyadmin bạn có thể dễ dàng đổi tên cơ sở dữ liệu

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

yêu cầu bỏ bảng cũ và tải lại dữ liệu bảng bấm OK trong cả hai

Cơ sở dữ liệu của bạn được đổi tên


3

Nếu bạn đang sử dụng phpMyAdmin, bạn có thể chuyển đến tab "hoạt động" sau khi bạn đã chọn cơ sở dữ liệu bạn muốn đổi tên. Sau đó đi đến phần cuối cùng "sao chép cơ sở dữ liệu vào" (hoặc một cái gì đó tương tự), đặt tên và chọn các tùy chọn bên dưới. Trong trường hợp này, tôi đoán bạn phải chọn "cấu trúc và dữ liệu" và "tạo cơ sở dữ liệu trước khi sao chép" và cuối cùng, nhấn nút "đi" trong phần đó.

Nhân tiện, tôi đang sử dụng phpMyAdmin bằng tiếng Tây Ban Nha nên tôi không chắc tên của các phần trong tiếng Anh là gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.