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?
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:
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 !!!
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 .
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"
và
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.
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.
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.
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
, USE
và 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
, --databases
hoặc phiên bản ngắn của chúng -A
hoặc -B
không được sử dụng.
--no-create-db
và không có --database
hoặc không có --databases
.
Nếu bạn thực hiện kết xuất bằng hai quy tắc sau:
--databases
, --database
và 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.--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
--no-create-db
và không có --database
hoặc không có --databases
.
Dưới đây là kịch bản shell sẽ cho phép bạn thêm hậu tố / phụ tố cho tất cả các tên lược đồ đang hoạt động.
-Ddb2
khô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.