Khôi phục cơ sở dữ liệu mysql với tên khác


41

Làm thế nào chúng ta có thể khôi phục cơ sở dữ liệu mysql với tên khác từ tệp mysqldump. Tôi không muốn mở tập tin kết xuất và chỉnh sửa nó. Bất kỳ phương pháp nào tốt hơn?

Câu trả lời:


58

Bạn có thể để mysqldump tạo kết xuất theo cách mà nó không tạo hoặc chọn cơ sở dữ liệu.

VÍ DỤ: Bạn đang bỏ cơ sở dữ liệu db1 và tải nó vào cơ sở dữ liệu db2

Điều này sẽ đưa vào các lệnh CREATE DATABASE và USE trong kết xuất

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

Điều này sẽ không đưa vào các lệnh CREATE DATABASE và USE trong kết xuất ( đây là những gì bạn muốn )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

Bạn có thể tải nó vào cơ sở dữ liệu khác (chẳng hạn như db2) theo một trong bốn (4) cách:

LỰA CHỌN 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

TÙY CHỌN 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

TÙY CHỌN 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

TÙY CHỌN 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

Hãy thử một lần !!!


Trong trường hợp bất cứ ai khác đấu tranh với điều này, -Ddb2không nên có một dấu gạch nối ở phía trước của nó. Ít nhất, tôi đã gặp lỗi cú pháp MySQL khi tôi đưa nó vào.
gwg

Điều này dường như không hoạt động. Bãi rác của tôi không có cơ sở dữ liệu CREATE hoặc USE, nhưng nó vẫn có ALTER DATABASE ... CHARACTER SET ...trong đó phá vỡ quá trình nhập của tôi. Chỉnh sửa: Oracle về cơ bản là bỏ qua lỗi .
mở

5

Tôi là một fan hâm mộ lớn của đổ, chỉnh sửa và chèn. nhưng bạn không phải mở tệp văn bản (tệp kết xuất) để thay đổi nó (điều này đặc biệt hữu ích khi nó dài vài triệu dòng). nếu bạn muốn kết xuất cơ sở dữ liệu MYDATABASE.

mysqldump MYDATABASE > mydump.sql

sau đó sử dụng sed để thay thế tên cơ sở dữ liệu cũ bằng tên mới như thế này

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

sau đó, bạn có thể chỉ cần tạo cơ sở dữ liệu mới và nhập lại, và nó sẽ tạo tất cả các bảng với trong cơ sở dữ liệu mới MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Chỉnh sửa: Giống như một số người tốt trong phần bình luận đã chỉ ra, điều này có thể nguy hiểm, nếu một số dữ liệu cũng bị thay đổi bởi điều này ở trên, vì vậy, để cách cụ thể để tránh điều này.

1) Grep cho điều này trong bãi chứa, trước khi bạn thay đổi nó, như thế này.

cat mydump.sql | grep "MYDATABASE"

2) chúng ta có thể thêm một số `để làm cho nó an toàn hơn như thế này:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

nếu có ai có đề xuất cụ thể, tôi rất vui lòng chỉnh sửa câu trả lời của tôi trong 4 năm nữa.


Tôi nghĩ rằng câu hỏi là về việc khôi phục cơ sở dữ liệu enitre nhưng với một tên khác, không chỉ sao chép một bảng trong một DB hiện có.
Michael Green

3
phần sed là cần thiết
Steve Buzonas

10
Lệnh này là một ý tưởng tồi và tôi sẽ bỏ phiếu nếu có thể. Nếu bạn định thay thế chuỗi, ít nhất phải khớp với dòng CREATE TABLE và USE để bạn không thay thế bất kỳ dữ liệu nào khác.
bksunday

1
trước khi chạy lệnh sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) kiểm tra tất cả các lần xuất hiện của MYDATABASE cat mydump.sql | grep "MYDATABASE"để đảm bảo chỉ có tên cơ sở dữ liệu được thay đổi, các dữ liệu khác vẫn còn nguyên.
Rafaf Tahsin

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # có khả năng chỉnh sửa hơi nước an toàn hơn. kết xuất cơ sở dữ liệu của tôi không chứa bất kỳ câu lệnh USE hoặc CREATE DATABASE nào, nhưng tên db nằm trong các bình luận, khung nhìn và kích hoạt sql (MySQL 5.7). Điều này KHÔNG thay thế tên cơ sở dữ liệu trong các bình luận, nhưng chúng không có tác dụng đối với cơ sở dữ liệu kết quả. Điều này làm việc tốt cho tôi.
Jonathan

3

Tôi đã làm điều này một lần, từ lâu rồi.

Khi bạn xuất tất cả dữ liệu của mình, có một tùy chọn để đặt tên cơ sở dữ liệu khi bắt đầu tệp, đại loại là: "sử dụng cơ sở dữ liệu x"

Vì vậy, bạn có thể thay đổi tuyên bố này.


3

Nếu tập tin là những gì bạn có trong tay và bạn đang thao tác nó từ một vỏ / console, tôi sẽ sử dụng sedđể làm thay thế chuỗi trên dòng bắt đầu với CREATE DABATASE, CREATE TABLE, USEvà optionnally --(mysqldump comments)

Thay thế tên db trên các dòng khớp với Tạo cơ sở dữ liệu, Tạo bảng, Sử dụng và nhận xét mysqldump

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


Tất nhiên, giống như nhiều câu trả lời ở đây đề cập, sẽ dễ dàng hơn nếu bản sao lưu mysqldump không chứa một TẠO DỮ LIỆU và một dòng USE. Có nghĩa là các tùy chọn --all-databases, --databaseshoặc phiên bản ngắn của chúng -Ahoặc -Bkhông được sử dụng.


Trong MySQL 5.7, mysqldump bao gồm tên cơ sở dữ liệu trong các kích hoạt và chế độ xem, ngay cả khi có --no-create-dbvà không có --databasehoặc không có --databases.
Jonathan

2

Nếu bạn thực hiện kết xuất bằng hai quy tắc sau:

  1. Không sử dụng các tùy chọn như --databases, --databasevà chỉ đơn giản là chỉ cần đặt tên cơ sở dữ liệu ở phần cuối của lệnh mà không cần các tùy chọn này.
  2. Bao gồm các tùy chọn --no-create-db

Nếu bạn làm như sau thì mysqldump sẽ tạo SQL mà không cần tham chiếu cơ sở dữ liệu, thì bạn có thể sử dụng tên cơ sở dữ liệu mới ở cuối lệnh mysql của bạn trong quá trình nhập!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

Trong MySQL 5.7, mysqldump bao gồm tên cơ sở dữ liệu trong các kích hoạt và chế độ xem, ngay cả khi có --no-create-dbvà không có --databasehoặc không có --databases.
Jonathan

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.