Nhân bản Toàn bộ Cơ sở dữ liệu MySQL


91

Có thể nhân bản toàn bộ cơ sở dữ liệu MySQL trên máy chủ linux không?

Tôi biết tôi có thể sử dụng xuất và nhập nhưng cơ sở dữ liệu gốc> 25MB nên điều đó không lý tưởng.

Có thể sử dụng mysqldump hoặc bằng cách sao chép trực tiếp các tệp cơ sở dữ liệu không?

Câu trả lời:


176

Đầu tiên hãy tạo cơ sở dữ liệu trùng lặp:

CREATE DATABASE duplicateddb;

Đảm bảo rằng người dùng và các quyền đều có sẵn và:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

29
Tôi không nghĩ rằng cần phải có một khoảng trống giữa "-p" và "password" trong phần 2 của 2 dòng lệnh của bạn

16
không có không gian không nên ở đó! Câu trả lời là đúng như thế này. Trang người đàn ông mysql cho biết: --password [= password], -p [password] Mật khẩu sử dụng khi kết nối với máy chủ. Nếu bạn sử dụng biểu mẫu tùy chọn ngắn (-p), bạn không thể có khoảng cách giữa tùy chọn và mật khẩu. Nếu bạn bỏ qua giá trị mật khẩu sau tùy chọn --password hoặc -p trên dòng lệnh, mysql sẽ nhắc một. Chỉ định mật khẩu trên dòng lệnh sẽ được coi là không an toàn. Xem Phần 6.1.2.1, "Hướng dẫn người dùng cuối cho P ...
nils petersohn

2
Lưu ý rằng mysqldump sao lưu theo mặc định các trình kích hoạt chứ không phải các thủ tục được lưu trữ, hãy thêm --routineslàm tùy chọn cho trường hợp này.
LinuxDevOps

1
Nếu bạn đang làm như vậy và bạn không muốn mật khẩu MySQL của người dùng này có sẵn trong lịch sử bash, hãy chỉnh sửa nó ra khỏi ~/.bash_historytệp của bạn sau khi thực thi. Hoặc bạn cũng có thể xuất kết quả của lệnh đầu tiên vào một tệp tạm thời và thực thi lệnh sau (lệnh này sẽ nhắc bạn bằng mật khẩu) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike

1
Câu trả lời này chắc chắn hoạt động, nhưng câu hỏi cho biết "Tôi biết tôi có thể sử dụng xuất và nhập nhưng cơ sở dữ liệu gốc> 25MB nên điều đó không lý tưởng" và những gì câu trả lời này gợi ý về cơ bản là xuất và nhập.
el.pescado


5

Đôi khi tôi thực hiện một mysqldump và chuyển đầu ra vào một lệnh mysql khác để nhập nó vào một cơ sở dữ liệu khác.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

Tôi gặp lỗi rằng cơ sở dữ liệu đích không tồn tại khi tôi sử dụng điều này. Vì vậy, bạn cũng cần một dòng CREATE DATABASE.
blak3r

3

Tạo tệp mysqldump trong hệ thống có dữ liệu và sử dụng đường dẫn để cung cấp tệp mysqldump này làm đầu vào cho hệ thống mới. Hệ thống mới có thể được kết nối bằng lệnh ssh.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

không có khoảng cách giữa -p [mật khẩu]


1
Bạn có thể thêm mô tả về cách hoạt động của nó, ví dụ như việc sử dụng đường ống?
kalyfe

1

Đây là tệp windows bat mà tôi đã viết kết hợp các đề xuất của Vincent và Pauls. Nó nhắc người dùng nhập tên nguồn và tên đích.

Chỉ cần sửa đổi các biến ở trên cùng để đặt đường dẫn thích hợp đến các cổng thực thi / cơ sở dữ liệu của bạn.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

Đầu ra mẫu:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

Điều này sẽ không hoạt động đối với InnoDB. Chỉ sử dụng giải pháp này nếu bạn đang cố gắng sao chép cơ sở dữ liệu MyISAM.

Nếu việc khóa các bảng trong quá trình sao lưu và có thể, tạm dừng MySQL trong quá trình nhập cơ sở dữ liệu được chấp nhận, thì mysqlhotcopy có thể hoạt động nhanh hơn.

Ví dụ

Sao lưu:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

Khôi phục:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy cũng có thể chuyển tệp qua SSH (scp) và có thể vào thẳng thư mục cơ sở dữ liệu trùng lặp.

Ví dụ

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

Tạo bản sao cơ sở dữ liệu

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

0

Điều này làm việc cho tôi với dấu nhắc lệnh, từ shell mysql NGOÀI RA:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

Điều này tìm kiếm cho tôi cách tốt nhất. Nếu nén "dump.sql", bạn có thể lưu trữ nó như một bản sao lưu nén. Mát mẻ! Đối với cơ sở dữ liệu 1GB với các bảng Innodb, khoảng một phút để tạo "dump.sql" và khoảng ba phút để kết xuất dữ liệu vào DB db2 mới.

Việc sao chép thẳng thư mục db lỗ (mysql / data / db1) không hiệu quả với tôi, tôi đoán là do bảng InnoDB.


-2

Ngày xưa trong MySQL, bạn chỉ có thể sao chép tất cả các tệp bảng sang một thư mục khác trong cây mysql

mysql cli - tạo cơ sở dữ liệu db2

linux cli - cp db1 db2


Điều đó chỉ hoạt động với MyISAM, phải không? Tốt những ngày cũ tồi tệ đã qua đi.
Laurenz Albe

Tốt cho sách lịch sử, nhưng không còn hữu ích nữa.
JJJ
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.